Co oznacza $ $ @ i symbol rury w Makefile?
W następującej definicji Makefile:
- co oznacza
$$@
w drugiej ostatniej linijce? - a co z symbolem
|
w linii środkowej?
define KERNEL_RULE
$(DESTDIR)/$(1) : kernel_modules
$(DEST_DIR)/$(1) : $(DESTDIR)/$(1) | $(DEST_DIR)
cp $(DESTDIR)/$(1) $$@
endef
1 answers
(masz opłakany wybór nazw zmiennych; zmieńmy DESTDIR
na SOURCE_DIR
i zostawmy DEST_DIR
w spokoju.)
Załóżmy, że piszesz zwykłą regułę:
$(DEST_DIR)/foo : $(SOURCE_DIR)/foo
cp $(SOURCE_DIR)/foo $(DEST_DIR)/foo
To działa, ale redundancja jest kłopotliwa. Prędzej czy później zmienisz $(DEST_DIR)/foo
w preq, ale zapomnij o zmianie w regule. A zasada jest trudna do odczytania. Zatem wstawiamy zmienną automatyczną :
$(DEST_DIR)/foo : $(SOURCE_DIR)/foo
cp $(SOURCE_DIR)/foo $@
Gdy ta reguła zostanie uruchomiona, $@
zostanie rozszerzona do nazwy celu, $(DEST_DIR)/foo
. (My stać Cię na więcej, ale na tym poprzestańmy.)
Teraz chcemy się upewnić, że $(DEST_DIR)
istnieje zanim ta reguła zostanie uruchomiona, ale nie chcemy , aby było to dokładnie warunkiem wstępnym, ponieważ brak tego katalogu nie powinien wystarczyć, aby ta reguła została uruchomiona. Więc robimy to tylko warunek:
$(DEST_DIR)/foo : $(SOURCE_DIR)/foo | $(DEST_DIR)
cp $(SOURCE_DIR)/foo $@
Teraz chcemy wiele takich zasad, dla różnych celów, i zamiast robić tointeligentny sposób , użyjemy "canned przepis " , rodzaj szablonu do tworzenia reguł w locie.
# This won't work
define KERNEL_RULE
$(SOURCE_DIR)/$(1) : kernel_modules
$(DEST_DIR)/$(1) : $(SOURCE_DIR)/$(1) | $(DEST_DIR)
cp $(SOURCE_DIR)/$(1) $@
endef
Problem polega na tym, że gdy ocenimy tę definicję, $@
zostanie rozszerzona, a ponieważ nie jest jeszcze regułą, rozszerzy się do zera. Zmieniamy więc na $$@
:
# This will work
define KERNEL_RULE
$(SOURCE_DIR)/$(1) : kernel_modules
$(DEST_DIR)/$(1) : $(SOURCE_DIR)/$(1) | $(DEST_DIR)
cp $(SOURCE_DIR)/$(1) $$@
endef
Kiedy wywołujemy tę definicję, $$@
rozszerza się do $@
, wtedy jeśli/kiedy uruchomi regułę, $@
rozszerzy się do nazwy celu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-12 01:12:22