2013-12-17 17 views
6

Podczas korzystania z opcji Utwórz ostatnio zaobserwowałem pewne dziwne zachowanie (v3.81).Czy mogę nakazać Make, aby ignorował zmienne środowiskowe?

Załóżmy, że mam następujący Makefile:

FOOBAR = $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ') 

all: 
    @echo "Hi" 

clean: 
    @echo "Hi again" 

wydaje się proste wystarczy, prawda? Warto zauważyć, że FOOBAR jest "zmienną rekurencyjnie rozwiniętą", więc nie powinno się jej oceniać, dopóki się do niej nie odwołam. Zauważ, że nigdy o tym nie mówię. Należy również pamiętać, że nonexistentdirectory nie istnieje, jak można się spodziewać.

Załóżmy teraz ustawić FOOBARw powłoce przed modlę cel Producent:

compy386$ FOOBAR="stuff" make clean 
find: nonexistentdirectory: No such file or directory 
Hi again 

Dlaczego FOOBAR są oceniane? Oczywiście ma to coś wspólnego z tym, że zmienna jest zdefiniowana w powłoce. Czy mam przewidzieć, że użytkownik mógł ustawić zmienne w powłoce? Co ja tu robię źle ?!

Odpowiedz

2

FOOBAR jest oceniany, ponieważ korzystasz z receptury (dla clean) i FOOBAR istniał w środowisku przy wpisie do make. Ponieważ FOOBAR istniało w środowisku na wejściu, staje się zmienną eksportowaną, co oznacza, że ​​make dostarczy ją jako część środowiska do dowolnego programu w recepturze. make nie jest przypadkiem specjalnym echo; po prostu używa tego znalezionego na twojej ścieżce. I nie może wiedzieć, czy to narzędzie odniesie się do konkretnej zmiennej środowiskowej, więc musi wyeksportować wszystkie wyeksportowane zmienne, co oznacza, że ​​musi ocenić FOOBAR.

(Na oficjalnej słowem, patrz akapit trzeci Variables from the Environment w instrukcji makijażu. Zobacz także przepis na recursive make invocation.)

Aby odpowiedzieć na bezpośrednie pytanie, można powiedzieć make ignorować faktu, że zmienna pochodził ze środowiska, więc nie wyeksportował go ponownie, przez wyeksportowanie go:

unexport FOOBAR 
0

Dodaj ? przed = jak:

FOOBAR ?= $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ') 

To będzie używać zmiennej środowiskowej czy ustawić i ocenić tylko wtedy, gdy wyłączony lub pusta.

Powiązane problemy