0

这是我的实验 Makefile。

.SECONDEXPANSION:

~/hello.txt:  $(shell echo '$$(@D)/')$(shell echo '$$(@F)' | sed -e 's/hello/bye/')
    echo "$^"

不知何故 sed 命令不起作用,并且 Make 抱怨循环依赖

gmake: Circular /users/sim/hello.txt <- /users/me/hello.txt dependency dropped.
gmake: *** No rule to make target `echo', needed by `/users/me/hello.txt'.  Stop.

我的预期行为是 GNU Make 寻找 ~/bye.txt 代替。我究竟做错了什么?

虽然我可以在这个小例子中明确指定“bye.txt”,但我仍然想知道为什么 sed 命令不适用。谢谢您的帮助。

4

1 回答 1

1

我不明白你为什么有$(shell echo '$$(@D)/');为什么不直接写$$(@D)/

至于第二个,它不起作用,因为该$(shell ...)函数是立即评估的,而不是在第二次扩展期间。您还需要通过编写来推迟 shell 函数$$(shell ...)

但是,我不确定这是否可行。我不明白你为什么要这样做;我认为有一些更大的背景使它有用。因为,您可以通过使用静态模式规则更直接地完成您想做的事情

~/hello.txt : %/hello.txt : %/bye.txt
        echo "$^"
于 2013-05-15T00:26:06.240 回答