CMake:请求用户权限以安装依赖项

CMake:请求用户权限以安装依赖项,cmake,Cmake,如果必须从internet下载并安装大型依赖项才能继续构建过程,许多构建系统(如make)有时会提示用户确认其意图 从CMake实现这一目标的最佳方式是什么 我的示例应用程序。我正在修改一个CMakeLists.txt文件,如果找不到它,它将安装Google测试框架。我应该如何修改它以在安装之前向用户请求权限 或者,这可能是不可能的/标准的,我应该要求用户在调用CMake时传递一个变量定义,以声明他同意下载 #引用自: # https://github.com/pabloariasal/mode

如果必须从internet下载并安装大型依赖项才能继续构建过程,许多构建系统(如make)有时会提示用户确认其意图

从CMake实现这一目标的最佳方式是什么

我的示例应用程序。我正在修改一个
CMakeLists.txt
文件,如果找不到它,它将安装Google测试框架。我应该如何修改它以在安装之前向用户请求权限

或者,这可能是不可能的/标准的,我应该要求用户在调用CMake时传递一个变量定义,以声明他同意下载

#引用自:
# https://github.com/pabloariasal/modern-cmake-sample/blob/master/libjsonutils/test/CMakeLists.txt
#提交散列0c8272b621f2bfd819c406b575517fdeb05a38a7
#-------------------------以下为原始内容------------------------------
#请参阅/opt/local/share/cmake-3.16/Modules/FindGTest.cmake
查找包(GTest安静)
#注意:大写字母GTEST!CK
如果(未找到GTEST_)
#在配置时下载并解包googletest
#但只有在需要的时候!CK
配置_文件(${CMAKE_SOURCE_DIR}/CMAKE/GoogleTest-CMakeLists.txt.in
${CMAKE_BINARY_DIR}/googletest下载/CMakeLists.txt)
执行_进程(命令${CMAKE_COMMAND}-G“${CMAKE_生成器}”。
结果\变量结果
工作目录${CMAKE\u BINARY\u DIR}/googletest下载)
如果(结果)
消息(致命错误“Google测试的CMake步骤失败:${result}”)
endif()
执行进程(命令${CMAKE_COMMAND}--build。
结果\变量结果
工作目录${CMAKE\u BINARY\u DIR}/googletest下载)
如果(结果)
消息(致命错误“googletest的生成步骤失败:${result}”)
endif()
#将googletest直接添加到我们的构建中。这就定义了
#gtest和gtest是主要目标。
添加子目录(${CMAKE_BINARY_DIR}/googletest src)
${CMAKE_BINARY_DIR}/googletest build
将_从_中排除(全部)
endif()
#现在只需根据需要链接gtest。如
添加可执行文件(json\u utils\u test src/main.cpp)
目标\编译\功能(json \ utils \测试专用cxx \自动\类型)
目标链接库(json_utils_test gtest_main JSONUtils::JSONUtils)
添加测试(名称json\U utils\U测试
命令json_utils_test)

将变量传递给CMake是指定用户决策的正确方法

要求用户确认一些默认决定看起来不错。。。但我担心CMake没有现成的工具来实现这一点。注意,可以在shell/terminal(通过
cmake
executable)中请求项目配置,也可以从与用户输入无关的cmake GUI请求项目配置

在配置过程中,您可能会配置失败(例如,使用
消息(致命错误)
),而不是要求用户进行确认。但是,在发送此失败消息时,会显示描述用户需要设置的变量的消息

# Variable-option for a user.
option(DOWNLOAD_GTEST "Whether GTest is needed to be downloaded" OFF)

if (DOWNLOAD_GTEST)
  # User explicitly requests to download gtest.
  # Do not try 'find_package' at all.
  #
  # Download and unpack googletest at configure time
  configure_file(${CMAKE_SOURCE_DIR}/cmake/GoogleTest-CMakeLists.txt.in
    ${CMAKE_BINARY_DIR}/googletest-download/CMakeLists.txt)
  ...
else()
  # GTest download hasn't been requested.
  # Try to find installed variant.
  find_package(GTest)
  if(NOT GTEST_FOUND)
    # No installed variant has been found.
    # Fail configuration with a notion about 'DOWNLOAD_GTEST' variable.
    message(FATAL_ERROR "GTest has not been found. If you want to automatically download it, please set variable 'DOWNLOAD_GTEST': cmake -DDOWNLOAD_GTEST=ON")
  endif()
endif()
使用该
CMakeLists.txt
,如果用户未明确设置变量
DOWNLOAD\GTEST
,则将其设置为
OFF
。在这种情况下,使用
find_package
搜索GTest。如果搜索失败,那么配置过程也会失败,但会建议设置变量


如果用户重新运行
cmake
,变量
DOWNLOAD\GTEST
设置为
ON
,那么GTEST将在不显示额外消息的情况下下载。

将变量传递给cmake是指定用户决策的正确方法

要求用户确认一些默认决定看起来不错。。。但我担心CMake没有现成的工具来实现这一点。注意,可以在shell/terminal(通过
cmake
executable)中请求项目配置,也可以从与用户输入无关的cmake GUI请求项目配置

在配置过程中,您可能会配置失败(例如,使用
消息(致命错误)
),而不是要求用户进行确认。但是,在发送此失败消息时,会显示描述用户需要设置的变量的消息

# Variable-option for a user.
option(DOWNLOAD_GTEST "Whether GTest is needed to be downloaded" OFF)

if (DOWNLOAD_GTEST)
  # User explicitly requests to download gtest.
  # Do not try 'find_package' at all.
  #
  # Download and unpack googletest at configure time
  configure_file(${CMAKE_SOURCE_DIR}/cmake/GoogleTest-CMakeLists.txt.in
    ${CMAKE_BINARY_DIR}/googletest-download/CMakeLists.txt)
  ...
else()
  # GTest download hasn't been requested.
  # Try to find installed variant.
  find_package(GTest)
  if(NOT GTEST_FOUND)
    # No installed variant has been found.
    # Fail configuration with a notion about 'DOWNLOAD_GTEST' variable.
    message(FATAL_ERROR "GTest has not been found. If you want to automatically download it, please set variable 'DOWNLOAD_GTEST': cmake -DDOWNLOAD_GTEST=ON")
  endif()
endif()
使用该
CMakeLists.txt
,如果用户未明确设置变量
DOWNLOAD\GTEST
,则将其设置为
OFF
。在这种情况下,使用
find_package
搜索GTest。如果搜索失败,那么配置过程也会失败,但会建议设置变量


如果用户重新运行
cmake
,变量
DOWNLOAD\GTEST
设置为
ON
,那么GTEST将在没有额外消息的情况下下载。

我应该在调用cmake
Yes时只要求用户传递变量定义。我相信您可以编写一个shell脚本,从用户那里获取输入,然后
execute\u process
it并在cmake中处理。(我想知道
文件(READ)/dev/stdin“
是否可以工作,但无论如何都不行)
我应该要求用户在调用CMake时传递一个变量定义
是。我相信您可以编写一个shell脚本,从用户那里获取输入,然后
执行流程
并在CMake中处理。(我想知道
文件(读“/dev/stdin”
是否有效,但无论如何都不行)