Posso passar variáveis para um GNU Makefile como argumentos de linha de comando? Em outras palavras, quero passar alguns argumentos que eventualmente se tornarão variáveis no Makefile.
Posso passar variáveis para um GNU Makefile como argumentos de linha de comando? Em outras palavras, quero passar alguns argumentos que eventualmente se tornarão variáveis no Makefile.
Você tem várias opções para configurar variáveis de fora do seu makefile:
Do ambiente - cada variável de ambiente é transformada em uma variável makefile com o mesmo nome e valor.
Você também pode ativar a -e
opção (aka --environments-override
) e suas variáveis de ambiente substituirão as atribuições feitas no makefile (a menos que essas atribuições usem a override
diretiva . No entanto, não é recomendado, e é muito melhor e flexível usar a ?=
atribuição (a variável condicional) operador de atribuição, só terá efeito se a variável ainda não estiver definida):
FOO?=default_value_if_not_set_in_environment
Observe que certas variáveis não são herdadas do ambiente:
MAKE
é obtido do nome do scriptSHELL
é definido dentro de um makefile ou o padrão é /bin/sh
(justificativa: os comandos são especificados dentro do makefile e são específicos do shell).Na linha de comando - make
pode aceitar atribuições de variáveis como parte de sua linha de comando, misturadas com os destinos:
make target FOO=bar
Mas todas as atribuições para FOO
variáveis dentro do makefile serão ignoradas, a menos que você use a override
diretiva na atribuição. (O efeito é o mesmo que com a -e
opção para variáveis de ambiente).
Exportando do Make pai - se você chamar Make de um Makefile, geralmente não deve escrever explicitamente atribuições de variáveis como esta:
# Don't do this!
target:
$(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
Em vez disso, a melhor solução seria exportar essas variáveis. A exportação de uma variável faz com que ela entre no ambiente de todas as chamadas de shell, e as chamadas Fazer desses comandos escolhem essas variáveis de ambiente, conforme especificado acima.
# Do like this
CFLAGS=-g
export CFLAGS
target:
$(MAKE) -C target
Você também pode exportar todas as variáveis usando export
sem argumentos.
make A='"as df"'
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
e transmiti-la comomake -C folder $(PROJECT_MAKE_FLAGS)
. Se houver uma maneira de dizer ao makefile da biblioteca para ignorar o ambiente, isso seria ideal (oposto a -e).make target FOO=bar
make FOO=bar target
?A maneira mais simples é:
Em seu makefile, você pode consultar
$(foo)
. Observe que isso não será propagado para sub-marcas automaticamente.Se você estiver usando subprodutos, consulte este artigo: Comunicando variáveis a um subproduto
fonte
included
no makefile principal?Digamos que você tenha um makefile como este:
Você chamaria então
make action argument=something
fonte
Do manual :
Então você pode fazer (do bash):
resultando em uma variável
FOOBAR
no seu Makefile.fonte
Há outra opção não citada aqui, incluída no livro GNU Make de Stallman e McGrath (consulte http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html ). Ele fornece o exemplo:
Envolve verificar se um determinado parâmetro aparece em
MAKEFLAGS
. Por exemplo .. suponha que você esteja estudando tópicos em c ++ 11 e tenha dividido seu estudo em vários arquivos (class01
, ...,classNM
) e deseje: compilar todos e executar individualmente ou compilar um de cada vez cronometre e execute-o se um sinalizador for especificado (-r
, por exemplo). Então, você pode criar o seguinteMakefile
:Tendo isso, você:
make -r class02
;make
ormake all
;make -r
(suponha que todos eles contenham algum tipo de afirmação e você só queira testá-los)fonte
parece
comando args sobrescrever variável de ambiente
Makefile
Executar exemplo
fonte
Se você criar um arquivo chamado Makefile e adicionar uma variável como $ (unittest), poderá usar essa variável dentro do Makefile, mesmo com caracteres curinga
exemplo:
Eu uso o BOOST_TEST e, dando um caractere curinga ao parâmetro --run_test = $ (unittest), poderei usar a expressão regular para filtrar o teste que quero que meu Makefile execute
fonte
Em seguida, use a variável
$(ROOT_DIR)
no Makefile.fonte