[oe-commits] org.nslu2-linux.bitbake bitbake: bitbake revision 334

jbowler commit openembedded-commits at lists.openembedded.org
Mon Oct 23 17:45:00 UTC 2006


bitbake: bitbake revision 334

Author: jbowler at nslu2-linux.org
Branch: org.nslu2-linux.bitbake
Revision: ea870eecc49ed17f6243578a4bab1f0490defb99
ViewMTN: http://monotone.openembedded.org/revision.psp?id=ea870eecc49ed17f6243578a4bab1f0490defb99
Files:
1
bin/bitbake
lib/bb/shell.py
lib/bb/utils.py
Diffs:

#
# mt diff -r334c0d2dc58bf8d889b6996772fd3589ac3ce552 -rea870eecc49ed17f6243578a4bab1f0490defb99
#
# 
# 
# patch "bin/bitbake"
#  from [b1b0d707f65b8305610e2e45986075c0aa3db275]
#    to [25fb9c4ac042ff3480dbb054833a9ad94d10220b]
# 
# patch "lib/bb/shell.py"
#  from [9d77708d9910f911076f9678ca01f0a63c47e6b1]
#    to [d677b17a7543b340148012477ada298fa7b06716]
# 
# patch "lib/bb/utils.py"
#  from [57700a024b4313687805256e95231349e6c426c5]
#    to [4bbc84348f12fb1ee2feb0f7dbc5baf0a38aa323]
# 
============================================================
--- bin/bitbake	b1b0d707f65b8305610e2e45986075c0aa3db275
+++ bin/bitbake	25fb9c4ac042ff3480dbb054833a9ad94d10220b
@@ -219,42 +219,17 @@ class BBCooker:
             self.build_cache_fail.append(fn)
             raise
 
-    def regexpsMatch(self, regexps, substring):
-        for regexp in regexps:
-            if regexp.match(substring):
-                return 1
-        return 0
-
-    def removeSelfDeps(self, the_data, deps_list):
-        clean_deps = []
-        dpackagesRe = []
-        # Remove any dependencies which map to ourselves to avoid circular dependencies
-        packages = (bb.data.getVar('PACKAGES', the_data, 1) or "").split()
-        dpackages = (bb.data.getVar('PACKAGES_DYNAMIC', the_data, 1) or "").split()
-        bb.note("deps_list: %s" % " ".join(deps_list))
-        for dpackage in dpackages:
-            dpackagesRe.append(re.compile(dpackage))
-        for subdep in deps_list:
-            if subdep in packages:
-                continue
-            if not self.regexpsMatch(dpackagesRe, subdep):
-                clean_deps.append(subdep)
-        bb.note("clean %s" % ":".join(clean_deps))
-        return clean_deps
-
     def tryBuild( self, fn, virtual , itemtype , buildAllDeps ):
         """Build a provider and its dependencies"""
 
         the_data = self.pkgdata[fn]
 
         if not buildAllDeps:
-            buildAllDeps = bb.data.getVar('BUILD_ALL_DEPS', the_data, 1) or False
+            buildAllDeps = bb.data.getVar('BUILD_ALL_DEPS', the_data, True) or False
 
-        self.addRunDeps(fn, virtual , buildAllDeps)
-
         if fn in self.building_list:
             if itemtype == "runtime":
-                return True
+                return self.addRunDeps(fn, virtual , buildAllDeps)
             else:
                 bb.error("%s depends on itself (eventually)" % fn)
                 bb.error("upwards chain is: %s" % (" -> ".join(self.build_path)))
@@ -267,11 +242,8 @@ class BBCooker:
         pathstr = "%s (%s)" % (item, virtual)
         self.build_path.append(pathstr)
 
+        depends_list = (bb.data.getVar('DEPENDS', the_data, True) or "").split()
 
-        depends_list = (bb.data.getVar('DEPENDS', the_data, 1) or "").split()
-
-        bb.note("build dependencies for %s are: %s" % (item, " ".join(depends_list)))
-
         if self.configuration.verbose:
             bb.note("current path: %s" % (" -> ".join(self.build_path)))
             bb.note("dependencies for %s are: %s" % (item, " ".join(depends_list)))
@@ -309,6 +281,9 @@ class BBCooker:
                 self.stats.deps += 1
                 return False
 
