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

时间:2017-07-31 11:18:53

标签: 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}
   )

不幸的是,这不会起作用,因为构建目录中生成的文件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。

我找到了两个解决方案:

  1. This answer提到了一个创建新CMAKE_PREFIX_PATH文件的解决方案,该文件将包含在外部项目中。
  2. 还可以将.cmake之类的内容传递给-DCMAKE_EXTRA_PREFIX_PATH参数。
  3. 两个解决方案都需要通过包含额外的CMAKE_ARGS文件或向CMakeLists.txt附加额外路径来修改外部.cmake项目文件。但这不是一个选择,因为我希望不要触及外部项目。

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

    也许我只是错过了一些"引用魔法"必须要做什么?

1 个答案:

答案 0 :(得分:6)

经过一些搜索后,我在this page上发现LIST_SEPARATOR的{​​{1}}参数可以解决问题。不幸的是,关于使用这个参数的文档并没有多大意义。

以下是我的问题的解决方案:

ExternalProject_Add