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

问题描述 投票:0回答:2

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)不起作用。

上面的示例有效,但它创建了

copy_target
other_target
不必要的依赖。我更喜欢像
${CMAKE_RUNTIME_OUTPUT_DIRECTORY_$<CONFIG>}
这样的东西,但这没有被接受(出乎意料的
<
)。此外,该解决方案也应该适用于单配置生成器,但
${CMAKE_RUNTIME_OUTPUT_DIRECTORY_$<CONFIG>}
可能不会。

而且

$<TARGET_FILE_DIR:copy_target>
不起作用,因为
copy_target
是一个虚拟变量,而不是二进制文件。

cmake cross-platform
2个回答
3
投票

变量 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
投票

我看到帝释回答了你的问题,对于你的具体问题我没有更好的答案。但我确实有一个建议,可以简化多配置构建(针对 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()
© www.soinside.com 2019 - 2024. All rights reserved.