我已经(大部分)成功地建立了ExternalProject_Add为googletest。 然而,我注意到,类似的事情我选择的C ++编译器,生成类型,等不自动转发到ExternalProject。
我可以很容易地通过调用其添加到CMAKE_ARGS到ExternalProject_Add像这样添加任何给定的标志:
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的邮件列表回答(唐顿)。 弗雷泽的解决方案是非常接近,但仍可以通过,可能会导致一些不可预知的行为的一些项目的具体参数。
下正常工作。 希望这将节省的人一段时间,试图弄清楚这一点:
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的命令行参数可以帮助你?