如何在使用cmake的构建过程中定义变量?

时间:2018-09-04 14:41:55

标签: cmake

我想在CMakeLists.txt中定义CMake变量BUILD_TIME_VAR:

  • 在构建阶段使用python脚本进行计算
  • 然后我可以使用$ {VAR}
  • 访问其内容

换句话说,相当于构建阶段:

execute_process(COMMAND bash -c "python $SCRIPT $FILE" OUTPUT_VARIABLE GEN_TIME_VAR)

然后,该变量用于生成依赖于生成二进制文件的文件。

目标是使代码更易于阅读,因为否则,计算将发生多次。

我不想使用n次调用python脚本来计算BUILD_TIME_VAR,而是要使用脚本一次,以这种方式分解代码:

 if(expression_1)
    add_custom_command(OUTPUT foo
    COMMAND cmd_1(${BUILD_TIME_VAR}))

    ...
  elseif(expression_2)
    # elseif section.
    add_custom_command(OUTPUT foo
    COMMAND cmd_2(${BUILD_TIME_VAR}))
    ...
  else(expression_n)
    # else section.
    add_custom_command(OUTPUT foo
    COMMAND cmd_n(${BUILD_TIME_VAR}))
    ...
  endif(expression)

add_custom_target(${BINARY} ALL
DEPENDS foo)

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,则实际上是在尝试创建“构建时变量”。那是构建工具(实际上是CMake支持的 all 所有构​​建工具)必须支持的东西。我不知道在构建工具(make,ninja,VS等)中没有这种功能,因此在CMake中也不支持这种功能。

您可以通过将结果写入文件并在随后的所有使用该文件的构建步骤中读取该文件来进行模拟。

答案 1 :(得分:0)

我相信您误解了CMake的作用。简而言之,CMake会为您选择的后端系统(Make,忍者等)生成构建文件。简明扼要地回顾了here,其中简要记录了配置/生成步骤以及它在实际构建步骤之前的方式。

目前尚不清楚您要实现的目标,但也许定义自定义命令并使用其输出将它们链接到自定义目标以进行进一步的依赖关系链接(请参见DEPENDS here)可能会有所帮助,例如

cmake_minimum_required(VERSION 3.11)

project(foobar)

set(FOO_FILES "foo.txt")

add_custom_command(OUTPUT ${FOO_FILES}
  COMMAND ${CMAKE_COMMAND} -E touch ${FOO_FILES}
  COMMAND echo hello >> ${FOO_FILES}
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Creating ${FOO_FILES}"
  VERBATIM)

add_custom_target(foo DEPENDS ${FOO_FILES})

set(BAR_FILES "bar_dummy.txt") # this is only use to link the custom command to the corresponding custom target

add_custom_command(OUTPUT ${BAR_FILES}
  COMMAND ${CMAKE_COMMAND} -E touch ${BAR_FILES}
  COMMAND cat ${FOO_FILES}
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Displaying ${FOO_FILES}"
  VERBATIM)

add_custom_target(bar DEPENDS ${BAR_FILES})

add_dependencies(bar foo)

但是,您可能需要考虑违反该工具的可能性,因此,在配置项目之前先进行必要的步骤可能会更清楚。