运行时输出目录的 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_$<CONFIG>
之类的东西,但这不被接受(出乎意料的<
)。此外,该解决方案也应该适用于单一配置生成器,$CMAKE_RUNTIME_OUTPUT_DIRECTORY_$<CONFIG>
可能不会。
$<TARGET_FILE_DIR:copy_target>
也不起作用,因为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 / Ninja:当内容未知时递归“清理”输出目录......?
使用 CMake 将 Qt DLL 复制到 Windows 上的可执行目录