mirror of
https://github.com/godotengine/webrtc-native.git
synced 2026-01-01 05:48:15 +03:00
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.
177 lines
6.2 KiB
Python
177 lines
6.2 KiB
Python
#!python
|
|
|
|
import os, sys, platform, json, subprocess
|
|
import SCons
|
|
|
|
|
|
def add_sources(sources, dirpath, extension):
|
|
for f in os.listdir(dirpath):
|
|
if f.endswith("." + extension):
|
|
sources.append(dirpath + "/" + f)
|
|
|
|
|
|
def replace_flags(flags, replaces):
|
|
for k, v in replaces.items():
|
|
if k in flags:
|
|
flags[flags.index(k)] = v
|
|
|
|
|
|
env = Environment()
|
|
opts = Variables(["customs.py"], ARGUMENTS)
|
|
opts.Add(EnumVariable("godot_version", "The Godot target version", "4", ["3", "4"]))
|
|
opts.Update(env)
|
|
|
|
if env["godot_version"] == "3":
|
|
if "platform" in ARGUMENTS and ARGUMENTS["platform"] == "macos":
|
|
ARGUMENTS["platform"] = "osx" # compatibility with old osx name
|
|
|
|
env = SConscript("godot-cpp-3.x/SConstruct")
|
|
|
|
# Patch base env
|
|
replace_flags(env["CCFLAGS"], {
|
|
"-mios-simulator-version-min=10.0": "-mios-simulator-version-min=11.0",
|
|
"-miphoneos-version-min=10.0": "-miphoneos-version-min=11.0",
|
|
"/std:c++14": "/std:c++17",
|
|
"-std=c++14": "-std=c++17",
|
|
})
|
|
|
|
env = env.Clone()
|
|
|
|
if env["target"] == "debug":
|
|
env.Append(CPPDEFINES=["DEBUG_ENABLED"])
|
|
|
|
if env["platform"] == "windows" and env["use_mingw"]:
|
|
env.Append(LINKFLAGS=["-static-libgcc"])
|
|
|
|
if env["platform"] == "osx":
|
|
env["platform"] = "macos" # compatibility with old osx name
|
|
ARGUMENTS["platform"] = "macos"
|
|
|
|
# Normalize suffix
|
|
if env["platform"] in ["windows", "linux"]:
|
|
env["arch"] = "x86_32" if env["bits"] == "32" else "x86_64"
|
|
env["arch_suffix"] = env["arch"]
|
|
elif env["platform"] == "macos":
|
|
env["arch"] = env["macos_arch"]
|
|
env["arch_suffix"] = env["arch"]
|
|
elif env["platform"] == "ios":
|
|
env["arch"] = "arm32" if env["ios_arch"] == "armv7" else env["ios_arch"]
|
|
env["arch_suffix"] = env["ios_arch"] + (".simulator" if env["ios_simulator"] else "")
|
|
elif env["platform"] == "android":
|
|
env["arch"] = {
|
|
"armv7": "arm32",
|
|
"arm64v8": "arm64",
|
|
"x86": "x86_32",
|
|
"x86_64": "x86_64",
|
|
}[env["android_arch"]]
|
|
env["arch_suffix"] = env["arch"]
|
|
|
|
target_compat = "template_" + env["target"]
|
|
env["suffix"] = ".{}.{}.{}".format(env["platform"], target_compat, env["arch_suffix"])
|
|
env["debug_symbols"] = False
|
|
|
|
# Set missing CC for MinGW from upstream build module.
|
|
if env["platform"] == "windows" and sys.platform != "win32" and sys.platform != "msys":
|
|
# Cross-compilation using MinGW
|
|
if env["bits"] == "64":
|
|
env["CC"] = "x86_64-w64-mingw32-gcc"
|
|
elif env["bits"] == "32":
|
|
env["CC"] = "i686-w64-mingw32-gcc"
|
|
else:
|
|
ARGUMENTS["ios_min_version"] = "11.0"
|
|
env = SConscript("godot-cpp/SConstruct").Clone()
|
|
|
|
# Should probably go to upstream godot-cpp.
|
|
# We let SCons build its default ENV as it includes OS-specific things which we don't
|
|
# want to have to pull in manually.
|
|
# Then we prepend PATH to make it take precedence, while preserving SCons' own entries.
|
|
env.PrependENVPath("PATH", os.getenv("PATH"))
|
|
env.PrependENVPath("PKG_CONFIG_PATH", os.getenv("PKG_CONFIG_PATH"))
|
|
if "TERM" in os.environ: # Used for colored output.
|
|
env["ENV"]["TERM"] = os.environ["TERM"]
|
|
|
|
# Patch mingw SHLIBSUFFIX.
|
|
if env["platform"] == "windows" and env["use_mingw"]:
|
|
env["SHLIBSUFFIX"] = ".dll"
|
|
|
|
opts.Update(env)
|
|
|
|
target = env["target"]
|
|
if env["godot_version"] == "3":
|
|
result_path = os.path.join("bin", "gdnative", "webrtc" if env["target"] == "release" else "webrtc_debug")
|
|
else:
|
|
result_path = os.path.join("bin", "extension", "webrtc")
|
|
|
|
# Our includes and sources
|
|
env.Append(CPPPATH=["src/"])
|
|
env.Append(CPPDEFINES=["RTC_STATIC"])
|
|
sources = []
|
|
sources.append(
|
|
[
|
|
"src/WebRTCLibDataChannel.cpp",
|
|
"src/WebRTCLibPeerConnection.cpp",
|
|
]
|
|
)
|
|
if env["godot_version"] == "4":
|
|
sources.append("src/init_gdextension.cpp")
|
|
else:
|
|
env.Append(CPPDEFINES=["GDNATIVE_WEBRTC"])
|
|
sources.append("src/init_gdnative.cpp")
|
|
add_sources(sources, "src/net/", "cpp")
|
|
|
|
# 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":
|
|
gdnlib = "webrtc" if target != "debug" else "webrtc_debug"
|
|
ext = ".tres"
|
|
extfile = env.Substfile(os.path.join(result_path, gdnlib + ext), "misc/webrtc" + ext, SUBST_DICT={
|
|
"{GDNATIVE_PATH}": gdnlib,
|
|
"{TARGET}": "template_" + env["target"],
|
|
})
|
|
else:
|
|
extfile = env.InstallAs(os.path.join(result_path, "webrtc.gdextension"), "misc/webrtc.gdextension")
|
|
|
|
Default(extfile)
|