cmake设定项目版本信息

一、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()
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值