Co oznacza $ $ @ i symbol rury w Makefile?

W następującej definicji Makefile:

  1. co oznacza $$@ w drugiej ostatniej linijce?
  2. 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
 24
Author: wil93, 2012-09-06

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.

 59
Author: Beta,
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