2012-10-19 9 views
8

Próbuję zaimplementować nierekurencyjny system kompilacji make w moim bieżącym projekcie. Z czym walczę to zakresy zmiennych. Docelowe zmienne nie pasują do moich potrzeb, ponieważ często zmienne definiują cele, a nie wymagania wstępne. Co potrzebne jest:GNU Make. Zmienne o zakresie ograniczonym do pojedynczego pliku Makefile

Makefile1:

SOMEVAR := original_value 
include Makefile2 
$(warning $(SOMEVAR)) 

Makefile2:

#some magic here to do what I want and make me happy 
SOMEVAR := included_value 
#and maybe here 

a wyjście chcę to 'original_value'.

Czy istnieją jakieś strategie, które sprawią, że będzie on prawdziwy?

EDIT: Jedynym rozwiązaniem doszedłem do momentu jest życie i zorganizować sobie umieścić wszystkie Pakiet obejmuje w końcu poszczególnych Makefile i użyć natychmiastowej zmiennej przypisania: =

+0

To rozwiązanie brzmi całkiem nieźle. Co jest z tym nie tak? A czym jest 'SOMEVAR', do czego służy? – Beta

+1

W tym rozwiązaniu nie podoba mi się to, że jest bardzo chwiejny. Jeśli jakiś biedny facet, który zajmie moje miejsce, nie dostanie pomysłu i miejsce to gdzieś indziej, dostanie mnóstwo niespodzianek. –

+1

Jeśli Makefile2 jest zawarty więcej niż jeden raz i definiuje przepis, który odwołuje się do '$ (SOMEVAR)' , wtedy przerwie się okropnie --- zmienne w recepturach są oceniane podczas wykonywania receptur, co oznacza, że ​​wszyscy zobaczą ostatnią wartość '$ (SOMEVAR)', a nie wartość, jaką posiadali, gdy receptura została zdefiniowana. –

Odpowiedz

5

Jedną ze strategii jest staromodny rozwiązanie na kolizje nazw zmiennych, gdy wszystko, co masz, to zmienne globalne: dodaj prefiks do nazw zmiennych w postaci przestrzeni nazw ubogich.

Makefile1:

Makefile1_SOMEVAR := original_value 
include Makefile2 
$(warning $(Makefile1_SOMEVAR)) 

Makefile2:

# no magic needed 
Makefile2_SOMEVAR := included_value 
# rest of Makefile2 uses $(Makefile2_SOMEVAR) of course 

Hej presto, z konwencją tak to tak, jakby każdy makefile ma swoje własne zmienne lokalne (lub przynajmniej jego własne zmienne przestrzeń nazw, która nie koliduje z żadnym innym plikiem Makefile).

Powiązane problemy