【问题标题】:CMake ExternalProject_Add() that uses a parent folder in its include_directories()CMake ExternalProject_Add() 在其 include_directories() 中使用父文件夹
【发布时间】:2017-06-06 14:21:07
【问题描述】:

我有一个“int_tester”CMake 项目,它使用ExternalProject_Add 来实现它的“drv”依赖项。现在,这个“drv”也是使用 CMake 构建的,它在其 include_directories() 中使用父目录。麻烦的是我不知道如何将这个父文件夹复制到ExternalProject_Add()

目录结构如下:

/  
|-common  
|-IP  
| |-int_tester  
| |-drv  

drv 的 CMakeLists.txt 看起来像:

add_library(SPT_driver STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c)  
target_include_directories(SPT_driver
    PUBLIC  ${CMAKE_CURRENT_SOURCE_DIR}/api/
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../common/include/
)  

int_tester 的 CMakeLists.txt 如下:

add_executable(int_tester ...)  
ExternalProject_Add(drv_ext
    PREFIX ${CMAKE_CURRENT_BINARY_DIR}/drv/drv_dir
    URL ${CMAKE_CURRENT_SOURCE_DIR}/../drv
    INSTALL_COMMAND ""
)
add_library(drv_import STATIC IMPORTED) #phony lib
add_dependencies (drv_import drv_ext) #link phony lib to the external proj
ExternalProject_Get_Property(drv_ext install_dir) #find out where the external proj is installed
set_property(TARGET drv_import PROPERTY IMPORTED_LOCATION ${install_dir}/src/drv_ext-build/obj/drv.a) #so that the phony lib can have a target
include_directories(${install_dir}/src/drv_ext/api) #and to make current executable dependent on api .h and .a of the externally built lib
target_link_libraries(int_tester drv_import)

可以看出,drv 依赖于${CMAKE_CURRENT_SOURCE_DIR}/../../common/include/

当'int_tester'构建'drv'时(通过ExternalProject_Add),找不到文件夹../../common/include/(不是ExternalProject_Add带来的)。即使我为这个公用文件夹添加了另一个伪造的 ExternProject,它的目录结构也不会与 'drv' 的CMakeLists.txt 预期的目录结构相匹配。

请问我错过了什么?

【问题讨论】:

    标签: cmake external-project


    【解决方案1】:

    如果您想使用IP/drv 作为其源目录 构建“drv”,请为ExternalProject_Add 明确指定SOURCE_DIR 选项:

    ExternalProject_Add(drv_ext
        PREFIX ${CMAKE_CURRENT_BINARY_DIR}/drv/drv_dir
        SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../drv
        INSTALL_COMMAND ""
    )
    

    如果没有这个选项,源目录是从 PREFX 中推导出来的(有关该推导的确切算法,请参见 documentation)。


    ExternalProject_Add

    选项URL 表示目录,应复制 到源目录中。如果您不想复制,请不要使用该选项。

    【讨论】:

    • 谢谢,我明白了!然后,为了正确依赖 drv 的 api .h 文件,我应该替换 include_directories(${install_dir}/src/drv_ext/api) - 它不再有效,因为 .h/.c 文件不再复制到install_dir - 带有 [target_] 包含目录(${CMAKE_CURRENT_SOURCE_DIR}/../drv/api),对吗?
    • install_dir 是否仍然有效?您已禁用安装步骤(通过 INSTALL_COMMAND 设置为空字符串),因此不应安装任何内容。至于include_directories,如果drv项目在其源目录中提供了它们,你可以指向那个目录,对吧。
    猜你喜欢
    • 2017-08-24
    • 2016-10-21
    • 1970-01-01
    • 2018-08-13
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多