TLDR:我想让CMake等待ExternalProject_Add
完成,然后再尝试转到下一个子目录并构建一个碰巧使用其中一个文件的库外部项目。换句话说,我喜欢将外部项目声明为共享库的依赖项。
更多说明:
假设我的CMake项目有两个目录:thirdparty
和src
。我的顶级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文件的层次结构和组织进行任何更改?
谢谢!
答案 0 :(得分:1)
CMake希望传递给add_library
或add_executable
的每个源文件都存在,除非它被标记为GENERATED。对于add_custom_command
的 OUTPUT 列出的文件,此属性自动。在其他情况下,需要设置此属性显式:
set_source_files_properties(${Libsvm_SOURCE_FILES} PROPERTIES GENERATED TRUE)