2009-08-24 15 views
20

Czytam dokument GNU Make. Oto przykładCztery znaki dolara w Makefile

% .d:% .c

@set -e; rm -f [email protected]; \ 

    $(CC) -M $(CPPFLAGS) $< > [email protected]$$$$; \ 

    sed ’s,\($*\)\.o[ :]*,\1.o [email protected] : ,g’ < [email protected]$$$$ > [email protected]; \ 

    rm -f [email protected]$$$$ 

Próbowałem to na C++ programu i dostał listę plików

init3d.d init3d .d.18449 input.d input.d.18444 main.d main.d.18439

Oto co znalazłem, ale nie wiesz nderstand w tym samym document

Jeśli włączono ekspansję wtórnego i chcesz dosłowny znak dolara na liście przesłanek należy właściwie napisać cztery znaki dolara („$$$$”).

Zastanawiam się, co właściwie oznaczają cztery znaki dolara "$$$$"? Jak oni 18449, 18444 lub 18439?

Dzięki i pozdrawiam!

Odpowiedz

21

Jeśli opcja "rozszerzenie wtórne" jest włączona, wymagany jest $$$$ w celu wygenerowania pojedynczego $ w aktualnym wyjściu. $ jest zwykle używany do rozwijania zmiennych, wywoływania funkcji make itd. $$ z włączonym rozszerzeniem dodatkowym robi coś innego, ale w przeciwnym razie generuje rzeczywisty $ na wyjściu.

Powłoka, która sprawia, że ​​używa do uruchamiania linii poleceń w systemach uniksowych zwykle interpretuje $$ jako rozszerzenie do identyfikatora procesu powłoki. Tak więc, bez włączonej dodatkowej rozbudowy, $$$$ zmieni się w dane wyjściowe, które będą rozszerzały powłokę do ID procesu.

(przy użyciu identyfikatora procesu powłoki jako przyrostek to prosty sposób próbować zagwarantować unikalność nazwy pliku do pliku tymczasowego.)

+0

Secondary ekspansja nie wpływa na treść przepisu. Tylko lista wymagań wstępnych. Tak więc '$$$$' zawsze tworzy '$$' w kontekście receptury. Potrzebujesz tylko "$$$$" na liście wymagań wstępnych, aby uzyskać pojedyncze '$', gdy rozszerzenie wtórne jest włączone (gdy nie korzysta z '$$', dostaniesz to). –

+0

To nie jest odpowiedź. Wtórne rozszerzenie jest nieistotne. – reinierpost

+0

@reinierpost Wydaje się, że masz takie same trudności ze zrozumieniem jak Etan Reisner :) Oryginalny plakat mówił o wtórnej ekspansji, dlatego napisałem o tym. Rzeczywiste wyjaśnienie znajduje się w drugim akapicie, a najbardziej prawdopodobnym powodem zastosowania tego konstruktu jest nawiasowany akapit trzeci. –

2

18449, 18444 lub 18439 wyglądają jak identyfikatory procesowe, więc może to identyfikator procesu?

16

$$ zostaną zamienione na $, ale w przepisach Makefile (które są powłoki wyrażenia) musisz także uniknąć otrzymanego $ za pomocą \ lub za pomocą pojedynczych cudzysłowów ' wokół wyrażenia.

Oto przykład, który pokazuje go:

DOLLAR:=$$ 
dollar: 
    echo '$$' > [email protected] 
    echo "\$$" >> [email protected] 
    echo '$(DOLLAR)' >> [email protected] 
    echo "\$(DOLLAR)" >> [email protected] 
    cat dollar 
+1

Gosh, kocham cię. Szukałem w kółko, dlaczego "$$" rozszerza się na nicość. – Profpatsch