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

相关文章

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

git ssh key相关

step1、进入.ssh文件夹   (windows下 下载git客户端)   cd ~/.ssh(windows mkdir ~/.ssh) step2、配置name和email git config --global user.name "你的名称"git config --global user.email "你的邮箱" step3、生成key ssh-keygen

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个