From 0be6b671e59436c15395c5a9ee220329b2b0fb87 Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Wed, 21 Jun 2023 14:37:39 +0200 Subject: [OpenSSL] Allow using external (static) libraries. In case one wants to handle openssl builds manually (or use static libraries provided by third parties like those in Linux distros). Note that they still must be *static* libraries, adding support for linking against *shared* libraries needs more work (and testing). --- tools/openssl.py | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/tools/openssl.py b/tools/openssl.py index c7d88a6..f42928f 100644 --- a/tools/openssl.py +++ b/tools/openssl.py @@ -119,6 +119,15 @@ def ssl_emitter(target, source, env): def build_openssl(env, jobs=None): + if env["SSL_EXTERNAL"]: + # Setup the env to use the provided libraries, and return them without building. + env.Prepend(CPPPATH=[env["SSL_INCLUDE"]]) + env.Prepend(LIBPATH=[env["SSL_BUILD"]]) + if env["platform"] == "windows": + env.PrependUnique(LIBS=["crypt32", "ws2_32", "advapi32", "user32"]) + env.Prepend(LIBS=env["SSL_LIBS"]) + return [env["SSL_CRYPTO_LIBRARY"], env["SSL_LIBRARY"]] + if jobs is None: jobs = int(env.GetOption("num_jobs")) @@ -155,11 +164,11 @@ def build_openssl(env, jobs=None): ssl = benv.OpenSSLBuilder() benv.NoCache(ssl) # Needs refactoring to properly cache generated headers. + # Setup the environment to use the freshly built openssl. env.Prepend(CPPPATH=[env["SSL_INCLUDE"]]) env.Prepend(LIBPATH=[env["SSL_BUILD"]]) if env["platform"] == "windows": env.PrependUnique(LIBS=["crypt32", "ws2_32", "advapi32", "user32"]) - env.Prepend(LIBS=env["SSL_LIBS"]) return ssl @@ -192,6 +201,21 @@ def options(opts): "OpenSSL configure compiler flags override. Will be autodetected if not specified.", "", ) + opts.Add( + "openssl_external_crypto", + 'An external libcrypto static library (e.g. "/usr/lib/x86_64-linux-gnu/libcrypto.a"). If not provided, OpenSSL will be built from source.', + "", + ) + opts.Add( + "openssl_external_ssl", + 'An external libssl static library (e.g. "/usr/lib/x86_64-linux-gnu/libssl.a"). If not provided, OpenSSL will be built from source.', + "", + ) + opts.Add( + "openssl_external_include", + 'An external OpenSSL "include" folder (e.g. "/usr/include/openssl").', + "", + ) def exists(env): @@ -199,6 +223,29 @@ def exists(env): def generate(env): + env.AddMethod(build_openssl, "OpenSSL") + + # Check if the user specified infos about external OpenSSL files. + external_opts = ["openssl_external_crypto", "openssl_external_ssl", "openssl_external_include"] + is_set = lambda k: env.get(k, "") != "" + if any(map(is_set, external_opts)): + # Need provide the whole (crypto, ssl, include) triple to proceed. + if not all(map(is_set, external_opts)): + print('Error: The options "%s" must all be set to use a external library.' % '", "'.join(external_opts)) + sys.exit(255) + + env["SSL_CRYPTO_LIBRARY"] = env.File("${openssl_external_crypto}") + env["SSL_LIBRARY"] = env.File("${openssl_external_ssl}") + env["SSL_BUILD"] = env.Dir("${SSL_LIBRARY.dir}").abspath + env["SSL_INSTALL"] = env.Dir("${SSL_LIBRARY.dir}").abspath + env["SSL_INCLUDE"] = env.Dir("${openssl_external_include}").abspath + env["SSL_LIBS"] = [env["SSL_LIBRARY"], env["SSL_CRYPTO_LIBRARY"]] + env["SSL_EXTERNAL"] = True + return + + # We will need to build our own OpenSSL library. + env["SSL_EXTERNAL"] = False + # 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"]) -- cgit v1.2.3