Marca recursiva: forma correcta de inserir ' $(MAKEFLAGS)`
Como posso usar $(MAKEFLAGS)
(ou outra forma de passar variáveis definidas na linha de comandos para sub-fazer) de uma forma que suporte a invocação da shell com make VAR=val
e make -args
?
preciso dos meus subprojectos configuráveis, mas odeio autotools, por isso estou a usar variáveis make para isto, por exemplo, invocando a partir da shell:
$ make USE_SSE3=1
e USE_SSE3
têm de se aplicar a todas as compilações em todos os sub-makefiles.
o manual afirma que:
Se fizeres 'make-ks' então MAKEFLAGS recebe o valor 'ks'.
por isso estou a usar -$(MAKEFLAGS)
(com um prefixo) no meu Makefile.
No entanto, esse expande-se em argumentos inválidos quando são usadas variáveis sem opções. Se eu correr:
$ make FOO=bar
Então o sub-make fica inválido -FOO=bar
. OTOH sem o prefixo do traço as definições das variáveis funcionam, então mas make -s
, etc. não.
existe uma sintaxe / variável/hack que faz com que a passagem de argumentos e as definições de variáveis isoladas funcionem com sub-makefiles?
O legado $(MKFLAGS)
não tem o problema do prefixo do traço estranho, mas também não inclui definições de variáveis. Tentei arranjar a variável com $(patsubst)
, mas isso só piorou as coisas aparando espaços em branco.
Eu preciso que a solução seja compatível com o GNU Make 3.81 obsoleto enviado com Mac OS X Mavericks.
foo:
$(MAKE) -C subproject -$(MAKEFLAGS)
$ make foo -s # MAKEFLAGS = 's'
$ make foo BAR=baz # MAKEFLAGS = 'BAR=baz'
$ make foo -j8 # MAKEFLAGS = ' --job-server=…'
2 answers
MAKEFLAGS
pretende-se, na verdade, ser uma implementação interna passando argumentos de um pai fazer para uma criança fazer. Não se destina, geralmente, a ser modificado por um makefile. Sobre a única coisa que você pode fazer utilmente é adicionar novas bandeiras.
Se você apenas executar a marca recursiva usando a variável $(MAKE)
em vez de hardcoding make
, Ela vai apenas funcionar:
recurse:
@$(MAKE) all FOO=bar
Ou como queiras.
Para verificar se-B está presente em make flags I do:
BB_CLOBBER := $(shell echo $(MAKEFLAGS) | grep wB)
ifeq (,$(BB_CLOBBER))
# also force clobber make if these files are missing
BB_CLOBBER := $(shell (test -e $(bb_gen)/minimal/.config && test -e $(bb_gen)/full/.config) || echo "B")
endif
bb_prepare:
ifneq (,$(BB_CLOBBER))
@rm -rf $(bb_gen)/full
...