diff --git a/Misc/NEWS b/Misc/NEWS index b1a66e75002..86caea80c88 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -400,12 +400,15 @@ Tests Build ----- +- Issue #21668: Link audioop, _datetime, _ctypes_test modules to libm, + except on Mac OS X. Patch written by Xavier de Gaye. + - Issue #25702: A --with-lto configure option has been added that will enable link time optimizations at build time during a make profile-opt. Some compilers and toolchains are known to not produce stable code when using LTO, be sure to test things thoroughly before relying on it. It can provide a few % speed up over profile-opt alone. - + - Issue #26624: Adds validation of ucrtbase[d].dll version with warning for old versions. diff --git a/setup.py b/setup.py index de6e5ad8dca..3d6a6605faa 100644 --- a/setup.py +++ b/setup.py @@ -480,6 +480,13 @@ class PyBuildExt(build_ext): finally: os.unlink(tmpfile) + def detect_math_libs(self): + # Check for MacOS X, which doesn't need libm.a at all + if host_platform == 'darwin': + return [] + else: + return ['m'] + def detect_modules(self): # Ensure that /usr/local is always used, but the local build # directories (i.e. '.' and 'Include') must be first. See issue @@ -584,10 +591,7 @@ class PyBuildExt(build_ext): if item.startswith('-L'): lib_dirs.append(item[2:]) - # Check for MacOS X, which doesn't need libm.a at all - math_libs = ['m'] - if host_platform == 'darwin': - math_libs = [] + math_libs = self.detect_math_libs() # XXX Omitted modules: gl, pure, dl, SGI-specific modules @@ -620,7 +624,10 @@ class PyBuildExt(build_ext): # time operations and variables exts.append( Extension('time', ['timemodule.c'], libraries=time_libs) ) - exts.append( Extension('_datetime', ['_datetimemodule.c']) ) + # math_libs is needed by delta_new() that uses round() and by accum() + # that uses modf(). + exts.append( Extension('_datetime', ['_datetimemodule.c'], + libraries=math_libs) ) # random number generator implemented in C exts.append( Extension("_random", ["_randommodule.c"]) ) # bisect @@ -691,11 +698,14 @@ class PyBuildExt(build_ext): # Multimedia modules # These don't work for 64-bit platforms!!! # These represent audio samples or images as strings: - + # # Operations on audio samples # According to #993173, this one should actually work fine on # 64-bit platforms. - exts.append( Extension('audioop', ['audioop.c']) ) + # + # audioop needs math_libs for floor() in multiple functions. + exts.append( Extension('audioop', ['audioop.c'], + libraries=math_libs) ) # readline do_readline = self.compiler.find_library_file(lib_dirs, 'readline') @@ -1937,6 +1947,7 @@ class PyBuildExt(build_ext): '_ctypes/stgdict.c', '_ctypes/cfield.c'] depends = ['_ctypes/ctypes.h'] + math_libs = self.detect_math_libs() if host_platform == 'darwin': sources.append('_ctypes/malloc_closure.c') @@ -1967,8 +1978,10 @@ class PyBuildExt(build_ext): libraries=[], sources=sources, depends=depends) + # function my_sqrt() needs math library for sqrt() ext_test = Extension('_ctypes_test', - sources=['_ctypes/_ctypes_test.c']) + sources=['_ctypes/_ctypes_test.c'], + libraries=math_libs) self.extensions.extend([ext, ext_test]) if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):