Browse Source

Make dependency fetching a bit more resilient.

Tobias Hieta 9 years ago
parent
commit
a2f30f9f9e

+ 3 - 2
CMakeModules/DependencyConfiguration.cmake

@@ -6,8 +6,9 @@ include(FetchDependencies)
 if(APPLE AND NOT DISABLE_BUNDLED_DEPS)  
   download_deps(
     "plexmediaplayer-dependencies"
-     ARTIFACTNAME konvergo-depends
-     DIRECTORY dir
+    ARTIFACTNAME konvergo-depends
+    DIRECTORY dir
+    DYLIB_SCRIPT_PATH ${PROJECT_SOURCE_DIR}/scripts/fix-install-names.py
   )
   message("dependencies are: ${dir}")
   set(DEFAULT_ROOT ${dir})

+ 50 - 18
CMakeModules/FetchDependencies.cmake

@@ -1,6 +1,6 @@
 include(CMakeParseArguments)
 
-set(DEPENDENCY_CACHE_DIR ${CMAKE_SOURCE_DIR}/Dependencies CACHE PATH "Cache downloaded deps in this directory")
+set(DEPENDENCY_CACHE_DIR ${CMAKE_BINARY_DIR}/dependencies CACHE PATH "Cache downloaded deps in this directory")
 set(DEPENDENCY_UNTAR_DIR ${CMAKE_BINARY_DIR}/dependencies CACHE PATH "Where to untar deps")
 
 if(APPLE)
@@ -9,38 +9,48 @@ elseif(WIN32)
   set(OS "windows-i386")
   set(ARCHSTR "windows-i386")
 elseif(UNIX)
-  set(ARCHSTR ${PLEX_BUILD_TYPE})
+  set(ARCHSTR ${PLEX_BUILD_TARGET})
 endif(APPLE)
 
 
 function(get_content_of_url)
   set(ARGS URL CONTENT_VAR FILENAME)
-  cmake_parse_arguments(CU "" "${ARGS}" "" ${ARGN})
+  cmake_parse_arguments(CU "ALWAYS" "${ARGS}" "" ${ARGN})
   if(NOT DEFINED CU_FILENAME)
     get_filename_component(CU_FILENAME ${CU_URL} NAME)
   endif(NOT DEFINED CU_FILENAME)
 
-  if(NOT EXISTS ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME})
+  if(EXISTS ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME})
+    if(CU_ALWAYS)
+      file(REMOVE ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME})
+    else()
+      file(STRINGS ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME} CVAR LIMIT_COUNT 1)
+    endif()
+  endif()
+
+  if(NOT CVAR)
     message(STATUS "Downloading ${CU_URL} to ${CU_FILENAME}...")
 
     file(
       DOWNLOAD ${CU_URL} ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME}
       STATUS DL_STATUS
+      LOG DL_LOG
     )
 
     list(GET DL_STATUS 0 SUCCESS)
     if(NOT SUCCESS EQUAL 0)
-      message(FATAL_ERROR "Failed to download ${CU_URL}")
+      list(GET DL_STATUS 1 ERROR_MESSAGE)
+      file(REMOVE ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME})
+      message(FATAL_ERROR "Failed to download ${CU_URL}: ${ERROR_MESSAGE}\n${DL_LOG}")
     endif(NOT SUCCESS EQUAL 0)
 
-  endif(NOT EXISTS ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME})
-
-  file(STRINGS ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME} CVAR LIMIT_COUNT 1)
+    get_content_of_url(URL ${CU_URL} CONTENT_VAR CVAR FILENAME ${CU_FILENAME})
+  endif()
   set(${CU_CONTENT_VAR} ${CVAR} PARENT_SCOPE)
 endfunction(get_content_of_url)
 
 function(download_deps DD_NAME)
-  set(ARGS DIRECTORY BUILD_NUMBER ARTIFACTNAME VARIANT DEPHASH ARCHSTR)
+  set(ARGS DIRECTORY BUILD_NUMBER ARTIFACTNAME VARIANT DEPHASH ARCHSTR DYLIB_SCRIPT_PATH)
   cmake_parse_arguments(DD "" "${ARGS}" "" ${ARGN})
 
   if(NOT DEFINED DD_VARIANT)
@@ -59,11 +69,19 @@ function(download_deps DD_NAME)
     set(DD_ARCHSTR ${ARCHSTR})
   endif(NOT DEFINED DD_ARCHSTR)
 
+  if(DD_BUILD_NUMBER STREQUAL latest)
+    set(DD_ALWAYS_DOWNLOAD ALWAYS)
+  endif()
+
   set(BASE_URL "https://nightlies.plex.tv/directdl/plex-dependencies/${DD_NAME}/${DD_BUILD_NUMBER}")
   set(DEP_DIR ${DEPENDENCY_UNTAR_DIR}/${DD_ARCHSTR}-${DD_NAME}/${DD_BUILD_NUMBER})
 
   set(HASH_FILENAME ${DD_NAME}-${DD_BUILD_NUMBER}-hash.txt)
