From 4d14f5e461413b52fd5b7a2b8077c58a4efb6d6c Mon Sep 17 00:00:00 2001 From: MyreMylar Date: Tue, 19 May 2020 10:56:17 +0100 Subject: [PATCH] Add '/GF' and '/Gy' flags to win32 builds only when the compiler supports them (i.e. is msvc) --- setup.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/setup.py b/setup.py index 9e47d2c345..f2be277b88 100755 --- a/setup.py +++ b/setup.py @@ -557,6 +557,31 @@ def dependencies(roots): else: pygame_data_files.append(f) + def has_flag(compiler, flagname): + """ + Adapted from here: https://github.com/pybind/python_example/blob/master/setup.py#L37 + """ + from distutils.errors import CompileError + import tempfile + import os + with tempfile.NamedTemporaryFile('w', suffix='.cpp', delete=False) as f: + f.write('int main (int argc, char **argv) { return 0; }') + fname = f.name + try: + compiler.compile([fname], extra_postargs=[flagname]) + except CompileError: + return False + finally: + try: + os.remove(fname) + except OSError: + pass + return True + + # filter flags, returns list of accepted flags + def flag_filter(compiler, *flags): + return [flag for flag in flags if has_flag(compiler, flag)] + class WinBuildExt(build_ext): """This build_ext sets necessary environment variables for MinGW""" @@ -568,6 +593,14 @@ class WinBuildExt(build_ext): __sdl_lib_dir = e.library_dirs[0].replace('/', os.sep) break + def build_extensions(self): + # Add supported optimisations flags to reduce code size with MSVC + opts = flag_filter(self.compiler, "/GF", "/Gy") + for extension in extensions: + extension.extra_compile_args += opts + + build_ext.build_extensions(self) + cmdclass['build_ext'] = WinBuildExt # Add the precompiled smooth scale MMX functions to transform.