summaryrefslogtreecommitdiffstats
path: root/meta/classes
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2016-09-13 14:56:15 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-09-14 22:22:12 +0100
commitc77f114e240fdeab4af35278160ae020b8c53565 (patch)
treed4c3373538bd7edc6d75919283cb550f726b72a6 /meta/classes
parent1373b528964e47c2b0a154e4ca749e64f7f1a341 (diff)
downloadpoky-c77f114e240fdeab4af35278160ae020b8c53565.tar.gz
autotools: Correctly filter m4 files view to setscene dependencies
Currently when you run builds from sstate, you can see warnings like: WARNING: systemd-1_230+gitAUTOINC+3a74d4fc90-r0 do_configure: /data/poky-master/tmp-glibc/sstate-control/manifest-intel-corei7-64-glibc-initial.populate_sysroot not found WARNING: systemd-1_230+gitAUTOINC+3a74d4fc90-r0 do_configure: /data/poky-master/tmp-glibc/sstate-control/manifest-intel-corei7-64-libgcc-initial.populate_sysroot not found This is due to co_configure wanting to copy a limited number of m4 macros, only listed in a recipes DEPENDS but that set is still larger than the set of recipes which get restored from sstate. For build determinism and to avoid these warnings, we need to make this function match what the sstate code does. We really don't want to duplicate the functionality since keeping things in sync would be hard so we create a data structure which can be passed into the same underlying function, setscene_depvalid(). [YOCTO #10030] (From OE-Core rev: 37ffb1f7d812e40d6fa23b44782eaa8436d9ab76) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes')
-rw-r--r--meta/classes/autotools.bbclass67
1 files changed, 48 insertions, 19 deletions
diff --git a/meta/classes/autotools.bbclass b/meta/classes/autotools.bbclass
index 5fda03df80..4c32c84fa8 100644
--- a/meta/classes/autotools.bbclass
+++ b/meta/classes/autotools.bbclass
@@ -137,6 +137,8 @@ do_configure[postfuncs] += "autotools_postconfigure"
137ACLOCALDIR = "${WORKDIR}/aclocal-copy" 137ACLOCALDIR = "${WORKDIR}/aclocal-copy"
138 138
139python autotools_copy_aclocals () { 139python autotools_copy_aclocals () {
140 import copy
141
140 s = d.getVar("AUTOTOOLS_SCRIPT_PATH", True) 142 s = d.getVar("AUTOTOOLS_SCRIPT_PATH", True)
141 if not os.path.exists(s + "/configure.in") and not os.path.exists(s + "/configure.ac"): 143 if not os.path.exists(s + "/configure.in") and not os.path.exists(s + "/configure.ac"):
142 if not d.getVar("AUTOTOOLS_COPYACLOCAL", False): 144 if not d.getVar("AUTOTOOLS_COPYACLOCAL", False):
@@ -165,36 +167,63 @@ python autotools_copy_aclocals () {
165 if start is None: 167 if start is None:
166 bb.fatal("Couldn't find ourself in BB_TASKDEPDATA?") 168 bb.fatal("Couldn't find ourself in BB_TASKDEPDATA?")
167 169
168 # We need to find configure tasks which are either from <target> -> <target> 170 # We need to figure out which m4 files we need to expose to this do_configure task.
169 # or <native> -> <native> but not <target> -> <native> unless they're direct 171 # This needs to match what would get restored from sstate, which is controlled
170 # dependencies. This mirrors what would get restored from sstate. 172 # ultimately by calls from bitbake to setscene_depvalid().
171 done = [start] 173 # That function expects a setscene dependency tree. We build a dependency tree
172 next = [start] 174 # condensed to do_populate_sysroot -> do_populate_sysroot dependencies, similar to
175 # that used by setscene tasks. We can then call into setscene_depvalid() and decide
176 # which dependencies we can "see" and should expose the m4 files for.
177 setscenedeps = copy.deepcopy(taskdepdata)
178
179 start = set([start])
180
181 # Create collapsed do_populate_sysroot -> do_populate_sysroot tree
182 for dep in taskdepdata:
183 data = setscenedeps[dep]
184 if data[1] != "do_populate_sysroot":
185 for dep2 in setscenedeps:
186 data2 = setscenedeps[dep2]
187 if dep in data2[3]:
188 data2[3].update(setscenedeps[dep][3])
189 data2[3].remove(dep)
190 if dep in start:
191 start.update(setscenedeps[dep][3])
192 start.remove(dep)
193 del setscenedeps[dep]
194
195 # Remove circular references
196 for dep in setscenedeps:
197 if dep in setscenedeps[dep][3]:
198 setscenedeps[dep][3].remove(dep)
199
200 # Direct dependencies should be present and can be depended upon
201 for dep in start:
202 configuredeps.append(setscenedeps[dep][0])
203
204 # Call into setscene_depvalid for each sub-dependency and only copy m4 files
205 # for ones that would be restored from sstate.
206 done = list(start)
207 next = list(start)
173 while next: 208 while next:
174 new = [] 209 new = []
175 for dep in next: 210 for dep in next:
176 data = taskdepdata[dep] 211 data = setscenedeps[dep]
177 for datadep in data[3]: 212 for datadep in data[3]:
178 if datadep in done: 213 if datadep in done:
179 continue 214 continue
180 if (not data[0].endswith("-native")) and taskdepdata[datadep][0].endswith("-native") and dep != start: 215 taskdeps = {}
216 taskdeps[dep] = setscenedeps[dep][:2]
217 taskdeps[datadep] = setscenedeps[datadep][:2]
218 retval = setscene_depvalid(datadep, taskdeps, [], d)
219 if retval:
220 bb.note("Skipping setscene dependency %s for m4 macro copying" % datadep)
181 continue 221 continue
182 done.append(datadep) 222 done.append(datadep)
183 new.append(datadep) 223 new.append(datadep)
184 if taskdepdata[datadep][1] == "do_configure": 224 configuredeps.append(setscenedeps[datadep][0])
185 configuredeps.append(taskdepdata[datadep][0])
186 next = new 225 next = new
187 226
188 #configuredeps2 = []
189 #for dep in taskdepdata:
190 # data = taskdepdata[dep]
191 # if data[1] == "do_configure" and data[0] != pn:
192 # configuredeps2.append(data[0])
193 #configuredeps.sort()
194 #configuredeps2.sort()
195 #bb.warn(str(configuredeps))
196 #bb.warn(str(configuredeps2))
197
198 cp = [] 227 cp = []
199 if nodeps: 228 if nodeps:
200 bb.warn("autotools: Unable to find task dependencies, -b being used? Pulling in all m4 files") 229 bb.warn("autotools: Unable to find task dependencies, -b being used? Pulling in all m4 files")