Como posso alterar os argumentos padrão para gcc Quando eu executo Make “filename”

5

Perdoe-me se eu postei isso na pilha errada. Toda vez que eu executo make para um arquivo sem qualquer Makefiles no diretório, faça ainda funciona e compila o código fonte mas apenas com os argumentos: gcc filename.c -o filename

Por exemplo, se eu inserir make test com test.c no diretório, ele faz: gcc test.c -o test

Desejo alterar isso, para que, sempre que eu executar o tempo sem um Makefile, ele faça: gcc -ggdb -std=c99 -Wall -Werror -o filename filename.c -lcs50 -lm

Eu também que essa alteração se torna permanente e não muda independentemente se eu reiniciar ou alterar diretórios.

Atualmente, estou executando o Crunchbang Weezy em um processador AMD de 64 bits.

    
por Anfernee 22.03.2014 / 02:57

4 respostas

3

Você quer a variável de ambiente CFLAGS .

Por exemplo:

$ export CFLAGS='-ggdb3'
$ make test
cc -ggdb3    test.c   -o test
    
por 22.03.2014 / 04:23
3

Geralmente, quando você digita make test , se estiver faltando uma ferramenta Makefile , o make tentará usar um comando baunilha de compilação.

Exemplo

Digamos que tenhamos o seguinte test.c :

$ cat test.c 
#include <stdio.h>
int main()
{
    printf( "I am alive!  Beware.\n" );
    return 0;
}

Sem um Makefile quando executamos make test , obteríamos o seguinte comportamento:

$ make test
cc     test.c   -o test

NOTA: As execuções subsequentes resultariam em:

$ make test
make: 'test' is up to date.

Um teste:

$ ./test 
I am alive!  Beware.

Se você está digitando make test, você deve ter um Makefile em algum lugar. Quando executo esse comando em um diretório que não tem um Makefile , recebo o seguinte:

$ make test
make: *** No rule to make target 'test'.  Stop.

Usando CFLAGS

Se você quiser substituir as opções de linha de comando padrão do make , você pode fazer algo parecido com isto:

$ export CFLAGS="-ggdb -std=c99 -Wall -Werror -lcs50 -lm"

Agora, quando executarmos make :

$ make test
cc -ggdb -std=c99 -Wall -Werror -lcs50 -lm    test.c   -o test

Referências

por 22.03.2014 / 03:08
1

[Editar]

Do GNU make man page:

If no -f option is present, make will look for the makefiles GNUmakefile, makefile, and Makefile, in that order.

Transmitir argumentos só é possível se você tiver uma variável por exemplo CFLAGS definida em seu Makefile:

CC=gcc
CFLAGS=-g -O -Wall -Werror

all: foo

foo: foo.o
    $(CC) $(CFLAGS) $<

Aqui você pode substituir a variável com

$ make CFLAGS="-ggdb -std=c99 -Wall -Werror"
gcc -ggdb -std=c99 -Wall -Werror   -c -o foo.o foo.c
gcc -ggdb -std=c99 -Wall -Werror foo.o

No entanto, é mais fácil editar o Makefile.

    
por 22.03.2014 / 04:47
0

Isso depende exatamente do make(1) que você obteve e do makefile sendo usado.

Por exemplo, o GNU make supõe um conjunto de regras e macros padrão. Ou seja, a macro CC fornece o nome do compilador C, o CXX o C ++; CFLAGS são sinalizadores para CC e CXXFLAGS para CXX.

Ele também define uma série de regras padrão, ou seja, para criar um foo.o de foo.c chamando $(CC) $(CFLAGS) -c foo.c e criar um executável foo de foo.o fazendo $(CC) $(CFLAGS) -o foo foo.o . Novamente, outras versões do make podem definir outras macros e regras padrão (mas CC e CFLAGS parecem ser universais).

Se não houver makefile no , o GNU make usa as regras acima, e você pode substituir as macros, por exemplo, criando tst de tst.c com:

make CC=clang CFLAGS='-O2 -g -Wall' tst

Fora do topo da minha cabeça eu não sei como os outros faz reagir, parece que eu me lembro de outros apenas erro quando não há makefile.

Se houver um makefile (pode ser chamado de alguns nomes diferentes, verifique o manual; pelo menos makefile e Makefile ) as definições e regras de macro que ele define assumem. Os makefiles Mais não, então você pode usar o comando acima. Mas não há garantias. Verifique as instruções em arquivos chamados tipicamente INSTALL, README ou alguma variação, ou no próprio makefile.

E, finalmente, há algumas alternativas para fazer (seus arquivos de controle padrão são chamados de variação em makefile ), mas como make(1) é quase universal, seu uso deve ser documentado em algum lugar.

    
por 22.03.2014 / 23:48