aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorRyan Sturgell <ryan.sturgell@gmail.com>2014-05-01 12:06:40 -0700
committerRyan Sturgell <ryan.sturgell@gmail.com>2014-05-07 16:55:05 -0700
commit2fdc694d1a1bec91578cfcdbb0d829dcc58d1957 (patch)
tree95e33db0e384cb0801f13ae5f724dab5107b712d /tools
parent6556a69f282ec534512c3e6a119328fe98886a97 (diff)
Add support for archive groups.
emcc now understands -Wl,--start-group, -Wl,--end-group to group static libraries. Static libraries in a group need not be specified in dependent to dependency order and can have circular dependencies.
Diffstat (limited to 'tools')
-rw-r--r--tools/shared.py33
1 files changed, 30 insertions, 3 deletions
diff --git a/tools/shared.py b/tools/shared.py
index 63367c30..8b98ac0d 100644
--- a/tools/shared.py
+++ b/tools/shared.py
@@ -1144,14 +1144,20 @@ class Building:
unresolved_symbols = set([func[1:] for func in Settings.EXPORTED_FUNCTIONS])
resolved_symbols = set()
temp_dirs = []
- files = map(os.path.abspath, files)
+ def make_paths_absolute(f):
+ if f.startswith('-'): # skip flags
+ return f
+ else:
+ return os.path.abspath(f)
+ files = map(make_paths_absolute, files)
# Paths of already included object files from archives.
added_contents = set()
# Map of archive name to list of extracted object file paths.
ar_contents = {}
has_ar = False
for f in files:
- has_ar = has_ar or Building.is_ar(f)
+ if not f.startswith('-'):
+ has_ar = has_ar or Building.is_ar(f)
# If we have only one archive or the force_archive_contents flag is set,
# then we will add every object file we see, regardless of whether it
@@ -1229,8 +1235,26 @@ class Building:
#print >> sys.stderr, ' done running loop of archive including for', f
return added_any_objects
+ current_archive_group = None
for f in files:
- if not Building.is_ar(f):
+ if f.startswith('-'):
+ if f in ['--start-group', '-(']:
+ assert current_archive_group is None, 'Nested --start-group, missing --end-group?'
+ current_archive_group = []
+ elif f in ['--end-group', '-)']:
+ assert current_archive_group is not None, '--end-group without --start-group'
+ # rescan the archives in the group until we don't find any more
+ # objects to link.
+ loop_again = True
+ while loop_again:
+ loop_again = False
+ for archive in current_archive_group:
+ if consider_archive(archive):
+ loop_again = True
+ current_archive_group = None
+ else:
+ logging.debug('Ignoring unsupported link flag: %s' % f)
+ elif not Building.is_ar(f):
if Building.is_bitcode(f):
if has_ar:
consider_object(f, force_add=True)
@@ -1242,6 +1266,9 @@ class Building:
# Extract object files from ar archives, and link according to gnu ld semantics
# (link in an entire .o from the archive if it supplies symbols still unresolved)
consider_archive(f)
+ if current_archive_group is not None:
+ current_archive_group.append(f)
+ assert current_archive_group is None, '--start-group without matching --end-group'
try_delete(target)