【问题标题】:Create CMake target that copies files/dirs but excludes some items创建复制文件/目录但排除某些项目的 CMake 目标
【发布时间】:2020-08-04 00:12:13
【问题描述】:

我正在尝试使用 add_custom_target 为 C++ 项目生成 CMake 目标,该目标将 CMakeLists.txt 所在目录的内容复制到 ${CMAKE_BINARY_DIR}但不包括给定的文件列表 em>。

虽然这看起来很容易,但我在这里遇到了问题。到目前为止我的尝试:

1) 生成所有文件/目录的列表,删除要排除的项目并使用 CMake 复制命令:

file(GLOB files_to_copy LIST_DIRECTORIES TRUE *)
list(REMOVE_ITEM files_to_copy
  ${CMAKE_CURRENT_SOURCE_DIR}/file_to_exclude.txt
  ${CMAKE_CURRENT_SOURCE_DIR}/dir_to_exclude
  # ...
)
add_custom_target(my-target
  COMMAND ${CMAKE_COMMAND} -E copy ${files_to_copy} ${CMAKE_BINARY_DIR}
)

问题:

  • 以这种方式删除项目适用于字符串比较级别,这可能会导致在使用符号链接时出现问题,例如
  • copy command line tool 显然支持复制目录,但它似乎在我的机器上不起作用,因此目录不会被复制。

2)使用file命令复制文件,不包括部分文件

file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/" DESTINATION ${CMAKE_BINARY_DIR}
  PATTERN "file_to_exclude.txt" EXCLUDE
  PATTERN "dir_to_exclude" EXCLUDE
)

问题:

  • 这正是我想要的,只是命令没有绑定到目标,因此总是被执行。但我只需要将复制操作作为目标。

是否有可能将file(COPY ...) 命令绑定到目标?或者任何其他直接的解决方案来实现我想要的?

请注意,我只想使用 CMake 内置工具,而不执行任何特定于操作系统的 shell 命令(在跨平台项目上工作)。

【问题讨论】:

    标签: c++ cmake copy target


    【解决方案1】:

    CMake scripting commands 仅在 CMake 上下文 中工作并立即执行

    但是add_custom_command(或add_custom_target)中的COMMAND 是在构建工具(例如Makefile)的上下文中执行的,而不是在CMake 上下文中。

    但是,您可以将 CMake 脚本命令放入单独的 CMake 脚本,并从 COMMAND 调用此脚本。此解决方案与CMakeLists.txt 本身具有相同的平台无关属性。

    您可以参数化单独的脚本:

    1. 使用configure_file CMake 命令。
    2. 通过在调用脚本时将-D 参数传递给CMake。

    第一种方法非常简单:编写脚本就像编写CMakeLists.txt 本身一样。但它会为每个参数化集生成额外的文件。

    第二种方法对于多用途(或多用途)脚本很有用,因为它不会为每次使用创建额外的脚本副本。但这需要对参数进行一些设计。

    使用“配置文件”

    copy_sources.cmake.in(好像命令写在CMakeLists.txt):

    file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/" DESTINATION ${CMAKE_BINARY_DIR}
      PATTERN "file_to_exclude.txt" EXCLUDE
      PATTERN "dir_to_exclude" EXCLUDE
    

    )

    CMakeLists.txt

    # Instantiate the parameterized script in the binary directory.
    configure_file(copy_sources.cmake.in copy_sources.cmake)
    
    add_custom_target(my-target
      COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/copy_sources.cmake
    

    )

    使用“-D”参数

    copy_sources.cmake

    # Expect the script to be called from the source directory.
    # This saves one parameter.
    # 
    # DEST_DIR denotes the directory for copy to.
    file(COPY "${CMAKE_SOURCE_DIR}/" DESTINATION ${DEST_DIR}
      PATTERN "file_to_exclude.txt" EXCLUDE
      PATTERN "dir_to_exclude" EXCLUDE
    )
    

    CMakeLists.txt

    add_custom_target(my-target
      COMMAND ${CMAKE_COMMAND}
        -DDEST_DIR=${CMAKE_BINARY_DIR} # all '-D' options should preceed '-P' one
        -P ${CMAKE_CURRENT_SOURCE_DIR}/copy_sources.cmake
      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} # The script assumes proper current directory
    

    )

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      相关资源
      最近更新 更多