FetchDependencies.cmake 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. include(CMakeParseArguments)
  2. set(DEPENDENCY_CACHE_DIR ${CMAKE_SOURCE_DIR}/Dependencies CACHE PATH "Cache downloaded deps in this directory")
  3. set(DEPENDENCY_UNTAR_DIR ${CMAKE_BINARY_DIR}/dependencies CACHE PATH "Where to untar deps")
  4. if(APPLE)
  5. set(ARCHSTR "darwin-x86_64")
  6. elseif(WIN32)
  7. set(OS "windows-i386")
  8. set(ARCHSTR "windows-i386")
  9. elseif(UNIX)
  10. set(ARCHSTR ${PLEX_BUILD_TYPE})
  11. endif(APPLE)
  12. function(get_content_of_url)
  13. set(ARGS URL CONTENT_VAR FILENAME)
  14. cmake_parse_arguments(CU "" "${ARGS}" "" ${ARGN})
  15. if(NOT DEFINED CU_FILENAME)
  16. get_filename_component(CU_FILENAME ${CU_URL} NAME)
  17. endif(NOT DEFINED CU_FILENAME)
  18. if(NOT EXISTS ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME})
  19. message(STATUS "Downloading ${CU_URL} to ${CU_FILENAME}...")
  20. file(
  21. DOWNLOAD ${CU_URL} ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME}
  22. STATUS DL_STATUS
  23. )
  24. list(GET DL_STATUS 0 SUCCESS)
  25. if(NOT SUCCESS EQUAL 0)
  26. message(FATAL_ERROR "Failed to download ${CU_URL}")
  27. endif(NOT SUCCESS EQUAL 0)
  28. endif(NOT EXISTS ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME})
  29. file(STRINGS ${DEPENDENCY_CACHE_DIR}/${CU_FILENAME} CVAR LIMIT_COUNT 1)
  30. set(${CU_CONTENT_VAR} ${CVAR} PARENT_SCOPE)
  31. endfunction(get_content_of_url)
  32. function(download_deps DD_NAME)
  33. set(ARGS DIRECTORY BUILD_NUMBER ARTIFACTNAME VARIANT DEPHASH ARCHSTR)
  34. cmake_parse_arguments(DD "" "${ARGS}" "" ${ARGN})
  35. if(NOT DEFINED DD_VARIANT)
  36. set(DD_VARIANT "release")
  37. endif(NOT DEFINED DD_VARIANT)
  38. if(NOT DEFINED DD_ARTIFACTNAME)
  39. set(DD_ARTIFACTNAME ${DD_NAME})
  40. endif(NOT DEFINED DD_ARTIFACTNAME)
  41. if(NOT DEFINED DD_BUILD_NUMBER)
  42. set(DD_BUILD_NUMBER "latest")
  43. endif(NOT DEFINED DD_BUILD_NUMBER)
  44. if(NOT DEFINED DD_ARCHSTR)
  45. set(DD_ARCHSTR ${ARCHSTR})
  46. endif(NOT DEFINED DD_ARCHSTR)
  47. set(BASE_URL "https://nightlies.plex.tv/directdl/plex-dependencies/${DD_NAME}/${DD_BUILD_NUMBER}")
  48. set(DEP_DIR ${DEPENDENCY_UNTAR_DIR}/${DD_ARCHSTR}-${DD_NAME}/${DD_BUILD_NUMBER}/)
  49. set(HASH_FILENAME ${DD_NAME}-${DD_BUILD_NUMBER}-hash.txt)
  50. get_content_of_url(URL ${BASE_URL}/hash.txt CONTENT_VAR DEP_HASH FILENAME ${HASH_FILENAME})
  51. message(STATUS "Dependency hash is: ${DEP_HASH}")
  52. set(DEP_DIRNAME "${DD_ARTIFACTNAME}-${DD_ARCHSTR}-${DD_VARIANT}-${DEP_HASH}")
  53. set(DEP_FILENAME ${DEP_DIRNAME}.tbz2)
  54. set(${DD_DIRECTORY} ${DEP_DIR}/${DEP_DIRNAME} PARENT_SCOPE)
  55. set(${DD_DEP_HASH} ${DEP_HASH} PARENT_SCOPE)
  56. set(DEP_URL "${BASE_URL}/${DEP_FILENAME}")
  57. get_content_of_url(URL ${DEP_URL}.sha.txt CONTENT_VAR CONTENT_HASH)
  58. if(NOT EXISTS ${DEP_DIR}/${DEP_DIRNAME})
  59. message(STATUS "Clearing out old dependencies ...")
  60. execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${DEPENDENCY_UNTAR_DIR}/${DD_ARCHSTR}-${DD_NAME})
  61. file(MAKE_DIRECTORY ${DEP_DIR})
  62. message(STATUS "Downloading ${DEP_FILENAME}...")
  63. file(
  64. DOWNLOAD ${DEP_URL} ${DEPENDENCY_CACHE_DIR}/${DEP_FILENAME}
  65. SHOW_PROGRESS
  66. STATUS DEP_STATUS
  67. )
  68. list(GET DEP_STATUS 0 DEP_SUCCESS)
  69. if(NOT DEP_SUCCESS EQUAL 0)
  70. message(FATAL_ERROR "Failed to download ${DEP_URL}")
  71. endif()
  72. message(STATUS "Unpacking ${DEP_FILENAME}...")
  73. execute_process(
  74. COMMAND ${CMAKE_COMMAND} -E tar xjf ${DEPENDENCY_CACHE_DIR}/${DEP_FILENAME}
  75. WORKING_DIRECTORY ${DEP_DIR}
  76. )
  77. if(APPLE)
  78. message(STATUS "Fixing install library names...")
  79. execute_process(
  80. COMMAND ${PROJECT_SOURCE_DIR}/scripts/darwin/fix-install-names.py ${DEP_DIR}/${DEP_DIRNAME}
  81. WORKING_DIRECTORY ${DEP_DIR}
  82. )
  83. message(STATUS "Done")
  84. endif(APPLE)
  85. if(EXISTS ${DEP_DIR}/${DEP_DIRNAME}/etc)
  86. message(STATUS "Removing etc in dependency bundle")
  87. file(REMOVE_RECURSE ${DEP_DIR}/${DEP_DIRNAME}/etc)
  88. endif(EXISTS ${DEP_DIR}/${DEP_DIRNAME}/etc)
  89. else(NOT EXISTS ${DEP_DIR}/${DEP_DIRNAME})
  90. message(STATUS "Directory ${DEP_DIR}/${DEP_DIRNAME} already exists, remove it to redownload")
  91. endif(NOT EXISTS ${DEP_DIR}/${DEP_DIRNAME})
  92. endfunction(download_deps DD_NAME)