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=…'
 5
Author: Kornel, 2013-10-26

2 answers

Não devias Pôr nada. Porque queres? Não deu nenhuma razão para o fazer.

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.

 9
Author: MadScientist, 2013-10-27 19:59:59

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
    ...
 0
Author: Tanguy, 2014-07-25 17:47:03