diff options
author | Oleg Pudeyev <oleg@bsdpower.com> | 2018-05-28 23:54:48 -0400 |
---|---|---|
committer | Oleg Pudeyev <oleg@bsdpower.com> | 2018-05-29 00:03:05 -0400 |
commit | da85cb6b9fdfb540c4f56642595128db1edb9104 (patch) | |
tree | 28258536477c267cd1ce86ce610881787cc0cff9 | |
parent | 99cd4706b4c6db23b88764fe519e978a94f4e8e1 (diff) | |
download | pycurl-da85cb6b9fdfb540c4f56642595128db1edb9104.tar.gz |
libcurl 7.60.0 support for winbuild
-rw-r--r-- | setup.py | 26 | ||||
-rw-r--r-- | winbuild.py | 42 |
2 files changed, 67 insertions, 1 deletions
@@ -54,6 +54,28 @@ def scan_argv(argv, s, default=None): return p +def scan_argvs(argv, s): + p = [] + i = 1 + while i < len(argv): + arg = argv[i] + if str.find(arg, s) == 0: + if s.endswith('='): + # --option=value + p.append(arg[len(s):]) + if s != '--openssl-lib-name=': + assert p[-1], arg + else: + # --option + # set value to True + raise Exception('specification must end with =') + del argv[i] + else: + i = i + 1 + ##print argv + return p + + class ExtensionConfiguration(object): def __init__(self, argv=[]): # we mutate argv, this is necessary because @@ -368,6 +390,9 @@ specify the SSL backend manually.''') # meaning the correct usage of this option is --openssl-lib-name="" self.openssl_lib_name = scan_argv(self.argv, '--openssl-lib-name=', 'libeay32.lib') + for lib in scan_argvs(self.argv, '--link-arg='): + self.extra_link_args.append(lib) + if scan_argv(self.argv, "--use-libcurl-dll") is not None: libcurl_lib_path = os.path.join(curl_dir, "lib", curl_lib_name) self.extra_link_args.extend(["ws2_32.lib"]) @@ -851,6 +876,7 @@ PycURL Windows options: --libcurl-lib-name=libcurl_imp.lib override libcurl import library name --with-openssl libcurl is linked against OpenSSL --with-ssl legacy alias for --with-openssl + --link-arg=foo.lib also link against specified library ''' if __name__ == "__main__": diff --git a/winbuild.py b/winbuild.py index 99d8113..1c50408 100644 --- a/winbuild.py +++ b/winbuild.py @@ -84,7 +84,7 @@ class Config: libiconv_version = '1.15' libidn_version = '1.35' # which version of libcurl to use, will be downloaded from internet - libcurl_version = '7.59.0' + libcurl_version = '7.60.0' # virtualenv version virtualenv_version = '15.1.0' # whether to build binary wheels @@ -230,6 +230,10 @@ class ExtendedConfig(Config): return tuple(int(part) for part in self.cares_version.split('.')) @property + def libcurl_version_tuple(self): + return tuple(int(part) for part in self.libcurl_version.split('.')) + + @property def python_releases(self): return [PythonRelease('.'.join(version.split('.')[:2])) for version in self.python_versions] @@ -886,6 +890,42 @@ class PycurlBuilder(Builder): #b.add("call %s" % os.path.join('..', 'venv-%s-%s' % (self.python_release, self.bitness), 'Scripts', 'activate')) if config.build_wheels: targets = targets + ['bdist_wheel'] + if config.libcurl_version_tuple >= (7, 60, 0): + # As of 7.60.0 libcurl does not include its dependencies into + # its static libraries. + # libcurl_a.lib in 7.59.0 is 30 mb. + # libcurl_a.lib in 7.60.0 is 2 mb. + # https://github.com/curl/curl/pull/2474 is most likely culprit. + # As a result we need to specify all of the libraries that + # libcurl depends on here, plus the library paths, + # plus even windows standard libraries for good measure. + if self.config.use_zlib: + zlib_builder = ZlibBuilder(bitness=self.bitness, vc_version=self.vc_version, config=self.config) + libcurl_arg += ' --link-arg=/LIBPATH:%s' % zlib_builder.lib_path + libcurl_arg += ' --link-arg=zlib.lib' + if self.config.use_openssl: + openssl_builder = OpensslBuilder(bitness=self.bitness, vc_version=self.vc_version, config=self.config) + libcurl_arg += ' --link-arg=/LIBPATH:%s' % openssl_builder.lib_path + # openssl 1.1 + libcurl_arg += ' --link-arg=libcrypto.lib' + libcurl_arg += ' --link-arg=libssl.lib' + libcurl_arg += ' --link-arg=crypt32.lib' + libcurl_arg += ' --link-arg=advapi32.lib' + if self.config.use_cares: + cares_builder = CaresBuilder(bitness=self.bitness, vc_version=self.vc_version, config=self.config) + libcurl_arg += ' --link-arg=/LIBPATH:%s' % cares_builder.lib_path + libcurl_arg += ' --link-arg=libcares.lib' + if self.config.use_libssh2: + libssh2_builder = Libssh2Builder(bitness=self.bitness, vc_version=self.vc_version, config=self.config) + libcurl_arg += ' --link-arg=/LIBPATH:%s' % libssh2_builder.lib_path + libcurl_arg += ' --link-arg=libssh2.lib' + if self.config.use_nghttp2: + nghttp2_builder = Nghttp2Builder(bitness=self.bitness, vc_version=self.vc_version, config=self.config) + libcurl_arg += ' --link-arg=/LIBPATH:%s' % nghttp2_builder.lib_path + libcurl_arg += ' --link-arg=nghttp2.lib' + if self.vc_version != 'vc9': + libcurl_arg += ' --link-arg=normaliz.lib' + libcurl_arg += ' --link-arg=user32.lib' b.add("%s setup.py %s --curl-dir=%s %s" % ( self.python_path, ' '.join(targets), libcurl_dir, libcurl_arg)) if 'bdist' in targets: |