小技巧 | 自动生成版本号及编译时间

Posted 嵌入式大杂烩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小技巧 | 自动生成版本号及编译时间相关的知识,希望对你有一定的参考价值。

实际开发中,我们有可能需要对程序的编译时间、版本号进行把控。

实现的方法可能有很多种,这里分享一种便捷的方法——使用cmake的自定义编译选项。

关于cmake的基础知识:Hello系列 | cmake简明基础知识

cmake支持自定义编译选项,我们可以根据项目需要自定义一些编译选项。cmake借助一个.h.in后缀的文件生成对应的.h头文件,而我们的代码中可以使用这个头文件。

假如,我们建立的demo工程结构如下:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)

####################################### 编译模式设置 #######################################
set(DEBUG_VERSION "DebugMode")
set(RELEASE_VERSION "ReleaseMode")
set(COMPILE_MODE $RELEASE_VERSION)            # 编译模式
set(TARGET_NAME "hello")                        # 目标可执行程序名称
string(TIMESTAMP COMPILE_TIME %m%d_%H%M)        # 生成编译时间

# Debug模式(目标:工程名+编译时间)
if($COMPILE_MODE MATCHES $DEBUG_VERSION)   
    message(STATUS "Compile mode: $COMPILE_MODE")
    set(USE_RELEASE_MODE 0)
    set(CMAKE_BUILD_TYPE "Debug")
    set(target $TARGET_NAME_$COMPILE_TIME)
# Release模式(目标:工程名+版本号)
else()
    message(STATUS "Compile mode: $COMPILE_MODE")
    set(USE_RELEASE_MODE 1)
    set(CMAKE_BUILD_TYPE "Release") 
    set(VERSION_MAJOR  0)    # 一级版本号
    set(VERSION_MINOR  0)    # 二级版本号
    set(VERSION_LEVEL3 1)    # 三级版本号
    set(target $TARGET_NAME_V$VERSION_MAJOR.$VERSION_MINOR.$VERSION_LEVEL3)
endif()
project($target)

# 加入一个配置头文件,用于处理 CMake 对源码的设置
configure_file (
  "config.h.in"
  "../config.h"
  )

####################################### 编译选项配置 #######################################
set(CMAKE_CXX_FLAGS "-std=c++11")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -Wall")
set(CMAKE_CXX_FLAGS_DEBUG "$ENVCXXFLAGS -O0 -Wall -g -ggdb")
set(CMAKE_C_FLAGS "-fdata-sections -g -rdynamic -funwind-tables -ffunction-sections -Wall")
set(CMAKE_CXX_FLAGS "-fdata-sections -Wno-psabi") 

####################################### 头文件 ############################################
include_directories(inc)

####################################### 源文件 ############################################
aux_source_directory(src SRCS)

message(STATUS "################## Compile time:$COMPILE_TIME ##################")
add_executable($PROJECT_NAME $SRCS main.c)

我们设置:

  • debug模式:输出的可执行程序名称带有时间戳

  • release模式:输出的可执行程序名称带有版本号。

我们可以在config.h.in文件里增加一些参数来编译生成对应的C/C ++的宏。

比如,config.h.in里的内容:

#define PROJECT_NAME     "@TARGET_NAME@"
#define COMPILE_TIME     "@COMPILE_TIME@"
#define VERSION_MAJOR    @VERSION_MAJOR@
#define VERSION_MINOR    @VERSION_MINOR@
#define VERSION_LEVEL3   @VERSION_LEVEL3@
#define USE_RELEASE_MODE @USE_RELEASE_MODE@

其中,@@符号包含起来的是CMakeLists.txt文件里的变量。

生成对应的头文件config.h:

#define PROJECT_NAME     "hello"
#define COMPILE_TIME     "0305_2055"
#define VERSION_MAJOR    0
#define VERSION_MINOR    0
#define VERSION_LEVEL3   1
#define USE_RELEASE_MODE 1

实现这一过程是借助configure_file命令生成的,输入config.h.in,输出config.h:

configure_file (
  "config.h.in"
  "../config.h"
  )

我们的C源码中可以使用config.h里的内容,比如main.c:

#include "hello.h"
#include "config.h"

int main(void)

    #if USE_RELEASE_MODE
    printf("VERSION: %d.%d.%d\\n", VERSION_MAJOR, VERSION_MINOR, VERSION_LEVEL3);
    #endif
    print_hello();
    
    return 0;

包含了config.h,如果配置为release模式,我们就打印出版本号。

修改CMakeLists.txt里的COMPILE_MODE变量可以切换编译模式。

看看运行结果:

① debug模式:

② release模式:

以上就是本次的分享。如果觉得文章有用,欢迎收藏、转发!

温馨提示

由于微信公众号近期改变了推送规则,如果您想经常看到我们的文章,可以在每次阅读后,在页面下方点一个「赞」或「在看」,这样每次推送的文章才会第一时间出现在您的订阅列表里。

往期推荐:

Hello系列 | cmake简明基础知识

分享几个工作中用到的shell脚本

分享一个轻量级跨平台构建工具!

分享一个程序员必备的知识库系统!

Hello系列 | Shell编程必备简明基础知识

Hello系列 | 静态、动态链接简明知识

在公众号聊天界面回复1024,可获取Linux资源

点击阅读原文,查看更多分享。

以上是关于小技巧 | 自动生成版本号及编译时间的主要内容,如果未能解决你的问题,请参考以下文章

QT小技巧—更好管理项目(增加预编译头文件,并且指定moc文件的生成位置)good

软件版本号命名规则

【小技巧】AS手动实现无线真机调试

语义化版本 2.0.0

Java 代码编译和执行的整个过程

常见的版本号及Springcloud的版本