diff options
Diffstat (limited to 'winbuild/openssl.py')
-rw-r--r-- | winbuild/openssl.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/winbuild/openssl.py b/winbuild/openssl.py new file mode 100644 index 0000000..cc8bba4 --- /dev/null +++ b/winbuild/openssl.py @@ -0,0 +1,76 @@ +import os.path +from .utils import * +from .builder import * + +class OpensslBuilder(StandardBuilder): + def build(self): + # another openssl gem: + # nasm output is redirected to NUL which ends up creating a file named NUL. + # however being a reserved file name this file is not deletable by + # ordinary tools. + nul_file = "openssl-%s-%s\\NUL" % (self.bconf.openssl_version, self.bconf.vc_tag) + check_call(['rm', '-f', nul_file]) + openssl_dir = self.standard_fetch_extract( + 'https://www.openssl.org/source/openssl-%(my_version)s.tar.gz') + with in_dir(openssl_dir): + with self.execute_batch() as b: + if self.bconf.openssl_version_tuple < (1, 1): + # openssl 1.0.2 + b.add("patch -p0 < %s" % + require_file_exists(os.path.join(config.winbuild_patch_root, 'openssl-fix-crt-1.0.2.patch'))) + elif self.bconf.openssl_version_tuple < (1, 1, 1): + # openssl 1.1.0 + b.add("patch -p0 < %s" % + require_file_exists(os.path.join(config.winbuild_patch_root, 'openssl-fix-crt-1.1.0.patch'))) + else: + # openssl 1.1.1 + b.add("patch -p0 < %s" % + require_file_exists(os.path.join(config.winbuild_patch_root, 'openssl-fix-crt-1.1.1.patch'))) + if self.bconf.bitness == 64: + target = 'VC-WIN64A' + batch_file = 'do_win64a' + else: + target = 'VC-WIN32' + batch_file = 'do_nasm' + + # msysgit perl has trouble with backslashes used in + # win64 assembly things in openssl 1.0.2 + # and in x86 assembly as well in openssl 1.1.0; + # use ActiveState Perl + if not os.path.exists(config.activestate_perl_bin_path): + raise ValueError('activestate_perl_bin_path refers to a nonexisting path') + if not os.path.exists(os.path.join(config.activestate_perl_bin_path, 'perl.exe')): + raise ValueError('No perl binary in activestate_perl_bin_path') + b.add("set path=%s;%%path%%" % config.activestate_perl_bin_path) + b.add("perl -v") + + openssl_prefix = os.path.join(os.path.realpath('.'), 'build') + # Do not want compression: + # https://en.wikipedia.org/wiki/CRIME + extras = ['no-comp', 'no-unit-test', 'no-tests', 'no-external-tests'] + if config.openssl_version_tuple >= (1, 1): + # openssl 1.1.0 + # in 1.1.0 the static/shared selection is handled by + # invoking the right makefile + extras += ['no-shared'] + + # looks like openssl 1.1.0c does not derive + # --openssldir from --prefix, like its Configure claims, + # and like 1.0.2 does; provide a relative openssl dir + # manually + extras += ['--openssldir=ssl'] + b.add("perl Configure %s %s --prefix=%s" % (target, ' '.join(extras), openssl_prefix)) + + if config.openssl_version_tuple < (1, 1): + # openssl 1.0.2 + b.add("call ms\\%s" % batch_file) + b.add("nmake -f ms\\nt.mak") + b.add("nmake -f ms\\nt.mak install") + else: + # openssl 1.1.0 + b.add("nmake") + b.add("nmake install") + + # assemble dist + b.add('mkdir dist') + b.add('cp -r build/include build/lib dist') |