【问题标题】:CMake: How do I ensure a file is created before reading it to a variable?CMake:如何确保在将文件读取到变量之前创建文件?
【发布时间】:2019-01-21 11:57:43
【问题描述】:

我想将当前的 git commit 哈希读入一个变量并从中生成version.h。这个命令依赖于我的主要目标作为预构建命令,因为version.h必须在构建之前生成:

# Get the current git commit
add_custom_command(
  TARGET ${MY_MAIN_TARGET} PRE_BUILD
  COMMAND git rev-parse HEAD > git-commit.txt
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

这很好用。现在,我想把它读入一个变量:

file(READ "${CMAKE_BINARY_DIR}/git-commit.txt" GIT_COMMIT)

然后生成version.h(本模板使用${GIT_COMMIT}变量):

configure_file(version.h.in "${CMAKE_CURRENT_BINARY_DIR}/version.h" @ONLY)

问题是:我怎样才能让这个文件被读取并且configure_file() 命令只有在git-commit.txt 被创建之后才会发生?有没有办法制作一个只运行 CMake 脚本代码的自定义命令/目标?

还有execute_process()可以直接读入变量,但没有DEPENDS

【问题讨论】:

  • 文件修改由file()configure_file 命令在配置阶段立即执行。当执行add_custom_command 中指定的命令时,此阶段先于 构建阶段。 “有没有办法制作一个只运行 CMake 脚本代码的自定义命令/目标?” - 使用像${CMAKE_COMMAND} -P <script> 这样的COMMAND,您可以在脚本模式 下执行给定的CMake 脚本,在该模式下,命令file()configure_file() 照常工作。
  • 对。我只是想制作一个过于复杂的装置。

标签: cmake


【解决方案1】:

解决方案是像这样简单地使用execute_process

# Get the current commit
execute_process(
  COMMAND git rev-parse HEAD
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  OUTPUT_VARIABLE GIT_COMMIT
  OUTPUT_STRIP_TRAILING_WHITESPACE
)

..然后在 version.h.in 模板中使用该输出变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2020-06-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多