From fd4e383caee253e78bf7ac645ae782228a68d7db Mon Sep 17 00:00:00 2001 From: Leroy Hopson Date: Tue, 31 May 2022 20:14:41 +0700 Subject: [PATCH] Support universal (x86_64/arm64) builds for macOS The macOS binary (libgodot-xterm.osx.64.dylib) is now a universal binary that runs natively on both x86_64 and arm64. --- .github/workflows/main.yml | 3 ++- CHANGELOG.md | 5 ++++- addons/godot_xterm/native/SConstruct | 21 +++++++++++++-------- addons/godot_xterm/native/build.sh | 7 ++++--- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1c626c9..607e042 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -130,7 +130,8 @@ jobs: OS: ${{ matrix.os }} run: | cd addons/godot_xterm/native/thirdparty/libuv - args="-DCMAKE_BUILD_TYPE=$TARGET -DBUILD_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE" + args="-DCMAKE_BUILD_TYPE=$TARGET -DBUILD_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_OSX_ARCHITECTURES=x86_64;arm64" if [ "$TARGET" == "release" ]; then args="$args -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDLL" else diff --git a/CHANGELOG.md b/CHANGELOG.md index 75fd7dc..09bae13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased](https://github.com/lihop/godot-xterm/compare/v2.0.0...HEAD) - +### Added +- Support for macOS universal (x86_64/arm64) binaries. The macOS binary + `libgodot-xterm.osx.64.dylib` is now a universal binary that runs natively + on both x86_64 and arm64. ## [v2.0.0](https://github.com/lihop/godot-xterm/compare/v1.2.1...v2.0.0) - 2021-07-25 ### Added diff --git a/addons/godot_xterm/native/SConstruct b/addons/godot_xterm/native/SConstruct index c483f95..f9ae061 100644 --- a/addons/godot_xterm/native/SConstruct +++ b/addons/godot_xterm/native/SConstruct @@ -62,6 +62,8 @@ opts.Add(EnumVariable( allowed_values=('debug', 'release'), ignorecase=2 )) +opts.Add(EnumVariable("macos_arch", "Target macOS architecture", + "universal", ["universal", "x86_64", "arm64"])) opts.Add(BoolVariable( 'disable_pty', 'Disables the PTY and its dependencies (LibuvUtils and Pipe). Has no effect on platforms where PTY is not supported', @@ -139,15 +141,17 @@ elif env['platform'] == 'osx': if env['bits'] == '32': raise ValueError( - 'Only 64-bit builds are supported for the macOS target.' + 'Only 64-bit builds are supported for the osx platform.' ) - env.Append(CCFLAGS=['-arch', 'x86_64']) - env.Append(LINKFLAGS=[ - '-arch', - 'x86_64', - '-Wl,-undefined,dynamic_lookup', - ]) + if env["macos_arch"] == "universal": + env.Append(LINKFLAGS=["-arch", "x86_64", "-arch", "arm64"]) + env.Append(CCFLAGS=["-arch", "x86_64", "-arch", "arm64"]) + else: + env.Append(LINKFLAGS=["-arch", env["macos_arch"]]) + env.Append(CCFLAGS=["-arch", env["macos_arch"]]) + + env.Append(LINKFLAGS=['-Wl,-undefined,dynamic_lookup']) if env['target'] == 'debug': env.Append(CCFLAGS=['-Og', '-g']) @@ -249,7 +253,8 @@ env.Append(LIBS=[ env.File('thirdparty/godot-cpp/bin/libgodot-cpp.{}.{}.{}{}'.format( env['platform'], env['target'], - 'wasm' if env['platform'] == 'javascript' else env['bits'], + 'wasm' if env['platform'] == 'javascript' else env['macos_arch'] if ( + env['macos_arch'] != 'universal' and env['platform'] == 'osx') else env['bits'], env['LIBSUFFIX'], )), env.File('thirdparty/libtsm/build/bin/libtsm.{}.{}.{}{}'.format( diff --git a/addons/godot_xterm/native/build.sh b/addons/godot_xterm/native/build.sh index 1da7cab..d0a0659 100755 --- a/addons/godot_xterm/native/build.sh +++ b/addons/godot_xterm/native/build.sh @@ -58,13 +58,14 @@ updateSubmodules GODOT_CPP_DIR ${NATIVE_DIR}/thirdparty/godot-cpp # Build godot-cpp bindings. cd ${GODOT_CPP_DIR} echo "scons generate_bindings=yes target=$target -j$nproc" -scons generate_bindings=yes target=$target -j$nproc +scons generate_bindings=yes macos_arch=$(uname -m) target=$target -j$nproc # Build libuv as a static library. cd ${LIBUV_DIR} mkdir build || true cd build -args="-DCMAKE_BUILD_TYPE=$target -DBUILD_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE" +args="-DCMAKE_BUILD_TYPE=$target -DBUILD_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_OSX_ARCHITECTURES=$(uname -m)" if [ "$target" == "release" ]; then args="$args -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDLL" else @@ -76,7 +77,7 @@ cmake --build build --config $target -j$nproc # Build libgodot-xterm. cd ${NATIVE_DIR} -scons target=$target disable_pty=$disable_pty -j$nproc +scons target=$target macos_arch=$(uname -m) disable_pty=$disable_pty -j$nproc # Use Docker to build libgodot-xterm javascript. if [ -x "$(command -v docker-compose)" ]; then