소스 검색

Adopt simpler strategy for big libs on Windows

(cherry picked from commit 51ad1c16683589aa1ebc73e29416e1b0fc50d30d)
Pedro J. Estébanez 8 년 전
부모
커밋
b492dd78bd
2개의 변경된 파일12개의 추가작업 그리고 50개의 파일을 삭제
  1. 3 49
      drivers/SCsub
  2. 9 1
      methods.py

+ 3 - 49
drivers/SCsub

@@ -33,52 +33,6 @@ if (env["tools"]=="yes"):
 if env['vsproj']=="yes":
 	env.AddToVSProject(env.drivers_sources)
 
-
-# Split drivers, this used to be needed for windows until separate builders for windows were created
-# FIXME: Check if still needed now that the drivers were made more lightweight
-if (env.split_drivers):
-	import string
-
-	num = 0
-	cur_base = ""
-	max_src = 64
-	list = []
-	lib_list = []
-
-	for f in env.drivers_sources:
-		fname = ""
-		if type(f) == type(""):
-			fname = env.File(f).path
-		else:
-			fname = env.File(f)[0].path
-		fname = fname.replace("\\", "/")
-		base = string.join(fname.split("/")[:2], "/")
-		if base != cur_base and len(list) > max_src:
-			if num > 0:
-				lib = env.Library("drivers"+str(num), list)
-				lib_list.append(lib)
-				list = []
-			num = num+1
-		cur_base = base
-		list.append(f)
-
-	lib = env.Library("drivers"+str(num), list)
-	lib_list.append(lib)
-
-	if len(lib_list) > 0:
-		import os, sys
-		if os.name=='posix' and sys.platform=='msys':
-			env.Replace(ARFLAGS=['rcsT'])
-
-			lib = env.Library("drivers_collated", lib_list)
-			lib_list = [lib]
-
-	drivers_base=[]
-	env.add_source_files(drivers_base,"*.cpp")
-	lib_list.insert(0, env.Library("drivers", drivers_base))
-
-	env.Prepend(LIBS=lib_list)
-else:
-	env.add_source_files(env.drivers_sources,"*.cpp")
-	lib = env.Library("drivers",env.drivers_sources)
-	env.Prepend(LIBS=[lib])
+env.add_source_files(env.drivers_sources,"*.cpp")
+lib = env.Library("drivers",env.drivers_sources)
+env.Prepend(LIBS=[lib])

+ 9 - 1
methods.py

@@ -1350,7 +1350,15 @@ def use_windows_spawn_fix(self, platform=None):
     if (os.name!="nt"):
 	return #not needed, only for windows
 
-    self.split_drivers=True
+    # 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 looses symbols defined by overwritten objects.
+    # By enabling quick append instead of the default mode (replacing), libraries will
+    # got built correctly regardless the invokation 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')
 
     import subprocess