使用 cmake 将依赖项传播到 header-only ExternalProject
propagate dependencies to header-only ExternalProject with cmake
我正在尝试使用 CMake (Microsoft/GSL) 构建一个 header-only 库,这样我就可以使用像 GSL_INCLUDE_DIRS
和 GSL_LIBRARIES
这样的变量来link 到目标并传播适当的依赖项。
我正在处理的项目有大量 sub-directories,所有外部项目都是自己构建的 sub-directories,因此变量很重要。
我正在使用 CMake 3.2.3
通常(对于具有实际 .lib 或 .a 的库)我会做类似的事情:
SET(TARGET_NAME gsl)
include(ExternalProject)
ExternalProject_Add(
${TARGET_NAME}-ext
URL "http://target/url"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
) # download/unzip the header-only project
# Specify include dir
SET(${TARGET_NAME}_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include CACHE STRING "${TARGET_NAME} include directory")
# Library
add_library(${TARGET_NAME} SHARED IMPORTED GLOBAL)
SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
IMPORTED_LOCATION "some/path/to/some/lib"
)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)
SET(${TARGET_NAME}_LIBRARIES ${TARGET_NAME} CACHE STRING "${TARGET_NAME} library location")
MARK_AS_ADVANCED(${TARGET_NAME_UPPER}_DIR ${TARGET_NAME_UPPER}_INCLUDE_DIRS ${TARGET_NAME_UPPER}_LIBRARIES)
这里的问题是 header-only 库没有设置导入路径的库,所以我不能使用 IMPORTED
库。如果我根本不使用库,那么我无法在不构建的情况下在 GSL 上的其他模块中设置依赖项(即 downloading/unzipping) 每次 ,我不想做。 custom_target
会有同样的问题,所以这是 no-go.
我想我想要的是一个界面库,比如
add_library(${TARGET_NAME} INTERFACE)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)
但是 cmake 抱怨说
CMake Error at 3rdParty/gsl/CMakeLists.txt:33 (add_dependencies):
add_dependencies Cannot add target-level dependencies to INTERFACE library
target "gsl".
有没有什么方法可以使用接口库(或其他东西)来传播对外部项目的依赖?
禁止依赖 INTERFACE
库是 an oversight that was corrected in CMake version 3.3。升级到最新的稳定版本后,我能够使用问题中描述的方法,并且完全按预期工作。
我正在尝试使用 CMake (Microsoft/GSL) 构建一个 header-only 库,这样我就可以使用像 GSL_INCLUDE_DIRS
和 GSL_LIBRARIES
这样的变量来link 到目标并传播适当的依赖项。
我正在处理的项目有大量 sub-directories,所有外部项目都是自己构建的 sub-directories,因此变量很重要。
我正在使用 CMake 3.2.3
通常(对于具有实际 .lib 或 .a 的库)我会做类似的事情:
SET(TARGET_NAME gsl)
include(ExternalProject)
ExternalProject_Add(
${TARGET_NAME}-ext
URL "http://target/url"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
) # download/unzip the header-only project
# Specify include dir
SET(${TARGET_NAME}_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include CACHE STRING "${TARGET_NAME} include directory")
# Library
add_library(${TARGET_NAME} SHARED IMPORTED GLOBAL)
SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
IMPORTED_LOCATION "some/path/to/some/lib"
)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)
SET(${TARGET_NAME}_LIBRARIES ${TARGET_NAME} CACHE STRING "${TARGET_NAME} library location")
MARK_AS_ADVANCED(${TARGET_NAME_UPPER}_DIR ${TARGET_NAME_UPPER}_INCLUDE_DIRS ${TARGET_NAME_UPPER}_LIBRARIES)
这里的问题是 header-only 库没有设置导入路径的库,所以我不能使用 IMPORTED
库。如果我根本不使用库,那么我无法在不构建的情况下在 GSL 上的其他模块中设置依赖项(即 downloading/unzipping) 每次 ,我不想做。 custom_target
会有同样的问题,所以这是 no-go.
我想我想要的是一个界面库,比如
add_library(${TARGET_NAME} INTERFACE)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)
但是 cmake 抱怨说
CMake Error at 3rdParty/gsl/CMakeLists.txt:33 (add_dependencies): add_dependencies Cannot add target-level dependencies to INTERFACE library target "gsl".
有没有什么方法可以使用接口库(或其他东西)来传播对外部项目的依赖?
禁止依赖 INTERFACE
库是 an oversight that was corrected in CMake version 3.3。升级到最新的稳定版本后,我能够使用问题中描述的方法,并且完全按预期工作。