以递归方式使用copy_if_different CMake复制文件

时间:2012-10-31 20:09:24

标签: cmake

我是CMake的新手。我有我的项目编译。我有这样的结构

PROJECT

  • SRC

    1. 测试
      .cpp(所有源文件)和此文件夹的CMakeLists.txt(创建静态库)
    2. 示例
      .cpp(所有源文件)和此文件夹的CMakeLists.txt(创建静态库)
  • 包含

    1. 测试
      .h(所有头文件)
    2. 示例
      .h(所有头文件)
  • 构建

    1. CMakeLists.txt(主要CMakelist文件)
  • lib

    1. test(包含生成的文件)
    2. 示例(包含生成的文件)

问题是如何复制所有静态文件,即。从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个项目,我想递归地做。

谢谢:)

1 个答案:

答案 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)