diff options
Diffstat (limited to 'tools/buildgen/plugins/expand_filegroups.py')
-rwxr-xr-x | tools/buildgen/plugins/expand_filegroups.py | 52 |
1 files changed, 39 insertions, 13 deletions
diff --git a/tools/buildgen/plugins/expand_filegroups.py b/tools/buildgen/plugins/expand_filegroups.py index 156bdc4417..c40143ef95 100755 --- a/tools/buildgen/plugins/expand_filegroups.py +++ b/tools/buildgen/plugins/expand_filegroups.py @@ -1,4 +1,4 @@ -# Copyright 2015, Google Inc. +# Copyright 2015-2016, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -42,6 +42,9 @@ def excluded(filename, exclude_res): return False +FILEGROUP_LISTS = ['src', 'headers', 'public_headers'] + + def mako_plugin(dictionary): """The exported plugin code for expand_filegroups. @@ -54,21 +57,44 @@ def mako_plugin(dictionary): filegroups_list = dictionary.get('filegroups') filegroups = {} - for fg in filegroups_list: - filegroups[fg['name']] = fg + todo = filegroups_list[:] + skips = 0 + + while todo: + assert skips != len(todo), "infinite loop in filegroup uses clauses" + # take the first element of the todo list + cur = todo[0] + todo = todo[1:] + # check all uses filegroups are present (if no, skip and come back later) + skip = False + for uses in cur.get('uses', []): + if uses not in filegroups: + skip = True + if skip: + skips += 1 + todo.append(cur) + else: + skips = 0 + for uses in cur.get('uses', []): + for lst in FILEGROUP_LISTS: + vals = cur.get(lst, []) + vals.extend(filegroups[uses].get(lst, [])) + cur[lst] = vals + filegroups[cur['name']] = cur + + # the above expansion can introduce duplicate filenames: contract them here + for fg in filegroups.itervalues(): + for lst in FILEGROUP_LISTS: + fg[lst] = sorted(list(set(fg.get(lst, [])))) for lib in libs: for fg_name in lib.get('filegroups', []): fg = filegroups[fg_name] - src = lib.get('src', []) - src.extend(fg.get('src', [])) - lib['src'] = src - - headers = lib.get('headers', []) - headers.extend(fg.get('headers', [])) - lib['headers'] = headers + for lst in FILEGROUP_LISTS: + vals = lib.get(lst, []) + vals.extend(fg.get(lst, [])) + lib[lst] = vals - public_headers = lib.get('public_headers', []) - public_headers.extend(fg.get('public_headers', [])) - lib['public_headers'] = public_headers + for lst in FILEGROUP_LISTS: + lib[lst] = sorted(list(set(lib.get(lst, [])))) |