]> code.ossystems Code Review - openembedded-core.git/commitdiff
autotools: Limit aclocal files to those in dependencies
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Sun, 2 Mar 2014 17:36:38 +0000 (17:36 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 5 Mar 2014 15:23:42 +0000 (15:23 +0000)
We still occasionally see race issues with cp-noerror, and it copies
too many files, we should limit the the m4 files to those explicitly in
the DEPENDS for the recipe.

This change takes advantage of the BB_TASKDEPDATA data from bitbake to
only copy in those files listed in the manifest of the recipes in DEPENDS.

I've had this testing locally for some time, its ready for wider
review/testing.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/autotools.bbclass

index 883eb06e263dceb9eb6b031eed54ca06789eab3d..01e49c98bfda1e027d9c86ff6f6615d6cbec8e9d 100644 (file)
@@ -130,28 +130,51 @@ autotools_postconfigure(){
 
 EXTRACONFFUNCS ??= ""
 
-do_configure[prefuncs] += "autotools_preconfigure ${EXTRACONFFUNCS}"
+do_configure[prefuncs] += "autotools_preconfigure autotools_copy_aclocals ${EXTRACONFFUNCS}"
 do_configure[postfuncs] += "autotools_postconfigure"
 
 ACLOCALDIR = "${B}/aclocal-copy"
 
-autotools_copy_aclocal () {
-       # Remove any previous copy of the m4 macros
-       rm -rf ${ACLOCALDIR}/
-
-       # The aclocal directory could get modified by other processes
-       # uninstalling data from the sysroot. See Yocto #861 for details.
-       # We avoid this by taking a copy here and then files cannot disappear.
-       # We copy native first, then target. This avoids certain races since cp-noerror
-       # won't overwrite existing files.
-       mkdir -p ${ACLOCALDIR}/
-       if [ -d ${STAGING_DATADIR_NATIVE}/aclocal ]; then
-               cp-noerror ${STAGING_DATADIR_NATIVE}/aclocal/ ${ACLOCALDIR}/
-       fi
-       if [ -d ${STAGING_DATADIR}/aclocal -a "${STAGING_DATADIR_NATIVE}/aclocal" != "${STAGING_DATADIR}/aclocal" ]; then
-               cp-noerror ${STAGING_DATADIR}/aclocal/ ${ACLOCALDIR}/
-       fi
+python autotools_copy_aclocals () {
+    s = d.getVar("S", True)
+    if not os.path.exists(s + "/configure.in") and not os.path.exists(s + "/configure.ac"):
+        return
+
+    taskdepdata = d.getVar("BB_TASKDEPDATA", False)
+    pn = d.getVar("PN", True)
+    aclocaldir = d.getVar("ACLOCALDIR", True)
+    oe.path.remove(aclocaldir)
+    bb.utils.mkdirhier(aclocaldir)
+    configuredeps = []
+    for dep in taskdepdata:
+        data = taskdepdata[dep]
+        if data[1] == "do_configure" and data[0] != pn:
+            configuredeps.append(data[0])
+
+    cp = []
+    for c in configuredeps:
+        if c.endswith("-native"):
+            manifest = d.expand("${SSTATE_MANIFESTS}/manifest-${BUILD_ARCH}-%s.populate_sysroot" % c)
+        elif c.startswith("nativesdk-"):
+            manifest = d.expand("${SSTATE_MANIFESTS}/manifest-${SDK_ARCH}-%s.populate_sysroot" % c)
+        elif c.endswith("-cross") or c.endswith("-cross-initial") or c.endswith("-crosssdk") or c.endswith("-crosssdk-initial"):
+            continue
+        else:
+            manifest = d.expand("${SSTATE_MANIFESTS}/manifest-${MACHINE}-%s.populate_sysroot" % c)
+        try:
+            f = open(manifest, "r")
+            for l in f:
+                if "/aclocal/" in l and l.strip().endswith(".m4"):
+                    cp.append(l.strip())
+        except:
+            bb.warn("%s not found" % manifest)
+
+    for c in cp:
+        t = os.path.join(aclocaldir, os.path.basename(c))
+        if not os.path.exists(t):
+            os.symlink(c, t)
 }
+autotools_copy_aclocals[vardepsexclude] += "MACHINE"
 
 autotools_do_configure() {
        # WARNING: gross hack follows:
@@ -168,7 +191,6 @@ autotools_do_configure() {
        if [ -e ${S}/configure.in -o -e ${S}/configure.ac ]; then
                olddir=`pwd`
                cd ${S}
-               autotools_copy_aclocal
                ACLOCAL="aclocal --system-acdir=${ACLOCALDIR}/"
                if [ x"${acpaths}" = xdefault ]; then
                        acpaths=