2013-10-26 9 views
5

Come posso usare $(MAKEFLAGS) (o un altro modo di passare le variabili definite sulla riga di comando per eseguire sub-make) in un modo che supporta invocazione dalla shell con entrambi make VAR=val e make -args?

Ho bisogno dei miei sottoprogetti configurabili, ma odio gli autotools, quindi sto usando make variables per questo, ad es. invocando da shell:

$ make USE_SSE3=1 

e USE_SSE3 necessità di applicare a tutti costruisce in tutte le sub-makefiles.

The manual afferma che:

se ‘fai -KS’ quindi MAKEFLAGS ottiene il valore ‘ks’.

Pertanto sto usando -$(MAKEFLAGS) (con un prefisso di trattino) nel mio Makefile.

Tuttavia, questo si espande in argomenti non validi quando vengono utilizzate variabili senza flag. Se corro:

$ make FOO=bar 

poi sub-make ottiene valida -FOO=bar. OTOH senza le definizioni delle variabili del prefisso del trattino funzionano, quindi non lo sono make -s, ecc.

Esiste una sintassi/variabile/hack che rende il passaggio di argomenti e definizioni di variabili solitarie che funzionano con i sotto-makefile?

Il file legacy $(MKFLAGS) non ha il problema del prefisso del trattino strano, ma non include neanche le definizioni di variabili. Ho provato a correggere la variabile con $(patsubst), ma ciò ha solo peggiorato le cose eliminando gli spazi bianchi.

Ho bisogno che la soluzione sia compatibile con il vecchio GNU Make 3.81 fornito con 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=…' 
+0

Questo sembra funzionare senza alcuno sforzo particolare. Prova 'pippo: $ (MAKE) bar' e' bar: echo flags sono $ (MAKEFLAGS), BAR is $ (BAR) '. – Beta

risposta

9

Non si dovrebbe impostare MAKEFLAGS a tutti. Perché vuoi? Non hai dato nessuna ragione per farlo.

MAKEFLAGS è inteso, in realtà, essere un'implementazione interna che passa argomenti da un genitore a un figlio. Non è destinato, in genere, a essere modificato da un makefile. L'unica cosa che puoi fare utilmente è aggiungere nuove bandiere.

Se si esegue solo la marca ricorsiva usando la variabile $(MAKE) piuttosto che hardcoding make, sarà solo di lavoro:

recurse: 
     @$(MAKE) all FOO=bar 

o qualsiasi altra cosa.

+0

Non ho bisogno di modificare 'MAKEFLAGS', voglio solo che * funzionino *. Il tuo esempio perde le variabili che sono state passate al make di livello superiore. Devo consentire all'utente di impostare variabili di configurazione e sotto-makefile per reagire a loro. – Kornel

+2

No, non è così. Tutte le variabili che sono state passate al livello superiore sono passate, come variabili da riga di comando, a sub-marche, a patto che non si scherzi con MAKEFLAGS. Si prega di mostrare un esempio che non funziona, perché le persone lo usano con successo da oltre 20 anni. – MadScientist

+0

Oh, vedo - i flag vengono passati implicitamente ai sotto-makefile. Ho assunto erroneamente che la variabile debba essere utilizzata esplicitamente. – Kornel

0

Per verificare se -B è presente in bandiere make faccio:

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 
    ...