diff options
author | Fabio Alessandrelli <fabio.alessandrelli@gmail.com> | 2023-06-19 04:58:03 +0200 |
---|---|---|
committer | Fabio Alessandrelli <fabio.alessandrelli@gmail.com> | 2023-06-20 13:22:07 +0200 |
commit | 86c27ec7efa5b4630ddeff50d02b0deda2ad3db3 (patch) | |
tree | 1d00228bde064a94d7cb9c33d74831ccc0383c14 /tools/openssl.py | |
parent | f2ee596bd9a67512f69d170cbcd260e6422e97a9 (diff) | |
download | fork-godot-webrtc-native-86c27ec7efa5b4630ddeff50d02b0deda2ad3db3.tar.gz fork-godot-webrtc-native-86c27ec7efa5b4630ddeff50d02b0deda2ad3db3.tar.bz2 fork-godot-webrtc-native-86c27ec7efa5b4630ddeff50d02b0deda2ad3db3.zip |
[SCons] Refactor CMake and OpenSSL tools to use actions.
Improve build reliability, allow for more customization.
Diffstat (limited to 'tools/openssl.py')
-rw-r--r-- | tools/openssl.py | 223 |
1 files changed, 125 insertions, 98 deletions
diff --git a/tools/openssl.py b/tools/openssl.py index ad61df9..936895d 100644 --- a/tools/openssl.py +++ b/tools/openssl.py @@ -1,117 +1,106 @@ import os, sys +import SCons.Util +import SCons.Builder +import SCons.Action from SCons.Defaults import Mkdir from SCons.Variables import PathVariable, BoolVariable -def ssl_emitter(target, source, env): - env.Depends(env["SSL_LIBS"], env.File(__file__)) - return env["SSL_LIBS"], [env.Dir(env["SSL_SOURCE"]), env.File(env["SSL_SOURCE"] + "/VERSION.dat")] +def ssl_platform_target(env): + targets = {} + platform = env["platform"] + if platform == "linux": + targets = { + "x86_32": "linux-x86", + "x86_64": "linux-x86_64", + } + elif platform == "android": + targets = { + "arm64": "android-arm64", + "arm32": "android-arm", + "x86_32": "android-x86", + "x86_64": "android-x86_64", + } + elif platform == "macos": + targets = { + "x86_64": "darwin64-x86_64", + "arm64": "darwin64-arm64", + } + elif platform == "ios": + if env["ios_simulator"]: + targets = { + "x86_64": "iossimulator-xcrun", + "arm64": "iossimulator-xcrun", + } + else: + targets = { + "arm64": "ios64-xcrun", + "arm32": "ios-xcrun", + } + elif platform == "windows": + if env.get("is_msvc", False): + targets = { + "x86_32": "VC-WIN32", + "x86_64": "VC-WIN64A", + } + else: + targets = { + "x86_32": "mingw", + "x86_64": "mingw64", + } + arch = env["arch"] + target = targets.get(arch, "") + if target == "": + raise ValueError("Architecture '%s' not supported for platform: '%s'" % (arch, platform)) + return target -def ssl_action(target, source, env): - build_dir = env["SSL_BUILD"] - source_dir = env["SSL_SOURCE"] - install_dir = env["SSL_INSTALL"] - ssl_env = env.Clone() - args = [ +def ssl_default_options(env): + ssl_config_options = [ "no-ssl2", "no-ssl3", "no-weak-ssl-ciphers", "no-legacy", "no-shared", "no-tests", - "--prefix=%s" % install_dir, - "--openssldir=%s" % install_dir, ] - if env["openssl_debug"]: - args.append("-d") + if env["platform"] == "windows": + ssl_config_options.append("enable-capieng") + return ssl_config_options - if env["platform"] == "linux": - if env["arch"] == "x86_32": - args.extend(["linux-x86"]) - else: - args.extend(["linux-x86_64"]) - - elif env["platform"] == "android": - api = env["android_api_level"] if int(env["android_api_level"]) > 28 else "28" - args.extend( - [ - { - "arm64": "android-arm64", - "arm32": "android-arm", - "x86_32": "android-x86", - "x86_64": "android-x86_64", - }[env["arch"]], - "-D__ANDROID_API__=%s" % api, - ] - ) - # Setup toolchain path. - ssl_env.PrependENVPath("PATH", os.path.dirname(env["CC"])) - ssl_env["ENV"]["ANDROID_NDK_ROOT"] = os.environ.get("ANDROID_NDK_ROOT", "") +def ssl_platform_config(env): + opts = ssl_default_options(env) + target = ssl_platform_target(env) + args = [] + if env["platform"] == "android" and env.get("android_api_level", ""): + api = int(env["android_api_level"]) + args.append("-D__ANDROID_API__=%s" % api) elif env["platform"] == "macos": - if env["arch"] == "x86_64": - args.extend(["darwin64-x86_64"]) - elif env["arch"] == "arm64": - args.extend(["darwin64-arm64"]) - else: - raise ValueError("macOS architecture not supported: %s" % env["arch"]) - + # OSXCross toolchain setup. if sys.platform != "darwin" and "OSXCROSS_ROOT" in os.environ: - args.extend( - [ - "CC=" + env["CC"], - "CXX=" + env["CXX"], - "AR=" + env["AR"], - "AS=" + env["AS"], - "RANLIB=" + env["RANLIB"], - ] - ) - - elif env["platform"] == "ios": - if env["ios_simulator"]: - args.extend(["iossimulator-xcrun"]) - elif env["arch"] == "arm32": - args.extend(["ios-xcrun"]) - elif env["arch"] == "arm64": - args.extend(["ios64-xcrun"]) - else: - raise ValueError("iOS architecture not supported: %s" % env["arch"]) - + for k in ["CC", "CXX", "AR", "AS", "RANLIB"]: + args.append("%s=%s" % (k, env[k])) elif env["platform"] == "windows": - args.extend(["enable-capieng"]) is_win_host = sys.platform in ["win32", "msys", "cygwin"] - if env.get("is_msvc", False): - args.extend(["VC-WIN32" if env["arch"] == "x86_32" else "VC-WIN64A"]) - else: - if env["arch"] == "x86_32": - args.extend(["mingw"]) - if not is_win_host: - args.extend(["--cross-compile-prefix=i686-w64-mingw32-"]) - else: - args.extend(["mingw64"]) - if not is_win_host: - args.extend(["--cross-compile-prefix=x86_64-w64-mingw32-"]) - - jobs = env.GetOption("num_jobs") - make_cmd = ["make -C %s -j%s" % (build_dir, jobs), "make -C %s install_sw install_ssldirs -j%s" % (build_dir, jobs)] - if env["platform"] == "windows" and env.get("is_msvc", False): - make_cmd = ["cd %s && nmake install_sw install_ssldirs" % build_dir] - ssl_env.Execute( - [ - Mkdir(build_dir), - Mkdir(install_dir), - "cd {} && perl -- {} {}".format( - build_dir, os.path.join(source_dir, "Configure"), " ".join(['"%s"' % a for a in args]) - ), - ] - + make_cmd - ) - return None + if not (is_win_host or env.get("is_msvc", False)): + mingw_prefixes = { + "x86_32": "--cross-compile-prefix=i686-w64-mingw32-", + "x86_64": "--cross-compile-prefix=x86_64-w64-mingw32-", + } + args.append(mingw_prefixes[env["arch"]]) + return opts + [target] + args + +def ssl_emitter(target, source, env): + return env["SSL_LIBS"], [env.File(env["SSL_SOURCE"] + "/Configure"), env.File(env["SSL_SOURCE"] + "/VERSION.dat")] + + +def build_openssl(env, jobs=None): + if jobs is None: + jobs = int(env.GetOption("num_jobs")) -def build_openssl(env): # 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. if env["platform"] == "macos" and env["arch"] == "universal": @@ -124,6 +113,7 @@ def build_openssl(env): benv = build_envs[arch] benv["arch"] = arch generate(benv) + benv["SSLBUILDJOBS"] = max([1, int(jobs / len(build_envs))]) ssl = benv.OpenSSLBuilder() arch_ssl.extend(ssl) benv.NoCache(ssl) # Needs refactoring to properly cache generated headers. @@ -132,16 +122,17 @@ def build_openssl(env): env["SSL_INCLUDE"] = build_envs["arm64"]["SSL_INCLUDE"] # Join libraries using lipo. + lipo_action = "lipo $SOURCES -create -output $TARGET" ssl_libs = list(map(lambda arch: build_envs[arch]["SSL_LIBRARY"], build_envs)) ssl_crypto_libs = list(map(lambda arch: build_envs[arch]["SSL_CRYPTO_LIBRARY"], build_envs)) - ssl = [ - env.Command([env["SSL_LIBRARY"]], ssl_libs, "lipo $SOURCES -output $TARGETS -create"), - env.Command([env["SSL_CRYPTO_LIBRARY"]], ssl_libs, "lipo $SOURCES -output $TARGETS -create"), - ] + ssl = env.Command(env["SSL_LIBRARY"], ssl_libs, lipo_action) + ssl += env.Command(env["SSL_CRYPTO_LIBRARY"], ssl_crypto_libs, lipo_action) env.Depends(ssl, arch_ssl) else: - ssl = env.OpenSSLBuilder() - env.NoCache(ssl) # Needs refactoring to properly cache generated headers. + benv = env.Clone() + benv["SSLBUILDJOBS"] = jobs + ssl = benv.OpenSSLBuilder() + benv.NoCache(ssl) # Needs refactoring to properly cache generated headers. env.Prepend(CPPPATH=[env["SSL_INCLUDE"]]) env.Prepend(LIBPATH=[env["SSL_BUILD"]]) @@ -164,6 +155,14 @@ def exists(env): def generate(env): + # Android needs the NDK in ENV, and proper PATH setup. + if env["platform"] == "android" and env["ENV"].get("ANDROID_NDK_ROOT", "") == "": + cc_path = os.path.dirname(env["CC"]) + if cc_path and cc_path not in env["ENV"]: + env.PrependENVPath("PATH", cc_path) + if "ANDROID_NDK_ROOT" not in env["ENV"]: + env["ENV"]["ANDROID_NDK_ROOT"] = env.get("ANDROID_NDK_ROOT", os.environ.get("ANDROID_NDK_ROOT", "")) + env["SSL_SOURCE"] = env.Dir(env["openssl_source"]).abspath env["SSL_BUILD"] = env.Dir( env["openssl_build"] @@ -175,5 +174,33 @@ def generate(env): env["SSL_LIBRARY"] = env.File(env["SSL_BUILD"] + "/libssl" + lib_ext) env["SSL_CRYPTO_LIBRARY"] = env.File(env["SSL_BUILD"] + "/libcrypto" + lib_ext) env["SSL_LIBS"] = [env["SSL_LIBRARY"], env["SSL_CRYPTO_LIBRARY"]] - env.Append(BUILDERS={"OpenSSLBuilder": env.Builder(action=ssl_action, emitter=ssl_emitter)}) + + # Configure action + env["PERL"] = env.get("PERL", "perl") + env["_ssl_platform_config"] = ssl_platform_config + env["SSLPLATFORMCONFIG"] = "${_ssl_platform_config(__env__)}" + env["SSLCONFFLAGS"] = SCons.Util.CLVar("") + # fmt: off + env["SSLCONFIGCOM"] = "cd ${TARGET.dir} && $PERL -- ${SOURCE.abspath} --prefix=$SSL_INSTALL --openssldir=$SSL_INSTALL $SSLPLATFORMCONFIG $SSLCONFFLAGS" + # fmt: on + + # Build action + env["SSLBUILDJOBS"] = "${__env__.GetOption('num_jobs')}" + # fmt: off + env["SSLBUILDCOM"] = "make -j$SSLBUILDJOBS -C ${TARGET.dir} && make -j$SSLBUILDJOBS -C ${TARGET.dir} install_sw install_ssldirs" + # fmt: on + + # Windows MSVC needs to build using NMake + if env["platform"] == "windows" and env.get("is_msvc", False): + env["SSLBUILDCOM"] = "cd ${TARGET.dir} && nmake install_sw install_ssldirs" + + env["BUILDERS"]["OpenSSLBuilder"] = SCons.Builder.Builder( + action=[ + Mkdir("$SSL_BUILD"), + Mkdir("$SSL_INSTALL"), + SCons.Action.Action("$SSLCONFIGCOM", "$SSLCONFIGCOMSTR"), + SCons.Action.Action("$SSLBUILDCOM", "$SSLBUILDCOMSTR"), + ], + emitter=ssl_emitter, + ) env.AddMethod(build_openssl, "OpenSSL") |