[oe-commits] org.nslu2-linux.bitbake temporary patch version 4 from RP

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


temporary patch version 4 from RP

Author: jbowler at nslu2-linux.org
Branch: org.nslu2-linux.bitbake
Revision: 334c0d2dc58bf8d889b6996772fd3589ac3ce552
ViewMTN: http://monotone.openembedded.org/revision.psp?id=334c0d2dc58bf8d889b6996772fd3589ac3ce552
Files:
1
bin/bitbake
Diffs:

#
# mt diff -r17970596310cf5b084702b68f677b680fcc0d5b3 -r334c0d2dc58bf8d889b6996772fd3589ac3ce552
#
# 
# 
# patch "bin/bitbake"
#  from [d39d47aac1a22bc0d210b1d322ae49d5b84a67ff]
#    to [b1b0d707f65b8305610e2e45986075c0aa3db275]
# 
============================================================
--- bin/bitbake	d39d47aac1a22bc0d210b1d322ae49d5b84a67ff
+++ bin/bitbake	b1b0d707f65b8305610e2e45986075c0aa3db275
@@ -182,6 +182,7 @@ class BBCooker:
     def __init__( self ):
         self.build_cache_fail = []
         self.build_cache = []
+        self.rbuild_cache = []
         self.building_list = []
         self.build_path = []
         self.consider_msgs_cache = []
@@ -241,14 +242,24 @@ class BBCooker:
         bb.note("clean %s" % ":".join(clean_deps))
         return clean_deps
 
-    def tryBuild( self, fn, virtual , buildAllDeps ):
+    def tryBuild( self, fn, virtual , itemtype , buildAllDeps ):
         """Build a provider and its dependencies"""
-        if fn in self.building_list:
-            bb.error("%s depends on itself (eventually)" % fn)
-            bb.error("upwards chain is: %s" % (" -> ".join(self.build_path)))
-            return False
 
         the_data = self.pkgdata[fn]
+
+        if not buildAllDeps:
+            buildAllDeps = bb.data.getVar('BUILD_ALL_DEPS', the_data, 1) or False
+
+        self.addRunDeps(fn, virtual , buildAllDeps)
+
+        if fn in self.building_list:
+            if itemtype == "runtime":
+                return True
+            else:
+                bb.error("%s depends on itself (eventually)" % fn)
+                bb.error("upwards chain is: %s" % (" -> ".join(self.build_path)))
+                return False
+
         item = self.status.pkg_fn[fn]
 
         self.building_list.append(fn)
@@ -256,37 +267,15 @@ class BBCooker:
         pathstr = "%s (%s)" % (item, virtual)
         self.build_path.append(pathstr)
 
-        depends_list = (bb.data.getVar('DEPENDS', the_data, 1) or "").split()
-        if not buildAllDeps:
-            buildAllDeps = bb.data.getVar('BUILD_ALL_DEPS', the_data, 1) or False
 
-        bb.note("dependencies for %s are: %s" % (item, " ".join(depends_list)))
+        depends_list = (bb.data.getVar('DEPENDS', the_data, 1) or "").split()
 
-        if buildAllDeps:
-            bb.note("building all deps")
-            subdeps = []
-            subdeps += bb.utils.explode_deps(bb.data.getVar('RDEPENDS', the_data, 1) or "")
-            subdeps += bb.utils.explode_deps(bb.data.getVar('RRECOMMENDS', the_data, 1) or "")
-            # Need to include subpackage dependencies but not circular ones
-            packages = (bb.data.getVar('PACKAGES', the_data, 1).split() or "")
-            for package in packages:
-                #if virtual != package:
-                    #bb.note("%s: %s not equal to %s, skipping" % (item, virtual, package))
-                    #continue
-    	        subdeps += bb.utils.explode_deps(bb.data.getVar("RDEPENDS_%s" % package, the_data, 1) or "")
-                subdeps += bb.utils.explode_deps(bb.data.getVar("RRECOMMENDS_%s" % package, the_data, 1) or "")
-            depends_list += self.removeSelfDeps(the_data, subdeps)
-        else:
-            bb.note("not building all deps")
+        bb.note("build dependencies for %s are: %s" % (item, " ".join(depends_list)))
 
-        bb.note("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)))
 
-
-
         try:
             failed = False
 
@@ -480,15 +469,14 @@ class BBCooker:
 
     def buildProvider( self, item , buildAllDeps ):
         fn = None
-
         discriminated = False
 
-        all_p = self.getProviders(item, buildAllDeps)
-
-        if not all_p:
-            bb.error("Nothing provides %s" % item)
+        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)
@@ -574,13 +562,170 @@ class BBCooker:
 
         # run through the list until we find one that we can build
         for fn in eligible:
-            bb.debug(2, "selecting %s to satisfy %s" % (fn, item))
-            if self.tryBuild(fn, item, buildAllDeps):
+            bb.note( "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 ):
+
+        fn = None
+        all_p = []
+        discriminated = False
+
+        if not buildAllDeps:
+            bb.note("not building all deps")
+            return 1
+
+        all_p = self.getProvidersRun(item)
+
+        if not all_p:
+            bb.error("Nothing provides runtime dependency %s" % (item))
+            return 0
+
+        for p in all_p:
+            if p in self.rbuild_cache:
+                bb.note("already built %s providing runtime %s\n" % (p,item))
+                return 1
+            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
+
+        eligible = []
+        preferred_versions = {}
+
+        # 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:
+                if self.configuration.verbose:
+                    bb.note("selecting %s to satisfy runtime %s due to PREFERRED_PROVIDERS" % (pn, item))
+                eligible.remove(p)
+                eligible = [p] + eligible
+                discriminated = True
+                break
+
+        if len(eligible) > 1 and discriminated == False:
+            if item not in self.consider_msgs_cache:
+                providers_list = []
+                for fn in eligible:
+                    providers_list.append(self.status.pkg_fn[fn])
+                bb.note("multiple providers are available (%s);" % ", ".join(providers_list))
+                bb.note("consider defining a PREFERRED_PROVIDER to match runtime %s" % item)
+            self.consider_msgs_cache.append(item)
+
+        # 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))
+            if self.tryBuild(fn, item, "runtime", buildAllDeps):
+                return 1
+
+        bb.note("no buildable providers for runtime %s" % item)
+        return 0
+
     def buildDepgraph( self ):
         all_depends = self.status.all_depends
         pn_provides = self.status.pn_provides






More information about the Openembedded-commits mailing list