如果是最新的则采取行动
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)
我有一个由 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)