2012-05-03 19 views
5

w instrukcji:W jaki sposób można użyć funkcji eval w makefile?

Funkcja eval jest bardzo szczególny: to pozwala na definiowanie nowych konstruktów makefile, które nie są stałe; które są wynikiem oceny innych zmiennych i funkcji. Argument funkcji eval jest rozszerzany, a następnie wyniki tego rozszerzenia są analizowane jako składnia pliku Makefile .

Należy zdać sobie sprawę, że argument eval został dwukrotnie rozwinięty; najpierw przez funkcję eval, a następnie wyniki tego rozszerzenia są ponownie rozwinięte, gdy są parsowane jako składnia makefile. Oznacza to, że użytkownik może potrzebować dodatkowych poziomów ucieczki dla znaków "$" przy użyciu eval.

"Rozwija dwa razy" wprowadza mnie w błąd.

na przykład utworzyć makefile:

define func 
    tmp = $(OBJPATH)/$(strip $1) 
    objs += $$(tmp) 
    $$(tmp) : $2 
     gcc $$^ -o [email protected] 
endef 

all : foo 

$(eval $(call func, foo, 1.c))  

jak będzie funkcja eval zostać rozszerzony?

+0

"Jak rozszerzona zostanie funkcja ewaluacji?" Próbowałeś tego? – Beta

Odpowiedz

15

Najłatwiej zrozumieć to, aby zastąpić eval z informacją:

$(info $(call func, foo, 1.c)) 

To będą wyświetlane jako wyjście wynik pierwszej ekspansji, dzięki czemu można zobaczyć, co czyni będą faktycznie parsowania. Nie dostarczają wartości dla zmiennej OBJPATH, ale jeśli to było obj na przykład wtedy w przypadku pierwszej ekspansji (z funkcją połączeń) powoduje:

tmp = obj/foo 
objs += $(tmp) 
$(tmp) : 1.c 
    gcc $^ -o [email protected] 

Następnie make parser oceni to, a podczas tego procesu rozszerzy go ponownie, dzięki czemu rzeczy takie jak $(tmp) zostaną rozwinięte.

Powiązane problemy