def _getPackages(self, script): parts = script.parts # Generating list of all classes allClasses = {} for part in parts.values(): for classId in part.deps: allClasses[classId] = True # Check for each class which part is using it; # create a package for each set of classes which # are used by the same combination of parts; # track how many parts are using a particular package packages = {} for classId in allClasses.keys(): pkgId = 0 for part in parts.values(): if classId in part.deps: pkgId |= part.bit_mask if not packages.has_key(pkgId): package = Package(pkgId) packages[pkgId] = package packages[pkgId].classes.append(classId) # Which packages does a part use - and vice versa for package in packages.values(): for part in parts.values(): if package.id & part.bit_mask: #part.packages.append(package.id) part.packages.append(package) #package.parts.append(part.name) package.parts.append(part) package.part_count = len(package.parts) # Sorting packages of parts for part in parts.values(): #part.packageIdsSorted = self._sortPackages([x.id for x in part.packages], packages) ## re-map sorting to part.packages #packObjs = [] #for pkgId in part.packageIdsSorted: # packObjs.append(packages[pkgId]) #part.packages = packObjs self._sortPartPackages(part) # Register dependencies between Packages for package in packages.values(): # get all direct deps of this package allDeps = set(()) for classId in package.classes: classDeps = self._depLoader.getCombinedDeps(classId, script.variants) loadDeps = set(x.name for x in classDeps['load']) allDeps.update(loadDeps) # record the other packages in which these dependencies are located for classId in allDeps: for otherpackage in packages.values(): if otherpackage != package and classId in otherpackage.classes: #print "-- package %s adding dependent package %s" % (package.id, otherpackage.id) package.packageDeps.add(otherpackage) return packages