Browse Source

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.
Alvin Wong 11 months ago
parent
commit
28b95ff550
2 changed files with 11 additions and 18 deletions
  1. 6 18
      methods.py
  2. 5 0
      platform/windows/detect.py

+ 6 - 18
methods.py

@@ -467,16 +467,6 @@ def use_windows_spawn_fix(self, platform=None):
     if os.name != "nt":
     if os.name != "nt":
         return  # not needed, only for windows
         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):
     def mySubProcess(cmdline, env):
         startupinfo = subprocess.STARTUPINFO()
         startupinfo = subprocess.STARTUPINFO()
         startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
         startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
@@ -500,19 +490,17 @@ def use_windows_spawn_fix(self, platform=None):
         return rv
         return rv
 
 
     def mySpawn(sh, escape, cmd, args, env):
     def mySpawn(sh, escape, cmd, args, env):
+        # Used by TEMPFILE.
+        if cmd == "del":
+            os.remove(args[1])
+            return 0
+
         newargs = " ".join(args[1:])
         newargs = " ".join(args[1:])
         cmdline = cmd + " " + newargs
         cmdline = cmd + " " + newargs
 
 
         rv = 0
         rv = 0
         env = {str(key): str(value) for key, value in iter(env.items())}
         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
         return rv
 
 

+ 5 - 0
platform/windows/detect.py

@@ -654,6 +654,11 @@ def configure_mingw(env: "SConsEnvironment"):
     # https://www.scons.org/wiki/LongCmdLinesOnWin32
     # https://www.scons.org/wiki/LongCmdLinesOnWin32
     env.use_windows_spawn_fix()
     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
     ## Build type
 
 
     if not env["use_llvm"] and not try_cmd("gcc --version", env["mingw_prefix"], env["arch"]):
     if not env["use_llvm"] and not try_cmd("gcc --version", env["mingw_prefix"], env["arch"]):