+            if not self.addRunDeps(fn, virtual , buildAllDeps):
+                return False
+
             if bb.build.stamp_is_current('do_%s' % self.configuration.cmd, the_data):
                 self.build_cache.append(fn)
                 return True
@@ -347,7 +322,7 @@ class BBCooker:
         bb.data.setVar('OVERRIDES', "%s:%s" % (pn, data.getVar('OVERRIDES', localdata)), localdata)
         bb.data.update_data(localdata)
 
-        preferred_v = bb.data.getVar('PREFERRED_VERSION_%s' % pn, localdata, 1)
+        preferred_v = bb.data.getVar('PREFERRED_VERSION_%s' % pn, localdata, True)
         if preferred_v:
             m = re.match('(.*)_(.*)', preferred_v)
             if m:
@@ -441,53 +416,17 @@ class BBCooker:
             if data.getVarFlag( e, 'python', self.configuration.data ):
                 sys.__stdout__.write("\npython %s () {\n%s}\n" % (e, data.getVar(e, self.configuration.data, 1)))
 
-    def getProviders(self, item, buildAllDeps):
-
-        if item in self.status.providers:
-            return self.status.providers[item]
-
-        if not buildAllDeps:
-            return False
-
-        if item in self.status.rproviders:
-            return self.status.rproviders[item]
-
-        if item in self.status.packages:
-            return self.status.packages[item]
-
-        matches = []
-        for pattern in self.status.packages_dynamic:
-            regexp = re.compile(pattern)
-            if regexp.match(item):
-                for fn in self.status.packages_dynamic[pattern]:
-                    matches.append(fn)
-
-        if matches:
-            return matches
-
-        return False
-
-    def buildProvider( self, item , buildAllDeps ):
-        fn = None
-        discriminated = False
-
-        if not item in self.status.providers:
-            bb.error("Nothing provides %s dependency %s" % (itemtype, item))
-            return 0
-
-        all_p = self.status.providers[item]
-
-        for p in all_p:
-            if p in self.build_cache:
-                bb.debug(1, "already built %s in this run\n" % p)
-                return 1
-
+    def filterProviders(self, providers, item):
+        """
+        Take a list of providers and filter/reorder according to the 
+        environment variables and previous build results
+        """
         eligible = []
         preferred_versions = {}
 
         # Collate providers by PN
         pkg_pn = {}
-        for p in all_p:
+        for p in providers:
             pn = self.status.pkg_fn[p]
             if pn not in pkg_pn:
                 pkg_pn[pn] = []
@@ -510,7 +449,7 @@ class BBCooker:
 
         # look to see if one of them is already staged, or marked as preferred.
         # if so, bump it to the head of the queue
-        for p in all_p:
+        for p in providers:
             the_data = self.pkgdata[p]
             pn = bb.data.getVar('PN', the_data, 1)
             pv = bb.data.getVar('PV', the_data, 1)
@@ -535,6 +474,30 @@ class BBCooker:
                 discriminated = True
                 break
 
+        return eligible
+
+    def buildProvider( self, item , buildAllDeps ):
+        """
+        Build something to provide a named build requirement
+        (takes item names from DEPENDS namespace)
+        """
+
+        fn = None
+        discriminated = False
+
+        if not item in self.status.providers:
+            bb.error("Nothing provides dependency %s" % item)
+            return 0
+
+        all_p = self.status.providers[item]
+
+        for p in all_p:
+            if p in self.build_cache:
+                bb.debug(1, "already built %s in this run\n" % p)
+                return 1
+
+        eligible = self.filterProviders(all_p, item)
+
         prefervar = bb.data.getVar('PREFERRED_PROVIDER_%s' % item, self.configuration.data, 1)
         if prefervar:
             self.preferred[item] = prefervar
@@ -562,142 +525,43 @@ class BBCooker:
 
         # run through the list until we find one that we can build
         for fn in eligible:
-            bb.note( "selecting %s to satisfy %s" % (fn, item))
+            bb.debug(2, "selecting %s to satisfy %s" % (fn, item))
             if self.tryBuild(fn, item, "build", buildAllDeps):
                 return 1
 
         bb.note("no buildable providers for %s" % item)
         return 0
 
