如何使用 cmake 将 git SHA1 作为定义传递给编译器?

2023-12-08

在 Makefile 中,这可以通过以下方式完成:

g++ -DGIT_SHA1="`git log -1 | head -n 1`" ...

这非常有用,因为二进制文件知道确切的提交 SHA1,因此可以在发生段错误时转储它。

我怎样才能用 CMake 达到同样的效果?


我制作了一些 CMake 模块,这些模块可以查看 git 存储库以进行版本控制和类似目的 - 它们都在我的存储库中https://github.com/rpavlik/cmake-modules

这些函数的好处是,每次 HEAD 提交更改时,它们都会在构建之前强制重新配置(重新运行 cmake)。与使用execute_process只执行一次操作不同,您不需要记住重新cmake来更新哈希定义。

为了这个特定的目的,你至少需要GetGitRevisionDescription.cmake and GetGitRevisionDescription.cmake.in文件。然后,在你的主要CMakeLists.txt文件,你会有这样的东西

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/whereYouPutMyModules/")
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA1)

然后,您可以将其添加为系统范围的定义(不幸的是,这会导致大量重建)

add_definitions("-DGIT_SHA1=${GIT_SHA1}")

或者,我建议的替代方案:制作生成的源文件。在源中创建这两个文件:

GitSHA1.cpp.in:

#define GIT_SHA1 "@GIT_SHA1@"
const char g_GIT_SHA1[] = GIT_SHA1;

GitSHA1.h:

extern const char g_GIT_SHA1[];

将其添加到您的CMakeLists.txt(假设您在 SOURCES 中有一个源文件列表):

configure_file("${CMAKE_CURRENT_SOURCE_DIR}/GitSHA1.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/GitSHA1.cpp" @ONLY)
list(APPEND SOURCES "${CMAKE_CURRENT_BINARY_DIR}/GitSHA1.cpp" GitSHA1.h)

然后,你有一个包含 SHA 字符串的全局变量 - 当 SHA 改变时,带有 extern 的标头不会改变,因此你可以只包含你想要引用该字符串的任何地方,然后只有生成的 CPP 需要每次提交时都会重新编译,以便您可以在任何地方访问 SHA。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 cmake 将 git SHA1 作为定义传递给编译器? 的相关文章

  • CMakeLists.txt:30(项目)处的 CMake 错误:找不到 CMAKE_C_COMPILER

    我正在尝试使用 CMake 制作 Visual Studio 解决方案来编译最新版本的 aseprite 并且 CMake 不断向我提供 No CMAKE C COMPILER could be found No CMAKE CXX COM
  • 无法使用 git 推送或获取 [重复]

    这个问题在这里已经有答案了 我可以拉 但无法使用 git 版本 1 9 5 推送或获取 它突然开始给我以下错误 关于如何修复它有什么想法吗 git fetch fatal unable to access https email prote
  • 如何签出仅在“git ls-remote”中列出的分支?

    我遇到了无法切换到仅列出的分支的情况git ls remote 这是详细信息 我分叉了一个 github repoA 作为 repoB 创建了自己的分支并将其推送到 ComputerA 中的 repoB 在 ComputerB 中 我将分叉
  • 在 CMake 中使用 -isystem 而不是 -I

    在使用 gcc 构建时 CMake 是否有任何方法可以强制通过 include directories 或者可能通过不同的函数 指定的路径使用 isystem 标志而不是 I 标志 See http gcc gnu org onlinedo
  • 为什么 git-svn 应该积极搜索旧历史?

    当我运行 git svn clone s 时发生了一些奇怪的事情 尽管以下信息告诉我们不要惊慌 但我想知道为什么会出现这种 svn 错误 为什么这个路径不存在 是被别人删除了吗 如果是 为什么 git svn 应该积极搜索旧历史记录 Ini
  • 如何让 Gitlab 运行程序在成功构建时将代码合并到分支中

    嗯 标题几乎是不言自明的 总之 如果构建成功 我希望将一个分支 即开发 合并到另一个分支 即生产 我尝试了 jakub kania 解决方案 但我总是得到id rsa invalid format 我认为 gitlab 秘密变量以某种方式被
  • 如何使用 Clang 编译器和 CMake 进行分析

    Question 1 What output我应该期待当我想使用进行分析时clang编译器 2 我该怎么办profiling for a C project它使用clang作为编译器andCMake 作为构建工具 重新分析我所使用的内容 1
  • 为别名命令添加“git help”?

    我已经实现了一个 Git 命令并使用 git 别名将其连接到 Git 但是有没有办法连接 Git 帮助 我在 Windows 上运行 如果我发出git help mycmd我收到一个弹出窗口 告诉我 Git 找不到 git mycmnd h
  • GIT 和 Ruby:如何从 ruby​​ 脚本内部取消设置 GIT_DIR 变量?

    我编写了一个非常简单的 部署 脚本作为我的post update挂钩到我的裸 git 存储库中 变量如下 live domain mydomain com staging domain stage mydomain com git repo
  • 如何让 git 显示作者日期指定日期范围内的提交?

    显然this https stackoverflow com a 11189286 281545 git log all after
  • 如何恢复已删除的远程分支

    我们的远程主分支被删除 我有主存储库的本地副本 但它已经过时了 我可以通过将最后一个已知的提交哈希值插入 URL 来查看 github 中的分支 但未能成功恢复它 我尝试了几个步骤来恢复它 git reset hard 16deddc05c
  • 如何获取 git 存储库中所有文件的计数?

    如何获取 git 存储库中当前所有文件的计数 您可以使用以下命令获取 git 存储库中所有跟踪文件的计数 git ls files wc l 命令分解 The git ls files命令本身打印出存储库中所有跟踪文件的列表 每行一个 Th
  • Git 中的数据完整性?

    我现在已经多次听到提到 Git 提供数据完整性 但是 这是什么意思 据我所知 git 中的所有对象都是使用 SHA 1 校验和来访问的 并且该校验和是根据文件的内容计算的 这意味着如果文件发生更改 您将得到不同的校验和 但这如何提供数据完整
  • GitPython 检查 git pull 是否更改了本地文件

    使用 GitPython 我只想在拉取后本地文件发生更改时才调用函数 例如 如果我在一台单独的计算机上进行推送 然后拉第一台计算机 它按预期工作 但不提供任何输出 理想的输出是已更改的文件列表 或者只是告诉我拉动是否有错误 没有拉动 因为分
  • 如何有条件地将 ALL 选项添加到 add_custom_target()?

    我想有条件地包含目标docs html to ALL如果用户选择 DO HTML 切换cmake gui 如何避免这种丑陋的代码重复 cmake minimum required VERSION 3 3 FATAL ERROR projec
  • 合并后 Git 分支和提交历史记录

    我正在开发一个项目 单独 对于我开发的每个功能 我都会创建一个新分支 处理该功能 然后将其合并到 master 中 所以通常我不会同时在两个不同的分支上工作 也不会在一个分支上工作时接触master 当我合并一个分支时 我看到 使用gitx
  • Git 删除其他人从远程所做的最后提交

    所以 我的情况是 错误地 我已经授予某人对我的分支的承诺 现在 在我的本地 我已经进行了提交 当我尝试将其推送到远程时 它显示远程在前面 因为对方已经将他的代码推送到了这个分支并进行了多次提交 现在 我可以从远程删除这些提交而不将拉取到本地
  • 如何使用 git 找到一个分支中但不在另一个分支中的所有提交?

    我有两个分行master and live Master是发展 分支并包含尚未准备好进入的提交live 如果在master需要进入的分支live树枝然后他们被樱桃采摘master to live 有时会做出承诺live分支然后是 樱桃摘入m
  • git rebase 吃了我的提交!为我翻译“git reflog”输出?

    我已经完成了五次提交 我想在推送它们之前将它们全部合并为一次提交 出于某种原因 我决定尝试通过与通常使用的不同的方式来做到这一点 FWIW 我试图按照此处的说明进行操作http gitready com advanced 2009 02 1
  • 是否可以使用“git gc”来打包引用日志对象?

    正如答案所暗示的https stackoverflow com a 32025729 https stackoverflow com a 32025729我已经配置了远程裸仓库 git config gc pruneExpire never

随机推荐

  • 跨程序集边界返回/使用动态匿名类型

    下面的代码效果很好 如果Get and Use方法位于不同的程序集中 代码失败并出现 RuntimeBinderException 这是因为 Net运行时系统只保证匿名类型的通用性
  • 简单的正则表达式在 jQuery 中提取方括号之间的内容

    我有一堆名称类似于 comp 1 Field 或 comp 3 AnotherField 的元素 其中索引 1 或 3 发生变化 我正在尝试从名称中提取索引 现在我正在使用 var index input last attr name ma
  • SpreadsheetFormatRow 突然停止工作

    我见过this帖子 但看起来确实有解决方案 无论如何 我正在使用 ColdFusion 10 生成 Excel 电子表格 但是 当我使用 SpreadsheetFormatRow 并传入要格式化的行时 它只执行大约 3 个操作 然后突然停止
  • 通过 Jenkins CI 工具执行 AUTO IT EXE

    我正在使用 CI Jenkins 工具并尝试执行 AUTO IT Exe 文件 我尝试通过詹金斯 使用以下选项 但是什么都没有解决 执行命令行参数 批处理文件 ant file Windows 运行器插件 通过 Jenkins 在从属设备上
  • 如果其中一个是使用 Popen 启动的,为什么两个 Python 脚本之间的套接字连接会中断?

    所以我有两个非常简单的 python 脚本通过套接字进行通信 现在它们都在同一台 Windows PC 上运行 这是控制器 py import socket import time import sys from subprocess im
  • 无法使用 Python 将阿拉伯语解码的 Unicode 保存到 CSV 文件

    我正在使用 python 的 Twitter 流媒体包 我目前正在使用以 unicode 编写的关键字来搜索包含该单词的推文 然后 我使用 python 创建推文的数据库 csv 文件 但是 当我将推文保存到 csv 中时 我想将它们转换回
  • 了解用户是否启动了应用程序

    好吧 这个标题可能看起来很奇怪 但请耐心听我说 我有一个应用程序 用户可以根据其首选项进行设置 以便在登录时启动 这意味着我可以预期有时该应用程序将由用户启动 单击 Dock Finder 等 但有时该应用程序将在登录时由系统自动启动 我想
  • 如何从 UITableView 中删除选定的行? [复制]

    这个问题在这里已经有答案了 可能的重复 将表更改为编辑模式并删除普通 ViewController 中的行 我想从 tableView 中删除选定的行 我想向用户提供当用户在行上滑动或轻弹手指时删除该行的功能 我知道编辑风格提供了一个带有
  • 使用 std::chrono 在 C++ 中输出日期和时间

    我一直在升级一些旧代码 并尽可能更新到 c 11 以下代码是我在程序中显示时间和日期的方法 include
  • 如何使用 picasso 库实现我自己的磁盘缓存 - Android?

    我正在使用 picasso 库为我的应用程序加载图像 但我不知道如何使用 picasso 库实现我自己的磁盘 sdcard 缓存 Picasso 使用 HTTP 客户端进行磁盘缓存 如果已经配置 它将使用该客户端而不是安装自己的客户端 对于
  • 更改 UISegmentedControl 的高度

    我正在尝试改变高度UISegmentedControl使用此代码 CGRect frame mySegmentedControl frame mySegmentedControl setFrame CGRectMake frame orig
  • 我只需要重写 Toast 类的 show()

    我只需要覆盖show 方法为Toast班级 我创建了一个扩展的类Toast类 但随后我创建了一条 toast 消息 但出现异常setView View view 还没有被调用 但我不想创建自定义View方法 但使用默认方法 那么 如何才能覆
  • SecurityAttribute.Unrestricted 问题

    我对这个属性感到困惑 正如这里提到的 http msdn microsoft com en us library system security permissions securityattribute unrestricted aspx
  • 使用自定义 CSS 将 HTML 文件加载到 WebView

    我的 Android 应用程序上有一个 WebView 可以加载 WebView loadUrl 手机内部存储中的不同本地 HTML 文件 我想为它们添加一些自定义 css 样式 现在 我可以让我的应用程序编辑每个 HTML 文件并添加 C
  • scipy curve_fit 不喜欢数学模块

    在尝试创建一个示例时scipy optimize curve fit我发现scipy似乎与Python的不兼容math模块 而函数f1工作正常 f2抛出错误消息 from scipy optimize import curve fit fr
  • 添加到词典的不同方式

    有什么区别Dictionary add key value and Dictionary key value 我注意到最后一个版本没有抛出ArgumentException插入重复密钥时 但有什么理由更喜欢第一个版本 Edit 请问谁有这方
  • 警告:无法访问代码,使用 Reactjs

    我正在使用 ReactJs 我有两个组件 PrescriptionIndex 和 PrescriptionNew 将一个组件与另一个组件集成 这是我的第一个组件 PrescriptionNew import React Component
  • 为什么我的 Java 中的 PriorityBlockingQueue 无法正确排序?

    由于某种原因 当我添加到优先级队列时 它不会完全按字母顺序对我的字符串进行排序 我不明白为什么 这是添加到 PriorityBlockingQueue 的代码 String toAdd String format s s directory
  • 在 JTextField 上设置光标

    我正在用 Java 制作一个使用 JTextField 的小型应用程序 现在 我希望 一旦运行应用程序 光标就会自动放置在该位置 以便用户不必单击它然后编写文本 我已经尝试了在网上找到的几乎所有内容 setCaretPosition 0 g
  • 如何使用 cmake 将 git SHA1 作为定义传递给编译器?

    在 Makefile 中 这可以通过以下方式完成 g DGIT SHA1 git log 1 head n 1 这非常有用 因为二进制文件知道确切的提交 SHA1 因此可以在发生段错误时转储它 我怎样才能用 CMake 达到同样的效果 我制