From 51ad1c16683589aa1ebc73e29416e1b0fc50d30d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20J=2E=20Est=C3=A9banez?= Date: Sat, 29 Oct 2016 03:34:53 +0200 Subject: [PATCH 1/2] Adopt simpler strategy for big libs on Windows --- drivers/SCsub | 52 +++------------------------------------------------ methods.py | 10 +++++++++- 2 files changed, 12 insertions(+), 50 deletions(-) diff --git a/drivers/SCsub b/drivers/SCsub index 1f1509efa87e..9c561b5c13bf 100644 --- a/drivers/SCsub +++ b/drivers/SCsub @@ -35,52 +35,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]) diff --git a/methods.py b/methods.py index 477fe4f12f24..26c1c6e68e00 100755 --- a/methods.py +++ b/methods.py @@ -1352,7 +1352,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 From e34a5324c884960735b3f743956b3a052574d6ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Sun, 30 Oct 2016 17:04:07 +0100 Subject: [PATCH 2/2] scons: Move lib splitting method to methods.py Apparently it might still be necessary for some console ports. --- SConstruct | 1 + drivers/SCsub | 9 ++++++--- methods.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/SConstruct b/SConstruct index 72de2e2004a3..fb76014e4a5a 100644 --- a/SConstruct +++ b/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 diff --git a/drivers/SCsub b/drivers/SCsub index 9c561b5c13bf..e9a6e3b983bd 100644 --- a/drivers/SCsub +++ b/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]) diff --git a/methods.py b/methods.py index 26c1c6e68e00..8a195067614c 100755 --- a/methods.py +++ b/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: