소스 검색

scons: Move lib splitting method to methods.py

Apparently it might still be necessary for some console ports.
Rémi Verschelde 8 년 전
부모
커밋
e34a5324c8
3개의 변경된 파일51개의 추가작업 그리고 3개의 파일을 삭제
  1. 1 0
      SConstruct
  2. 6 3
      drivers/SCsub
  3. 44 0
      methods.py

+ 1 - 0
SConstruct

@@ -100,6 +100,7 @@ env_base.__class__.disable_module = methods.disable_module
 
 env_base.__class__.add_source_files = methods.add_source_files
 env_base.__class__.use_windows_spawn_fix = methods.use_windows_spawn_fix
+env_base.__class__.split_lib = methods.split_lib
 
 env_base["x86_libtheora_opt_gcc"]=False
 env_base["x86_libtheora_opt_vc"]=False

+ 6 - 3
drivers/SCsub

@@ -35,6 +35,9 @@ if (env["tools"]=="yes"):
 if env['vsproj']=="yes":
 	env.AddToVSProject(env.drivers_sources)
 
-env.add_source_files(env.drivers_sources,"*.cpp")
-lib = env.Library("drivers",env.drivers_sources)
-env.Prepend(LIBS=[lib])
+if env.split_drivers:
+	env.split_lib("drivers")
+else:
+	env.add_source_files(env.drivers_sources,"*.cpp")
+	lib = env.Library("drivers",env.drivers_sources)
+	env.Prepend(LIBS=[lib])

+ 44 - 0
methods.py

@@ -1402,6 +1402,50 @@ def use_windows_spawn_fix(self, platform=None):
     self['SPAWN'] = mySpawn
 
 
+def split_lib(self, libname):
+	import string
+	env = self
+
+	num = 0
+	cur_base = ""
+	max_src = 64
+	list = []
+	lib_list = []
+
+	for f in getattr(env, libname + "_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(libname + str(num), list)
+				lib_list.append(lib)
+				list = []
+			num = num + 1
+		cur_base = base
+		list.append(f)
+
+	lib = env.Library(libname + 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(libname + "_collated", lib_list)
+			lib_list = [lib]
+
+	lib_base = []
+	env.add_source_files(lib_base, "*.cpp")
+	lib_list.insert(0, env.Library(libname, lib_base))
+
+	env.Prepend(LIBS = lib_list)
+
+
 def save_active_platforms(apnames,ap):
 
 	for x in ap: