我如何强制一直运行命令

my_*_*ion 4 makefile gnu-make

当前的Makefile有这样的东西:

target1 : lib1.a  lib2.a

target2 : lib1.a  lib3.a

target3 : lib3.a 

lib1.a:
    $(MAKE) -C sub_dir all
Run Code Online (Sandbox Code Playgroud)

我想更改这个Makefile,以便在目标所依赖的任何地方lib1.a,它总是运行命令" $(MAKE) -C sub_dir all".换句话说,在上面的例子中,target1和target2将始终运行" $(MAKE) -C sub_dir all".有什么方法可以做到吗?

我知道以下不起作用:

target1 :  lib2.a
    $(MAKE) -C sub_dir all

target2 :   lib3.a
    $(MAKE) -C sub_dir all

target3 : lib3.a 
Run Code Online (Sandbox Code Playgroud)

因为如果lib2.a没有更新,则该命令不会运行.我有一个限制,我只控制lib1.a,我无法改变lib2.a的构建方式.

任何帮助表示赞赏!

[ 更新 ]我最终得到了以下解决方案:

target1 : lib1.a  lib2.a

target2 : lib1.a  lib3.a

target3 : lib3.a 

lib1.a: relay

.PHONY: relay
relay:
    $(MAKE) -C sub_dir all
Run Code Online (Sandbox Code Playgroud)

Etan,您指出的GNU帮助说FORCE不如.PHONY效率高,但从您的解释来看,在我看来FORCE更好.我误解了吗?你能评论我的解决方案吗?

Eta*_*ner 9

我认为这Force Target就是你在这里寻找的东西.

lib1.a: FORCE
        $(MAKE) -C sub_dir all

FORCE: ;
Run Code Online (Sandbox Code Playgroud)

.PHONY规则相比(正如@MadScientist 在这里所建议的那样),这本身并不会强制所有依赖于lib1.a重建的目标.只有lib1.a实际改变才会这样做.

一个更好的解决方案虽然可能完全摆脱子make,实际上有lib1.a这个makefile可用的依赖信息(直接或通过包含的makefile sub_dir),因为这避免了这整个"强制这个配方,因为我不能告诉你如何判断目标是否需要更新"问题.