diff options
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/command.py | 2 | ||||
-rw-r--r-- | bitbake/lib/bb/cooker.py | 80 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/cooker.py | 2 |
3 files changed, 52 insertions, 32 deletions
diff --git a/bitbake/lib/bb/command.py b/bitbake/lib/bb/command.py index 3902ccca71..805ed9216c 100644 --- a/bitbake/lib/bb/command.py +++ b/bitbake/lib/bb/command.py | |||
@@ -396,7 +396,7 @@ class CommandsSync: | |||
396 | def sortkey(x): | 396 | def sortkey(x): |
397 | vfn, _ = x | 397 | vfn, _ = x |
398 | realfn, _, mc = bb.cache.virtualfn2realfn(vfn) | 398 | realfn, _, mc = bb.cache.virtualfn2realfn(vfn) |
399 | return (-command.cooker.collections[mc].calc_bbfile_priority(realfn), vfn) | 399 | return (-command.cooker.collections[mc].calc_bbfile_priority(realfn)[0], vfn) |
400 | 400 | ||
401 | skipdict = OrderedDict(sorted(command.cooker.skiplist.items(), key=sortkey)) | 401 | skipdict = OrderedDict(sorted(command.cooker.skiplist.items(), key=sortkey)) |
402 | return list(skipdict.items()) | 402 | return list(skipdict.items()) |
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index effd02442c..3a58a3a332 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
@@ -1588,7 +1588,7 @@ class BBCooker: | |||
1588 | self.show_appends_with_no_recipes() | 1588 | self.show_appends_with_no_recipes() |
1589 | self.handlePrefProviders() | 1589 | self.handlePrefProviders() |
1590 | for mc in self.multiconfigs: | 1590 | for mc in self.multiconfigs: |
1591 | self.recipecaches[mc].bbfile_priority = self.collections[mc].collection_priorities(self.recipecaches[mc].pkg_fn, self.data) | 1591 | self.recipecaches[mc].bbfile_priority = self.collections[mc].collection_priorities(self.recipecaches[mc].pkg_fn, self.parser.mcfilelist[mc], self.data) |
1592 | self.state = state.running | 1592 | self.state = state.running |
1593 | 1593 | ||
1594 | # Send an event listing all stamps reachable after parsing | 1594 | # Send an event listing all stamps reachable after parsing |
@@ -1704,14 +1704,11 @@ class CookerCollectFiles(object): | |||
1704 | # the shortest. This allows nested layers to be properly evaluated. | 1704 | # the shortest. This allows nested layers to be properly evaluated. |
1705 | self.bbfile_config_priorities = sorted(priorities, key=lambda tup: tup[1], reverse=True) | 1705 | self.bbfile_config_priorities = sorted(priorities, key=lambda tup: tup[1], reverse=True) |
1706 | 1706 | ||
1707 | def calc_bbfile_priority( self, filename, matched = None ): | 1707 | def calc_bbfile_priority(self, filename): |
1708 | for _, _, regex, pri in self.bbfile_config_priorities: | 1708 | for _, _, regex, pri in self.bbfile_config_priorities: |
1709 | if regex.match(filename): | 1709 | if regex.match(filename): |
1710 | if matched is not None: | 1710 | return pri, regex |
1711 | if not regex in matched: | 1711 | return 0, None |
1712 | matched.add(regex) | ||
1713 | return pri | ||
1714 | return 0 | ||
1715 | 1712 | ||
1716 | def get_bbfiles(self): | 1713 | def get_bbfiles(self): |
1717 | """Get list of default .bb files by reading out the current directory""" | 1714 | """Get list of default .bb files by reading out the current directory""" |
@@ -1744,7 +1741,7 @@ class CookerCollectFiles(object): | |||
1744 | config.setVar("BBFILES", " ".join(files)) | 1741 | config.setVar("BBFILES", " ".join(files)) |
1745 | 1742 | ||
1746 | # Sort files by priority | 1743 | # Sort files by priority |
1747 | files.sort( key=lambda fileitem: self.calc_bbfile_priority(fileitem) ) | 1744 | files.sort( key=lambda fileitem: self.calc_bbfile_priority(fileitem)[0] ) |
1748 | 1745 | ||
1749 | if not len(files): | 1746 | if not len(files): |
1750 | files = self.get_bbfiles() | 1747 | files = self.get_bbfiles() |
@@ -1866,39 +1863,62 @@ class CookerCollectFiles(object): | |||
1866 | filelist.append(filename) | 1863 | filelist.append(filename) |
1867 | return tuple(filelist) | 1864 | return tuple(filelist) |
1868 | 1865 | ||
1869 | def collection_priorities(self, pkgfns, d): | 1866 | def collection_priorities(self, pkgfns, fns, d): |
1867 | # Return the priorities of the entries in pkgfns | ||
1868 | # Also check that all the regexes in self.bbfile_config_priorities are used | ||
1869 | # (but to do that we need to ensure skipped recipes aren't counted, nor | ||
1870 | # collections in BBFILE_PATTERN_IGNORE_EMPTY) | ||
1870 | 1871 | ||
1871 | priorities = {} | 1872 | priorities = {} |
1873 | seen = set() | ||
1874 | matched = set() | ||
1875 | |||
1876 | matched_regex = set() | ||
1877 | unmatched_regex = set() | ||
1878 | for _, _, regex, _ in self.bbfile_config_priorities: | ||
1879 | unmatched_regex.add(regex) | ||
1872 | 1880 | ||
1873 | # Calculate priorities for each file | 1881 | # Calculate priorities for each file |
1874 | matched = set() | ||
1875 | for p in pkgfns: | 1882 | for p in pkgfns: |
1876 | realfn, cls, mc = bb.cache.virtualfn2realfn(p) | 1883 | realfn, cls, mc = bb.cache.virtualfn2realfn(p) |
1877 | priorities[p] = self.calc_bbfile_priority(realfn, matched) | 1884 | priorities[p], regex = self.calc_bbfile_priority(realfn) |
1878 | 1885 | if regex in unmatched_regex: | |
1879 | unmatched = set() | 1886 | matched_regex.add(regex) |
1880 | for _, _, regex, pri in self.bbfile_config_priorities: | 1887 | unmatched_regex.remove(regex) |
1881 | if not regex in matched: | 1888 | seen.add(realfn) |
1882 | unmatched.add(regex) | 1889 | if regex: |
1883 | 1890 | matched.add(realfn) | |
1884 | # Don't show the warning if the BBFILE_PATTERN did match .bbappend files | 1891 | |
1885 | def find_bbappend_match(regex): | 1892 | if unmatched_regex: |
1893 | # Account for bbappend files | ||
1886 | for b in self.bbappends: | 1894 | for b in self.bbappends: |
1887 | (bbfile, append) = b | 1895 | (bbfile, append) = b |
1888 | if regex.match(append): | 1896 | seen.add(append) |
1889 | # If the bbappend is matched by already "matched set", return False | 1897 | |
1890 | for matched_regex in matched: | 1898 | # Account for skipped recipes |
1891 | if matched_regex.match(append): | 1899 | seen.update(fns) |
1892 | return False | 1900 | |
1893 | return True | 1901 | seen.difference_update(matched) |
1894 | return False | ||
1895 | 1902 | ||
1896 | for unmatch in unmatched.copy(): | 1903 | def already_matched(fn): |
1897 | if find_bbappend_match(unmatch): | 1904 | for regex in matched_regex: |
1898 | unmatched.remove(unmatch) | 1905 | if regex.match(fn): |
1906 | return True | ||
1907 | return False | ||
1908 | |||
1909 | for unmatch in unmatched_regex.copy(): | ||
1910 | for fn in seen: | ||
1911 | if unmatch.match(fn): | ||
1912 | # If the bbappend or file was already matched by another regex, skip it | ||
1913 | # e.g. for a layer within a layer, the outer regex could match, the inner | ||
1914 | # regex may match nothing and we should warn about that | ||
1915 | if already_matched(fn): | ||
1916 | continue | ||
1917 | unmatched_regex.remove(unmatch) | ||
1918 | break | ||
1899 | 1919 | ||
1900 | for collection, pattern, regex, _ in self.bbfile_config_priorities: | 1920 | for collection, pattern, regex, _ in self.bbfile_config_priorities: |
1901 | if regex in unmatched: | 1921 | if regex in unmatched_regex: |
1902 | if d.getVar('BBFILE_PATTERN_IGNORE_EMPTY_%s' % collection) != '1': | 1922 | if d.getVar('BBFILE_PATTERN_IGNORE_EMPTY_%s' % collection) != '1': |
1903 | collectlog.warning("No bb files in %s matched BBFILE_PATTERN_%s '%s'" % (self.mc if self.mc else 'default', | 1923 | collectlog.warning("No bb files in %s matched BBFILE_PATTERN_%s '%s'" % (self.mc if self.mc else 'default', |
1904 | collection, pattern)) | 1924 | collection, pattern)) |
diff --git a/bitbake/lib/bb/tests/cooker.py b/bitbake/lib/bb/tests/cooker.py index 74c903f010..c82d4b7b81 100644 --- a/bitbake/lib/bb/tests/cooker.py +++ b/bitbake/lib/bb/tests/cooker.py | |||
@@ -60,7 +60,7 @@ class CookerTest(unittest.TestCase): | |||
60 | log_handler = LogHandler() | 60 | log_handler = LogHandler() |
61 | logger.addHandler(log_handler) | 61 | logger.addHandler(log_handler) |
62 | collection = bb.cooker.CookerCollectFiles(bbfile_config_priorities) | 62 | collection = bb.cooker.CookerCollectFiles(bbfile_config_priorities) |
63 | collection.collection_priorities(pkgfns, self.d) | 63 | collection.collection_priorities(pkgfns, pkgfns, self.d) |
64 | logger.removeHandler(log_handler) | 64 | logger.removeHandler(log_handler) |
65 | 65 | ||
66 | # Should be empty (no generated messages) | 66 | # Should be empty (no generated messages) |