我有一个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}
)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,因为构建目录中生成的文件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"
)
Run Code Online (Sandbox Code Playgroud)
由于将有一个名为command包含传递给的列表的变量execute_process,因此只将第一个路径CMAKE_PREFIX_PATH传递给外部CMake调用CMAKE_PREFIX_PATH.其他参数作为命令行参数传递给CMake.
我找到了两个解决方案:
.cmake文件的解决方案,该文件将包含在外部项目中. -DCMAKE_EXTRA_PREFIX_PATH的东西传递给CMAKE_ARGS参数.两种解决方案都需要CMakeLists.txt通过包含额外.cmake文件或附加额外路径来修改外部项目文件CMAKE_PREFIX_PATH.但这不是一个选择,因为我希望不要触及外部项目.
是否可以在没有任何额外.cmake文件或额外变量的情况下处理此问题?
也许我只是错过了一些必须要做的"引用魔术"?
经过更多搜索后,我在此页面上发现的LIST_SEPARATOR参数有效ExternalProject_Add。不幸的是,有关使用此参数的文档意义不大。
这是我的问题的解决方案:
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH}
${CMAKE_SOURCE_DIR}/MyProject/cmake_packages
${CMAKE_SOURCE_DIR}/OtherProjects/cmake_packages)
# Create a list with an alternate separator e.g. pipe symbol
string(REPLACE ";" "|" CMAKE_PREFIX_PATH_ALT_SEP "${CMAKE_PREFIX_PATH}")
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
LIST_SEPARATOR | # Use the alternate list separator
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}/MyProjectInstall
-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_ALT_SEP}
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1828 次 |
| 最近记录: |