summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabio Alessandrelli <fabio.alessandrelli@gmail.com>2023-05-23 13:17:41 +0200
committerFabio Alessandrelli <fabio.alessandrelli@gmail.com>2023-05-24 00:53:28 +0200
commitf0af5f9982ea231eeeb92b4329178ea24e75e219 (patch)
treec2f2f63ef668235dae9b6db98e27028c067c591c
parentfbe4e06b9f3491db19351762e553d0fd08c9845e (diff)
downloadfork-godot-webrtc-native-f0af5f9982ea231eeeb92b4329178ea24e75e219.tar.gz
fork-godot-webrtc-native-f0af5f9982ea231eeeb92b4329178ea24e75e219.tar.bz2
fork-godot-webrtc-native-f0af5f9982ea231eeeb92b4329178ea24e75e219.zip
[macOS] Add support for universal builds.
Since the OpenSSL build system does not support macOS universal binaries, we first need to build the two libraries separately, then we join them together using lipo.
-rw-r--r--.github/workflows/build_release.yml12
-rw-r--r--SConstruct58
-rw-r--r--misc/webrtc.gdextension6
-rw-r--r--misc/webrtc.tres11
4 files changed, 50 insertions, 37 deletions
diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml
index d6a9350..9047da3 100644
--- a/.github/workflows/build_release.yml
+++ b/.github/workflows/build_release.yml
@@ -84,17 +84,11 @@ jobs:
# macOS
- platform: macos
- arch: 'x86_64'
- gdnative_flags: 'macos_arch=x86_64 bits=64'
- sconsflags: ''
- os: 'macos-11'
- cache-name: macos-x86_64
- - platform: macos
- gdnative_flags: 'macos_arch=arm64 bits=64'
- arch: 'arm64'
+ arch: 'universal'
+ gdnative_flags: 'macos_arch=universal bits=64'
sconsflags: ''
os: 'macos-11'
- cache-name: macos-arm64
+ cache-name: macos-universal
# Windows
- platform: windows
diff --git a/SConstruct b/SConstruct
index 8317fb2..16acffc 100644
--- a/SConstruct
+++ b/SConstruct
@@ -1,6 +1,7 @@
#!python
import os, sys, platform, json, subprocess
+import SCons
def add_sources(sources, dirpath, extension):
@@ -101,14 +102,6 @@ if env["godot_version"] == "3":
else:
result_path = os.path.join("bin", "extension", "webrtc")
-# Dependencies
-for tool in ["cmake", "common", "ssl", "rtc"]:
- env.Tool(tool, toolpath=["tools"])
-
-ssl = env.BuildOpenSSL()
-env.NoCache(ssl) # Needs refactoring to properly cache generated headers.
-rtc = env.BuildLibDataChannel()
-
# Our includes and sources
env.Append(CPPPATH=["src/"])
env.Append(CPPDEFINES=["RTC_STATIC"])
@@ -126,12 +119,48 @@ else:
sources.append("src/init_gdnative.cpp")
add_sources(sources, "src/net/", "cpp")
-env.Depends(sources, [ssl, rtc])
-
-# Make the shared library
-result_name = "webrtc_native{}{}".format(env["suffix"], env["SHLIBSUFFIX"])
-library = env.SharedLibrary(target=os.path.join(result_path, "lib", result_name), source=sources)
-Default(library)
+# Since the OpenSSL build system does not support macOS universal binaries, we first need to build the two libraries
+# separately, then we join them together using lipo.
+mac_universal = env["platform"] == "macos" and env["arch"] == "universal"
+build_targets = []
+build_envs = [env]
+
+# For macOS universal builds, setup one build environment per architecture.
+if mac_universal:
+ build_envs = []
+ for arch in ["x86_64", "arm64"]:
+ benv = env.Clone()
+ benv["arch"] = arch
+ benv["CCFLAGS"] = SCons.Util.CLVar(str(benv["CCFLAGS"]).replace("-arch x86_64 -arch arm64", "-arch " + arch))
+ benv["LINKFLAGS"] = SCons.Util.CLVar(str(benv["LINKFLAGS"]).replace("-arch x86_64 -arch arm64", "-arch " + arch))
+ benv["suffix"] = benv["suffix"].replace("universal", arch)
+ benv["SHOBJSUFFIX"] = benv["suffix"] + benv["SHOBJSUFFIX"]
+ build_envs.append(benv)
+
+# Build our library and its dependencies.
+for benv in build_envs:
+ # Dependencies
+ for tool in ["cmake", "common", "ssl", "rtc"]:
+ benv.Tool(tool, toolpath=["tools"])
+
+ ssl = benv.BuildOpenSSL()
+ benv.NoCache(ssl) # Needs refactoring to properly cache generated headers.
+ rtc = benv.BuildLibDataChannel()
+
+ benv.Depends(sources, [ssl, rtc])
+
+ # Make the shared library
+ result_name = "webrtc_native{}{}".format(benv["suffix"], benv["SHLIBSUFFIX"])
+ library = benv.SharedLibrary(target=os.path.join(result_path, "lib", result_name), source=sources)
+ build_targets.append(library)
+
+Default(build_targets)
+
+# For macOS universal builds, join the libraries using lipo.
+if mac_universal:
+ result_name = "libwebrtc_native{}{}".format(env["suffix"], env["SHLIBSUFFIX"])
+ universal_target = env.Command(os.path.join(result_path, "lib", result_name), build_targets, "lipo $SOURCES -output $TARGETS -create")
+ Default(universal_target)
# GDNativeLibrary
if env["godot_version"] == "3":
@@ -143,4 +172,5 @@ if env["godot_version"] == "3":
})
else:
extfile = env.InstallAs(os.path.join(result_path, "webrtc.gdextension"), "misc/webrtc.gdextension")
+
Default(extfile)
diff --git a/misc/webrtc.gdextension b/misc/webrtc.gdextension
index 863db9a..a717d0d 100644
--- a/misc/webrtc.gdextension
+++ b/misc/webrtc.gdextension
@@ -6,8 +6,7 @@ entry_symbol = "webrtc_extension_init"
linux.debug.x86_64 = "res://webrtc/lib/libwebrtc_native.linux.template_debug.x86_64.so"
linux.debug.x86_32 = "res://webrtc/lib/libwebrtc_native.linux.template_debug.x86_32.so"
-macos.debug.x86_64 = "res://webrtc/lib/libwebrtc_native.macos.template_debug.x86_64.dylib"
-macos.debug.arm64 = "res://webrtc/lib/libwebrtc_native.macos.template_debug.arm64.dylib"
+macos.debug = "res://webrtc/lib/libwebrtc_native.macos.template_debug.universal.dylib"
windows.debug.x86_64 = "res://webrtc/lib/libwebrtc_native.windows.template_debug.x86_64.dll"
windows.debug.x86_32 = "res://webrtc/lib/libwebrtc_native.windows.template_debug.x86_32.dll"
android.debug.arm64 = "res://webrtc/lib/libwebrtc_native.android.template_debug.arm64.so"
@@ -17,8 +16,7 @@ ios.debug.x86_64 = "res://webrtc/lib/libwebrtc_native.ios.template_debug.x86_64.
linux.release.x86_64 = "res://webrtc/lib/libwebrtc_native.linux.template_release.x86_64.so"
linux.release.x86_32 = "res://webrtc/lib/libwebrtc_native.linux.template_release.x86_32.so"
-macos.release.x86_64 = "res://webrtc/lib/libwebrtc_native.macos.template_release.x86_64.dylib"
-macos.release.arm64 = "res://webrtc/lib/libwebrtc_native.macos.template_release.arm64.dylib"
+macos.release = "res://webrtc/lib/libwebrtc_native.macos.template_release.universal.dylib"
windows.release.x86_64 = "res://webrtc/lib/libwebrtc_native.windows.template_release.x86_64.dll"
windows.release.x86_32 = "res://webrtc/lib/libwebrtc_native.windows.template_release.x86_32.dll"
android.release.arm64 = "res://webrtc/lib/libwebrtc_native.android.template_release.arm64.so"
diff --git a/misc/webrtc.tres b/misc/webrtc.tres
index 53f096e..bdcb80f 100644
--- a/misc/webrtc.tres
+++ b/misc/webrtc.tres
@@ -3,8 +3,7 @@
[resource]
singleton = true
reloadable = false
-entry/OSX.64 = "res://{GDNATIVE_PATH}/lib/libwebrtc_native.osx.{TARGET}.x86_64.dylib"
-entry/OSX.arm64 = "res://{GDNATIVE_PATH}/lib/libwebrtc_native.osx.{TARGET}.arm64.dylib"
+entry/OSX.64 = "res://{GDNATIVE_PATH}/lib/libwebrtc_native.macos.{TARGET}.universal.dylib"
entry/Windows.64 = "res://{GDNATIVE_PATH}/lib/libwebrtc_native.windows.{TARGET}.x86_64.dll"
entry/Windows.32 = "res://{GDNATIVE_PATH}/lib/libwebrtc_native.windows.{TARGET}.x86_32.dll"
entry/X11.64 = "res://{GDNATIVE_PATH}/lib/libwebrtc_native.linux.{TARGET}.x86_64.so"
@@ -16,11 +15,3 @@ entry/Android.x64 = "res://{GDNATIVE_PATH}/lib/libwebrtc_native.android.{TARGET}
entry/iOS.armv7 = "res://{GDNATIVE_PATH}/lib/libwebrtc_native.ios.{TARGET}.armv32.dylib"
entry/iOS.arm64 = "res://{GDNATIVE_PATH}/lib/libwebrtc_native.ios.{TARGET}.arm64.dylib"
entry/iOS.x86_64 = "res://{GDNATIVE_PATH}/lib/libwebrtc_native.ios.{TARGET}.x86_64.simulator.dylib"
-dependency/Windows.64 = [ ]
-dependency/Windows.32 = [ ]
-dependency/X11.64 = [ ]
-dependency/X11.32 = [ ]
-dependency/Server.64 = [ ]
-dependency/Server.32 = [ ]
-dependency/Android.armeabi-v7a = [ ]
-dependency/Android.arm64-v8a = [ ]