2013-10-26 16 views
5

Wie kann ich $(MAKEFLAGS) (oder eine andere Art der Weitergabe von Variablen in der Befehlszeile zu sub-make) auf eine Weise, die den Aufruf von Shell mit make VAR=val und unterstützt make -args?

Ich brauche meine Teilprojekte konfigurierbar, aber ich hasse Autotools, also verwende ich Make-Variablen dafür, z. Aufrufen von Shell:

$ make USE_SSE3=1 

und USE_SSE3 Bedürfnisse alle anzuwenden baut sich in allen Teilmakefiles.

The manual heißt es:

, wenn Sie ‚make -ks‘ dann MAKEFLAGS der Wert ‚ks‘ bekommt.

Daher verwende ich -$(MAKEFLAGS) (mit einem Strich Präfix) in meinem Makefile.

Allerdings wird in ungültige Argumente erweitert, wenn Variablen ohne Flag verwendet werden. Wenn ich laufen:

$ make FOO=bar 

dann sub-make wird ungültig -FOO=bar. OTOH ohne die Präfix-Variablen-Definitionen arbeiten, dann aber make -s, etc. nicht.

Gibt es eine Syntax/Variable/Hack, die die Übergabe von Argumenten und einzelne Variablen-Definitionen mit Sub-Makefiles funktioniert?

Das Legacy $(MKFLAGS) hat nicht das seltsame Bindestrich-Präfix-Problem, aber es enthält auch keine Variablendefinitionen. Ich habe versucht, die Variable mit $(patsubst) zu beheben, aber das machte nur die Dinge schlechter, indem Sie Whitespace trimmen.

Ich brauche die Lösung, um mit dem veralteten GNU Make 3.81 kompatibel zu sein, das mit Mac OS X Mavericks ausgeliefert wird.


foo: 
    $(MAKE) -C subproject -$(MAKEFLAGS) 

$ make foo -s  # MAKEFLAGS = 's' 
$ make foo BAR=baz # MAKEFLAGS = 'BAR=baz' 
$ make foo -j8  # MAKEFLAGS = ' --job-server=…' 
+0

Dies ohne besonderen Aufwand zu funktionieren scheint. Probieren Sie 'foo: $ (MAKE) bar' und' bar: echo flags sind $ (MAKEFLAGS), BAR ist $ (BAR) '. – Beta

Antwort

9

Sie sollten nicht MAKEFLAGS überhaupt eingestellt. Warum willst du? Du hast keinen Grund dazu angegeben.

MAKEFLAGS ist eigentlich beabsichtigt, eine interne Implementierung zu sein, die Argumente von einem übergeordneten make an ein child übergeben. Es ist im Allgemeinen nicht vorgesehen, dass es durch ein Makefile modifiziert wird. Über das einzige, was Sie sinnvollerweise tun können, ist das Hinzufügen neuer Flags.

Wenn Sie nur die rekursive make mit den $(MAKE) Variable laufen anstatt zu make, es wird nur Arbeit:

recurse: 
     @$(MAKE) all FOO=bar 

oder was auch immer.

+0

Ich muss 'MAKEFLAGS' nicht ändern, ich will nur, dass sie * arbeiten *. In Ihrem Beispiel werden Variablen verloren, die an make auf oberster Ebene übergeben wurden. Ich muss dem Benutzer erlauben, Konfigurationsvariablen und Sub-Makefiles zu setzen, um darauf zu reagieren. – Kornel

+2

Nein, tut es nicht. Alle Variablen, die an die oberste Ebene übergeben wurden, werden als Befehlszeilenvariablen an Sub-Maker übergeben - solange Sie nicht mit MAKEFLAGS herumspielen. Bitte zeigen Sie ein Beispiel, das nicht funktioniert, weil die Leute es seit über 20 Jahren erfolgreich benutzen. – MadScientist

+0

Oh, ich sehe - Flags werden implizit an Sub-Makefiles übergeben. Ich nahm fälschlicherweise an, dass die Variable explizit verwendet werden muss. – Kornel

0

Um zu überprüfen, ob -B in Make-Flags ist i tun:

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