如何实施
我们将按照以下步骤,在模板头文件中对版本进行注册:
- 要跟踪代码版本,我们可以在 CMakeLists.txt 中调用 CMake 的
project
时定义项目版本:cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-04 VERSION 2.0.1 LANGUAGES C)
- 然后,基于
version.h.in
生成version.h
:configure_file( version.h.in generated/version.h @ONLY )
- 最后,我们定义了可执行文件,并提供了目标包含路径:
add_executable(example example.c) target_include_directories(example PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated )
工作原理
当使用版本参数调用 CMake 的 project
时,CMake 将为项目设置 PROJECT_VERSION_MAJOR
、 PROJECT_VERSION_MINOR
和 PROJECT_VERSION_PATCH
。此示例中的关键命令是 configure_file
,它接受一个输入文件(本例中是 version.h.in
),通过将 @
之间的占位符替换成对应的 CMake 变量,生成一个输出文件(本例中是 generate/version.h
)。它将 @ [email protected]
替换为 2,以此类推。使用关键字 @ONLY
,我们将 configure_file
限制为只替换 @ [email protected]
,而不修改 ${variables}
。后一种形式在 version.h.in
中没有使用。但是,当使用 CMake 配置 shell 脚本时,会经常出现。
生成的头文件可以包含在示例代码中,可以打印版本信息:
$ mkdir -p build $ cd build $ cmake .. $ cmake --build . $ ./example This is output from code v2.0.1 Major version number: 2 Minor version number: 0 Hello CMake world!
NOTE : CMake 以 x.y.z
格式给出的版本号,并将变量 PROJECT_VERSION
和 <project-name>_VERSION
设置为给定的值。此外, PROJECT_VERSION_MAJOR
( <project-name>_VERSION_MAJOR
), PROJECT_VERSION_MINOR
( <project-name>_VERSION_MINOR
) PROJECT_VERSION_PATCH
( <project-name>_VERSION_PATCH
) 和 PROJECT_VERSION_TWEAK
( <project-name>_VERSION_TWEAK
),将分别设置为 X
, Y
, Z
和 t
。
更多信息
为了确保只有当 CMake 变量被认为是一个真正的常量时,才定义预处理器变量,可以使用 configure_file
,在配置的头文件中使用 #cmakedefin
而不是 #define
。
根据是否定义了 CMake 变量并将其计算为一个真正的常量, #cmakedefine YOUR_VARIABLE
将被替换为 #define YOUR_VARIABLE …
或者 /* #undef YOUR_VARIABLE */
。还有 #cmakedefine01
,将根据变量是否定义,将变量设置为 0
或 1
。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论