如果是最新的则采取行动

make action if up to date

我有一个由 GNU Make 3.81 运行ning 在 windows 上使用的生成文件,并且在每次构建时我都会向编译器传递一个给出版本号的定义。版本号是从文件中获取的,并在 makefile 的开头使用带有 -get 选项的 perl 脚本递增。然后生成的程序可以显示构建版本。我遇到的麻烦是,即使构建失败,版本号也会更新。但这可以通过 运行 再次使用 -dec 选项修复 perl 脚本,以便在发生错误时减少版本号。 makefile 的简化内容:

objects:= pov1.obj
ouf:= pov1
versionFile:= povVersion.txt
VERSION:=$(shell perl ../../../perl/uscripts/bump.pl -get -f $(versionFile))
CXX:= cl 
CXXFLAGS:= -c -EHsc -std:c++17 -D$(addprefix VER=,\"$(VERSION)\")

target:=$(addsuffix .exe, $(ouf))

%.obj : %.cpp
    $(CXX) $(CXXFLAGS) $< -Fo$@ || perl ../../../perl/uscripts/bump.pl -dec -f $(versionFile)
     
$(target) : $(objects)
    $(LINKER) $(LDFLAGS) $(objects) /OUT:$(target) || perl ../../../perl/uscripts/bump.pl -dec -f $(versionFile)

虽然这似乎工作如果我不小心 运行 最新的版本号更新尽管没有构建发生。我如何 运行 在 make 检测到最新的情况下减少 perl 脚本,或者使 perl 脚本的第一个 运行 依赖于需要的更新?

也许有更好的方法可以将构建版本号添加到程序中?

编辑以反映 dash-o 给出的答案,我的简化 make 文件现在包含以下内容:

objects:= pov1.obj
ouf:= pov1
versionFile:= povVersion.txt
VERSION:=$(shell perl ../../../perl/uscripts/bump.pl -inc -dry -f $(versionFile)) #versionFile is not updated until link actually completes
CXX:= cl 
CXXFLAGS:= -c -EHsc -std:c++17 -D$(addprefix VER=,\"$(VERSION)\")

target:=$(addsuffix .exe, $(ouf))

%.obj : %.cpp
    $(CXX) $(CXXFLAGS) $< -Fo$@
     
$(target) : $(objects)
    $(LINKER) $(LDFLAGS) $(objects) /OUT:$(target)
    perl ../../../perl/uscripts/bump.pl -inc -f $(versionFile) #update versionFile here

在我的 C++ 主文件中 pov1.cpp 我有

#ifdef VER
std::string version{VER};
#else
std::string version{"version not set"};
#endif

允许在程序中访问版本号。 perl 脚本是 here

当前解决方案在构建开始时增加版本号(存储在文件中),并在失败时回滚。但是,当脚本未达到 link 时间时,这可能会在多种情况下失败。

作为替代方案,考虑一个不同的解决方案:

  • 新版本号将在构建开始时计算,但版本号不会在文件中更新。
  • 如果构建(linking)成功完成,新版本号将提交到文件

    # The '-get' should return N+1, and should NOT update the file
VERSION:=$(shell perl ../../../perl/uscripts/bump.pl -get -f $(versionFile))

$(target) : $(objects)
    $(LINKER) $(LDFLAGS) $(objects) /OUT:$(target)
    # Commit the new version number, only if build is success
    echo $(VERSION) > $(versionFile)