jellyfin-media-player/CMakeModules/FetchDependencies.cmake
2021-04-04 02:48:27 -04:00

262 lines
8.2 KiB
CMake

include(CMakeParseArguments)
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)
set(ARCHSTR "darwin-x86_64")
elseif(WIN32)
set(OS "windows-i386")
if (CMAKE_SIZEOF_VOID_P MATCHES 8)
set(ARCHSTR "windows-x86_64")
else()
set(ARCHSTR "windows-i386")
endif()
elseif(OPENELEC)
if (OE_ARCH STREQUAL "x86_64")
set(ARCHSTR "linux-openelec-x86_64")
elseif(OE_ARCH STREQUAL "armv7")
set(ARCHSTR "linux-openelec-armv7")
endif()
elseif(UNIX)
set(ARCHSTR ${JELLYFIN_BUILD_TARGET})
endif(APPLE)
option(ENABLE_CODECS "Enable downloading for Codecs on Demand" OFF)
if(ENABLE_CODECS)
add_definitions(-DHAVE_CODEC_MANIFEST)
add_definitions(-DEAE_VERSION=133)
endif()
function(get_content_of_url)
set(ARGS URL CONTENT_VAR FILENAME)
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(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)
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)
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_VAR
ARCHSTR
DYLIB_SCRIPT_PATH
BASE_URL
TOKEN)
cmake_parse_arguments(DD "NO_HASH_FILE" "${ARGS}" "" ${ARGN})
if(NOT DEFINED DD_VARIANT)
set(DD_VARIANT "release")
endif(NOT DEFINED DD_VARIANT)
if(NOT DEFINED DD_ARTIFACTNAME)
set(DD_ARTIFACTNAME ${DD_NAME})
endif(NOT DEFINED DD_ARTIFACTNAME)
if(NOT DEFINED DD_BUILD_NUMBER)
set(DD_BUILD_NUMBER "latest")
endif(NOT DEFINED DD_BUILD_NUMBER)
if(NOT DEFINED DD_ARCHSTR)
set(DD_ARCHSTR ${ARCHSTR})
endif(NOT DEFINED DD_ARCHSTR)
if(DD_BUILD_NUMBER STREQUAL latest)
set(DD_ALWAYS_DOWNLOAD ALWAYS)
endif()
if(NOT DEFINED DD_TOKEN)
set(DD_TOKEN jellyfin-dependencies)
endif()
if(NOT DEFINED DD_BASE_URL)
set(DD_BASE_URL "")
endif()
set(DEP_DIR ${DEPENDENCY_UNTAR_DIR}/${DD_ARCHSTR}-${DD_NAME}/${DD_BUILD_NUMBER})
get_cmake_property(cacheVars CACHE_VARIABLES)
foreach(var ${cacheVars})
if(("${${var}}" MATCHES "^${DEPENDENCY_UNTAR_DIR}/${DD_ARCHSTR}-${DD_NAME}/[0-9]+") AND
(NOT ("${${var}}" MATCHES "^${DEP_DIR}")))
unset(${var} CACHE)
endif()
endforeach()
if(NOT DD_NO_HASH_FILE)
set(HASH_FILENAME ${DD_NAME}-${DD_BUILD_NUMBER}-hash.txt)
get_content_of_url(URL ${DD_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}")
if(DD_DEPHASH_VAR)
set(${DD_DEPHASH_VAR} ${DEP_HASH} PARENT_SCOPE)
endif()
set(DEP_DIRNAME "${DD_ARTIFACTNAME}-${DD_ARCHSTR}-${DD_VARIANT}-${DEP_HASH}")
set(DEP_FILENAME ${DEP_DIRNAME}.tbz2)
set(${DD_DEP_HASH} ${DEP_HASH} PARENT_SCOPE)
set(DEP_URL "${DD_BASE_URL}/${DEP_FILENAME}")
set(CONTENT_HASH_URL ${DEP_URL}.sha.txt)
else()
set(DEP_DIRNAME "${DD_ARTIFACTNAME}-${DD_VARIANT}")
set(DEP_FILENAME "${DEP_DIRNAME}.tar.xz")
set(DEP_URL "${DD_BASE_URL}/${DEP_FILENAME}")
set(CONTENT_HASH_URL ${DEP_URL}.sha1)
endif()
set(${DD_DIRECTORY} ${DEP_DIR}/${DEP_DIRNAME} PARENT_SCOPE)
get_content_of_url(URL ${CONTENT_HASH_URL} CONTENT_VAR CONTENT_HASH)
string(SUBSTRING "${CONTENT_HASH}" 0 40 CONTENT_HASH)
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})
if(EXISTS ${DEPENDENCY_CACHE_DIR}/${DEP_FILENAME})
message(STATUS "Checking checksum of file ${DEP_FILENAME}")
file(SHA1 ${DEPENDENCY_CACHE_DIR}/${DEP_FILENAME} CURRENT_SHA1)
endif()
if(NOT CURRENT_SHA1 STREQUAL CONTENT_HASH)
message(STATUS "Downloading ${DEP_FILENAME}...")
file(
DOWNLOAD ${DEP_URL} ${DEPENDENCY_CACHE_DIR}/${DEP_FILENAME}
SHOW_PROGRESS
STATUS DEP_STATUS
LOG DEP_LOG
)
list(GET DEP_STATUS 0 DEP_SUCCESS)
if(NOT DEP_SUCCESS EQUAL 0)
list(GET DEP_STATUS 1 DEP_ERROR)
file(REMOVE ${DEPENDENCY_CACHE_DIR}/${DEP_FILENAME})
message(FATAL_ERROR "Failed to download ${DEP_URL}: ${DEP_ERROR}\n${DEP_LOG}")
endif()
message(STATUS "Checking checksum of file ${DEP_FILENAME}")
file(SHA1 ${DEPENDENCY_CACHE_DIR}/${DEP_FILENAME} CURRENT_SHA1)
if(NOT CURRENT_SHA1 STREQUAL CONTENT_HASH)
file(REMOVE ${DEPENDENCY_CACHE_DIR}/${DEP_FILENAME})
message(FATAL_ERROR "Failed to verify hash of dependencies, expected: ${CONTENT_HASH} actual: ${CURRENT_SHA1}")
endif()
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(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 ${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()
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)
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}/_FINISHED)
endfunction(download_deps DD_NAME)
function(download_dep_file DD_NAME)
set(ARGS DIRECTORY BUILD_NUMBER ARTIFACTNAME TOKEN FILENAME DST_FILENAME)
cmake_parse_arguments(DD "" "${ARGS}" "" ${ARGN})
if(NOT DEFINED DD_ARTIFACTNAME)
set(DD_ARTIFACTNAME ${DD_NAME})
endif(NOT DEFINED DD_ARTIFACTNAME)
if(NOT DEFINED DD_BUILD_NUMBER)
set(DD_BUILD_NUMBER "latest")
endif(NOT DEFINED DD_BUILD_NUMBER)
if(DD_BUILD_NUMBER STREQUAL latest)
set(DD_ALWAYS_DOWNLOAD ALWAYS)
endif()
if(NOT DEFINED DD_TOKEN)
set(DD_TOKEN jellyfin-dependencies)
endif()
set(BASE_URL "")
set(DEP_URL "${BASE_URL}/${DD_FILENAME}")
if(NOT EXISTS ${DEPENDENCY_CACHE_DIR}/${DD_FILENAME})
message(STATUS "Downloading ${DD_FILENAME}...")
file(
DOWNLOAD ${DEP_URL} ${DEPENDENCY_CACHE_DIR}/${DD_FILENAME}
SHOW_PROGRESS
STATUS DEP_STATUS
LOG DEP_LOG
)
list(GET DEP_STATUS 0 DEP_SUCCESS)
if(NOT DEP_SUCCESS EQUAL 0)
list(GET DEP_STATUS 1 DEP_ERROR)
file(REMOVE ${DEPENDENCY_CACHE_DIR}/${DD_FILENAME})
message(FATAL_ERROR "Failed to download ${DEP_URL}: ${DEP_ERROR}\n${DEP_LOG}")
endif()
endif()
#file(COPY ${DEPENDENCY_CACHE_DIR}/${FILENAME} ${DST_FILENAME})
endfunction()