通过 cmake 命令获取 lldb 源码 git tag 信息

最终效果

  • 仅修改源码里 CMakeLists.txt,添加获取 tag 的命令,保存到编译目录新建的头文件里。
  • 通过字符串操作,提取想要的 tag 名称,比如将 tag 原始名称 v9.0.0-sw1.0.0 改为 sw1.0.0。

llvm 中获取 git 信息的思路

llvm 源码里通过 cmake/modules 目录下 VersionFromVCS.cmake 和 GenerateVersionFromVCS.cmake 两个文件来生成 git 源码仓库信息。

lldb 源码里也是调用了 llvm 这个文件来生成自己的 git 信息,之前已经借助 llvm 实现了 tag 获取,但是这里 tag 信息改变了,从而之前额规则不太适用了,这里重新设计了下实现方式,避免与 llvm 耦合。

  1. 新建 version.h 文件到编译目录

set(version_h “${CMAKE_CURRENT_BINARY_DIR}/version.h”)

  1. 添加 git 命令获取 tag 信息,此时 tag 名称为 v9.0.0-sw1.0.0。

execute_process(
COMMAND git describe –tags
WORKING_DIRECTORY ${LLDB_SOURCE_DIR}
RESULT_VARIABLE git_result
OUTPUT_VARIABLE git_tag
OUTPUT_STRIP_TRAILING_WHITESPACE)

  1. 正则匹配 tag 字符串并处理,把 tag 名称改为 sw1.0.0。

string(REGEX MATCHALL “sw.*$” git_tag_new “${git_tag}”)

  1. 将处理后的 tag 信息追加到 version.h 文件里,内容为:#define LLDB_GIT_TAG “sw1.0.0”
    file(APPEND “${version_h}”
    “#define LLDB_GIT_TAG "${git_tag_new}"\n”)

message(STATUS “LLDB_GIT_TAG: ${git_tag_new}”)

  1. 修改 source/lldb.cpp 文件,引入 version.h 头文件,在版本字符串后添加 LLDB_GIT_TAG 宏。

全部修改内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index d229f74..a3d3ad5 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -29,6 +29,20 @@ add_custom_command(OUTPUT "${version_inc}"
"-DHEADER_FILE=${version_inc}"
-P "${generate_vcs_version_script}")

+set(version_h "${CMAKE_CURRENT_BINARY_DIR}/version.h")
+execute_process(
+ COMMAND git describe --tags
+ WORKING_DIRECTORY ${LLDB_SOURCE_DIR}
+ RESULT_VARIABLE git_result
+ OUTPUT_VARIABLE git_tag
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+string(REGEX MATCHALL "sw.*$" git_tag_new "${git_tag}")
+
+file(APPEND "${version_h}"
+ "#define LLDB_GIT_TAG \"${git_tag_new}\"\n")
+message(STATUS "LLDB_GIT_TAG: ${git_tag_new}")
+
# Mark the generated header as being generated.
set_source_files_properties("${version_inc}"
PROPERTIES GENERATED TRUE