CMake make add_library依赖于ExternalProject_Add

时间:2017-12-14 11:27:25

标签: c++ build cmake

TLDR:我想让CMake等待ExternalProject_Add完成,然后再尝试转到下一个子目录并构建一个碰巧使用其中一个文件的库外部项目。换句话说,我喜欢将外部项目声明为共享库的依赖项。

更多说明:

假设我的CMake项目有两个目录:thirdpartysrc。我的顶级CMakeLists.txt文件包含:

add_subdirectory(thirdparty)
add_subdirectory(src)

thirdparty/CMakeLists.txt包含多个ExternalProject_Add命令。我的初衷是拉动并构建所有这些外部项目,然后继续在src中构建自己的库和可执行文件。不幸的是,这并没有按照我的计划进行:

我的一个外部项目名为libsvm。我的src/CMakeLists.txt有以下内容:

set(Libsvm_SOURCE_FILES
    ${PROJECT_BINARY_DIR}/thirdparty/libsvm/src/libsvm/svm.cpp
)

include_directories(
    ${Libsvm_INCLUDE_DIR}
)

add_library(
    mysvm
  SHARED
    ${Libsvm_SOURCE_FILES}
)

现在我面临的问题是CMake无法找到$ {Libsvm_SOURCE_FILES},显然是因为在执行ExternalProject_Add文件中的thirdparty/CMakeLists.txt之前执行了此步骤。

我想将此外部项目声明为此库的依赖项。

更广泛的问题: 是否有一种干净的方法迫使CMake完成第一个子目录中的所有内容,然后继续下一个?如果没有,您是否建议我对我的CMakeLists文件的层次结构和组织进行任何更改?

谢谢!

1 个答案:

答案 0 :(得分:1)

CMake希望传递给add_libraryadd_executable的每个源文件都存在,除非它被标记为GENERATED。对于add_custom_command OUTPUT 列出的文件,此属性自动。在其他情况下,需要设置此属性显式

set_source_files_properties(${Libsvm_SOURCE_FILES} PROPERTIES GENERATED TRUE)