-    def getProvidersRun(self, rdepend):
-        # Get the providers of run time dependency rdepend
-        rproviders = []
-
-        if rdepend in self.status.rproviders:
-            rproviders += self.status.rproviders[rdepend]
-
-        if rdepend in self.status.packages:
-            rproviders += self.status.packages[rdepend]
-
-        if rproviders:
-            return rproviders
-
-        # Only search dynamic packages if we can't find anything in other variables
-        for pattern in self.status.packages_dynamic:
-            regexp = re.compile(pattern)
-            if regexp.match(rdepend):
-                rproviders += self.status.packages_dynamic[pattern]
-
-        return rproviders
-
-    def addRunDeps(self , fn, item , buildAllDeps):
-
-        if item in self.rbuild_cache:
-            return
-
-        rdepends = []
-        self.rbuild_cache.append(item)
-        the_data = self.pkgdata[fn]
-        pn = self.status.pkg_fn[fn]
-
-        bb.note("Building RDEPENDS for %s" % pn)
-
-        if (item == pn):
-            rdepends += bb.utils.explode_deps(bb.data.getVar('RDEPENDS', the_data, 1) or "")
-            rdepends += bb.utils.explode_deps(bb.data.getVar('RRECOMMENDS', the_data, 1) or "")
-        else:
-            packages = (bb.data.getVar('PACKAGES', the_data, 1).split() or "")
-            for package in packages:
-                if package == item:
-                    rdepends += bb.utils.explode_deps(bb.data.getVar("RDEPENDS_%s" % package, the_data, 1) or "")
-                    rdepends += bb.utils.explode_deps(bb.data.getVar("RRECOMMENDS_%s" % package, the_data, 1) or "")
-
-        #depends_list += self.removeSelfDeps(the_data, subdeps)
-
-        bb.note("runtime dependencies for %s are: %s" % (item, " ".join(rdepends)))
-
-        for rdepend in rdepends:  
-            self.buildRProvider(rdepend, buildAllDeps)
-
     def buildRProvider( self, item , buildAllDeps ):
+        """
+        Build something to provide a named runtime requirement
+        (takes item names from RDEPENDS/PACKAGES namespace)
+        """
 
         fn = None
         all_p = []
         discriminated = False
 
         if not buildAllDeps:
-            bb.note("not building all deps")
-            return 1
+            return True
 
         all_p = self.getProvidersRun(item)
 
         if not all_p:
             bb.error("Nothing provides runtime dependency %s" % (item))
-            return 0
+            return False
 
         for p in all_p:
             if p in self.rbuild_cache:
-                bb.note("already built %s providing runtime %s\n" % (p,item))
-                return 1
+                bb.debug(2, "Already built %s providing runtime %s\n" % (p,item))
+                return True
             if p in self.build_cache:
-                bb.note("Already built %s but adding any further RDEPENDS for %s\n" % (p, item))
-                self.addRunDeps(p, item , buildAllDeps)
-                return 1
+                bb.debug(2, "Already built %s but adding any further RDEPENDS for %s\n" % (p, item))
+                return self.addRunDeps(p, item , buildAllDeps)
 
-        eligible = []
-        preferred_versions = {}
+        eligible = self.filterProviders(all_p, item)
 
-        # Collate providers by PN
-        pkg_pn = {}
-        for p in all_p:
-            pn = self.status.pkg_fn[p]
-            if pn not in pkg_pn:
-                pkg_pn[pn] = []
-            pkg_pn[pn].append(p)
-
-        bb.note("providers for runtime %s are: %s" % (item, pkg_pn.keys()))
-
-        for pn in pkg_pn.keys():
-            preferred_versions[pn] = self.findBestProvider(pn, pkg_pn)[2:4]
-            eligible.append(preferred_versions[pn][1])
-
         for p in eligible:
