makefile 条件配方不执行

makefile conditional recipe not executing

我有一个生成文件,它从几个目标文件生成一个可执行文件,并且我在编译每个目标文件时都包含一个版本号。但是,我希望版本号仅在创建特定目标文件时递增(下面的 ptarget,包含 main 的文件)。我尝试使用配方中的条件语句来做到这一点:

ptarget:=$(addsuffix .obj,$(ouf))

%.obj : %.cpp
    $(CXX) $(CXXFLAGS) $< -Fo$@
    $(info $(ptarget))
    $(info $@)
ifeq ($@, $(ptarget))
    perl $(perlDir)versionBump/bump.pl -inc -f $(versionFile)
endif

我可以从信息命令中看到,只有当构建 ptarget 时 $@ == $(ptarget) -- 我也尝试使用 strip 命令来确保没有隐藏的空格,但是 perl 命令来增加版本永远不会执行,它以制表符开头。

补充一下,这一切在没有条件的情况下都可以正常工作,但增量在构建过程中发生多次,这是我试图避免的。这 example 表明它应该工作但是...

这是对make的一个很普遍的误解。 ifeq 是一个 make 语句,在 make 解析 Makefile 时被评估。您需要的是一个条件,它在 shell 执行配方时得到评估,即 shell if:


%.obj : %.cpp
    $(CXX) $(CXXFLAGS) $< -Fo$@
    $(info $(ptarget))
    $(info $@)
    if [ "$@" = "$(ptarget)" ]; then \
      perl $(perlDir)versionBump/bump.pl -inc -f $(versionFile); \
    fi

不要忘记续行(尾部 \)。