【问题标题】:How to create a makefile prerequisite from the target如何从目标创建 makefile 先决条件
【发布时间】:2015-09-01 07:19:06
【问题描述】:

我正在使用 GNU make,并且正在尝试基于目标创建先决条件。我希望先决条件是目标的基本名称。所以,当我运行这个时:

make a/b/foo.txt

它应该运行这个:

cp foo.txt a/b/foo.txt

这些都不起作用:

a/%.txt: $(basename $@)
    cp $< $@

a/%.txt: $(@F)
    cp $< $@

a/%.txt: $(shell basename $@)
    cp $< $@

a/%.txt: $(basename %)
    cp $< $@

a/%.txt: $(shell basename %)
    cp $< $@

我已经看到目标和先决条件中使用了 %,因此我知道将先决条件基于目标是正常的。我也在先决条件中看到了变量,所以这也是正常的。但似乎特殊变量 $@ 和 $(@F) 在先决条件中不可用,以及 basename 和 shell 等函数。有什么方法可以解决这个限制吗?

【问题讨论】:

  • 不会是a/b/%.txt: %.txt吗?
  • 这里的想法是目录 a 是已知的。其余的可以是任何东西:a/b/c/d/foo.txt、a/c/d/foo.txt 等。它应该将 foo.txt 复制到目标。

标签: makefile gnu-make


【解决方案1】:

$(shell) 版本是错误的,因为它们混淆了执行时间。

$(shell) 命令本身在 make 解析时处理,但值 $@ 仅在目标执行时存在。

$(basename) 扩展也是如此。

不过,您可以在这里使用Secondary Expansion

.SECONDEXPANSION:

a/%.txt: $$(notdir $$@)
        @echo '$$@: $@'
        @echo '$$<: $<'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2023-03-23
    • 2020-07-04
    • 2022-09-24
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多