From 28b95ff55010d8f9e3f9feca4f75e5aeaf1ac9aa Mon Sep 17 00:00:00 2001 From: Alvin Wong Date: Sun, 1 Sep 2024 04:03:00 +0800 Subject: [PATCH] Remove ARFLAGS hack for Windows, replace with TEMPFILE TEMPFILE is the built-in way of SCons to use a response file for command lines that are too long. --- methods.py | 24 ++++++------------------ platform/windows/detect.py | 5 +++++ 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/methods.py b/methods.py index bfd08cfc7b5..c24e110edae 100644 --- a/methods.py +++ b/methods.py @@ -467,16 +467,6 @@ def use_windows_spawn_fix(self, platform=None): if os.name != "nt": return # not needed, only for windows - # On Windows, due to the limited command line length, when creating a static library - # from a very high number of objects SCons will invoke "ar" once per object file; - # that makes object files with same names to be overwritten so the last wins and - # the library loses symbols defined by overwritten objects. - # By enabling quick append instead of the default mode (replacing), libraries will - # got built correctly regardless the invocation strategy. - # Furthermore, since SCons will rebuild the library from scratch when an object file - # changes, no multiple versions of the same object file will be present. - self.Replace(ARFLAGS="q") - def mySubProcess(cmdline, env): startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW @@ -500,19 +490,17 @@ def use_windows_spawn_fix(self, platform=None): return rv def mySpawn(sh, escape, cmd, args, env): + # Used by TEMPFILE. + if cmd == "del": + os.remove(args[1]) + return 0 + newargs = " ".join(args[1:]) cmdline = cmd + " " + newargs rv = 0 env = {str(key): str(value) for key, value in iter(env.items())} - if len(cmdline) > 32000 and cmd.endswith("ar"): - cmdline = cmd + " " + args[1] + " " + args[2] + " " - for i in range(3, len(args)): - rv = mySubProcess(cmdline + args[i], env) - if rv: - break - else: - rv = mySubProcess(cmdline, env) + rv = mySubProcess(cmdline, env) return rv diff --git a/platform/windows/detect.py b/platform/windows/detect.py index d2a9c2315ff..ff25e416ae9 100644 --- a/platform/windows/detect.py +++ b/platform/windows/detect.py @@ -654,6 +654,11 @@ def configure_mingw(env: "SConsEnvironment"): # https://www.scons.org/wiki/LongCmdLinesOnWin32 env.use_windows_spawn_fix() + # In case the command line to AR is too long, use a response file. + env["ARCOM_ORIG"] = env["ARCOM"] + env["ARCOM"] = "${TEMPFILE('$ARCOM_ORIG', '$ARCOMSTR')}" + env["TEMPFILESUFFIX"] = ".rsp" + ## Build type if not env["use_llvm"] and not try_cmd("gcc --version", env["mingw_prefix"], env["arch"]):