2013-02-14 11 views
7

Ich habe eine Verzeichnisstruktur, wo ich ein Haupt Makefile in meinem Hauptordner, und dann ein anderes Makefile in meinem Test und Src-Ordner.Freigabe Variablen zwischen Makefiles

In meinem Makefile habe ich Anweisungen für beide Tests/alle, die die einzelnen Ordner Makefiles aufrufen. Ich versuche Variablen in meinem Haupt-Makefile zu deklarieren und sie für diese anderen Ordner zugänglich zu machen.

Zum Beispiel in meinem Haupt-Makefile

PACKAGES = jansson mysql .... 

all: 
    do something here 

test: 

    cd test 
    make test 

Und dann in meinem Test/Makefile Ich mag die vorherigen PAKETE Variable zugreifen zu können und diese individuellen Abhängigkeiten der Make-Datei hinzufügen, auf mich.

Im Test/Makefile

PACKAGES += googletest googlemock 

test 
    do something here 

Könnte mir jemand helfen, dieses Problem zu lösen?

Dank

Antwort

8

Sie eine andere Datei erstellen können, für sofort ce Makefile.variable, wenn diese gemeinsam genutzte Variablen definiert und umfasst die Datei

include $(PATHTOSHAREDMAKEFILE)/Makefile.variable 

Blick auf den include manual für weitere Informationen

+1

Ja, das war es, woran ich ursprünglich dachte, aber ich war mir nicht sicher, ob es eine gute Übung war. Alles hat geklappt, danke – JonMorehouse

6

Sie können die Variable in der Befehlszeile übergeben:

test: 
    make -C test PACKAGES="$(PACKAGES)" 

Beachten Sie, dass es in die andere Richtung zu gehen um, wenn auch nicht möglich ist. Wenn die Variable test/Makefile eine Variable ändert, können diese Änderungen nicht zum aufrufenden Makefile zurückkehren.


Wenn Sie die PACKAGES Variable in der Haupt Make-Datei hinzufügen möchten, werden Sie Ihr Build-System Refactoring müssen stattdessen Untermakefiles enthalten. Das Haupt-Makefile richtet also alles ein und schließt dann (unter Verwendung der include-Direktive, die in den meisten make-Implementierungen verfügbar ist) die Unter-Makefiles ein, die spezifische Ziele lokal hinzufügen, sowie Variablen ändern/hinzufügen.

Nehmen wir an, Sie haben zwei Testverzeichnisse, test_foo und test_bar, Sie könnten eine Variable mit den Testzielen haben, lassen Sie uns TEST_TARGETS nennen. Jedes Makefile im Ordner test_* fügt sein lokales und eindeutiges Ziel der globalen Variablen hinzu, und das Hauptmakefile kann sie dann ausführen.

Etwas wie folgt aus:

Haupt Make-Datei:

# Start empty 
TEST_TARGETS = 

include test_foo/Makefile 
include test_bar/Makefile 

test: 
    for target in "$(TEST_TARGETS)"; do \ 
     $(MAKE) $(target); \ 
    done 

test_foo/Makefile:

TEST_TARGETS += test_foo 

test_foo: 
    # Do some foo testing 

test_bar/Makefile:

TEST_TARGETS += test_bar 

test_bar: 
    # Do some bar testing 
+0

Das Problem, das ich mit dem letzten Ansatz zu sehen ist, dass $ (MAKE) $ (Ziel) aufgerufen mit dem Pfad im Makefile-Verzeichnis der obersten Ebene.Ich würde denken, dass der Pfad in dem Ordner mit dem Makefile sein muss, das das Ziel von Interesse enthält, damit das ordnungsgemäß funktioniert. –

Verwandte Themen