gpt4 book ai didi

makefile - $$@ 和 Makefile 中的管道符号代表什么?

转载 作者:行者123 更新时间:2023-12-03 08:52:06 29 4
gpt4 key购买 nike

在以下 Makefile 定义中:

  • $$@ 有什么用在倒数第二行代表什么?
  • |呢?中线的符号?

  • define KERNEL_RULE
    $(DESTDIR)/$(1) : kernel_modules
    $(DEST_DIR)/$(1) : $(DESTDIR)/$(1) | $(DEST_DIR)
    cp $(DESTDIR)/$(1) $$@
    endef

    最佳答案

    (您有一个可悲的变量名称选择;让我们将 DESTDIR 更改为 SOURCE_DIR 并留下 DEST_DIR。)

    假设您正在编写一条普通规则:

    $(DEST_DIR)/foo : $(SOURCE_DIR)/foo
    cp $(SOURCE_DIR)/foo $(DEST_DIR)/foo

    那行得通,但冗余很麻烦。迟早你会改变 $(DEST_DIR)/foo在 preq 中,但忘记在规则中更改它。而且这条规则很难读懂。所以我们输入了 automatic variable :
    $(DEST_DIR)/foo : $(SOURCE_DIR)/foo
    cp $(SOURCE_DIR)/foo $@

    当此规则运行时, $@将扩展为目标名称, $(DEST_DIR)/foo . (我们可以做得更好,但让我们就此打住。)

    现在我们要确保 $(DEST_DIR)在此规则运行之前存在,但我们不希望它完全成为先决条件,因为缺少该目录不应足以导致此规则运行。所以我们把它设为 order-only prerequisite :
    $(DEST_DIR)/foo : $(SOURCE_DIR)/foo | $(DEST_DIR)
    cp $(SOURCE_DIR)/foo $@

    现在我们想要很多这样的规则,针对不同的目标,而不是这样做 the smart way ,我们将使用 "canned recipe" ,一种用于即时创建规则的模板。
    # 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

    问题是当我们评估这个定义时, $@将被扩展,并且由于它还不是规则,因此它将扩展为空。所以我们把它改成 $$@ :
    # This will work
    define KERNEL_RULE
    $(SOURCE_DIR)/$(1) : kernel_modules
    $(DEST_DIR)/$(1) : $(SOURCE_DIR)/$(1) | $(DEST_DIR)
    cp $(SOURCE_DIR)/$(1) $$@
    endef

    当 Make 调用此定义时, $$@扩展为 $@ ,然后如果/当它运行规则时, $@将扩展到目标的名称。

    关于makefile - $$@ 和 Makefile 中的管道符号代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12299369/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com