根据生成生成文件时不可用的源文件在CMake中创建库

根据生成生成文件时不可用的源文件在CMake中创建库,cmake,Cmake,我有一个CMake配置文件,用于构建两个库: 第三方库(此处称为ThirdPartyLib),包含供应商提供的实时OS/板支持包。它使用autotools工具链在CMake外部构建 以前库的扩展版本(这里称为ExtendedThirdPartyLib) 不幸的是,我需要的一些源代码(各种工具)不是在(1)的普通构建脚本中构建的。因为我不想弄乱供应商构建脚本,所以我想添加另一个库(2),构建丢失的文件,从而从供应商扩展库 我希望能够在cmakfiles.txt中执行类似操作: cmake_mini

我有一个CMake配置文件,用于构建两个库:

  • 第三方库(此处称为ThirdPartyLib),包含供应商提供的实时OS/板支持包。它使用autotools工具链在CMake外部构建
  • 以前库的扩展版本(这里称为ExtendedThirdPartyLib)
  • 不幸的是,我需要的一些源代码(各种工具)不是在(1)的普通构建脚本中构建的。因为我不想弄乱供应商构建脚本,所以我想添加另一个库(2),构建丢失的文件,从而从供应商扩展库

    我希望能够在
    cmakfiles.txt
    中执行类似操作:

    cmake_minimum_required(VERSION 3.2)
    project(bsp)
    include(ExternalProject)
    
    ExternalProject_Add(
      ThirdPartyLib
      URL <http://some.url/bsp.tar.bz2
      BUILD_COMMAND make -C ../external/ThirdPartyLib/src
    )
    set_target_properties(ThirdPartyLib PROPERTIES EXCLUDE_FROM_ALL TRUE)
    
    add_library(ExtendedThirdPartyLib
      ${CMAKE_CURRENT_BINARY_DIR}/some/path/missing_file1.c
      ${CMAKE_CURRENT_BINARY_DIR}/some/path/missing_file2.c
    )
    add_dependencies(ExtendedThirdPartyLib ThirdPartyLib)
    target_include_directories(ExtendedThirdPartyLib PUBLIC
      ${CMAKE_CURRENT_BINARY_DIR}/some/path/include
    )
    target_link_libraries(ExtendedThirdPartyLib ThirdPartyLib)
    
    cmake_最低要求(3.2版)
    项目(bsp)
    包括(外部项目)
    外部项目添加(
    第三方
    
    URL就我个人而言,我不喜欢
    ExternalProject\u Add
    命令,因为它做了太多不合我口味的事情,但我已经离题了

    如果您这样做,其中
    bar
    正在模拟您的
    ExtendedThirdPartyLib
    目标,因为它取决于生成的文件,该怎么办

    cmake_minimum_required(VERSION 3.11)
    
    project(lol C)
    
    set(SOURCES lol.c) # only this file exists
    
    add_library(lol ${SOURCES})
    
    set(FOO_FILES "foo1.c" "foo2.c")
    
    add_custom_command(OUTPUT ${FOO_FILES}
      COMMAND ${CMAKE_COMMAND} -E touch ${FOO_FILES}
      WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
      COMMENT "Creating ${FOO_FILES}"
      VERBATIM)
    
    add_custom_target(foo DEPENDS ${FOO_FILES})
    
    add_library(bar ${FOO_FILES})
    
    add_dependencies(bar foo)
    
    target_link_libraries(lol bar)
    
    整个方法取决于这样一个事实,即获取生成/生成文件的方法是通过自定义命令和关联的自定义目标显式定义的


    您应该修改自定义命令以从tarball中提取所需的文件(例如,甚至可以调用一些外部脚本)(可能需要使用curl或类似工具下载)。

    它似乎可以工作!尽管我不太明白为什么。如果我理解正确,在实际构建过程中会运行自定义命令(生成生成生成文件时不需要)。因此,生成生成生成文件时,要bar的输入源文件仍然不存在,但在这种情况下,CMake似乎可以。@arghol是的,这是正确的,加上自定义命令和自定义目标之间的依赖项“链接”(请参阅我在发布的伪
    CMakeLists.txt
    之后的注释).另外,请看一下关于这两个命令的文档,它非常好,比我在这里给出的任何答案都要完整。