2009-06-01 11 views
6

Próbuję skleić dwa systemy kompilacji. Oba są rekursywne (reguły w makefile używają make, aby wywoływać inne pliki makefile w celu budowania komponentów projektu).Jak mogę zignorować przypisanie zmiennych wiersza polecenia w kompilacji rekurencyjnej?

Nazwiemy je "A" i "B", gdzie "A" buduje aplikację, a "B" kompiluje biblioteki używane przez "A".

Plik Makef najwyższego poziomu w wywołaniach A 'make TARGET = cokolwiek', co oznacza, że ​​wszystkie rekursywnie wywoływane bity kompilacji dziedziczą wartość TARGET jako zmiennej tylko do odczytu, łącznie z systemem kompilacji od B, który jest wywoływane jako część kompilacji rekursywnej.

Nie chcę tego robić w systemie kompilacji dla "B" (który pochodzi z innego projektu), ponieważ pliki Makefile używają TARGET do własnych celów, a kompilacja się nie udaje, ponieważ TARGET ma złą wartość i jest tylko czytać.

Widzę tylko dwa rozwiązania, z których żaden nie jest paletą;

1) Zmień nazwę TARGET na coś innego w pliku makefile w A, który ustawia go i w plikach Makefile w A, który go używa, aby uniknąć konfliktu z niższymi poziomami systemu budowania.

2) Użyj dyrektywy "zastąp" wszędzie w plikach Makefile w B, gdzie ustawiono zmienną TARGET, aby nadpisać jej stan tylko do odczytu.

Ktoś ma lepsze pomysły? - Najlepiej, jeśli chcę nic być dziedziczone przez B. kompilacji systemu od A, z wyjątkiem tych opcji I jawnie przechodzą do systemu B budować od A.

Nawiasem mówiąc, używam GNU make v3.80.

+0

Jeśli nie chcesz ustawiać CELU w pliku make pliku B, to dlaczego przekazujesz TARGET = cokolwiek w pliku makef użytkownika A? – JesperE

+0

Plik makefile najwyższego poziomu przekazuje TARGET = cokolwiek do makefile drugiego poziomu w A (który tego potrzebuje), a plik makefile drugiego poziomu w A następnie wywołuje plik make B, który dziedziczy TARGET jako zmienną tylko do odczytu ze środowiska marka drugiego poziomu. –

Odpowiedz

0

Być może możesz użyć dyrektywy "unexport", aby zapobiec propagacji TARGET do pliku Makefile B?

+0

Niestety, dyrektywa unexport tylko zapobiega eksportowaniu zmiennych wyeksportowanych za pomocą eksportu - nie ma wpływu na zmienne przekazywane w wierszu poleceń do bieżącego procesu tworzenia lub dziedziczone z wiersza poleceń rodzica. Wygląda na to, że ustawienie wartości za pomocą linii poleceń make powoduje, że jest ona niezniszczalna tylko do odczytu dla wszystkich produktów podrzędnych. –

+0

Potem nie mam pomysłów. – JesperE

3

Można ustawić MAKEOVERRIDES nic w makefile drugiego poziomu w A.

callb: 
     cd subdir && $(MAKE) MAKEOVERRIDES= 

ta przechodzi w dół normalne parametry linii poleceń jak -k i -s ale nie poleceń definicji zmiennych .

Albo użyć historyczną MFLAGS która jest taka sama jak MAKEFLAGS wyjątkiem MFLAGS nie zawiera definicje zmiennych polecenia.

callb: 
    cd subdir && $(MAKE) $(MFLAGS) 

Szczegóły dotyczące tych dwóch opcji można przeczytać tutaj: The GNU Make Manual

0

W miejscu, gdzie system zbudować wywołuje zbudować system B, nie należy używać „${MAKE}” bezpośrednio; wywołaj skrypt powłoki, który wywołuje system B (prawdopodobnie po oczyszczeniu środowiska).

Aby osiągnąć działanie, gdzie rozkazy są wykonywane przez „make -n” prefiks linii polecenia w makefile z „+” (podobnie jak dodanie do linii z „@” lub „-”).

0

Wygląda na to, że zmodyfikowałeś plik Makefile, aby rekurencyjnie wywoływał plik Makefile B, a tym samym Twój problem. Dlaczego zamiast tego wprowadzić nowy plik MakeLile, który rekurencyjnie wywoła plik Makefile B, a następnie rekursywnie wywołuje plik Makefile? Na przykład: combined.mk:

all: 
    $(MAKE) -f Makefile.B 
    $(MAKE) -f Makefile.A 

W ten sposób plik B makefile nie odziedziczy nic z pliku makefile.

Powiązane problemy