CMake ExternalProject_Add() 在其 include_directories() 中使用父文件夹
CMake ExternalProject_Add() that uses a parent folder in its include_directories()
我有一个 'int_tester' CMake 项目,它使用 ExternalProject_Add
作为其 'drv' 依赖项。现在,这个 'drv' 也是使用 CMake 构建的,它在其 include_directories() 中使用父目录。麻烦的是我不知道如何将这个父文件夹复制到 ExternalProject_Add()
.
目录结构如下:
/
|-common
|-IP
| |-int_tester
| |-drv
CMakeLists.txt 对于 drv 看起来像:
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/
)
CMakeLists.txt 对于 int_tester 喜欢:
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
预期的目录结构相匹配。
请问我遗漏了什么?
如果要使用 IP/drv
作为其 源目录 构建 'drv',请明确指定 SOURCE_DIR ExternalProject_Add
的选项:
ExternalProject_Add(drv_ext
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/drv/drv_dir
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../drv
INSTALL_COMMAND ""
)
如果没有这个选项,源目录是从 PREFX 中推导出来的(请参阅 documentation 了解该推导的确切算法)。
Option URL for ExternalProject_Add
表示目录,应复制到源文件中。如果您不想复制,请不要使用该选项。
我有一个 'int_tester' CMake 项目,它使用 ExternalProject_Add
作为其 'drv' 依赖项。现在,这个 'drv' 也是使用 CMake 构建的,它在其 include_directories() 中使用父目录。麻烦的是我不知道如何将这个父文件夹复制到 ExternalProject_Add()
.
目录结构如下:
/
|-common
|-IP
| |-int_tester
| |-drv
CMakeLists.txt 对于 drv 看起来像:
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/
)
CMakeLists.txt 对于 int_tester 喜欢:
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
预期的目录结构相匹配。
请问我遗漏了什么?
如果要使用 IP/drv
作为其 源目录 构建 'drv',请明确指定 SOURCE_DIR ExternalProject_Add
的选项:
ExternalProject_Add(drv_ext
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/drv/drv_dir
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../drv
INSTALL_COMMAND ""
)
如果没有这个选项,源目录是从 PREFX 中推导出来的(请参阅 documentation 了解该推导的确切算法)。
Option URL for ExternalProject_Add
表示目录,应复制到源文件中。如果您不想复制,请不要使用该选项。