2012-04-10 11 views
0

Was ist das Muster zu folgen, wenn spezialisierte Makefiles in einem Verzeichnis von der wichtigsten in einem übergeordneten Verzeichnis abhängt?Abhängigkeit der expliziten Kette in Makefile

ich habe:

/ 
/Makefile 
/src 
/src/Makefile 
/tests 
/tests/Makefile 

in /Makefile ich habe:

TESTING_COMMAND=something 
dotest1: 
    make -C tests/ [email protected] 

in /tests/makefile ich habe

dotest1: 
    $(TESTING_COMMAND) $? 

wenn ich laufe:

[email protected]:/ $ Make dotest1 

es funktioniert. aber wenn ich ausführen von den Tests dir:

[email protected]:/tests/ $ Make dotest1 

es versuchen wird, die Testdatei in der Schale zu halten, weil $ (TESTING_COMMAND) leer ist, so dass es erstes Argument ist wurde der Befehl an dem Shell übergeben.

Ich brauche das nicht unbedingt zu funktionieren, wenn im/tests/oder/src/dir ausgeführt, aber einen Weg, um ordnungsgemäß zu scheitern.

+0

Sind Sie sicher, dass Sie 'TESTING_COMMAND' im Haupt-Makefile definieren wollen, obwohl nur das tests/makefile es verwendet? – Beta

+0

Ich habe viel über die Frage vereinfacht :) Ich habe eine Menge Dinge, die geteilt werden. – gcb

Antwort

1

Ihr Design macht mir Angst, aber das wird den Trick in Haupt-Makefile tun:

TESTING_COMMAND=something 
dotest1: 
    make -C tests/ [email protected] TESTING_COMMAND=$(TESTING_COMMAND) 

Wenn Sie tests/Makefile gut zum Scheitern verurteilt, Sie ein paar Optionen. Wenn nur das eine Ziel auf TESTING_COMMAND abhängt, können Sie es wird eine Warnung ausgegeben haben und nichts tun:

ifdef TESTING_COMMAND 
dotest1: 
    $(TESTING_COMMAND) $? 
else 
dotest1: 
    @echo warning: TESTING_COMMAND not defined 
endif 

Oder wenn die ganze Makefile davon abhängt, können Sie eine Warnung abgeben Druck haben oder abbrechen:

ifndef TESTING_COMMAND 
$(warning TESTING_COMMAND is undefined, but Make will try to us it anyway) 
$(error TESTING_COMMAND is undefined, Make will now abort) 
endif 

Sie können auch die Sub-make (die Instanz, die tests/Makefile ausführt) abbrechen, aber weiterhin den Make-Prozess ausführen, der sie aufgerufen hat, aber das ist ein bisschen mühsam.

+0

perfekt! Das Ifndef auf der Suche nach einem var hat wunderbar funktioniert. Das Design ist nicht so beängstigend :) zentralisiere einfach alles, was von den Build-Akteuren in einem Kern-Makefile außer Kraft gesetzt werden kann, und belasse die Logik in den Verzeichnissen, die den Code/die Quelle enthalten. – gcb

2

Der Versuch, alles über die Befehlszeile (oder Umgebung) zu senden, scheint mir eine schlechte Idee zu sein. Das ist, was Aufnahme war erfunden für. Setzen Sie Ihre gemeinsamen Werte in eine separate Datei, so etwas wie config.mk, dann in alle Makefiles nur verwenden:

include config.mk 

bekommen sie enthalten.

Verwandte Themen