【问题标题】:cmake 2.8 custom target to copy multiple filescmake 2.8 自定义目标复制多个文件
【发布时间】:2019-11-04 21:30:22
【问题描述】:

我不得不在 Linux 环境中使用较旧的 cmake 版本 2.8.12。

作为预构建步骤,我必须将多个头文件从源目录复制到目标目录。我决定使用add_custom_target 子句。如果这本身就是个坏主意,请告诉我。例如:

add_custom_target( prebuild
  COMMENT "Prebuild step: copy other headers"
  COMMAND ${CMAKE_COMMAND} -E copy_if_different  ${CMAKE_SOURCE_DIR}/../other/include/alpha.h  ${CMAKE_SOURCE_DIR}/include/other
  COMMAND ${CMAKE_COMMAND} -E copy_if_different  ${CMAKE_SOURCE_DIR}/../other/include/bravo.h  ${CMAKE_SOURCE_DIR}/include/other
  COMMAND ${CMAKE_COMMAND} -E copy_if_different  ${CMAKE_SOURCE_DIR}/../other/include/charlie.h  ${CMAKE_SOURCE_DIR}/include/other
)

add_executable( myapp main.cxx )

# My application depends on the pre-build step.
add_dependencies( myapp prebuild )

set_target_properties( myapp PROPERTIES COMPILE_FLAGS "-g" )
install( TARGETS myapp DESTINATION ${BIN_INSTALL_DIR} )

列出每个头文件会很乏味。我知道如何搜索所有头文件并将它们放入列表变量中。例如。

file( GLOB other_headers "${CMAKE_SOURCE_DIR}/../other/include/*.h" )

但是,如何将该列表变量放在add_custom_target 子句中使用?

有没有办法在add_custom_target 子句中复制多个文件?

有没有更好的方法来复制多个文件作为预构建步骤,这可能是构建我的应用程序的依赖项?

受限于旧版本的 cmake 限制了我的选择。以下是我尝试过但没有成功的事情。

  • 如果我有 cmake 3.5 版,那么copy_if_different 命令可以采用多个源路径。
  • COMMAND_EXPAND_LISTS 添加到add_custom_target 子句无效。直到更新的 cmake 版本才可以使用。
  • add_custom_target 子句中使用foreach 循环不起作用。在我看到的其他示例中,它们总是使用foreach 循环,而add_custom_target 在该循环内。但是,如果我这样做,那么我不知道如何将其作为构建应用程序的依赖项。

【问题讨论】:

    标签: linux cmake prebuild


    【解决方案1】:

    add_custom_target 子句中使用foreach 循环不起作用。

    但是使用foreach,您可以创建一个包含所有必需命令的变量。然后在 add_custom_target 中使用该变量:

    set(commands)
    
    # Assume 'other_headers' contain list of files
    foreach(header ${other_headers})
      list(APPEND commands
        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${header}  ${CMAKE_SOURCE_DIR}/include/other)
    endforeach()
    
    add_custom_target( prebuild
      COMMENT "Prebuild step: copy other headers"
      ${commands}
    )
    

    【讨论】:

      【解决方案2】:

      您可以使用foreach 为每个头文件添加自定义目标,但也可以将add_dependencies() 调用拉入循环块:

      add_executable( myapp main.cxx )
      
      foreach(cur_header ${other_headers})
        # Get the filename from the full path.
        get_filename_component(my_header_name ${cur_header} NAME)
        # Add a new custom target for the current header.
        add_custom_target( prebuild_${my_header_name}
          COMMENT "Prebuild step: copy other headers"
          COMMAND ${CMAKE_COMMAND} -E copy_if_different ${cur_header} ${CMAKE_SOURCE_DIR}/include/other
        )
        # My application depends on the each pre-build target.
        add_dependencies( myapp prebuild_${my_header_name} )
      endforeach()
      

      【讨论】:

        猜你喜欢
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多