运行时输出目录的 cmake 生成器表达式
cmake generator expression for runtime output directory
是否有 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_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)
我看到 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_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_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)
我看到 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()