From ec27f15ba9470a2ba795a9493277868b306364e8 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 02:46:48 +0200 Subject: [PATCH 01/13] cmake: use external deps if the directory exist and add an option to not use libs from them - Add an option to not build and link against libraries from external_deps * Purposed to make possible to build on linux using system-provided SDL3 instead of the one in DEPS, in the rare case the system already provides SDL3. * Purposed to make possible to build on macos-arm64 using the macos-amd64 deps archive to find the NaCl runtime, relying on the system (example: brew) to find libraries. * Purposed to make possible to build on freebsd using the linux deps archive to find the NaCl runtime, relying on the system to find libraries. - Use the macos-amd64 deps on macos-arm64 only if the user didn't provide a macos-arm64 deps folder by himself. - Use the linux deps on freebsd only if the user didn't provide a freebsd deps folder by himself. - Use the deps folder if the user provided it by himself, even if we don't know yet about this system or architecture or we don't support that. --- CMakeLists.txt | 100 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 37f16a0049..740de8d1c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -218,38 +218,88 @@ set(DEPS_VERSION 11) option(USE_EXTERNAL_DEPS "Download or reuse dependencies from EXTERNAL_DEPS_DIR (mandatory for building and running NaCl .nexe binaries)." ON) +macro(set_deps_dir) + set(DEPS_DIR ${EXTERNAL_DEPS_DIR}/${DEPS_SYSTEM}-${DEPS_ARCH}-${DEPS_COMPILER}_${DEPS_VERSION}) +endmacro() + +set(DEFAULT_USE_EXTERNAL_DEPS_LIBS ON) + if (USE_EXTERNAL_DEPS AND NOT NACL) set(EXTERNAL_DEPS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external_deps" CACHE STRING "Directory in which to store the downloaded dependencies.") set(DEPS_EXT ".tar.xz") + set(DEPS_ARCH "${ARCH}") + + if (MSVC) + set(DEPS_COMPILER msvc) + elseif (WIN32) + set(DEPS_COMPILER mingw) + else() + set(DEPS_COMPILER default) + endif() + if (WIN32) set(DEPS_SYSTEM windows) set(SUPPORTED_${DEPS_SYSTEM}_ARCH amd64 i686) elseif (APPLE) set(DEPS_SYSTEM macos) set(SUPPORTED_${DEPS_SYSTEM}_ARCH amd64) - elseif (LINUX OR FREEBSD) + + if (ARCH STREQUAL arm64) + set(DEPS_ARCH amd64) + + set_deps_dir() + + if (NOT EXISTS ${DEPS_DIR}) + set(DEFAULT_USE_EXTERNAL_DEPS_LIBS OFF) + endif() + endif() + elseif (LINUX) set(DEPS_SYSTEM linux) set(SUPPORTED_${DEPS_SYSTEM}_ARCH amd64 i686 arm64 armhf) - endif() + elseif (FREEBSD) + set(DEPS_SYSTEM freebsd) + set(SUPPORTED_${DEPS_SYSTEM}_ARCH amd64 i686) - if (MSVC) - set(DEPS_COMPILER msvc) - elseif (WIN32) - set(DEPS_COMPILER mingw) - else() - set(DEPS_COMPILER default) + set_deps_dir() + + if (NOT EXISTS ${DEPS_DIR}) + set(DEFAULT_USE_EXTERNAL_DEPS_LIBS OFF) + set(DEPS_SYSTEM linux) + endif() endif() - if (DEPS_SYSTEM AND ARCH IN_LIST SUPPORTED_${DEPS_SYSTEM}_ARCH) - set(DEPS_DIR ${EXTERNAL_DEPS_DIR}/${DEPS_SYSTEM}-${ARCH}-${DEPS_COMPILER}_${DEPS_VERSION}) + set_deps_dir() + + if (DEPS_SYSTEM AND DEPS_ARCH IN_LIST SUPPORTED_${DEPS_SYSTEM}_ARCH) + set(HAS_NACL ON) if (DAEMON_PARENT_SCOPE_DIR) set(DEPS_DIR ${DEPS_DIR} PARENT_SCOPE) endif() else() - message(WARNING "No dependencies are provided for this system, Native Client is likely unsupported.") + message(WARNING "No prebuilt dependencies are available for this platform, Native Client is likely unsupported.") + + if (NOT EXISTS ${DEPS_DIR}) + unset(DEPS_DIR) + endif() + endif() +endif() + +option(USE_EXTERNAL_DEPS_LIBS "Build and link against libraries from the EXTERNAL_DEPS_DIR" ${DEFAULT_USE_EXTERNAL_DEPS_LIBS}) + +if (USE_EXTERNAL_DEPS AND NOT NACL) + if (DEPS_DIR) + message(STATUS "Using external deps dir: ${DEPS_DIR}") + + if (USE_EXTERNAL_DEPS_LIBS) + message(STATUS "Building against libraries from external deps dir") + else() + message(STATUS "Not building against libraries from external deps dir") + endif() + else() + message(STATUS "Not using any external deps dir") endif() endif() @@ -499,17 +549,19 @@ if (DEPS_DIR) endif() endif() - # Add to paths - set(CMAKE_FIND_ROOT_PATH ${DEPS_DIR} ${CMAKE_FIND_ROOT_PATH}) - set(CMAKE_INCLUDE_PATH ${DEPS_DIR} ${DEPS_DIR}/include ${CMAKE_INCLUDE_PATH}) - set(CMAKE_FRAMEWORK_PATH ${DEPS_DIR}/lib ${CMAKE_FRAMEWORK_PATH}) - set(CMAKE_PREFIX_PATH ${DEPS_DIR} ${CMAKE_PREFIX_PATH}) - if (DAEMON_PARENT_SCOPE_DIR) - # Also set parent scope so the top level CMakeLists can find precompiled deps - set(CMAKE_FIND_ROOT_PATH ${DEPS_DIR} ${CMAKE_FIND_ROOT_PATH} PARENT_SCOPE) - set(CMAKE_INCLUDE_PATH ${DEPS_DIR} ${DEPS_DIR}/include ${CMAKE_INCLUDE_PATH} PARENT_SCOPE) - set(CMAKE_FRAMEWORK_PATH ${DEPS_DIR} ${CMAKE_FRAMEWORK_PATH} PARENT_SCOPE) - set(CMAKE_PREFIX_PATH ${DEPS_DIR} ${CMAKE_PREFIX_PATH} PARENT_SCOPE) + if (USE_EXTERNAL_DEPS_LIBS) + # Add to paths + set(CMAKE_FIND_ROOT_PATH ${DEPS_DIR} ${CMAKE_FIND_ROOT_PATH}) + set(CMAKE_INCLUDE_PATH ${DEPS_DIR} ${DEPS_DIR}/include ${CMAKE_INCLUDE_PATH}) + set(CMAKE_FRAMEWORK_PATH ${DEPS_DIR}/lib ${CMAKE_FRAMEWORK_PATH}) + set(CMAKE_PREFIX_PATH ${DEPS_DIR} ${CMAKE_PREFIX_PATH}) + if (DAEMON_PARENT_SCOPE_DIR) + # Also set parent scope so the top level CMakeLists can find precompiled deps + set(CMAKE_FIND_ROOT_PATH ${DEPS_DIR} ${CMAKE_FIND_ROOT_PATH} PARENT_SCOPE) + set(CMAKE_INCLUDE_PATH ${DEPS_DIR} ${DEPS_DIR}/include ${CMAKE_INCLUDE_PATH} PARENT_SCOPE) + set(CMAKE_FRAMEWORK_PATH ${DEPS_DIR} ${CMAKE_FRAMEWORK_PATH} PARENT_SCOPE) + set(CMAKE_PREFIX_PATH ${DEPS_DIR} ${CMAKE_PREFIX_PATH} PARENT_SCOPE) + endif() endif() endif() @@ -871,7 +923,7 @@ macro(AddApplicationInternal Target Executable) add_executable(${Target} ${Sources}) target_link_libraries(${Target} ${A_Target}-objects ${CPP23SupportLibrary}) - if (DEPS_DIR) + if (DEPS_DIR AND HAS_NACL) add_dependencies(${Target} runtime_deps) endif() @@ -1024,7 +1076,7 @@ endif() # Runtime dependencies ################################################################################ -if (DEPS_DIR AND (BUILD_CLIENT OR BUILD_TTY_CLIENT OR BUILD_SERVER OR BUILD_DUMMY_APP)) +if (DEPS_DIR AND HAS_NACL AND (BUILD_CLIENT OR BUILD_TTY_CLIENT OR BUILD_SERVER OR BUILD_DUMMY_APP)) add_custom_target(runtime_deps) set_target_properties(runtime_deps PROPERTIES FOLDER "CMakePlumbing") From 5320285ba5daca7e13b3d6b660967e8e0e3bb5de Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 02:18:48 +0200 Subject: [PATCH 02/13] cmake: only set -march if the architecture is known Do not set an empty -march= option when attempting to build on an unknown system. We only print a warning when attempting to build on an unknown system, so this should not expect it is never built for an unknown system. --- cmake/DaemonFlags.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/DaemonFlags.cmake b/cmake/DaemonFlags.cmake index 95a7e04c26..24e984ac4d 100644 --- a/cmake/DaemonFlags.cmake +++ b/cmake/DaemonFlags.cmake @@ -642,7 +642,9 @@ elseif (NOT NACL) option(USE_CPU_GENERIC_ARCHITECTURE "Enforce generic -march and -mtune compiler options" ON) if (USE_CPU_GENERIC_ARCHITECTURE) - try_c_cxx_flag_werror(MARCH "-march=${GCC_GENERIC_ARCH}") + if (GCC_GENERIC_ARCH) + try_c_cxx_flag_werror(MARCH "-march=${GCC_GENERIC_ARCH}") + endif() if (GCC_GENERIC_TUNE) try_c_cxx_flag_werror(MTUNE "-mtune=${GCC_GENERIC_TUNE}") From e078e25667a8dafd1430bcfe29567da0f77f9664 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 02:19:34 +0200 Subject: [PATCH 03/13] cmake: make riscv64 a known native architecture --- cmake/DaemonFlags.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmake/DaemonFlags.cmake b/cmake/DaemonFlags.cmake index 24e984ac4d..2b25f92bf2 100644 --- a/cmake/DaemonFlags.cmake +++ b/cmake/DaemonFlags.cmake @@ -632,6 +632,9 @@ elseif (NOT NACL) set(GCC_GENERIC_ARCH "armv6") # There is no generic tuning option for armv6. unset(GCC_GENERIC_TUNE) + elseif (ARCH STREQUAL "riscv64") + unset(GCC_GENERIC_ARCH) + unset(GCC_GENERIC_TUNE) else() message(WARNING "Unknown architecture ${ARCH}") endif() From b8864f2883a7ed9df8bc84f2ff8711c06e2f4a90 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 01:25:59 +0200 Subject: [PATCH 04/13] external_deps: add the linux-riscv64-default profile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Makes it possible to build the deps for a linux-riscv64 build, it's only useful for a server as NaCl isn't working. It's used as an example of how we can implement and unlock systems we don't support. Such systems are meant to be listed as “extra”. In that context, “supported” means we provide a release binary in the unizip, while “extra” means we don't prevent someone to build it and run it if that works for him. --- external_deps/build.sh | 76 ++++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 21 deletions(-) diff --git a/external_deps/build.sh b/external_deps/build.sh index 7ecc965e2a..124fd7530f 100755 --- a/external_deps/build.sh +++ b/external_deps/build.sh @@ -598,29 +598,42 @@ build_jpeg() { ;; esac - local jpeg_cmake_args=(-DREQUIRE_SIMD=ON) + local jpeg_cmake_args=() + + local SYSTEM_PROCESSOR='unknown' + local jpeg_require_simd='OFF' case "${PLATFORM}" in *-amd64-*) - local SYSTEM_PROCESSOR='x86_64' + SYSTEM_PROCESSOR='x86_64' + jpeg_require_simd='ON' # Ensure NASM is available nasm --help >/dev/null ;; *-i686-*) - local SYSTEM_PROCESSOR='i386' + SYSTEM_PROCESSOR='i386' + jpeg_require_simd='ON' # Ensure NASM is available nasm --help >/dev/null ;; *-arm64-*) - local SYSTEM_PROCESSOR='aarch64' + SYSTEM_PROCESSOR='aarch64' + jpeg_require_simd='ON' jpeg_cmake_args+=(-DNEON_INTRINSICS=ON) ;; *-armhf-*) - local SYSTEM_PROCESSOR='arm' + SYSTEM_PROCESSOR='arm' + jpeg_require_simd='ON' jpeg_cmake_args+=(-DNEON_INTRINSICS=ON) ;; + *-riscv64-*) + # There is no riscv64 code implemented in libjpeg yet, but we can build it without SIMD code. + # This string will only be used for warnings like that: + # > SIMD extensions not available for this CPU (riscv64). Performance will suffer. + SYSTEM_PROCESSOR='riscv64' + ;; *) - log ERROR 'Unsupported platform for JPEG' + log WARNING 'Unknown platform for JPEG' ;; esac @@ -645,6 +658,7 @@ build_jpeg() { -DENABLE_STATIC="${LIBS_STATIC}" \ -DCMAKE_SYSTEM_NAME="${SYSTEM_NAME}" \ -DCMAKE_SYSTEM_PROCESSOR="${SYSTEM_PROCESSOR}" \ + -DREQUIRE_SIMD=${jpeg_require_simd} \ -DWITH_JPEG8=1 \ -DWITH_TURBOJPEG=0 \ "${jpeg_cmake_args[@]}" @@ -1328,6 +1342,8 @@ common_setup_arch() { CFLAGS+=' -march=armv7-a -mfpu=neon' CXXFLAGS+=' -march=armv7-a -mfpu=neon' ;; + *-riscv64-*) + ;; *) log ERROR 'Unsupported platform' ;; @@ -1439,6 +1455,11 @@ setup_linux-arm64-default() { common_setup linux aarch64-unknown-linux-gnu } +# Set up environment for 64-bit riscv Linux +setup_linux-riscv64-default() { + common_setup linux riscv64-unknown-linux-gnu +} + base_windows_amd64_msvc_packages='zlib gmp nettle curl sdl3 glew png jpeg webp openal ogg vorbis opus opusfile naclsdk depcheck genlib' all_windows_amd64_msvc_packages="${base_windows_amd64_msvc_packages}" @@ -1466,10 +1487,16 @@ all_linux_arm64_default_packages='zlib gmp nettle curl sdl3 glew png jpeg webp o base_linux_armhf_default_packages="${base_linux_arm64_default_packages}" all_linux_armhf_default_packages="${all_linux_arm64_default_packages}" -all_linux_platforms='linux-amd64-default linux-arm64-default linux-armhf-default linux-i686-default' -all_windows_platforms='windows-amd64-mingw windows-amd64-msvc windows-i686-mingw windows-i686-msvc' -all_macos_platforms='macos-amd64-default' -all_platforms="${all_linux_platforms} ${all_windows_platforms} ${all_macos_platforms}" +base_linux_riscv64_default_packages='sdl3' +all_linux_riscv64_default_packages='zlib gmp nettle curl sdl3 glew png jpeg webp openal ogg vorbis opus opusfile ncurses' + +supported_linux_platforms='linux-amd64-default linux-arm64-default linux-armhf-default linux-i686-default' +supported_windows_platforms='windows-amd64-mingw windows-amd64-msvc windows-i686-mingw windows-i686-msvc' +supported_macos_platforms='macos-amd64-default' +supported_platforms="${supported_linux_platforms} ${supported_windows_platforms} ${supported_macos_platforms}" + +extra_linux_platforms='linux-riscv64-default' +extra_platforms="${extra_linux_platforms}" printHelp() { # Please align to 4-space tabs. @@ -1482,15 +1509,18 @@ printHelp() { --download-only only download source packages, do not build them --prefer-ours attempt to download from unvanquished.net first - Platforms: - ${all_platforms} + Supported platforms: + ${supported_platforms} - Virtual platforms: - linux ${all_linux_platforms} - windows ${all_windows_platforms} - macos ${all_macos_platforms} + Supported virtual platforms: + linux ${supported_linux_platforms} + windows ${supported_windows_platforms} + macos ${supported_macos_platforms} all linux windows macos + Extra platforms: + ${extra_platforms} + Packages: pkgconfig nasm zlib gmp nettle curl sdl3 glew png jpeg webp openal ogg vorbis opus opusfile naclsdk wasisdk wasmtime @@ -1530,6 +1560,10 @@ printHelp() { base ${base_linux_arm64_default_packages} all ${all_linux_arm64_default_packages} + linux-riscv64-default: + base ${base_linux_riscv64_default_packages} + all ${all_linux_riscv64_default_packages} + EOF exit @@ -1595,19 +1629,19 @@ platform="${1}"; shift platform_list='' case "${platform}" in 'all') - platform_list="${all_platforms}" + platform_list="${supported_platforms}" ;; 'linux') - platform_list="${all_linux_platforms}" + platform_list="${supported_linux_platforms}" ;; 'windows') - platform_list="${all_windows_platforms}" + platform_list="${supported_windows_platforms}" ;; 'macos') - platform_list="${all_macos_platforms}" + platform_list="${supported_macos_platforms}" ;; *) - for known_platform in ${all_platforms} + for known_platform in ${supported_platforms} ${extra_platforms} do if [ "${platform}" = "${known_platform}" ] then From 0a62804b7cb9417149483e3dd27e8ef4ac7ed0cb Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 19:26:55 +0200 Subject: [PATCH 05/13] external_deps: we don't build SDL with pkg-config anymore --- external_deps/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external_deps/build.sh b/external_deps/build.sh index 124fd7530f..8d9022418d 100755 --- a/external_deps/build.sh +++ b/external_deps/build.sh @@ -249,7 +249,7 @@ cmake_build() { cmake --install build --strip } -# Build pkg-config, needed for opusfile and SDL3. +# Build pkg-config, needed for opusfile. # As a host-mode dependency it must be provided by the system when cross-compiling. build_pkgconfig() { local dir_name="pkg-config-${PKGCONFIG_VERSION}" From 3f69832713a1d45e707fbcbe2c2520fa77f9bea6 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 19:42:59 +0200 Subject: [PATCH 06/13] external_deps: do not cross-compile pkgconfig Do not cross-compile pkgconfig, it is part of the cross-compilation toolchain. --- external_deps/build.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/external_deps/build.sh b/external_deps/build.sh index 8d9022418d..686d303cc7 100755 --- a/external_deps/build.sh +++ b/external_deps/build.sh @@ -262,7 +262,12 @@ build_pkgconfig() { cd "${dir_name}" - CFLAGS="${CFLAGS} -Wno-error=int-conversion" \ + # Reset the environment variables, we don't cross-compile this, + # it is part of the cross-compilation toolchain. + # CXXFLAGS is unused. + CFLAGS='-Wno-error=int-conversion' \ + LDFLAGS='' \ + HOST='' \ configure_build \ --with-internal-glib } From 99ce265e22d44343f61bc99457d38d1413cd171c Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 19:02:14 +0200 Subject: [PATCH 07/13] external_deps: rework the macos-amd64 setup a bit --- external_deps/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external_deps/build.sh b/external_deps/build.sh index 686d303cc7..f73b754cf0 100755 --- a/external_deps/build.sh +++ b/external_deps/build.sh @@ -1437,7 +1437,7 @@ setup_macos-amd64-default() { MACOS_ARCH=x86_64 # OpenAL requires 10.14. export MACOSX_DEPLOYMENT_TARGET=10.14 # works with CMake - common_setup macos x86_64-apple-darwin11 + common_setup macos "x86_64-apple-macosx${MACOSX_DEPLOYMENT_TARGET}" } # Set up environment for 32-bit i686 Linux From 331b1e1dbf8092bf3697c32c3fbc028b62293f38 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 19:01:52 +0200 Subject: [PATCH 08/13] external_deps: add the macos-arm64-default profile --- external_deps/build.sh | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/external_deps/build.sh b/external_deps/build.sh index f73b754cf0..77bc363af6 100755 --- a/external_deps/build.sh +++ b/external_deps/build.sh @@ -1018,7 +1018,7 @@ build_naclsdk() { local NACLSDK_ARCH=x86_32 local DAEMON_ARCH=i686 ;; - *-amd64-*) + *-amd64-*|macos-arm64-*) local NACLSDK_ARCH=x86_64 local DAEMON_ARCH=amd64 ;; @@ -1440,6 +1440,15 @@ setup_macos-amd64-default() { common_setup macos "x86_64-apple-macosx${MACOSX_DEPLOYMENT_TARGET}" } +# Set up environment for 64-bit arm64 macOS +setup_macos-arm64-default() { + MACOS_ARCH=arm64 + # First macOS supporting the Apple M1. + export MACOSX_DEPLOYMENT_TARGET=11.0 + # Some old configure-based build like opusfile doen't recognize the arm64-apple prefix. + common_setup macos "aarch64-apple-macosx${MACOSX_DEPLOYMENT_TARGET}" +} + # Set up environment for 32-bit i686 Linux setup_linux-i686-default() { common_setup linux i686-unknown-linux-gnu @@ -1480,6 +1489,9 @@ all_windows_i686_mingw_packages="${base_windows_amd64_mingw_packages}" base_macos_amd64_default_packages='pkgconfig nasm gmp nettle sdl3 glew png jpeg webp openal ogg vorbis opus opusfile naclsdk' all_macos_amd64_default_packages="${base_macos_amd64_default_packages}" +base_macos_arm64_default_packages='pkgconfig gmp nettle sdl3 glew png jpeg webp openal ogg vorbis opus opusfile naclsdk' +all_macos_arm64_default_packages="${base_macos_arm64_default_packages}" + base_linux_i686_default_packages='sdl3 naclsdk' all_linux_i686_default_packages='zlib gmp nettle curl sdl3 glew png jpeg webp openal ogg vorbis opus opusfile ncurses naclsdk' @@ -1501,7 +1513,8 @@ supported_macos_platforms='macos-amd64-default' supported_platforms="${supported_linux_platforms} ${supported_windows_platforms} ${supported_macos_platforms}" extra_linux_platforms='linux-riscv64-default' -extra_platforms="${extra_linux_platforms}" +extra_macos_platforms='macos-arm64-default' +extra_platforms="${extra_linux_platforms} ${extra_macos_platforms}" printHelp() { # Please align to 4-space tabs. @@ -1552,6 +1565,10 @@ printHelp() { base ${base_macos_amd64_default_packages} all same + macos-arm64-default: + base ${base_macos_arm64_default_packages} + all same + linux-amd64-default: base ${base_linux_amd64_default_packages} all ${all_linux_amd64_default_packages} From d4f50ebf704e691f70c494eae1ddb45a0f59c4c5 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 20:39:36 +0200 Subject: [PATCH 09/13] external_deps: use gmake instead of make on FreeBSD --- external_deps/build.sh | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/external_deps/build.sh b/external_deps/build.sh index 77bc363af6..bcf37c1852 100755 --- a/external_deps/build.sh +++ b/external_deps/build.sh @@ -84,6 +84,16 @@ CFLAGS='-O3 -fPIC' CXXFLAGS='-O3 -fPIC' LDFLAGS='-O3 -fPIC' +case "$(uname -s)" in + 'FreeBSD') + # The builtin make isn't compatible enough. + MAKE='gmake' + ;; + *) + MAKE='make' + ;; +esac + log() { level="${1}"; shift printf '%s: %s\n' "${level}" "${@}" >&2 @@ -202,8 +212,8 @@ configure_build() { --libdir="${PREFIX}/lib" \ "${configure_args[@]}" - make - make install + "${MAKE}" + "${MAKE}" install } get_compiler_name() { @@ -309,8 +319,8 @@ build_zlib() { case "${PLATFORM}" in windows-*-*) - LOC="${CFLAGS}" make -f win32/Makefile.gcc PREFIX="${HOST}-" - make -f win32/Makefile.gcc install BINARY_PATH="${PREFIX}/bin" LIBRARY_PATH="${PREFIX}/lib" INCLUDE_PATH="${PREFIX}/include" SHARED_MODE=1 + LOC="${CFLAGS}" "${MAKE}" -f win32/Makefile.gcc PREFIX="${HOST}-" + "${MAKE}" -f win32/Makefile.gcc install BINARY_PATH="${PREFIX}/bin" LIBRARY_PATH="${PREFIX}/lib" INCLUDE_PATH="${PREFIX}/include" SHARED_MODE=1 ;; *) CFLAGS="${CFLAGS} -DZLIB_CONST" \ @@ -537,12 +547,12 @@ build_glew() { # manually re-add the required flags there. case "${PLATFORM}" in macos-*-*) - make "${glew_env[@]}" "${glew_options[@]}" - make install "${glew_env[@]}" "${glew_options[@]}" + "${MAKE}" "${glew_env[@]}" "${glew_options[@]}" + "${MAKE}" install "${glew_env[@]}" "${glew_options[@]}" ;; *) - env "${glew_env[@]}" make "${glew_options[@]}" - env "${glew_env[@]}" make install "${glew_options[@]}" + env "${glew_env[@]}" "${MAKE}" "${glew_options[@]}" + env "${glew_env[@]}" "${MAKE}" install "${glew_options[@]}" ;; esac From bc8dbaca09af3ce2e97e8afa3c295e68c00fecf5 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 20:14:54 +0200 Subject: [PATCH 10/13] external_deps: add the freebsd-amd64-default profile --- external_deps/build.sh | 46 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/external_deps/build.sh b/external_deps/build.sh index bcf37c1852..41b1986866 100755 --- a/external_deps/build.sh +++ b/external_deps/build.sh @@ -534,6 +534,10 @@ build_glew() { glew_env+=(CFLAGS.EXTRA="${CFLAGS}") glew_options+=(LIBDIR="${PREFIX}/lib" LD="${CC}") ;; + freebsd-*-*) + glew_env+=(CFLAGS.EXTRA="${CFLAGS}") + glew_options+=(SYSTEM=freebsd LD="${CC}") + ;; *) log ERROR 'Unsupported platform for GLEW' ;; @@ -605,6 +609,9 @@ build_jpeg() { linux-*-*) local SYSTEM_NAME='Linux' ;; + freebsd-*-*) + local SYSTEM_NAME='FreeBSD' + ;; *) # Other platforms can build but we need to explicitly # set CMAKE_SYSTEM_NAME for CMAKE_CROSSCOMPILING to be set @@ -942,6 +949,9 @@ build_wasisdk() { linux-*-*) local WASISDK_PLATFORM=linux ;; + *) + log ERROR "wasi doesn't have release for ${PLATFORM}" + ;; esac case "${PLATFORM}" in *-amd64-*) @@ -978,6 +988,9 @@ build_wasmtime() { local WASMTIME_PLATFORM=linux local ARCHIVE_EXT=tar.xz ;; + *) + log ERROR "wasmtime doesn't have release for ${PLATFORM}" + ;; esac case "${PLATFORM}" in *-amd64-*) @@ -1017,7 +1030,7 @@ build_naclsdk() { local EXE= local TAR_EXT=tar ;; - linux-*-*) + linux-*-*|freebsd-*-*) local NACLSDK_PLATFORM=linux local EXE= local TAR_EXT=tar @@ -1047,7 +1060,7 @@ build_naclsdk() { cp pepper_*"/tools/irt_core_${NACLSDK_ARCH}.nexe" "${PREFIX}/irt_core-${DAEMON_ARCH}.nexe" case "${PLATFORM}" in - linux-amd64-*) + linux-amd64-*|freebsd-amd64-*) ;; # Get sel_ldr from naclruntime package *) cp pepper_*"/tools/sel_ldr_${NACLSDK_ARCH}${EXE}" "${PREFIX}/nacl_loader${EXE}" @@ -1077,7 +1090,7 @@ build_naclsdk() { cp pepper_*"/tools/sel_ldr_x86_64.exe" "${PREFIX}/nacl_loader-amd64.exe" cp pepper_*"/tools/irt_core_x86_64.nexe" "${PREFIX}/irt_core-amd64.nexe" ;; - linux-amd64-*) + linux-amd64-*|freebsd-amd64-*) # Fix permissions on a few files which deny access to non-owner chmod 644 "${PREFIX}/irt_core-${DAEMON_ARCH}.nexe" ;; @@ -1258,7 +1271,7 @@ build_install() { # Fix import lib paths to use MSVC-style instead of MinGW ones (see 'genlib' target) find "${PKG_PREFIX}/lib/cmake" -name '*.cmake' -execdir sed -i -E 's@[.]dll[.]a\b@.lib@g' {} \; ;; - linux-*-*) + linux-*-*|freebsd-*-*) find "${PKG_PREFIX}/lib" -name '*.so' -execdir rm -f -- {} \; find "${PKG_PREFIX}/lib" -name '*.so.*' -execdir rm -f -- {} \; find "${PKG_PREFIX}/lib" -name '*_g.a' -execdir rm -f -- {} \; @@ -1416,6 +1429,15 @@ common_setup_linux() { CXXFLAGS+=' -fPIC' } +common_setup_freebsd() { + CC='clang' + CXX='clang++' + STRIP='strip' + CFLAGS+=" -target ${HOST}" + CXXFLAGS+=" -target ${HOST}" + LDFLAGS+=" -target ${HOST}" +} + # Set up environment for 32-bit i686 Windows for Visual Studio (compile all as .dll) setup_windows-i686-msvc() { BITNESS=32 @@ -1484,6 +1506,11 @@ setup_linux-riscv64-default() { common_setup linux riscv64-unknown-linux-gnu } +# Set up environment for 64-bit amd64 FreeBSD +setup_freebsd-amd64-default() { + common_setup freebsd x86_64-unknown-freebsd13.3 +} + base_windows_amd64_msvc_packages='zlib gmp nettle curl sdl3 glew png jpeg webp openal ogg vorbis opus opusfile naclsdk depcheck genlib' all_windows_amd64_msvc_packages="${base_windows_amd64_msvc_packages}" @@ -1517,6 +1544,10 @@ all_linux_armhf_default_packages="${all_linux_arm64_default_packages}" base_linux_riscv64_default_packages='sdl3' all_linux_riscv64_default_packages='zlib gmp nettle curl sdl3 glew png jpeg webp openal ogg vorbis opus opusfile ncurses' +# FIXME: The naclruntime isn't rebuilt. +base_freebsd_amd64_default_packages='sdl3 naclsdk' +all_freebsd_amd64_default_packages='zlib gmp nettle curl sdl3 glew png jpeg webp openal ogg vorbis opus opusfile naclsdk' + supported_linux_platforms='linux-amd64-default linux-arm64-default linux-armhf-default linux-i686-default' supported_windows_platforms='windows-amd64-mingw windows-amd64-msvc windows-i686-mingw windows-i686-msvc' supported_macos_platforms='macos-amd64-default' @@ -1524,7 +1555,8 @@ supported_platforms="${supported_linux_platforms} ${supported_windows_platforms} extra_linux_platforms='linux-riscv64-default' extra_macos_platforms='macos-arm64-default' -extra_platforms="${extra_linux_platforms} ${extra_macos_platforms}" +extra_freebsd_platforms='freebsd-amd64-default' +extra_platforms="${extra_linux_platforms} ${extra_macos_platforms} ${extra_freebsd_platforms}" printHelp() { # Please align to 4-space tabs. @@ -1596,6 +1628,10 @@ printHelp() { base ${base_linux_riscv64_default_packages} all ${all_linux_riscv64_default_packages} + freebsd-amd64-default: + base ${base_freebsd_amd64_default_packages} + all ${all_freebsd_amd64_default_packages} + EOF exit From 917d94e30fbaa9a09302ac104813384521a2f3b9 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 22:51:57 +0200 Subject: [PATCH 11/13] external_deps: do not build OpenAL utils --- external_deps/build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/external_deps/build.sh b/external_deps/build.sh index 41b1986866..a3aff4efc9 100755 --- a/external_deps/build.sh +++ b/external_deps/build.sh @@ -801,6 +801,7 @@ build_openal() { cd "${dir_name}" cmake_build \ + -DALSOFT_UTILS=OFF \ "${openal_cmake_args[@]}" ;; esac From ed29a2d849ac3303256032061e1ad2838c43562e Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 23:53:28 +0200 Subject: [PATCH 12/13] external_deps: workaround a GLEW build error on FreeBSD --- external_deps/build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/external_deps/build.sh b/external_deps/build.sh index a3aff4efc9..2c82ca4594 100755 --- a/external_deps/build.sh +++ b/external_deps/build.sh @@ -536,7 +536,8 @@ build_glew() { ;; freebsd-*-*) glew_env+=(CFLAGS.EXTRA="${CFLAGS}") - glew_options+=(SYSTEM=freebsd LD="${CC}") + sed -e 's/ -soname / -Wl,-soname=/' config/Makefile.freebsd > config/Makefile.freebsd-fix + glew_options+=(SYSTEM=freebsd-fix LD="${CC}") ;; *) log ERROR 'Unsupported platform for GLEW' From b06d29dc120fdea4bcc5c2fb178346fbbb55b93a Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sat, 27 Sep 2025 00:09:49 +0200 Subject: [PATCH 13/13] external_deps: also delete libdata/pkconfig (FreeBSD path) --- external_deps/build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/external_deps/build.sh b/external_deps/build.sh index 2c82ca4594..aa54d70975 100755 --- a/external_deps/build.sh +++ b/external_deps/build.sh @@ -1254,6 +1254,7 @@ build_install() { rm -rf "${PKG_PREFIX}/def" rm -rf "${PKG_PREFIX}/share" rm -rf "${PKG_PREFIX}/lib/pkgconfig" + rm -rf "${PKG_PREFIX}/libdata/pkgconfig" find "${PKG_PREFIX}/bin" -not -type d -not -name '*.dll' -not -execdir rm -f -- {} \; find "${PKG_PREFIX}/lib" -name '*.la' -execdir rm -f -- {} \; find "${PKG_PREFIX}/lib" -name '*.dll.a' -execdir bash -c 'rm -f -- "$(basename "{}" .dll.a).a"' \;