Eu normalmente passo definições de macro de "make command line" para um "makefile" usando a opção: -Dname = value. A definição está acessível dentro do makefile.
Também passo definições de macro do "makefile" para o "código-fonte" usando a opção de compilador semelhante: -Dname = value (compatível com muitos compiladores). Esta definição está acessível no código-fonte.
O que eu preciso agora é permitir que o usuário do meu makefile seja capaz de passar definições arbitrárias de macro da "linha de comando make.exe" para o "código-fonte" imediatamente, sem ter que alterar nada no makefile.
para que o usuário possa digitar: make -f mymakefile.mk -SOMEOPTION var = 5
então diretamente o código main.c pode ver var:
int main()
{
int i = var;
}
Respostas:
Chame o
make
comando desta forma:E certifique-se de usar
$(CFLAGS)
em seu comando de compilação no Makefile. Como @ jørgensen mencionou, colocar a atribuição da variável após omake
comando sobrescreverá oCFLAGS
valor já definido no Makefile.Alternativamente, você pode definir
-Dvar=42
em outra variávelCFLAGS
e então reutilizar essa variávelCFLAGS
para evitar a substituição completaCFLAGS
.fonte
$(CFLAGS)
deve vir por último, de modo que qualquer opção especificada por um usuário irá sobrescrever qualquer coisa que o Makefile definir internamente. Isso significaria usar, por exemplolocal_CFLAGS = -Wall $(CFLAGS)
. Por outro lado, se houver algo que você realmente deseja que tenha precedência, coloque-o depois$(CFLAGS)
, como no comentário @MadScientist.CFLAGS="-Dvar1=42 -Dvar2=314"
CPPFLAGS
pode representar um ajuste melhor do queCFLAGS
ouCXXFLAGS
: stackoverflow.com/a/53527858/2278206Basta usar uma variável específica para isso.
fonte
Ligue para fazer desta forma
porque você deseja substituir os CFLAGS do seu Makefile, e não apenas o ambiente (que tem uma prioridade mais baixa em relação às variáveis do Makefile).
fonte
Devido à baixa reputação, não posso comentar a resposta aceita.
Eu gostaria de mencionar a variável predefinida
CPPFLAGS
. Pode representar um ajuste melhor do queCFLAGS
ouCXXFLAGS
, uma vez que é descrito pelo manual GNU Make como:Exemplos de regras implícitas integradas que usam
CPPFLAGS
n.o
é feito automaticamenten.c
com uma receita do formulário:$(CC) $(CPPFLAGS) $(CFLAGS) -c
n.o
é feito automaticamente a partir den.cc
,n.cpp
oun.C
com uma receita da forma:$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
Alguém usaria o comando
make CPPFLAGS=-Dvar=123
para definir a macro desejada.Mais informações
fonte
fonte
Encontre o arquivo C e a implementação do Makefile abaixo para atender aos seus requisitos
foo.c
Makefile
fonte