aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2020-05-15 23:54:53 +0200
committerGitHub <noreply@github.com>2020-05-15 14:54:53 -0700
commit9b60e55db2897acc30d6b9ef1dbc49674eed40c7 (patch)
tree7b664911353173da34a6eced7e7fb9a5750fa5b8 /setup.py
parentbpo-40445: Update compileall.compile_dir docs (GH-19806) (diff)
downloadcpython-9b60e55db2897acc30d6b9ef1dbc49674eed40c7.tar.gz
cpython-9b60e55db2897acc30d6b9ef1dbc49674eed40c7.tar.bz2
cpython-9b60e55db2897acc30d6b9ef1dbc49674eed40c7.zip
bpo-40637: Add option to disable builtin hashes (GH-20121)
Signed-off-by: Christian Heimes <christian@python.org> Automerge-Triggered-By: @tiran
Diffstat (limited to 'setup.py')
-rw-r--r--setup.py106
1 files changed, 76 insertions, 30 deletions
diff --git a/setup.py b/setup.py
index 878372154d4..794ba2f7662 100644
--- a/setup.py
+++ b/setup.py
@@ -327,6 +327,7 @@ class PyBuildExt(build_ext):
self.failed = []
self.failed_on_import = []
self.missing = []
+ self.disabled_configure = []
if '-j' in os.environ.get('MAKEFLAGS', ''):
self.parallel = True
@@ -483,6 +484,14 @@ class PyBuildExt(build_ext):
print_three_column([ext.name for ext in mods_disabled])
print()
+ if self.disabled_configure:
+ print()
+ print("The following modules found by detect_modules() in"
+ " setup.py have not")
+ print("been built, they are *disabled* by configure:")
+ print_three_column(self.disabled_configure)
+ print()
+
if self.failed:
failed = self.failed[:]
print()
@@ -2295,36 +2304,73 @@ class PyBuildExt(build_ext):
libraries=openssl_libs))
def detect_hash_builtins(self):
- # We always compile these even when OpenSSL is available (issue #14693).
- # It's harmless and the object code is tiny (40-50 KiB per module,
- # only loaded when actually used).
- self.add(Extension('_sha256', ['sha256module.c'],
- extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
- depends=['hashlib.h']))
- self.add(Extension('_sha512', ['sha512module.c'],
- extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
- depends=['hashlib.h']))
- self.add(Extension('_md5', ['md5module.c'],
- depends=['hashlib.h']))
- self.add(Extension('_sha1', ['sha1module.c'],
- depends=['hashlib.h']))
-
- blake2_deps = glob(os.path.join(self.srcdir,
- 'Modules/_blake2/impl/*'))
- blake2_deps.append('hashlib.h')
-
- self.add(Extension('_blake2',
- ['_blake2/blake2module.c',
- '_blake2/blake2b_impl.c',
- '_blake2/blake2s_impl.c'],
- depends=blake2_deps))
-
- sha3_deps = glob(os.path.join(self.srcdir,
- 'Modules/_sha3/kcp/*'))
- sha3_deps.append('hashlib.h')
- self.add(Extension('_sha3',
- ['_sha3/sha3module.c'],
- depends=sha3_deps))
+ # By default we always compile these even when OpenSSL is available
+ # (issue #14693). It's harmless and the object code is tiny
+ # (40-50 KiB per module, only loaded when actually used). Modules can
+ # be disabled via the --with-builtin-hashlib-hashes configure flag.
+ supported = {"md5", "sha1", "sha256", "sha512", "sha3", "blake2"}
+
+ configured = sysconfig.get_config_var("PY_BUILTIN_HASHLIB_HASHES")
+ configured = configured.strip('"').lower()
+ configured = {
+ m.strip() for m in configured.split(",")
+ }
+
+ self.disabled_configure.extend(
+ sorted(supported.difference(configured))
+ )
+
+ if "sha256" in configured:
+ self.add(Extension(
+ '_sha256', ['sha256module.c'],
+ extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
+ depends=['hashlib.h']
+ ))
+
+ if "sha512" in configured:
+ self.add(Extension(
+ '_sha512', ['sha512module.c'],
+ extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
+ depends=['hashlib.h']
+ ))
+
+ if "md5" in configured:
+ self.add(Extension(
+ '_md5', ['md5module.c'],
+ depends=['hashlib.h']
+ ))
+
+ if "sha1" in configured:
+ self.add(Extension(
+ '_sha1', ['sha1module.c'],
+ depends=['hashlib.h']
+ ))
+
+ if "blake2" in configured:
+ blake2_deps = glob(
+ os.path.join(self.srcdir, 'Modules/_blake2/impl/*')
+ )
+ blake2_deps.append('hashlib.h')
+ self.add(Extension(
+ '_blake2',
+ [
+ '_blake2/blake2module.c',
+ '_blake2/blake2b_impl.c',
+ '_blake2/blake2s_impl.c'
+ ],
+ depends=blake2_deps
+ ))
+
+ if "sha3" in configured:
+ sha3_deps = glob(
+ os.path.join(self.srcdir, 'Modules/_sha3/kcp/*')
+ )
+ sha3_deps.append('hashlib.h')
+ self.add(Extension(
+ '_sha3',
+ ['_sha3/sha3module.c'],
+ depends=sha3_deps
+ ))
def detect_nis(self):
if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6':