我有一个CMake项目,我想用ExternalProject_Add
命令构建。在CMAKE_ARGS
参数中,我想传递一个前缀路径列表,其中包含外部项目所需的CMake包。
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH}
${CMAKE_SOURCE_DIR}/MyProject/cmake_packages
${CMAKE_SOURCE_DIR}/OtherProjects/cmake_packages)
ExternalProject_Add(MyProject
DOWNLOAD_COMMAND ""
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/source
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/MyProjectBuild
INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/MyProjectInstall
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}/MyProjectInstall
-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
)
不幸的是,这不会起作用,因为构建目录中生成的文件MyProject-configure-Debug.cmake包含类似这样的内容(简称):
set(command "C:/Path/to/cmake.exe;-DCMAKE_PREFIX_PATH=D:/path/to/MyProject/cmake_packages;D:/path/to/OtherProjects/cmake_packages;-GCodeBlocks - Ninja;D:/path/to/my/source/dir")
execute_process(
COMMAND ${command}
RESULT_VARIABLE result
OUTPUT_FILE "D:/.../MyProject-configure-out.log"
ERROR_FILE "D:/.../MyProject-configure-err.log"
)
因为会有一个名为command
的变量包含一个传递给execute_process
的列表,所以只有CMAKE_PREFIX_PATH
的第一个路径被传递给外部CMake调用{{ 1}}。其他参数作为命令行参数传递给CMake。
我找到了两个解决方案:
CMAKE_PREFIX_PATH
文件的解决方案,该文件将包含在外部项目中。 .cmake
之类的内容传递给-DCMAKE_EXTRA_PREFIX_PATH
参数。两个解决方案都需要通过包含额外的CMAKE_ARGS
文件或向CMakeLists.txt
附加额外路径来修改外部.cmake
项目文件。但这不是一个选择,因为我希望不要触及外部项目。
是否可以在没有任何额外CMAKE_PREFIX_PATH
文件或额外变量的情况下处理此问题?
也许我只是错过了一些"引用魔法"必须要做什么?
答案 0 :(得分:6)
经过一些搜索后,我在this page上发现LIST_SEPARATOR
的{{1}}参数可以解决问题。不幸的是,关于使用这个参数的文档并没有多大意义。
以下是我的问题的解决方案:
ExternalProject_Add