Deps_Builder: Win: Use blender mirror of msys2 for bootstrapping

This (optionally) uses the blender mirror for bootstrapping the msys2
environment, this is needed since some upstream providers remove older
packages frequently which makes it difficult to build older libs from
scratch.

Pull Request: https://projects.blender.org/blender/blender/pulls/131617
This commit is contained in:
Ray Molenkamp
2024-12-19 14:41:24 +01:00
committed by Ray molenkamp
parent 2a53debc73
commit 5eba4313aa
2 changed files with 80 additions and 44 deletions

View File

@@ -4,6 +4,7 @@
if(WIN32)
option(ENABLE_MSYS2 "Enable building of ffmpeg/libsndfile/fftw3/gmp by installing msys2" ON)
option(MSYS2_USE_UPSTREAM_PACKAGES "Use upstream packages to bootstrap msys2, when OFF the blender mirror will be used" OFF)
endif()
option(FORCE_CHECK_HASH "Force a check of all hashses during CMake the configure phase" OFF)

View File

@@ -10,6 +10,71 @@
# Note - no compiler is actually installed here, we just use the tools
##################################################################################################
macro(download_package package_name)
# this will
# 1 - download the required package from either the upstream location or blender mirror depending on MSYS2_USE_UPSTREAM_PACKAGES
# 2 - Set a global variable [package_name]_FILE to point to the downloaded file
# 3 - Verify the hash if FORCE_CHECK_HASH is on
set(URL ${MSYS2_${package_name}_URL})
set(HASH ${MSYS2_${package_name}_HASH})
string(REPLACE "/" ";" _url_list ${URL})
list(GET _url_list -1 _file_name)
set(_final_filename "${DOWNLOAD_DIR}/${_file_name}")
set(MSYS2_${package_name}_FILE ${_final_filename})
if(NOT EXISTS "${_final_filename}")
if(MSYS2_USE_UPSTREAM_PACKAGES)
set(_final_url ${URI})
else()
set(_final_url "https://projects.blender.org/blender/lib-windows_x64/media/branch/build_environment/${_file_name}")
endif()
message("Downloading ${_final_filename} from ${_final_url}")
file(
DOWNLOAD ${_final_url} ${_final_filename}
TIMEOUT 1800 # seconds
EXPECTED_HASH SHA1=${HASH}
TLS_VERIFY ON
SHOW_PROGRESS
)
endif()
if(EXISTS "${_final_filename}")
if(FORCE_CHECK_HASH)
file(SHA1 ${_final_filename} LOCAL_HASH)
if(NOT ${HASH} STREQUAL ${LOCAL_HASH})
message(FATAL_ERROR "${_final_filename} SHA1 mismatch\nExpected\t: ${HASH}\nActual\t: ${LOCAL_HASH}")
endif()
endif()
endif()
unset(URL)
unset(HASH)
unset(_final_url)
unset(_final_filename)
unset(_url_list)
unset(_file_name)
endmacro()
# Note we use URL here rather than URI as the deps checker will check all *_URI vars for package/license/homepage requirements
# since none of this will end up on end users systems the requirements are not as strict
set(MSYS2_BASE_URL https://repo.msys2.org/distrib/x86_64/msys2-base-x86_64-20221028.tar.xz)
set(MSYS2_BASE_HASH 545cc6a4c36bb98058f2b2945c5d06de523516db)
set(MSYS2_NASM_URL http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/win64/nasm-2.13.02-win64.zip)
set(MSYS2_NASM_HASH 6ae5eaffde68aa7450fadd7f45ba5c6df3dce558)
set(MSYS2_PERL_URL https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_5380_5361/strawberry-perl-5.38.0.1-64bit-portable.zip)
set(MSYS2_PERL_HASH 987c870cc2401e481e3ddbdd1462d2a52da34187)
set(MSYS2_GAS_URL https://raw.githubusercontent.com/FFmpeg/gas-preprocessor/9309c67acb535ca6248f092e96131d8eb07eefc1/gas-preprocessor.pl)
set(MSYS2_GAS_HASH d86e756793eb37a269f06e20538d2bb3141ec24a)
set(MSYS2_AR_URL https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-12.2.0/ar-lib)
set(MSYS2_AR_HASH 77194f45708a80f502102fa881a8a5cb048b03af)
download_package(BASE)
download_package(NASM)
download_package(PERL)
download_package(GAS)
download_package(AR)
message("LIBDIR = ${LIBDIR}")
macro(cmake_to_msys_path MsysPath ResultingPath)
string(REPLACE ":" "" TmpPath "${MsysPath}")
@@ -21,16 +86,6 @@ endmacro()
cmake_to_msys_path(${LIBDIR} msys2_LIBDIR)
message("msys2_LIBDIR = ${msys2_LIBDIR}")
# Get msys2-base (currently x64 only)
message("Checking for msys2 base")
if(NOT EXISTS "${DOWNLOAD_DIR}/msys2-base-x86_64-20221028.tar.xz")
message("Downloading msys2-base")
file(DOWNLOAD
"https://repo.msys2.org/distrib/x86_64/msys2-base-x86_64-20221028.tar.xz"
"${DOWNLOAD_DIR}/msys2-base-x86_64-20221028.tar.xz"
)
endif()
# Make msys2 root directory
if(NOT EXISTS "${DOWNLOAD_DIR}/msys2")
execute_process(
@@ -41,10 +96,10 @@ endif()
# Extract msys2
if((NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/msys2_shell.cmd") AND
(EXISTS "${DOWNLOAD_DIR}/msys2-base-x86_64-20221028.tar.xz"))
(EXISTS "${MSYS2_BASE_FILE}"))
message("Extracting msys2 base")
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar jxf ${DOWNLOAD_DIR}/msys2-base-x86_64-20221028.tar.xz
COMMAND ${CMAKE_COMMAND} -E tar jxf ${MSYS2_BASE_FILE}
WORKING_DIRECTORY ${DOWNLOAD_DIR}/msys2
)
@@ -96,20 +151,11 @@ if(EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/link.exe")
)
endif()
message("Checking for nasm")
if(NOT EXISTS "${DOWNLOAD_DIR}/nasm-2.13.02-win64.zip")
message("Downloading nasm")
file(DOWNLOAD
"http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/win64/nasm-2.13.02-win64.zip"
"${DOWNLOAD_DIR}/nasm-2.13.02-win64.zip"
)
endif()
# extract nasm
if((NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/nasm.exe") AND (EXISTS "${DOWNLOAD_DIR}/nasm-2.13.02-win64.zip"))
if((NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/nasm.exe") AND (EXISTS "${MSYS2_NASM_FILE}"))
message("Extracting nasm")
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar jxf "${DOWNLOAD_DIR}/nasm-2.13.02-win64.zip"
COMMAND ${CMAKE_COMMAND} -E tar jxf "${MSYS2_NASM_FILE}"
WORKING_DIRECTORY ${DOWNLOAD_DIR}/
)
execute_process(
@@ -120,16 +166,6 @@ if((NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/nasm.exe") AND (EXISTS "${D
endif()
set(NASM_PATH "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/nasm.exe")
message("Checking for perl")
# download perl for libvpx
if(NOT EXISTS "${DOWNLOAD_DIR}/strawberry-perl-5.38.0.1-64bit-portable.zip")
message("Downloading perl")
file(DOWNLOAD
"https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_5380_5361/strawberry-perl-5.38.0.1-64bit-portable.zip"
"${DOWNLOAD_DIR}/strawberry-perl-5.38.0.1-64bit-portable.zip"
)
endif()
# make perl root directory
if(NOT EXISTS "${DOWNLOAD_DIR}/perl")
execute_process(
@@ -139,32 +175,31 @@ if(NOT EXISTS "${DOWNLOAD_DIR}/perl")
endif()
# extract perl
if((NOT EXISTS "${DOWNLOAD_DIR}/perl/portable.perl") AND (EXISTS "${DOWNLOAD_DIR}/strawberry-perl-5.38.0.1-64bit-portable.zip"))
if((NOT EXISTS "${DOWNLOAD_DIR}/perl/portable.perl") AND (EXISTS "${MSYS2_PERL_FILE}"))
message("Extracting perl")
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar jxf ${DOWNLOAD_DIR}/strawberry-perl-5.38.0.1-64bit-portable.zip
COMMAND ${CMAKE_COMMAND} -E tar jxf ${MSYS2_PERL_FILE}
WORKING_DIRECTORY ${DOWNLOAD_DIR}/perl
)
endif()
# Get gas-preprocessor for ffmpeg
# This is required for Windows ARM64 builds
message("Checking for gas-preprocessor.pl")
if(NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/gas-preprocessor.pl")
message("Downloading gas-preprocessor.pl")
file(DOWNLOAD
"https://raw.githubusercontent.com/FFmpeg/gas-preprocessor/9309c67acb535ca6248f092e96131d8eb07eefc1/gas-preprocessor.pl"
"${DOWNLOAD_DIR}/msys2/msys64/usr/bin/gas-preprocessor.pl"
execute_process(
COMMAND ${CMAKE_COMMAND} -E copy
${MSYS2_GAS_FILE}
"${DOWNLOAD_DIR}/msys2/msys64/usr/bin/gas-preprocessor.pl"
)
endif()
# Get ar-lib
message("Checking for ar-lib")
if(NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/ar-lib")
message("Downloading ar-lib")
file(DOWNLOAD
"https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-12.2.0/ar-lib"
"${DOWNLOAD_DIR}/msys2/msys64/usr/bin/ar-lib"
execute_process(
COMMAND ${CMAKE_COMMAND} -E copy
${MSYS2_AR_FILE}
"${DOWNLOAD_DIR}/msys2/msys64/usr/bin/ar-lib"
)
endif()