-  get_content_of_url(URL ${BASE_URL}/hash.txt CONTENT_VAR DEP_HASH FILENAME ${HASH_FILENAME})
+  get_content_of_url(URL ${BASE_URL}/hash.txt CONTENT_VAR DEP_HASH FILENAME ${HASH_FILENAME} ${DD_ALWAYS_DOWNLOAD})
+
+  if(NOT DEP_HASH)
+    message(FATAL_ERROR "Failed to get hash for dependencies. Abort abort abort...")
+  endif()
 
   message(STATUS "Dependency hash is: ${DEP_HASH}")
 
@@ -76,45 +94,59 @@ function(download_deps DD_NAME)
   set(DEP_URL "${BASE_URL}/${DEP_FILENAME}")
   get_content_of_url(URL ${DEP_URL}.sha.txt CONTENT_VAR CONTENT_HASH)
 
-  if(NOT EXISTS ${DEP_DIR}/${DEP_DIRNAME})
+  if(NOT EXISTS ${DEP_DIR}/${DEP_DIRNAME}/_FINISHED)
     message(STATUS "Clearing out old dependencies ...")
     execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${DEPENDENCY_UNTAR_DIR}/${DD_ARCHSTR}-${DD_NAME})
     file(MAKE_DIRECTORY ${DEP_DIR})
-
+      
     message(STATUS "Downloading ${DEP_FILENAME}...")
 
     file(
       DOWNLOAD ${DEP_URL} ${DEPENDENCY_CACHE_DIR}/${DEP_FILENAME}
       SHOW_PROGRESS
       STATUS DEP_STATUS
+      LOG DEP_LOG
+      EXPECTED_HASH SHA1=${CONTENT_HASH}
     )
 
     list(GET DEP_STATUS 0 DEP_SUCCESS)
 
     if(NOT DEP_SUCCESS EQUAL 0)
-      message(FATAL_ERROR "Failed to download ${DEP_URL}")
+      list(GET DEP_STATUS 1 DEP_ERROR)
+      message(FATAL_ERROR "Failed to download ${DEP_URL}: ${DEP_ERROR}\n${DEP_LOG}")
     endif()
 
     message(STATUS "Unpacking ${DEP_FILENAME}...")
     execute_process(
       COMMAND ${CMAKE_COMMAND} -E tar xjf ${DEPENDENCY_CACHE_DIR}/${DEP_FILENAME}
       WORKING_DIRECTORY ${DEP_DIR}
+      RESULT_VARIABLE UNPACK_RESULT
     )
-    if(APPLE)
+
+    if(NOT UNPACK_RESULT EQUAL 0)
+      message(FATAL_ERROR "Failed to unpack deps..")
+    endif(NOT UNPACK_RESULT EQUAL 0)
+
+    if(APPLE AND DD_DYLIB_SCRIPT_PATH)
       message(STATUS "Fixing install library names...${DEP_DIR}/${DEP_DIRNAME}")
       execute_process(
-        COMMAND ${PROJECT_SOURCE_DIR}/scripts/fix-install-names.py ${DEP_DIR}/${DEP_DIRNAME}
+        COMMAND ${DD_DYLIB_SCRIPT_PATH} ${DEP_DIR}/${DEP_DIRNAME}
         WORKING_DIRECTORY ${DEP_DIR}
+        RESULT_VARIABLE DYLIB_RESULT
       )
+      if(NOT DYLIB_RESULT EQUAL 0)
+        message(FATAL_ERROR "Failed to run ${DD_DYLIB_SCRIPT_PATH}")
+      endif()
       message(STATUS "Done")
-    endif(APPLE)
+    endif()
 
     if(EXISTS ${DEP_DIR}/${DEP_DIRNAME}/etc)
       message(STATUS "Removing etc in dependency bundle")
       file(REMOVE_RECURSE ${DEP_DIR}/${DEP_DIRNAME}/etc)
     endif(EXISTS ${DEP_DIR}/${DEP_DIRNAME}/etc)
 
-  else(NOT EXISTS ${DEP_DIR}/${DEP_DIRNAME})
+    file(WRITE "${DEP_DIR}/${DEP_DIRNAME}/_FINISHED" "Dummy")
+  else(NOT EXISTS ${DEP_DIR}/${DEP_DIRNAME}/_FINISHED)
     message(STATUS "Directory ${DEP_DIR}/${DEP_DIRNAME} already exists, remove it to redownload")
-  endif(NOT EXISTS ${DEP_DIR}/${DEP_DIRNAME})
+  endif(NOT EXISTS ${DEP_DIR}/${DEP_DIRNAME}/_FINISHED)
 endfunction(download_deps DD_NAME)

+ 1 - 0
CMakeModules/QtConfiguration.cmake

@@ -12,6 +12,7 @@ if(NOT IS_DIRECTORY ${QTROOT})
 		DEPHASH QT_DEPS_HASH
     ARTIFACTNAME konvergo-qt
     ${WINARCHSTR}
+    DYLIB_SCRIPT_PATH ${PROJECT_SOURCE_DIR}/scripts/fix-install-names.py
 	)
   set(QTROOT ${dir})
 endif()