blob: 99d9463b3f9baeee1bc445e76a3c58775c6e3c03 [file] [log] [blame]
Jan Tattermusch7897ae92017-06-07 22:57:36 +02001# Copyright 2015 gRPC authors.
Craig Tillerc2c79212015-02-16 12:00:01 -08002#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
Craig Tillerc2c79212015-02-16 12:00:01 -08006#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02007# http://www.apache.org/licenses/LICENSE-2.0
Craig Tillerc2c79212015-02-16 12:00:01 -08008#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
Nicolas Nobleddef2462015-01-06 18:08:25 -080014"""Buildgen expand filegroups plugin.
15
Craig Tiller1ebb7c82015-08-31 15:53:36 -070016This takes the list of libs from our yaml dictionary,
Nicolas Nobleddef2462015-01-06 18:08:25 -080017and expands any and all filegroup.
18
19"""
20
21
22def excluded(filename, exclude_res):
ncteisen26d70b12017-12-11 16:40:56 -080023 for r in exclude_res:
24 if r.search(filename):
25 return True
26 return False
Nicolas Nobleddef2462015-01-06 18:08:25 -080027
28
Craig Tiller03915e52016-04-07 09:15:10 -070029def uniquify(lst):
ncteisen26d70b12017-12-11 16:40:56 -080030 out = []
31 for el in lst:
32 if el not in out:
33 out.append(el)
34 return out
Craig Tiller03915e52016-04-07 09:15:10 -070035
36
Craig Tillerd1697d92016-04-05 16:05:46 -070037FILEGROUP_LISTS = ['src', 'headers', 'public_headers', 'deps']
38
Craig Tillerd1697d92016-04-05 16:05:46 -070039FILEGROUP_DEFAULTS = {
ncteisen26d70b12017-12-11 16:40:56 -080040 'language': 'c',
41 'boringssl': False,
42 'zlib': False,
43 'ares': False,
Craig Tillerd1697d92016-04-05 16:05:46 -070044}
Craig Tiller44cc10b2016-03-28 10:45:29 -070045
46
Nicolas Nobleddef2462015-01-06 18:08:25 -080047def mako_plugin(dictionary):
ncteisen26d70b12017-12-11 16:40:56 -080048 """The exported plugin code for expand_filegroups.
Nicolas Nobleddef2462015-01-06 18:08:25 -080049
Craig Tiller1ebb7c82015-08-31 15:53:36 -070050 The list of libs in the build.yaml file can contain "filegroups" tags.
Nicolas Nobleddef2462015-01-06 18:08:25 -080051 These refer to the filegroups in the root object. We will expand and
52 merge filegroups on the src, headers and public_headers properties.
53
54 """
ncteisen26d70b12017-12-11 16:40:56 -080055 libs = dictionary.get('libs')
56 targets = dictionary.get('targets')
57 filegroups_list = dictionary.get('filegroups')
58 filegroups = {}
Nicolas Nobleddef2462015-01-06 18:08:25 -080059
ncteisen26d70b12017-12-11 16:40:56 -080060 for fg in filegroups_list:
Craig Tiller44cc10b2016-03-28 10:45:29 -070061 for lst in FILEGROUP_LISTS:
ncteisen26d70b12017-12-11 16:40:56 -080062 fg[lst] = fg.get(lst, [])
63 fg['own_%s' % lst] = list(fg[lst])
64 for attr, val in FILEGROUP_DEFAULTS.iteritems():
65 if attr not in fg:
66 fg[attr] = val
Craig Tiller44cc10b2016-03-28 10:45:29 -070067
ncteisen26d70b12017-12-11 16:40:56 -080068 todo = list(filegroups_list)
69 skips = 0
70
Craig Tiller3ab2fe02016-04-11 20:11:18 -070071 while todo:
ncteisen26d70b12017-12-11 16:40:56 -080072 assert skips != len(
73 todo), "infinite loop in filegroup uses clauses: %r" % [
74 t['name'] for t in todo
75 ]
76 # take the first element of the todo list
77 cur = todo[0]
78 todo = todo[1:]
79 # check all uses filegroups are present (if no, skip and come back later)
80 skip = False
81 for uses in cur.get('uses', []):
82 if uses not in filegroups:
83 skip = True
84 if skip:
85 skips += 1
86 todo.append(cur)
87 else:
88 skips = 0
89 assert 'plugins' not in cur
90 plugins = []
91 for uses in cur.get('uses', []):
92 for plugin in filegroups[uses]['plugins']:
93 if plugin not in plugins:
94 plugins.append(plugin)
95 for lst in FILEGROUP_LISTS:
96 vals = cur.get(lst, [])
97 vals.extend(filegroups[uses].get(lst, []))
98 cur[lst] = vals
99 cur_plugin_name = cur.get('plugin')
100 if cur_plugin_name:
101 plugins.append(cur_plugin_name)
102 cur['plugins'] = plugins
103 filegroups[cur['name']] = cur
Craig Tiller3ab2fe02016-04-11 20:11:18 -0700104
ncteisen26d70b12017-12-11 16:40:56 -0800105 # build reverse dependency map
106 things = {}
Mehrdad Afshari87cd9942018-01-02 14:40:00 -0800107 for thing in dictionary['libs'] + dictionary['targets'] + dictionary['filegroups']:
ncteisen26d70b12017-12-11 16:40:56 -0800108 things[thing['name']] = thing
109 thing['used_by'] = []
110 thing_deps = lambda t: t.get('uses', []) + t.get('filegroups', []) + t.get('deps', [])
111 for thing in things.itervalues():
112 done = set()
113 todo = thing_deps(thing)
114 while todo:
115 cur = todo[0]
116 todo = todo[1:]
117 if cur in done: continue
118 things[cur]['used_by'].append(thing['name'])
119 todo.extend(thing_deps(things[cur]))
120 done.add(cur)
Nicolas Nobleddef2462015-01-06 18:08:25 -0800121
ncteisen26d70b12017-12-11 16:40:56 -0800122 # the above expansion can introduce duplicate filenames: contract them here
123 for fg in filegroups.itervalues():
124 for lst in FILEGROUP_LISTS:
125 fg[lst] = uniquify(fg.get(lst, []))
Craig Tillerd1697d92016-04-05 16:05:46 -0700126
ncteisen26d70b12017-12-11 16:40:56 -0800127 for tgt in dictionary['targets']:
128 for lst in FILEGROUP_LISTS:
129 tgt[lst] = tgt.get(lst, [])
130 tgt['own_%s' % lst] = list(tgt[lst])
131
132 for lib in libs + targets:
133 assert 'plugins' not in lib
134 plugins = []
135 for lst in FILEGROUP_LISTS:
136 vals = lib.get(lst, [])
137 lib[lst] = list(vals)
138 lib['own_%s' % lst] = list(vals)
139 for fg_name in lib.get('filegroups', []):
140 fg = filegroups[fg_name]
141 for plugin in fg['plugins']:
142 if plugin not in plugins:
143 plugins.append(plugin)
144 for lst in FILEGROUP_LISTS:
145 vals = lib.get(lst, [])
146 vals.extend(fg.get(lst, []))
147 lib[lst] = vals
148 lib['plugins'] = plugins
149 if lib.get('generate_plugin_registry', False):
Mehrdad Afshari87cd9942018-01-02 14:40:00 -0800150 lib['src'].append(
151 'src/core/plugin_registry/%s_plugin_registry.cc' % lib['name'])
ncteisen26d70b12017-12-11 16:40:56 -0800152 for lst in FILEGROUP_LISTS:
153 lib[lst] = uniquify(lib.get(lst, []))