一、version.h.in模板文件
#pragma once
#define VER_MAJOR 1
#define VER_MINOR 0
#define VER_BUILD 1
#define VER_REVISION @PROJECT_REVISION@
#define Stringizing(v) #v
// generate rights
#define COPYRIGHT_STR() \
"Copyright (C) " "@PROJECT_BUILD_YEAR@"
// generate version string
#define VER_STR(major,minor,build,revision) \
"V" Stringizing(major) "." Stringizing(minor) "." Stringizing(build) "." Stringizing(revision) " " __DATE__ " " __TIME__
// generate file version
#define FILE_VERSION_STR(major,minor,build,revision) \
"V" Stringizing(major) "." Stringizing(minor) "." Stringizing(build) "." Stringizing(revision) "-" "@PROJECT_BUILD_DATE@" "T" "@PROJECT_BUILD_TIME@"
// generate product version
#define PRODUCT_VERSION_STR(major,minor,build,revision) \
"V" Stringizing(major) "." Stringizing(minor) "." Stringizing(build) "." Stringizing(revision) "-" "@PROJECT_BUILD_DATE@" "T" "@PROJECT_BUILD_TIME@"
二、version.rc
// version.rc.in
#include <Version.h>
1 VERSIONINFO
FILEVERSION VER_MAJOR, VER_MINOR, VER_BUILD, VER_REVISION
PRODUCTVERSION VER_MAJOR, VER_MINOR, VER_BUILD, VER_REVISION
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x0L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "FileDescription", ""
VALUE "FileVersion", FILE_VERSION_STR(VER_MAJOR,VER_MINOR,VER_BUILD,VER_REVISION)
VALUE "InternalName", ""
VALUE "LegalCopyright", COPYRIGHT_STR()
VALUE "OriginalFilename", ""
VALUE "ProductName", ""
VALUE "ProductVersion", PRODUCT_VERSION_STR(VER_MAJOR,VER_MINOR,VER_BUILD,VER_REVISION)
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
PS:version.rc在所做目录源文件目录/version/version.rc
三、svn/git提交revision获取函数
# generate project version
function(modify_project_version)
string(TIMESTAMP PROJECT_BUILD_YEAR "%Y")
string(TIMESTAMP PROJECT_BUILD_DATE "%Y%m%d")
string(TIMESTAMP PROJECT_BUILD_TIME "%H%M%S")
# get svn/git commit reversion
if(EXISTS "${PROJECT_STORE_PATH}/.git/")
find_package(Git)
if(GIT_FOUND)
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags RESULT_VARIABLE res_code OUTPUT_VARIABLE GIT_COMMIT_ID)
if(${res_code} EQUAL 0)
message("-- Get git revision success")
# -g: tag of git
string(FIND ${GIT_COMMIT_ID} "-g" pos)
if(${pos} GREATER 0)
string(SUBSTRING ${GIT_COMMIT_ID} ${pos} -1 COMMIT_ID)
string(SUBSTRING ${COMMIT_ID} 2 -1 PROJECT_REVISION)
message("-- Git commit id: ${PROJECT_REVISION}")
endif()
else(${res_code} EQUAL 0)
message( WARNING "-- Git failed (not a repo, or no tags). Build will not contain git revision info." )
endif(${res_code} EQUAL 0)
else(GIT_FOUND)
message("-- Git not found!)")
endif(GIT_FOUND)
else(EXISTS "${PROJECT_STORE_PATH}/.git/")
if(EXISTS "${PROJECT_STORE_PATH}/.svn/")
FIND_PACKAGE(Subversion)
if(SUBVERSION_FOUND)
Subversion_WC_INFO(${CMAKE_CURRENT_SOURCE_DIR} Project)
SET(PROJECT_REVISION ${Project_WC_REVISION})
message("-- Svn revision:${PROJECT_REVISION}")
else(SUBVERSION_FOUND)
message("-- Can't find packet Subversion")
endif(SUBVERSION_FOUND)
else()
message(ERROR "-- Svn directory not exists")
endif(EXISTS "${PROJECT_STORE_PATH}/.svn/")
endif(EXISTS "${PROJECT_STORE_PATH}/.git/")
# generate the version file
set(VERSION_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Version/Version.h)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/Version/Version.h.in"
"${VERSION_FILE}"
@ONLY)
endfunction()
四、版本信息获取
CMakeList.txt调用modify_project_version()