【问题标题】:How to define a variable during build with cmake?如何在使用 cmake 构建期间定义变量?
【发布时间】:2018-09-05 03:55:35
【问题描述】:

我想在 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)

感谢您的帮助。

【问题讨论】:

  • 我不太明白你在问什么。你能试着解释一下吗,也许用一个你想做什么和你目前正在做什么的例子?您是否尝试根据自定义目标的输出设置 CMake 变量?
  • 我重新制定它。我首先尝试使用 execute_process 允许定义 OUTPUT_VARIABLE 但计算发生在生成期间,而不是在构建期间。然后我尝试使用不建议 OUTPUT_VARIABLE 的 add_custom_target 和 add_custom_command。
  • 构建在 CMake 完成运行后很长时间才会发生,因此您无法直接提出您的要求。然而,它闻起来像XY problem。你能解释一下你实际上想通过这个实现什么吗?
  • 所以您实际上是在尝试创建构建时变量?
  • 当然,就像是一个开关,只有一个电话,我同意。正如最初提到的,目标是通过构建时间变量提高可读性。不幸的是,这似乎不可能。

标签: cmake


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我相信您误解了 CMake 的角色。简而言之,CMake 为您选择的后端系统(Make、ninja 等)生成构建文件。这是here 的简明评论,其中简要记录了配置/生成步骤以及它在实际构建步骤之前的方式。

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

    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)
    

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

    【讨论】:

    • 我扩展了最初的帖子以试图更清楚。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多