运行时输出目录的 cmake 生成器表达式

Posted

技术标签:

【中文标题】运行时输出目录的 cmake 生成器表达式【英文标题】:cmake generator expression for runtime output directory 【发布时间】:2015-08-04 19:08:11 【问题描述】:

CMAKE_RUNTIME_OUTPUT_DIRECTORY 是否有生成器表达式?

我想将一个目录复制到运行时输出目录,我目前这样做是这样的:

 add_custom_target(copy_target ALL)
 add_custom_command(TARGET copy_target POST_BUILD
  COMMAND $CMAKE_COMMAND -E copy_directory
      $CMAKE_CURRENT_SOURCE_DIR/foo
      $<TARGET_FILE_DIR:other_target>/foo)

仅复制到 CMAKE_RUNTIME_OUTPUT_DIRECTORY 不适用于为每个配置创建子目录的多配置生成器(Visual Studio、XCode)。

上面的示例有效,但它在other_target 上创建了copy_target 的不必要依赖。我更喜欢$CMAKE_RUNTIME_OUTPUT_DIRECTORY_$&lt;CONFIG&gt; 之类的东西,但这不被接受(出乎意料的&lt;)。此外,该解决方案也应该适用于单一配置生成器,$CMAKE_RUNTIME_OUTPUT_DIRECTORY_$&lt;CONFIG&gt; 可能不会。

$&lt;TARGET_FILE_DIR:copy_target&gt; 也不起作用,因为copy_target 是一个虚拟对象,而不是二进制文件。

【问题讨论】:

【参考方案1】:

变量CMAKE_CFG_INTDIR 可能会有所帮助,例如:

add_custom_command(TARGET copy_target POST_BUILD
  COMMAND $CMAKE_COMMAND -E copy_directory
      $CMAKE_CURRENT_SOURCE_DIR/foo
      $CMAKE_RUNTIME_OUTPUT_DIRECTORY/$CMAKE_CFG_INTDIR/foo)

【讨论】:

【参考方案2】:

我看到 sakra 回答了您的问题,但对于您的具体问题,我没有更好的答案。但我确实有一个建议来简化多配置构建(对于 Visual Studio)和单配置构建(对于 Linux makefile)的使用。我喜欢将输出目录折叠成一个平面结构,所有配置工件都具有唯一的后缀,因此它们不会发生冲突。我使用以下init_output_directories 宏来执行此操作:

# initialize the variables defining output directories
#
# Sets the following variables:
#
# - :cmake:data:`CMAKE_ARCHIVE_OUTPUT_DIRECTORY`
# - :cmake:data:`CMAKE_LIBRARY_OUTPUT_DIRECTORY`
# - :cmake:data:`CMAKE_RUNTIME_OUTPUT_DIRECTORY`
#
# plus the per-config variants, ``*_$<CONFIG>``
#
# @public
#
macro(init_output_directories)

  # Directory for output files
  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY $CMAKE_BINARY_DIR/lib 
    CACHE PATH "Output directory for static libraries.")

  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $CMAKE_BINARY_DIR/lib
    CACHE PATH "Output directory for shared libraries.")

  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $CMAKE_BINARY_DIR/bin
    CACHE PATH "Output directory for executables and DLL's.")

  foreach( OUTPUTCONFIG $CMAKE_CONFIGURATION_TYPES )
    string( TOUPPER $OUTPUTCONFIG OUTPUTCONFIG )
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_$OUTPUTCONFIG "$CMAKE_BINARY_DIR/bin" CACHE PATH "" FORCE)
    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_$OUTPUTCONFIG "$CMAKE_BINARY_DIR/lib" CACHE PATH "" FORCE)
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_$OUTPUTCONFIG "$CMAKE_BINARY_DIR/lib" CACHE PATH "" FORCE)
  endforeach()

endmacro()

【讨论】:

以上是关于运行时输出目录的 cmake 生成器表达式的主要内容,如果未能解决你的问题,请参考以下文章

cmake基础教程(40)生成器表达式

cmake基础教程(40)生成器表达式

CMake / Ninja:当内容未知时递归“清理”输出目录......?

使用 CMake 将 Qt DLL 复制到 Windows 上的可执行目录

CMake:在生成器表达式中使用 true/false 或 on/off 或 yes/no

CMake:如何添加仅针对一种配置执行的自定义命令?