diff options
| author | Rémi Verschelde | 2016-10-30 17:35:37 +0100 |
|---|---|---|
| committer | GitHub | 2016-10-30 17:35:37 +0100 |
| commit | 1944635ac4f3e9f12b176c2f38d43205195c35c5 (patch) | |
| tree | 136c3e69cbe9c2a65b2b25c3d581bd09889519b8 /methods.py | |
| parent | 2001e0f75ffc23089eba08365e1fbc4fe3b46584 (diff) | |
| parent | e34a5324c884960735b3f743956b3a052574d6ee (diff) | |
| download | godot-1944635ac4f3e9f12b176c2f38d43205195c35c5.tar.gz godot-1944635ac4f3e9f12b176c2f38d43205195c35c5.tar.zst godot-1944635ac4f3e9f12b176c2f38d43205195c35c5.zip | |
Diffstat (limited to 'methods.py')
| -rwxr-xr-x | methods.py | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/methods.py b/methods.py index bd5409e3d..efe2400c1 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 @@ -1394,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: |
