将前缀路径列表传递给CMAKE_ARGS中的ExternalProject_Add

tom*_*odi 8 cmake

我有一个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.

我找到了两个解决方案:

  1. 这个答案提到了一个创建新.cmake文件的解决方案,该文件将包含在外部项目中.
  2. 也可以将类似-DCMAKE_EXTRA_PREFIX_PATH的东西传递给CMAKE_ARGS参数.

两种解决方案都需要CMakeLists.txt通过包含额外.cmake文件或附加额外路径来修改外部项目文件CMAKE_PREFIX_PATH.但这不是一个选择,因为我希望不要触及外部项目.

是否可以在没有任何额外.cmake文件或额外变量的情况下处理此问题?

也许我只是错过了一些必须要做的"引用魔术"?

tom*_*odi 7

经过更多搜索后,我在此页面上发现的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)