Você quer a variável de ambiente CFLAGS
.
Por exemplo:
$ export CFLAGS='-ggdb3'
$ make test
cc -ggdb3 test.c -o test
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.
Geralmente, quando você digita make test
, se estiver faltando uma ferramenta Makefile
, o make
tentará usar um comando baunilha de compilação.
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.
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
[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.
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.
Tags bash gcc make crunchbang terminal