summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Pudeyev <oleg@bsdpower.com>2018-05-28 23:54:48 -0400
committerOleg Pudeyev <oleg@bsdpower.com>2018-05-29 00:03:05 -0400
commitda85cb6b9fdfb540c4f56642595128db1edb9104 (patch)
tree28258536477c267cd1ce86ce610881787cc0cff9
parent99cd4706b4c6db23b88764fe519e978a94f4e8e1 (diff)
downloadpycurl-da85cb6b9fdfb540c4f56642595128db1edb9104.tar.gz
libcurl 7.60.0 support for winbuild
-rw-r--r--setup.py26
-rw-r--r--winbuild.py42
2 files changed, 67 insertions, 1 deletions
diff --git a/setup.py b/setup.py
index 916985c..695ec85 100644
--- a/setup.py
+++ b/setup.py
@@ -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: