Kaynağa Gözat

Meta: Add a CMake function to download remote files during the build

This function will handle download failures. It doesn't support hashing
for integrity yet, but if the download times out or otherwise fails, the
build itself will fail. But default, file(DOWNLOAD) in CMake doesn't
fail the build; we must pass in and check a STATUS variable.
Timothy Flynn 3 yıl önce
ebeveyn
işleme
e805fce46e
1 değiştirilmiş dosya ile 16 ekleme ve 0 silme
  1. 16 0
      Meta/CMake/utils.cmake

+ 16 - 0
Meta/CMake/utils.cmake

@@ -194,3 +194,19 @@ function(invoke_generator name generator version_file prefix header implementati
     add_custom_target("generate_${prefix}${name}" DEPENDS "${header}" "${implementation}")
     add_custom_target("generate_${prefix}${name}" DEPENDS "${header}" "${implementation}")
     add_dependencies(all_generated "generate_${prefix}${name}")
     add_dependencies(all_generated "generate_${prefix}${name}")
 endfunction()
 endfunction()
+
+function(download_file url path)
+    if (NOT EXISTS "${path}")
+        get_filename_component(file "${path}" NAME)
+        message(STATUS "Downloading file ${file} from ${url}")
+
+        file(DOWNLOAD "${url}" "${path}" INACTIVITY_TIMEOUT 10 STATUS download_result)
+        list(GET download_result 0 status_code)
+        list(GET download_result 1 error_message)
+
+        if (NOT status_code EQUAL 0)
+            file(REMOVE "${path}")
+            message(FATAL_ERROR "Failed to download ${url}: ${error_message}")
+        endif()
+    endif()
+endfunction()