我是CMake的新手。我有我的项目编译。我有这样的结构
PROJECT
SRC
包含
构建
lib
问题是如何复制所有静态文件,即。从test和example文件夹中以递归方式将它们放在二进制结构外的不同文件夹中?
我的主要CMakeLists.txt文件:
PROJECT(copythefiles)
SET(CMAKE_CURRENT_BINARY_DIR ".")
add_subdirectory(/src/test /lib/test) # I am specifying the location where the files are to be generated
add_subdirectory(/src/example /lib/example)
ADD_CUSTOM_TARGET( a ALL COMMAND ${CMAKE_COMMAND} -E echo "\{X}" > ${CMAKE_CURRENT_BINARY_DIR}/lib/test/libtest.a )
ADD_CUSTOM_COMMAND(TARGET a POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${CMAKE_CURRENT_BINARY_DIR}/lib/test/libtest.a
${CMAKE_CURRENT_BINARY_DIR}/lib/libtest.a )
这会复制文件。但我有大约20个项目,我想递归地做。
谢谢:)
答案 0 :(得分:2)
将顶级CMakeLists.txt文件放在项目的根目录中是正常的。如果将CMakeLists.txt从“/ build”移到根目录,那么您应该能够调用add_subdirectory
而无需为每个案例指定二进制路径。
假设您移动了CMakeLists文件,那么您可以在add_subdirectory
来电之前插入此文件:
function(MoveLib TheTarget)
add_custom_command(TARGET ${TheTarget} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy $<TARGET_FILE:${TheTarget}> ${CMAKE_SOURCE_DIR}/lib)
endfunction()
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/lib)
然后,您可以添加例如库中的CMakeLists.txt文件中有MoveLib(my_test)
,其中my_test
是相关库的名称。
然后,所有库的副本将以“/ lib”结尾。如果您不是真的想要副本,那么您应该查看ARCHIVE_OUTPUT_DIRECTORY
属性。如果您只是添加
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)
然后所有静态库将以“/ lib”结尾。这里有几件值得关注的事情。
ARCHIVE_OUTPUT_DIRECTORY
不涵盖共享库。共享库的详细信息位于ARCHIVE_OUTPUT_DIRECTORY
的文档中。
此外,一些生成器(例如MSVC)将每个配置的子目录附加到指定的目录,因此您最终会得到“/ lib / Debug”,“/ lib / Release”等。您可以绕过这个将特定于配置的CMAKE_ARCHIVE_OUTPUT_DIRECTORY
版本设置为${CMAKE_SOURCE_DIR}/lib
:
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/lib)