【问题标题】:How to check for internet connection with CMake? (automatically prevent fails if there is non)如何使用 CMake 检查互联网连接? (如果没有自动防止失败)
【发布时间】:2020-09-24 14:49:35
【问题描述】:

例如,当使用 ExternalProjectFetchContent 模块时,可以在 CMake 中下载和使用其他数据。如果没有互联网连接,这些模块会失败,并且无论下载是否成功,CMake 都不会完成配置。有诸如 FETCHCONTENT_FULLY_DISCONNECTED 或 FETCHCONTENT_UPDATES_DISCONNECTED 之类的标志来防止检查并因此防止失败。但是这些必须手动设置。 (相关问题:cmake: external project update and a work offline)。

是否可以检查是否有连接,然后自动设置 FETCHCONTENT_FULLY_DISCONNECTED?怎么做?或者如果没有互联网连接,是否有其他方法可以防止 CMake 失败?

在我们的例子中,我们使用 FetchContent 下载库,然后使用例如 find_package 使它们可用。我们的工作流程目前不包括手动调整 CMake 选项/变量,我们不想添加它。 CMake 通过我们使用的 IDE 获取所有需要的选项,例如CMAKE_BUILD_TYPE 或自定义标志。我们需要将目标加倍,以便为每个现有组合提供非连接版本。因此这种半手动的方式也不可行。

【问题讨论】:

    标签: cmake download connection offline detection


    【解决方案1】:

    我找到了一种解决方法来检查连接。虽然它不会一直有效,但它对我们来说已经足够好了。我基于 CMake 的execute_process 和问题https://stackoverflow.com/a/27590444/9909548https://stackoverflow.com/a/6357629/9909548https://superuser.com/q/1406089

    execute_process(
        COMMAND ping www.google.com -n 2 -w 1000
        RESULT_VARIABLE NO_CONNECTION
    )
    if(NO_CONNECTION GREATER 0)
        set(FETCHCONTENT_FULLY_DISCONNECTED ON)
    else()
        set(FETCHCONTENT_FULLY_DISCONNECTED OFF)
    endif()
    

    希望将其添加为答案是正确的,尽管我不会接受它,而不是将其作为研究结果添加到问题中。

    【讨论】:

    • 我已编辑您的答案以解决 DNS 错误,其中退出代码将为 2(在 Linux 上)
    【解决方案2】:

    修改后的答案适用于最近的 cmake 和更多平台:

    if(MSVC)
        execute_process(
            COMMAND ping www.google.com -n 2
            ERROR_QUIET
            RESULT_VARIABLE NO_CONNECTION
        )
    else()
        execute_process(
            COMMAND ping www.google.com -c 2
            ERROR_QUIET
            RESULT_VARIABLE NO_CONNECTION
        )
    endif()
    
    if(NOT NO_CONNECTION EQUAL 0)
        set(FETCHCONTENT_FULLY_DISCONNECTED ON)
        message(WARNING "Fetch offline mode: requires already populated _deps")
    else()
        set(FETCHCONTENT_FULLY_DISCONNECTED OFF)
    endif()
    

    【讨论】:

      猜你喜欢
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 2012-04-16
      • 2015-01-02
      • 1970-01-01
      • 2010-12-16
      相关资源
      最近更新 更多