如何将 CMake 参数转发到外部项目



我已经(大部分)成功地为googletest设置了ExternalProject_Add。但是,我注意到诸如我选择C++编译器,构建类型等内容不会自动转发到ExternalProject。

我可以轻松地添加任何给定的标志,方法是将其添加到调用ExternalProject_Add中的CMAKE_ARGS,如下所示:

CMAKE_ARGS -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}

但是,这需要我列举所有应该转发到 googletests 的 CMake 调用的可能参数,并且该列表非常庞大。我还需要为我想要的所有其他ExternalProject_Add创建相同的列表。这似乎很脆弱,容易出错。

有没有办法告诉CMake"转发"用户提供的配置?换句话说,如果我调用 CMake 作为:

cmake <path-to-project> -DCMAKE_C_COMPILER=/usr/bin/clang -DSOME_RANDOM_FLAG=stuff

然后我希望我的调用ExternalProject_Add为SOME_RANDOM_FLAG提供相同的编译器选择和值,而无需显式列出这些名称。我不确定简单地传递 CMake 的 ARGV 是否有效,因为说

CC=/usr/bin/clang cmake <path-to-project>

理想情况下也可以工作。

关于如何实现这一目标的任何想法?

经过长时间的尝试,它终于在CMake邮件列表中得到了回答(由Don Hinton)。Fraser的解决方案非常接近,但仍然可以传递一些项目特定的参数,这些参数可能会导致一些不可预测的行为。

以下工作正常。希望这将节省人们试图解决这个问题的一些时间:

cmake_minimum_required(VERSION 3.1)
# MUST be done before call to 'project'
get_cmake_property(vars CACHE_VARIABLES)
foreach(var ${vars})
  get_property(currentHelpString CACHE "${var}" PROPERTY HELPSTRING)
    if("${currentHelpString}" MATCHES "No help, variable specified on the command line." OR "${currentHelpString}" STREQUAL "")
        # message("${var} = [${${var}}]  --  ${currentHelpString}") # uncomment to see the variables being processed
        list(APPEND CL_ARGS "-D${var}=${${var}}")
    endif()
endforeach()
project(SuperBuild)
include(ExternalProject)
ExternalProject_Add(ext_proj
  ...
  CMAKE_ARGS ${CL_ARGS}
)

链接到邮件列表线程:https://cmake.org/pipermail/cmake/2018-January/067002.html

我不知道实现此目的的强大方法,而且我很确定没有标准的"CMake 方法",但我对有关捕获 CMake 命令行参数的类似问题的回答可能会对您有所帮助?

  1. 创建工具链文件以包含 CMake 变量,例如:
    # /tmp/toolchain.cmake
    set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Targeting macOS version" FORCE)
    set(CMAKE_C_COMPILER_LAUNCHER "sccache" CACHE STRING "C compiler launcher" FORCE)
    
  2. 将环境变量CMAKE_TOOLCHAIN_FILE设置为工具链文件
    export CMAKE_TOOLCHAIN_FILE=/tmp/toolchain.cmake
    
  3. 运行 cmake 以配置根项目

现在,CMake 外部项目应自动继承环境变量CMAKE_TOOLCHAIN_FILE

见 https://cmake.org/cmake/help/latest/variable/CMAKE_TOOLCHAIN_FILE.html

最新更新