Respostas:
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.
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
e transmiti-la como make -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 é:
make foo=bar target
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
included
no makefile principal?
Do manual :
Variáveis no make podem vir do ambiente em que o make é executado. Toda variável de ambiente que make vê quando é inicializada é transformada em uma variável make com o mesmo nome e valor. No entanto, uma atribuição explícita no makefile, ou com um argumento de comando, substitui o ambiente.
Então você pode fazer (do bash):
FOOBAR=1 make
resultando em uma variável FOOBAR
no seu Makefile.
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:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
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 seguinte Makefile
:
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o $@.out $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./$@.out
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
Tendo isso, você:
make -r class02
;make
or make all
;make -r
(suponha que todos eles contenham algum tipo de afirmação e você só queira testá-los)parece
comando args sobrescrever variável de ambiente
Makefile
send:
echo $(MESSAGE1) $(MESSAGE2)
Executar exemplo
$ MESSAGE1=YES MESSAGE2=NG make send MESSAGE2=OK
echo YES OK
YES OK
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:
make unittest=*
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
make A='"as df"'