如何将CMake参数转发到ExternalProject

rfbsl7qr  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(188)

我已经(大部分)成功地为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提供相同的编译器选择和值,* 而不 * 需要显式列出这些名称。

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

也能很好地工作。
有什么想法吗?

zwghvu4y

zwghvu4y1#

经过长时间的尝试,终于在CMake邮件列表中找到了答案(由Don欣顿提供)。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

vktxenjb

vktxenjb2#

我不知道有什么健壮的方法来实现这一点,我很肯定没有标准的“CMake方法”,但是关于捕获CMake命令行参数的my answer to a similar question可能会对您有所帮助。

eaf3rand

eaf3rand3#

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)

1.将环境变量CMAKE_TOOLCHAIN_FILE设置为工具链文件

export CMAKE_TOOLCHAIN_FILE=/tmp/toolchain.cmake

1.运行cmake以配置根项目
现在,环境变量CMAKE_TOOLCHAIN_FILE应该由CMake外部项目自动继承。
请参阅https://cmake.org/cmake/help/latest/variable/CMAKE_TOOLCHAIN_FILE.html

相关问题