2013-02-14 14 views
7

Mam strukturę katalogów, w której chcę jeden główny plik Makefile w moim głównym folderze, a następnie inny plik Makefile zarówno w folderze testowym, jak i src.Udostępnianie zmiennych między plikami Makefile

W moim głównym pliku Makefile mam dyrektywy dotyczące zarówno testu/wszystkiego, które wywołują pliki makefile poszczególnych folderów. Próbuję zadeklarować zmienne w moim głównym pliku Makefile i udostępnić je innym folderom.

Na przykład w moim głównym Makefile

PACKAGES = jansson mysql .... 

all: 
    do something here 

test: 

    cd test 
    make test 

A potem w moim test/Makefile Chcę mieć dostęp do poprzednich PAKIETY zmienna i dodawanie poszczególnych zależności makefile za tym na nią.

W teście/Makefile

PACKAGES += googletest googlemock 

test 
    do something here 

Czy ktoś może mi pomóc rozwiązać ten problem?

Dzięki

Odpowiedz

8

Można utworzyć inny plik, dla instan ce Makefile.variable gdzie te współdzielone zmienne są zdefiniowane i dołączyć plik przy użyciu

include $(PATHTOSHAREDMAKEFILE)/Makefile.variable 

spojrzeć na include manual więcej informacji

+1

Tak, właśnie to miałem na myśli, ale nie byłem pewien, czy to była dobra praktyka. Wszystko się udało, dzięki – JonMorehouse

6

Możesz przekazać zmienną w linii poleceń:

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

pamiętać, że nie jest możliwe, aby przejść na odwrót choć. Jeśli test/Makefile zmienia zmienną, to te zmiany nie mogą powrócić do wywołującego pliku Makefile.


Jeśli chcesz dodać do zmiennej PACKAGES w głównym makefile, trzeba będzie byłaby systemu gromadzenia zawierać sub-makefile zamiast. Tak więc główny plik makefile ustawia wszystko, a następnie zawiera (używając dyrektywy include dostępnej w większości implementacji) pliki podrzędne, które dodają określone cele do nich, a także zmieniają/dodają zmienne.

Na przykład, powiedzmy, że masz dwa katalogi testowe, test_foo i test_bar, możesz mieć zmienną zawierającą cele testowe, nazwijmy ją TEST_TARGETS. Każdy plik Makefile w folderze test_* dodaje lokalny i unikalny cel do zmiennej globalnej, a główny plik Makefile może je uruchomić.

coś takiego:

główna makefile:

# 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

Problem widzę z ostatniego podejścia jest to, że $ (MAKE) $ (cel) jest wywoływana ze ścieżką w katalogu Makefile najwyższego poziomu.Myślę, że ścieżka musi znajdować się w folderze z plikiem Makefile, który zawiera cel będący przedmiotem zainteresowania, aby to działało poprawnie. –

Powiązane problemy