CMake 错误:URL 中至少有一个条目是路径(列表中无效)

Hai*_*sen 3 windows android cmake dart flutter

我正在使用 CMake 配置我正在创建的 flutter 插件。

我有这个宏可以从 github 存储库下载 zip 文件:

# Download the zipped folder of dart-sdk-api from the dependencies repo
set(dart_sdk_api_zip_url "https://github.com/Haidar0096/image_magick_ffi_deps/raw/master/dart_sdk_api.zip")
message(STATUS "Downloading dart-sdk-api from ${dart_sdk_api_zip_url}")
FetchContent_Declare(
        dart_sdk_api
        URL ${dart_sdk_api_zip_url}
        DOWNLOAD_EXTRACT_TIMESTAMP TRUE
)
FetchContent_MakeAvailable(dart_sdk_api)

# Include the include folder of dart_sdk_api from the downloaded zip
include_directories(${dart_sdk_api_SOURCE_DIR}/include)

# Create a target from the sources of the downloaded zip and link it to the executable
file(GLOB_RECURSE DART_SDK_API_SOURCES "${dart_sdk_api_SOURCE_DIR}/src/*.c")
add_library(dart_sdk_api STATIC ${DART_SDK_API_SOURCES})
target_link_libraries(image_magick_ffi dart_sdk_api)
Run Code Online (Sandbox Code Playgroud)

如果我为 Windows 构建,它效果很好,并且可以正常下载。

但是,如果我为 android 构建,我会收到此错误并且构建失败:

[        ] Successfully started process 'command 'C:\Users\haidar\AppData\Local\Android\Sdk\cmake\3.18.1\bin\cmake.exe''
[        ] C/C++: debug|arm64-v8a :CMake Error at C:/Users/haidar/AppData/Local/Android/Sdk/cmake/3.18.1/share/cmake-3.18/Modules/ExternalProject.cmake:2480 (message):
[        ] C/C++: debug|arm64-v8a :  At least one entry of URL is a path (invalid in a list)
[        ] C/C++: debug|arm64-v8a :Call Stack (most recent call first):
[        ] C/C++: debug|arm64-v8a :  C:/Users/haidar/AppData/Local/Android/Sdk/cmake/3.18.1/share/cmake-3.18/Modules/ExternalProject.cmake:3228 (_ep_add_download_command)
[        ] C/C++: debug|arm64-v8a :  CMakeLists.txt:13 (ExternalProject_Add)
[        ] C/C++: debug|arm64-v8a :-- Configuring incomplete, errors occurred!
[        ] C/C++: debug|arm64-v8a :See also "D:/dev_haidar/flutter/image_magick_ffi/android/.cxx/Debug/42552b6e/arm64-v8a/_deps/dart_sdk_api-subbuild/CMakeFiles/CMakeOutput.log".
Run Code Online (Sandbox Code Playgroud)

我不明白这个错误是什么意思以及我应该如何解决它?

(整个 CMakeLists.txt 都在这里,但没有包含它,因为它很大)

Hai*_*sen 9

深入研究 CMake 源代码,我发现错误源自文件的这一部分ExternalProject.cmake

    list(LENGTH url url_list_length)
    if(NOT "${url_list_length}" STREQUAL "1")
      foreach(entry ${url})
        if(NOT "${entry}" MATCHES "^[a-z]+://")
          message(FATAL_ERROR "At least one entry of URL is a path (invalid in a list)")
        endif()
      endforeach()
      if("x${fname}" STREQUAL "x")
        list(GET url 0 fname)
      endif()
    endif()
Run Code Online (Sandbox Code Playgroud)

打印 url 的值我发现由于某种原因它会将其读取为: https://github.com/Haidar0096/image_magick_ffi_deps/raw/master/dart_sdk_api.zipDOWNLOAD_EXTRACT_TIMESTAMP TRUE

所以它被附加DOWNLOAD_EXTRACT_TIMESTAMP TRUE到网址上。

所以解决方案是像这样交换行:

FetchContent_Declare(
        dart_sdk_api
        DOWNLOAD_EXTRACT_TIMESTAMP TRUE
        URL "${dart_sdk_api_zip_url}"
)
Run Code Online (Sandbox Code Playgroud)