diff --git a/build_files/build_environment/cmake/options.cmake b/build_files/build_environment/cmake/options.cmake index aae1a3099dd..e2b1115dde3 100644 --- a/build_files/build_environment/cmake/options.cmake +++ b/build_files/build_environment/cmake/options.cmake @@ -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) diff --git a/build_files/build_environment/cmake/setup_msys2.cmake b/build_files/build_environment/cmake/setup_msys2.cmake index 23b5976a102..310c8d3b289 100644 --- a/build_files/build_environment/cmake/setup_msys2.cmake +++ b/build_files/build_environment/cmake/setup_msys2.cmake @@ -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()