cmake外部项目:允许下载或用户指定路径

cmake外部项目:允许下载或用户指定路径,cmake,Cmake,考虑一个依赖于外部项目的项目。在配置项目时,我想为用户提供两种选择之一: 允许cmake的ExternalProject工具自动下载、配置、生成和安装此外部项目 如果外部项目已在本地生成,则允许用户手动指定头/lib的路径 这个想法是,如果用户不在乎,只是运行 cmake . 然后,cmake将自动执行外部项目的下载和安装。但是,对于开发人员来说,在其机器上本地构建(而不是安装)外部项目是很常见的。为了节省内存或便于定制,我还希望用户能够手动指定(例如通过ccmake)该项目的头和库路径,

考虑一个依赖于外部项目的项目。在配置项目时,我想为用户提供两种选择之一:

  • 允许cmake的ExternalProject工具自动下载、配置、生成和安装此外部项目
  • 如果外部项目已在本地生成,则允许用户手动指定头/lib的路径
这个想法是,如果用户不在乎,只是运行

cmake .
然后,cmake将自动执行外部项目的下载和安装。但是,对于开发人员来说,在其机器上本地构建(而不是安装)外部项目是很常见的。为了节省内存或便于定制,我还希望用户能够手动指定(例如通过ccmake)该项目的头和库路径,这将节省下载和编译的工作量


有什么好办法吗?

我不确定有什么好办法,但这是可能的。我可以想象,粗流会是这样的:

add_executable(Foo ...)

find_path(OtherProjectIncludes NAMES ...)
find_library(OtherProjectLib NAMES ...)

if(OtherProjectIncludes AND OtherProjectLib)
  include_directories(${OtherProjectIncludes})
  target_link_libraries(Foo ${OtherProjectLib})
else()
  include(ExternalProject)
  ...
endif()
如果有一个find模块可用于另一个项目,您可能会使用
find\u包
代替
find\u路径
find\u库

无论如何,您需要决定如何处理这样一种情况:用户通过一条路径来查找另一个项目的现有(构建)副本,但是
find\u xxx
调用失败。您可以继续调用
ExternalProject
模块,也可以提供一条有用的
FATAL\u ERROR
消息,允许用户重试