From 2ec9f4ae813862139a4b303fe406dc283bfab523 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Fri, 3 May 2019 15:52:39 -0700 Subject: [PATCH] fbcode_builder: getdeps: add OpenSSL builder Summary: the openssl builder knows how to perform the non-standard configuration and build steps to build openssl. On Linux systems the manifests for our projects don't mention openssl, causing them to pick up the system openssl. On Mac, apple don't ship openssl headers so we need to build our own. On Windows there is no standard openssl installation so we also need to build our own. As a result, this builder only works on windows and mac. Reviewed By: simpkins Differential Revision: D14691010 fbshipit-source-id: 9f8979f9eaeb5209c290cf4f43c97c0cb43d13a2 --- build/fbcode_builder/getdeps/builder.py | 47 ++++++++++++++++++++++++ build/fbcode_builder/getdeps/manifest.py | 13 ++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/build/fbcode_builder/getdeps/builder.py b/build/fbcode_builder/getdeps/builder.py index c4bd80705..691bd0716 100644 --- a/build/fbcode_builder/getdeps/builder.py +++ b/build/fbcode_builder/getdeps/builder.py @@ -238,3 +238,50 @@ class NinjaBootstrap(BuilderBase): os.makedirs(bin_dir) shutil.copyfile(src_ninja, dest_ninja) shutil.copymode(src_ninja, dest_ninja) + + +class OpenSSLBuilder(BuilderBase): + def __init__(self, build_opts, ctx, manifest, build_dir, src_dir, inst_dir): + super(OpenSSLBuilder, self).__init__( + build_opts, ctx, manifest, src_dir, build_dir, inst_dir + ) + + def _build(self, install_dirs, reconfigure): + configure = os.path.join(self.src_dir, "Configure") + + # prefer to resolve the perl that we installed from + # our manifest on windows, but fall back to the system + # path on eg: darwin + env = self.env.copy() + for d in install_dirs: + bindir = os.path.join(d, "bin") + add_path_entry(env, "PATH", bindir, append=False) + + perl = path_search(env, "perl", "perl") + + if self.build_opts.is_windows(): + make = "nmake.exe" + args = ["VC-WIN64A-masm", "-utf-8"] + elif self.build_opts.is_darwin(): + make = "make" + args = ["darwin64-x86_64-cc"] + else: + raise Exception("don't know how to build openssl for %r" % self.ctx) + + self._run_cmd( + [ + perl, + configure, + "--prefix=%s" % self.inst_dir, + "--openssldir=%s" % self.inst_dir, + ] + + args + + [ + "enable-static-engine", + "enable-capieng", + "no-makedepend", + "no-unit-test", + "no-tests", + ] + ) + self._run_cmd([make, "install_sw", "install_ssldirs"]) diff --git a/build/fbcode_builder/getdeps/manifest.py b/build/fbcode_builder/getdeps/manifest.py index 9b7f82373..89898eda7 100644 --- a/build/fbcode_builder/getdeps/manifest.py +++ b/build/fbcode_builder/getdeps/manifest.py @@ -10,7 +10,13 @@ from __future__ import absolute_import, division, print_function, unicode_litera import io -from .builder import AutoconfBuilder, CMakeBuilder, MakeBuilder, NinjaBootstrap +from .builder import ( + AutoconfBuilder, + CMakeBuilder, + MakeBuilder, + NinjaBootstrap, + OpenSSLBuilder, +) from .expr import parse_expr from .fetcher import ( ArchiveFetcher, @@ -323,4 +329,9 @@ class ManifestParser(object): build_options, ctx, self, build_dir, src_dir, inst_dir ) + if builder == "openssl": + return OpenSSLBuilder( + build_options, ctx, self, build_dir, src_dir, inst_dir + ) + raise KeyError("project %s has no known builder" % (self.name))