-            if p in self.build_cache_fail:
-                bb.note("rejecting already-failed %s" % p)
-                eligible.remove(p)
-
-        if len(eligible) == 0:
-            bb.error("no eligible providers for runtime %s" % item)
-            return 0
-
-        # look to see if one of them is already staged, or marked as preferred.
-        # if so, bump it to the head of the queue
-        for p in all_p:
-            the_data = self.pkgdata[p]
-            pn = bb.data.getVar('PN', the_data, 1)
-            pv = bb.data.getVar('PV', the_data, 1)
-            pr = bb.data.getVar('PR', the_data, 1)
-            tmpdir = bb.data.getVar('TMPDIR', the_data, 1)
-            stamp = '%s/stamps/%s-%s-%s.do_populate_staging' % (tmpdir, pn, pv, pr)
-            if os.path.exists(stamp):
-                (newvers, fn) = preferred_versions[pn]
-                if not fn in eligible:
-                    # package was made ineligible by already-failed check
-                    continue
-                oldver = "%s-%s" % (pv, pr)
-                newver = '-'.join(newvers)
-                if (newver != oldver):
-                    extra_chat = "; upgrading from %s to %s" % (oldver, newver)
-                else:
-                    extra_chat = ""
-                if self.configuration.verbose:
-                    bb.note("selecting already-staged %s to satisfy %s%s" % (pn, item, extra_chat))
-                eligible.remove(fn)
-                eligible = [fn] + eligible
-                discriminated = True
-                break
-
-        for p in eligible:
             pn = self.status.pkg_fn[p]
             prefervar = bb.data.getVar('PREFERRED_PROVIDER_%s' % pn, self.configuration.data, 1)
             if prefervar:
@@ -719,13 +583,70 @@ class BBCooker:
 
         # run through the list until we find one that we can build
         for fn in eligible:
-            bb.note("selecting %s to satisfy runtime %s" % (fn, item))
+            bb.debug(2, "selecting %s to satisfy runtime %s" % (fn, item))
             if self.tryBuild(fn, item, "runtime", buildAllDeps):
-                return 1
+                return True
 
-        bb.note("no buildable providers for runtime %s" % item)
-        return 0
+        bb.error("No buildable providers for runtime %s" % item)
+        return False
 
+    def getProvidersRun(self, rdepend):
+        """
+        Return any potential providers of runtime rdepend
+        """
+        rproviders = []
+
+        if rdepend in self.status.rproviders:
+            rproviders += self.status.rproviders[rdepend]
+
+        if rdepend in self.status.packages:
+            rproviders += self.status.packages[rdepend]
+
+        if rproviders:
+            return rproviders
+
+        # Only search dynamic packages if we can't find anything in other variables
+        for pattern in self.status.packages_dynamic:
+            regexp = re.compile(pattern)
+            if regexp.match(rdepend):
+                rproviders += self.status.packages_dynamic[pattern]
+
+        return rproviders
+
+    def addRunDeps(self , fn, item , buildAllDeps):
+        """
+        Add any runtime dependencies of runtime item provided by fn 
+        as long as item has't previously been processed by this function.
+        """
+
+        if item in self.rbuild_cache:
+            return True
+
+        if not buildAllDeps:
+            return True
+
+        rdepends = []
+        self.rbuild_cache.append(item)
+        the_data = self.pkgdata[fn]
+        pn = self.status.pkg_fn[fn]
+
+        if (item == pn):
+            rdepends += bb.utils.explode_deps(bb.data.getVar('RDEPENDS', the_data, True) or "")
+            rdepends += bb.utils.explode_deps(bb.data.getVar('RRECOMMENDS', the_data, True) or "")
+        else:
+            packages = (bb.data.getVar('PACKAGES', the_data, 1).split() or "")
+            for package in packages:
+                if package == item:
+                    rdepends += bb.utils.explode_deps(bb.data.getVar("RDEPENDS_%s" % package, the_data, True) or "")
+                    rdepends += bb.utils.explode_deps(bb.data.getVar("RRECOMMENDS_%s" % package, the_data, True) or "")
+
+        bb.debug(2, "Additional runtime dependencies for %s are: %s" % (item, " ".join(rdepends)))
+
+        for rdepend in rdepends:  
+            if not self.buildRProvider(rdepend, buildAllDeps):
+                return False
+        return True
+
     def buildDepgraph( self ):
         all_depends = self.status.all_depends
         pn_provides = self.status.pn_provides
============================================================
--- lib/bb/shell.py	9d77708d9910f911076f9678ca01f0a63c47e6b1
+++ lib/bb/shell.py	d677b17a7543b340148012477ada298fa7b06716
@@ -157,7 +157,7 @@ class BitBakeShellCommands:
 
         for name in names:
             try:
-                cooker.buildProvider( name )
+                cooker.buildProvider( name, data.getVar("BUILD_ALL_DEPS", cooker.configuration.data, True) )
             except build.EventException, e:
                 print "ERROR: Couldn't build '%s'" % name
                 global last_exception
===============================================%s
>>> DIFF TRUNCATED @ 16K






More information about the Openembedded-commits mailing list