重庆定制网站开发价格,龙岗区网络科技有限公司,服务器网站开发,廊坊网站建设电话准备
windows下设置文件的版本需要通过VERSIONINFO接口#xff0c;详情参考VERSIONINFO resource。这里我们根据模板做了一定的修改。
1 VERSIONINFOFILEVERSION ${GIT_VERSION} //文件版本号#xff0c;必填。以,分隔#xff0c;输出以.分隔。这里是取CMakeLists里的GIT_…准备
windows下设置文件的版本需要通过VERSIONINFO接口详情参考VERSIONINFO resource。这里我们根据模板做了一定的修改。
1 VERSIONINFOFILEVERSION ${GIT_VERSION} //文件版本号必填。以,分隔输出以.分隔。这里是取CMakeLists里的GIT_VERSION变量PRODUCTVERSION ${GIT_VERSION} //产品版本号必填。以,分隔。虽然没起作用见下面的ProductVersionFILEFLAGSMASK 0x17L
#ifdef _DEBUGFILEFLAGS 0x1L
#elseFILEFLAGS 0x0L
#endifFILEOS 0x4LFILETYPE 0x0LFILESUBTYPE 0x0L
BEGINBLOCK StringFileInfoBEGINBLOCK 040904b0BEGINVALUE FileDescription, MyLibrary Binary //文件说明VALUE FileVersion, 1.1.1 //文件版本好像没啥用只与FILEVERSION相关VALUE InternalName, //VALUE LegalCopyright, Copyright (C) 2019VALUE OriginalFilename, VALUE ProductName, 1234 //产品名称VALUE ProductVersion, 1.3.4.5.6 //产品版本与PRODUCTVERSION无关,直接输出 //${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},${PROJECT_VERSION_PATCH},${PROJECT_VERSION_TWEAK}ENDENDBLOCK VarFileInfoBEGINVALUE Translation, 0x409, 1200END
END
注意事项
FILEVERSION和PRODUCTVERSION为必填项。内容以,分隔输出以.分隔(如设置为1,1,3,5则实际输出版本为1.1.3.5)。可以直接是一整个变量也可以是多个变量以,隔开。而后面BLOCK块中内容都是全量输出不做调整。目前实验显示FILEVERSION内容管理实际输出的文件版本号而产品版本号不由PRODUCTVERSION管理反而由后面BLOK块中的ProductVersion控制。不知道是为啥。
调用versioninfo
前面已经准备号了versioninfo.接下来需要在CMakeLists中接入versioninfo。
首先将上面的versioninfo模板内容写入到文件中并命名为versioninfo.rc(名字不重要只要后续引用这个文件即可)先在CMakeLists中手动写一个版本号(动态获取后面介绍),GIT_VERSION与versioninfo.rc中引用的变量名保持一致
set(GIT_VERSION 1,2,0,4)
通过config_file()命令将文件拷贝到指定文件或目录下。这里使用的时MSVC编译器所以对MSVC进行判断了。
if(MSVC)set(VERSIONINFO_RC ${CMAKE_BINARY_DIR}/versioninfo.rc)configure_file(${CMAKE_SOURCE_DIR}/versioninfo.rc${VERSIONINFO_RC})
endif()
创建输出文件(dll/exe)时包含versioninfo.rc资源
add_executable(${PROJECT_NAME} ${SOURCES} ${VERSIONINFO_RC})
cmake之后编译查看生成的可执行文件详细信息内容。
动态获取版本号
这里采用的是cmake的execute_process运行git命令获取版本并对结果进行截取组合达到我们想要的内容。
execute_process表示运行命令可以与git其他命令结合获取其他信息。 #######################
####获取git版本#########
#######################
#设置默认版本
set(GIT_VERSION 1.0.0)
#通过git命令获取版本
execute_process(COMMAND git describe --tags
OUTPUT_VARIABLE GIT_DESCRIBE)# set(GIT_DESCRIBE ${GIT_DESCRIBE}-8-)
#查找版本
string(REGEX MATCH [0-9]\\.[0-9]\\.[0-9] GIT_DESCRIBE_VERSION ${GIT_DESCRIBE})
message(STATUS GIT_DESCRIBE_VERSION${GIT_DESCRIBE_VERSION})
if(NOT ${GIT_DESCRIBE_VERSION} EQUAL )
set(GIT_VERSION ${GIT_DESCRIBE_VERSION})
endif()#查找提交次数
string(REGEX MATCHALL -([0-9])- MATCH_COMMIT_RET ${GIT_DESCRIBE})
message(STATUS MATCH_COMMIT_RET${MATCH_COMMIT_RET})
list(LENGTH MATCH_COMMIT_RET MATCH_COMMIT_RET_LEN)message(STATUS MATCH_COMMIT_RET_LEN${MATCH_COMMIT_RET_LEN})if(${MATCH_COMMIT_RET_LEN} GREATER 0)
#拿到最后一个匹配项
math(EXPR MATCH_COMMIT_RET_LEN ${MATCH_COMMIT_RET_LEN} - 1)
message(STATUS MATCH_COMMIT_RET_LEN${MATCH_COMMIT_RET_LEN})
list(GET MATCH_COMMIT_RET ${MATCH_COMMIT_RET_LEN} MATCH_LAST)
#获取
string(REGEX REPLACE -(.)- \\1 GIT_COMMIT_COUNT ${MATCH_LAST})
set(GIT_VERSION ${GIT_VERSION}.${GIT_COMMIT_COUNT})
else()#没有则默认写0
set(GIT_VERSION ${GIT_VERSION}.0)
endif()string(REPLACE . , GIT_VERSION ${GIT_VERSION})
# set(GIT_VERSION 1,2,0)
# message(STATUS final version is ${GIT_VERSION})
##################################END#######################################
缺陷
这里因为是按照我们设想的git tag版本格式(x.x.x)并根据git describe会自动返回version-提交次数-g当前提交hash内容所写的。目的就是提炼成version.提交次数也就是x.x.x.x形式。所以这就要求在打tag的时候需要注意一定的格式否则这个代码将不起作用。
此外git describe对于轻量标签不起作用只有附注标签生效。
完整代码
cmake_minimum_required(VERSION 3.10)project(gitversion)#######################
####获取git版本#########
#######################
#设置默认版本
set(GIT_VERSION 1.0.0)
#通过git命令获取版本
execute_process(COMMAND git describe --tagsOUTPUT_VARIABLE GIT_DESCRIBE)# set(GIT_DESCRIBE ${GIT_DESCRIBE}-8-)
#查找版本
string(REGEX MATCH [0-9]\\.[0-9]\\.[0-9] GIT_DESCRIBE_VERSION ${GIT_DESCRIBE})
message(STATUS GIT_DESCRIBE_VERSION${GIT_DESCRIBE_VERSION})
if(NOT ${GIT_DESCRIBE_VERSION} EQUAL )set(GIT_VERSION ${GIT_DESCRIBE_VERSION})
endif()#查找提交次数
string(REGEX MATCHALL -([0-9])- MATCH_COMMIT_RET ${GIT_DESCRIBE})
message(STATUS MATCH_COMMIT_RET${MATCH_COMMIT_RET})
list(LENGTH MATCH_COMMIT_RET MATCH_COMMIT_RET_LEN)message(STATUS MATCH_COMMIT_RET_LEN${MATCH_COMMIT_RET_LEN})if(${MATCH_COMMIT_RET_LEN} GREATER 0)#拿到最后一个匹配项math(EXPR MATCH_COMMIT_RET_LEN ${MATCH_COMMIT_RET_LEN} - 1)message(STATUS MATCH_COMMIT_RET_LEN${MATCH_COMMIT_RET_LEN})list(GET MATCH_COMMIT_RET ${MATCH_COMMIT_RET_LEN} MATCH_LAST)#获取string(REGEX REPLACE -(.)- \\1 GIT_COMMIT_COUNT ${MATCH_LAST})set(GIT_VERSION ${GIT_VERSION}.${GIT_COMMIT_COUNT})
else()#没有则默认写0set(GIT_VERSION ${GIT_VERSION}.0)
endif()string(REPLACE . , GIT_VERSION ${GIT_VERSION})
# set(GIT_VERSION 1,2,0)
# message(STATUS final version is ${GIT_VERSION})
##################################END########################################这里需要注意按顺序
if(MSVC)set(VERSIONINFO_RC ${CMAKE_BINARY_DIR}/versioninfo.rc)configure_file(${CMAKE_SOURCE_DIR}/versioninfo.rc${VERSIONINFO_RC})
endif()file(GLOB SOURCES *.cpp)
add_executable(${PROJECT_NAME} ${SOURCES} ${VERSIONINFO_RC})target_include_directories(${PROJECT_NAME} PRIVATE${CMAKE_SOURCE_DIR})
注意事项
需要注意这里add_executable中引用了versioninfo.rc文件而versioninfo.rc文件中引用了GIT_VERSION变量所以GIT_VERSION变量的获取需要放在最前面然后是引入versioninfo.rc最后是add_executable否则会导致编译时GIT_VERSION变量内容为空编译不过。
其他
另一种方式是通过cmake的PROJECT_VERSION,PROJECT_VERSION_MAJOR, PROJECT_VERSION_MINOR, PROJECT_VERSION_PATCH, PROJECT_VERSION_TWEAK来获取,但是无法动态调整版本号需要手动修改。
代码如下
cmake_minimum_required(VERSION 3.10)project(cmakeversion VERSION 1.2.5.8)#这里需要注意按顺序
if(MSVC)set(VERSIONINFO_RC ${CMAKE_BINARY_DIR}/versioninfo.rc)configure_file(${CMAKE_SOURCE_DIR}/versioninfo.rc${VERSIONINFO_RC})
endif()file(GLOB SOURCES *.cpp)
add_executable(${PROJECT_NAME} ${SOURCES} ${VERSIONINFO_RC})target_include_directories(${PROJECT_NAME} PRIVATE${CMAKE_SOURCE_DIR})include(CMakePackageConfigHelpers)
configure_package_config_file(Config.cmake.in${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmakeINSTALL_DESTINATION lib/cmake/${PROJECT_NAME})
write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmakeVERSION ${PACKAGE_VERSION} COMPATIBILITY AnyNewerVersion )install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmakeDESTINATION lib/cmake/${PROJECT_NAME} )message(status version${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK})
此外需要引用Config.cmake.in
PACKAGE_INITset_and_check(CMAKEVERSION_INCLUDE_DIR PACKAGE_INCLUDE_INSTALL_DIR)
set_and_check(CMAKEVERSION_SYSCONFIG_DIR PACKAGE_SYSCONFIG_INSTALL_DIR)check_required_components(Cmakeversion)