makefile-cmake 打印 git commit 等编译信息

2024-06-04 00:36

本文主要是介绍makefile-cmake 打印 git commit 等编译信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. makefile-cmake 打印 git commit 等编译信息

  • 1. makefile-cmake 打印 git commit 等编译信息
    • 1.1. 前置条件及目的
    • 1.2. shell 通用方案
    • 1.3. Makefile 方案
    • 1.4. CMakeLists.txt 方案

本方法记录如何在程序中打印版本信息,比如 git commit id, git branch, git tag, 编译时间,编译用户等

1.1. 前置条件及目的

目的:在编译时,记录 git commit 信息,打印到日志中,方便调试定位问题

举例:

目录结构如下

├── build.sh
├── CMakeLists.txt
├── config.h.in
├── makefile
└── src├── CMakeLists.txt└── main.c

先定义 config.h.in 文件,里面定义 SDK_PRJ_USER,SDK_PRJ_TIME,SDK_PRJ_COMMIT 等变量。

#ifndef _SDK_CONFIG_H_
#define _SDK_CONFIG_H_#define SDK_BUILD_USER "@SDK_BUILD_USER@"#define SDK_BUILD_TIME "@SDK_BUILD_TIME@"#define SDK_BUILD_COMMIT "@SDK_BUILD_COMMIT@"#endif /* _SDK_CONFIG_H_ */

在 main.c 里包含 config.h 文件,然后打印这些变量。

#include <stdio.h>
#include "config.h"int main(int argc, char *argv[]) {printf("time %s, user %s, commit %s\n", SDK_BUILD_TIME, SDK_BUILD_USER, SDK_BUILD_COMMIT);return 0;
}

1.2. shell 通用方案

  • 在真正的编译之前,通过 shell 来修改 config.h.in 文件,然后编译。
  • 当然也可以在 shell 中调用编译命令
  • 依赖 sed git 等命令,window 环境需要安装 sed 命令,git自带 sed 命令,将 C:\Program Files\Git\usr\bin 加入环境变量即可

build.sh 文件内容如下:

# project info
SDK_PRJ_USER=`git config user.email`
SDK_PRJ_TIME=`date +%Y%m%d_%H%M%S`
SDK_PRJ_COMMIT=`git rev-parse --short HEAD`cp config.h.in config.h
sed -i 's/#define SDK_BUILD_TIME.*/#define SDK_BUILD_TIME "'${SDK_PRJ_TIME}'"/g' config.h
sed -i 's/#define SDK_BUILD_USER.*/#define SDK_BUILD_USER "'${SDK_PRJ_USER}'"/g' config.h
sed -i 's/#define SDK_BUILD_COMMIT.*/#define SDK_BUILD_COMMIT "'${SDK_PRJ_COMMIT}'"/g' config.hgcc src/main.c -I./

1.3. Makefile 方案

  • 类似于 shell 方案,依赖 sed git 等命令

makefile 文件内容如下:

SDK_PRJ_USER=$(shell git config user.email)
SDK_PRJ_TIME=$(shell date +%Y%m%d_%H%M%S)
SDK_PRJ_COMMIT=$(shell git rev-parse --short HEAD)all: config democonfig:cp config.h.in config.hsed -i 's/#define SDK_BUILD_TIME.*/#define SDK_BUILD_TIME "'$(SDK_PRJ_TIME)'"/g' config.hsed -i 's/#define SDK_BUILD_USER.*/#define SDK_BUILD_USER "'$(SDK_PRJ_USER)'"/g' config.hsed -i 's/#define SDK_BUILD_COMMIT.*/#define SDK_BUILD_COMMIT "'$(SDK_PRJ_COMMIT)'"/g' config.hdemo: $(OBJ1)gcc src/main.c -I./clean:rm -f a.out config.h

1.4. CMakeLists.txt 方案

  • 定义了 git 获取结果的宏,然后调用宏
  • 最顶层 CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.5)PROJECT (DEMO)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)macro(git_cmd_result _git_result)               # 宏的开始find_package(Git QUIET)                     # 查找Git,QUIET静默方式不报错if(GIT_FOUND)execute_process(                          # 执行一个子进程COMMAND ${GIT_EXECUTABLE} ${git_cmd}  # 命令,需要预定义 git_cmd 变量,制定 git 命令OUTPUT_VARIABLE ${_git_result}        # 输出字符串存入变量OUTPUT_STRIP_TRAILING_WHITESPACE      # 删除字符串尾的换行符ERROR_QUIET                           # 对执行错误静默WORKING_DIRECTORY                     # 执行路径${CMAKE_CURRENT_SOURCE_DIR})endif()
endmacro()                      # 宏的结束set(git_cmd rev-parse --short HEAD)  # 查找 commit id
git_cmd_result(SDK_BUILD_COMMIT)set(git_cmd config user.email)       # 查找 git user email
git_cmd_result(SDK_BUILD_USER)set(SDK_BUILD_TIME "")
string(TIMESTAMP SDK_BUILD_TIME %Y%m%d_%H%M%S)# 配置文件
configure_file(${PROJECT_SOURCE_DIR}/config.h.in ${PROJECT_BINARY_DIR}/include/config.h)ADD_SUBDIRECTORY(src)
  • src/CMakeLists.txt 文件
MESSAGE(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR})INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR}/include)
ADD_EXECUTABLE(demo main.c)

这篇关于makefile-cmake 打印 git commit 等编译信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028566

相关文章

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

IDEA实现回退提交的git代码(四种常见场景)

《IDEA实现回退提交的git代码(四种常见场景)》:本文主要介绍IDEA实现回退提交的git代码(四种常见场景),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.已提交commit,还未push到远端(Undo Commit)2.已提交commit并push到