* [PATCH 0/3] Bitbake fix, kernel-specific package naming @ 2018-11-22 12:58 Jan Kiszka 2018-11-22 12:58 ` [PATCH 1/3] bitbake: Update to fixed master revision Jan Kiszka ` (2 more replies) 0 siblings, 3 replies; 20+ messages in thread From: Jan Kiszka @ 2018-11-22 12:58 UTC (permalink / raw) To: isar-users See patches for details. Jan Kiszka (3): bitbake: Update to fixed master revision RECIPE-API-CHANGELOG: Reorder and capitalize sentences Append KERNEL_NAME to dependent custom modules and u-boot-script RECIPE-API-CHANGELOG.md | 73 +++++++++++---------- bitbake/bin/toaster | 4 +- .../bitbake-user-manual-intro.xml | 13 +++- .../bitbake-user-manual-metadata.xml | 31 ++++++++- .../bitbake-user-manual-ref-variables.xml | 59 ++++++++++++++--- .../figures/bb_multiconfig_files.png | Bin 0 -> 19991 bytes bitbake/lib/bb/cooker.py | 9 +-- bitbake/lib/bb/data_smart.py | 9 ++- bitbake/lib/bb/fetch2/__init__.py | 1 + bitbake/lib/bb/fetch2/git.py | 13 ++-- bitbake/lib/bb/fetch2/gitsm.py | 71 ++++++++++---------- bitbake/lib/bb/fetch2/npm.py | 2 +- bitbake/lib/bb/parse/ast.py | 2 +- bitbake/lib/bb/parse/parse_py/BBHandler.py | 2 +- bitbake/lib/bb/server/process.py | 15 +++-- bitbake/lib/bb/siggen.py | 10 +-- bitbake/lib/bb/tests/fetch.py | 5 +- bitbake/lib/bb/utils.py | 31 ++++----- meta-isar/conf/local.conf.sample | 2 +- meta-isar/conf/machine/de0-nano-soc.conf | 2 +- meta-isar/conf/multiconfig/bananapi-stretch.conf | 2 +- .../recipes-bsp/u-boot-script/u-boot-script_1.0.bb | 2 + meta/recipes-kernel/linux-module/module.inc | 2 + 23 files changed, 227 insertions(+), 133 deletions(-) -- 2.16.4 ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 1/3] bitbake: Update to fixed master revision 2018-11-22 12:58 [PATCH 0/3] Bitbake fix, kernel-specific package naming Jan Kiszka @ 2018-11-22 12:58 ` Jan Kiszka 2018-11-22 13:12 ` Henning Schild 2018-11-23 11:27 ` Maxim Yu. Osipov 2018-11-22 12:58 ` [PATCH 2/3] RECIPE-API-CHANGELOG: Reorder and capitalize sentences Jan Kiszka 2018-11-22 12:58 ` [PATCH 3/3] Append KERNEL_NAME to dependent custom modules and u-boot-script Jan Kiszka 2 siblings, 2 replies; 20+ messages in thread From: Jan Kiszka @ 2018-11-22 12:58 UTC (permalink / raw) To: isar-users From: Jan Kiszka <jan.kiszka@siemens.com> This primarily pulls in the essential fix f2106a3a7675 for multiconfig setups. Origin: https://github.com/openembedded/bitbake.git Commit: 19dee675bb9ad012d28e1e57a888931355a831cb Author: Richard Purdie <richard.purdie@linuxfoundation.org> Date: Thu Nov 22 11:59:58 2018 +0000 tests/fetch: Update after recent gitsm message changes Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> --- bitbake/bin/toaster | 4 +- .../bitbake-user-manual-intro.xml | 13 +++- .../bitbake-user-manual-metadata.xml | 31 ++++++++- .../bitbake-user-manual-ref-variables.xml | 59 ++++++++++++++--- .../figures/bb_multiconfig_files.png | Bin 0 -> 19991 bytes bitbake/lib/bb/cooker.py | 9 +-- bitbake/lib/bb/data_smart.py | 9 ++- bitbake/lib/bb/fetch2/__init__.py | 1 + bitbake/lib/bb/fetch2/git.py | 13 ++-- bitbake/lib/bb/fetch2/gitsm.py | 71 ++++++++++----------- bitbake/lib/bb/fetch2/npm.py | 2 +- bitbake/lib/bb/parse/ast.py | 2 +- bitbake/lib/bb/parse/parse_py/BBHandler.py | 2 +- bitbake/lib/bb/server/process.py | 15 +++-- bitbake/lib/bb/siggen.py | 10 +-- bitbake/lib/bb/tests/fetch.py | 5 +- bitbake/lib/bb/utils.py | 31 ++++----- 17 files changed, 181 insertions(+), 96 deletions(-) diff --git a/bitbake/bin/toaster b/bitbake/bin/toaster index 9fffbc6..ecf66fa 100755 --- a/bitbake/bin/toaster +++ b/bitbake/bin/toaster @@ -161,7 +161,9 @@ fi export BBBASEDIR=`dirname $TOASTER`/.. MANAGE="python3 $BBBASEDIR/lib/toaster/manage.py" -OE_ROOT=`dirname $TOASTER`/../.. +if [ -z "$OE_ROOT" ]; then + OE_ROOT=`dirname $TOASTER`/../.. +fi # this is the configuraton file we are using for toaster # we are using the same logic that oe-setup-builddir uses diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml index 9e2e6b2..f7d312a 100644 --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml @@ -342,13 +342,14 @@ <para> When you name an append file, you can use the - wildcard character (%) to allow for matching recipe names. + "<filename>%</filename>" wildcard character to allow for matching + recipe names. For example, suppose you have an append file named as follows: <literallayout class='monospaced'> busybox_1.21.%.bbappend </literallayout> - That append file would match any <filename>busybox_1.21.x.bb</filename> + That append file would match any <filename>busybox_1.21.</filename><replaceable>x</replaceable><filename>.bb</filename> version of the recipe. So, the append file would match the following recipe names: <literallayout class='monospaced'> @@ -356,6 +357,14 @@ busybox_1.21.2.bb busybox_1.21.3.bb </literallayout> + <note><title>Important</title> + The use of the "<filename>%</filename>" character + is limited in that it only works directly in front of the + <filename>.bbappend</filename> portion of the append file's + name. + You cannot use the wildcard character in any other + location of the name. + </note> If the <filename>busybox</filename> recipe was updated to <filename>busybox_1.3.0.bb</filename>, the append name would not match. diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml index fc55ef6..2490f6e 100644 --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml @@ -352,8 +352,9 @@ FOO2_remove = "abc def" </literallayout> The variable <filename>FOO</filename> becomes - " 789 123456 " and <filename>FOO2</filename> becomes - " ghi abcdef ". + " 789 123456 " + and <filename>FOO2</filename> becomes + " ghi abcdef ". </para> <para> @@ -2751,4 +2752,30 @@ </itemizedlist> </para> </section> + + <section id='wildcard-support-in-variables'> + <title>Wildcard Support in Variables</title> + + <para> + Support for wildcard use in variables varies depending on the + context in which it is used. + For example, some variables and file names allow limited use of + wildcards through the "<filename>%</filename>" and + "<filename>*</filename>" characters. + Other variables or names support Python's + <ulink url='https://docs.python.org/3/library/glob.html'><filename>glob</filename></ulink> + syntax, + <ulink url='https://docs.python.org/3/library/fnmatch.html#module-fnmatch'><filename>fnmatch</filename></ulink> + syntax, or + <ulink url='https://docs.python.org/3/library/re.html#re'><filename>Regular Expression (re)</filename></ulink> + syntax. + </para> + + <para> + For variables that have wildcard suport, the + documentation describes which form of wildcard, its + use, and its limitations. + </para> + </section> + </chapter> diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml index c327af5..a84b2bc 100644 --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml @@ -115,7 +115,8 @@ is either not set or set to "0". </para></listitem> <listitem><para> - Limited support for wildcard matching against the + Limited support for the "<filename>*</filename>" + wildcard character for matching against the beginning of host names exists. For example, the following setting matches <filename>git.gnu.org</filename>, @@ -124,6 +125,20 @@ <literallayout class='monospaced'> BB_ALLOWED_NETWORKS = "*.gnu.org" </literallayout> + <note><title>Important</title> + <para>The use of the "<filename>*</filename>" + character only works at the beginning of + a host name and it must be isolated from + the remainder of the host name. + You cannot use the wildcard character in any + other location of the name or combined with + the front part of the name.</para> + + <para>For example, + <filename>*.foo.bar</filename> is supported, + while <filename>*aa.foo.bar</filename> is not. + </para> + </note> </para></listitem> <listitem><para> Mirrors not in the host list are skipped and @@ -1082,7 +1097,19 @@ <glossentry id='var-BBFILES'><glossterm>BBFILES</glossterm> <glossdef> - <para>List of recipe files BitBake uses to build software.</para> + <para> + A space-separated list of recipe files BitBake uses to + build software. + </para> + + <para> + When specifying recipe files, you can pattern match using + Python's + <ulink url='https://docs.python.org/3/library/glob.html'><filename>glob</filename></ulink> + syntax. + For details on the syntax, see the documentation by + following the previous link. + </para> </glossdef> </glossentry> @@ -1166,15 +1193,19 @@ match any of the expressions. It is as if BitBake does not see them at all. Consequently, matching files are not parsed or otherwise - used by BitBake.</para> + used by BitBake. + </para> + <para> The values you provide are passed to Python's regular expression compiler. + Consequently, the syntax follows Python's Regular + Expression (re) syntax. The expressions are compared against the full paths to the files. For complete syntax information, see Python's documentation at - <ulink url='http://docs.python.org/release/2.3/lib/re-syntax.html'></ulink>. + <ulink url='http://docs.python.org/3/library/re.html#re'></ulink>. </para> <para> @@ -1933,15 +1964,27 @@ you want to select, and you should set <link linkend='var-PV'><filename>PV</filename></link> accordingly for precedence. - You can use the "<filename>%</filename>" character as a - wildcard to match any number of characters, which can be - useful when specifying versions that contain long revision - numbers that could potentially change. + </para> + + <para> + The <filename>PREFERRED_VERSION</filename> variable + supports limited wildcard use through the + "<filename>%</filename>" character. + You can use the character to match any number of + characters, which can be useful when specifying versions + that contain long revision numbers that potentially change. Here are two examples: <literallayout class='monospaced'> PREFERRED_VERSION_python = "2.7.3" PREFERRED_VERSION_linux-yocto = "4.12%" </literallayout> + <note><title>Important</title> + The use of the "<filename>%</filename>" character + is limited in that it only works at the end of the + string. + You cannot use the wildcard character in any other + location of the string. + </note> </para> </glossdef> </glossentry> diff --git a/bitbake/doc/bitbake-user-manual/figures/bb_multiconfig_files.png b/bitbake/doc/bitbake-user-manual/figures/bb_multiconfig_files.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..041f06403b4cfc7cf7939ce44849d022d7b1337e 100644 GIT binary patch literal 19991 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 H{!jh|Ff{m- literal 0 HcmV?d00001 diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 71a0eba..16681ba 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py @@ -609,14 +609,7 @@ class BBCooker: k2 = k.split(":do_") k = k2[0] ktask = k2[1] - if mc: - # Provider might be from another mc - for mcavailable in self.multiconfigs: - # The first element is empty - if mcavailable: - taskdata[mcavailable].add_provider(localdata[mcavailable], self.recipecaches[mcavailable], k) - else: - taskdata[mc].add_provider(localdata[mc], self.recipecaches[mc], k) + taskdata[mc].add_provider(localdata[mc], self.recipecaches[mc], k) current += 1 if not ktask.startswith("do_"): ktask = "do_%s" % ktask diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index 6b94fc4..67af380 100644 --- a/bitbake/lib/bb/data_smart.py +++ b/bitbake/lib/bb/data_smart.py @@ -122,7 +122,11 @@ class VariableParse: connector = self.d["_remote_data"] return connector.expandPythonRef(self.varname, code, self.d) - codeobj = compile(code.strip(), self.varname or "<expansion>", "eval") + if self.varname: + varname = 'Var <%s>' % self.varname + else: + varname = '<expansion>' + codeobj = compile(code.strip(), varname, "eval") parser = bb.codeparser.PythonParser(self.varname, logger) parser.parse_python(code) @@ -427,7 +431,8 @@ class DataSmart(MutableMapping): except bb.parse.SkipRecipe: raise except Exception as exc: - raise ExpansionError(varname, s, exc) from exc + tb = sys.exc_info()[2] + raise ExpansionError(varname, s, exc).with_traceback(tb) from exc varparse.value = s diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py index 2b62b41..572b71a 100644 --- a/bitbake/lib/bb/fetch2/__init__.py +++ b/bitbake/lib/bb/fetch2/__init__.py @@ -827,6 +827,7 @@ def runfetchcmd(cmd, d, quiet=False, cleanup=None, log=None, workdir=None): 'NO_PROXY', 'no_proxy', 'ALL_PROXY', 'all_proxy', 'GIT_PROXY_COMMAND', + 'GIT_SSH', 'GIT_SSL_CAINFO', 'GIT_SMART_HTTP', 'SSH_AUTH_SOCK', 'SSH_AGENT_PID', diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py index 15858a6..59a2ee8 100644 --- a/bitbake/lib/bb/fetch2/git.py +++ b/bitbake/lib/bb/fetch2/git.py @@ -488,12 +488,15 @@ class Git(FetchMethod): source_error.append("clone directory not available or not up to date: " + ud.clonedir) if not source_found: - if ud.shallow and os.path.exists(ud.fullshallow): - bb.utils.mkdirhier(destdir) - runfetchcmd("tar -xzf %s" % ud.fullshallow, d, workdir=destdir) - source_found = True + if ud.shallow: + if os.path.exists(ud.fullshallow): + bb.utils.mkdirhier(destdir) + runfetchcmd("tar -xzf %s" % ud.fullshallow, d, workdir=destdir) + source_found = True + else: + source_error.append("shallow clone not available: " + ud.fullshallow) else: - source_error.append("shallow clone not enabled or not available: " + ud.fullshallow) + source_error.append("shallow clone not enabled") if not source_found: raise bb.fetch2.UnpackError("No up to date source found: " + "; ".join(source_error), ud.url) diff --git a/bitbake/lib/bb/fetch2/gitsm.py b/bitbake/lib/bb/fetch2/gitsm.py index 0a982da..35729db 100644 --- a/bitbake/lib/bb/fetch2/gitsm.py +++ b/bitbake/lib/bb/fetch2/gitsm.py @@ -92,7 +92,7 @@ class GitSM(Git): url = uris[module].replace('%s:' % proto, 'gitsm:', 1) url += ';protocol=%s' % proto url += ";name=%s" % module - url += ";bareclone=1;nocheckout=1" + url += ";bareclone=1;nocheckout=1;nobranch=1" ld = d.createCopy() # Not necessary to set SRC_URI, since we're passing the URI to @@ -152,9 +152,9 @@ class GitSM(Git): if submodules and not os.path.exists(os.path.join(repo_conf, 'modules')): os.mkdir(os.path.join(repo_conf, 'modules')) - for module in submodules: - srcpath = os.path.join(ud.clonedir, 'modules', module) - modpath = os.path.join(repo_conf, 'modules', module) + for module, md in submodules.items(): + srcpath = os.path.join(ud.clonedir, 'modules', md['path']) + modpath = os.path.join(repo_conf, 'modules', md['path']) if os.path.exists(srcpath): if os.path.exists(os.path.join(srcpath, '.git')): @@ -187,9 +187,8 @@ class GitSM(Git): # No submodules to update continue - submodules = list(self.parse_gitmodules(gitmodules).keys()) - - self.copy_submodules(submodules, ud, dest, d) + submodules = self.parse_gitmodules(gitmodules) + self.copy_submodules(submodules, ud, dest, d) def unpack(self, ud, destdir, d): Git.unpack(self, ud, destdir, d) @@ -200,7 +199,7 @@ class GitSM(Git): else: repo_conf = os.path.join(ud.destdir, '.git') - submodules = [] + update_submodules = False paths = {} uris = {} local_paths = {} @@ -211,41 +210,41 @@ class GitSM(Git): # No submodules to update continue - for m, md in self.parse_gitmodules(gitmodules).items(): - submodules.append(m) - paths[m] = md['path'] - uris[m] = md['url'] + submodules = self.parse_gitmodules(gitmodules) + self.copy_submodules(submodules, ud, ud.destdir, d) + + submodules_queue = [(module, os.path.join(repo_conf, 'modules', md['path'])) for module, md in submodules.items()] + while len(submodules_queue) != 0: + module, modpath = submodules_queue.pop() - self.copy_submodules(submodules, ud, ud.destdir, d) + # add submodule children recursively + try: + gitmodules = runfetchcmd("%s show HEAD:.gitmodules" % (ud.basecmd), d, quiet=True, workdir=modpath) + for m, md in self.parse_gitmodules(gitmodules).items(): + submodules_queue.append([m, os.path.join(modpath, 'modules', md['path'])]) + except: + # no children + pass - submodules_queue = [(module, os.path.join(repo_conf, 'modules', module)) for module in submodules] - while len(submodules_queue) != 0: - module, modpath = submodules_queue.pop() - # add submodule children recursively - try: - gitmodules = runfetchcmd("%s show HEAD:.gitmodules" % (ud.basecmd), d, quiet=True, workdir=modpath) - for m, md in self.parse_gitmodules(gitmodules).items(): - submodules_queue.append([m, os.path.join(modpath, 'modules', m)]) - except: - # no children - pass + # There are submodules to update + update_submodules = True - # Determine (from the submodule) the correct url to reference - try: - output = runfetchcmd("%(basecmd)s config remote.origin.url" % {'basecmd': ud.basecmd}, d, workdir=modpath) - except bb.fetch2.FetchError as e: - # No remote url defined in this submodule - continue + # Determine (from the submodule) the correct url to reference + try: + output = runfetchcmd("%(basecmd)s config remote.origin.url" % {'basecmd': ud.basecmd}, d, workdir=modpath) + except bb.fetch2.FetchError as e: + # No remote url defined in this submodule + continue - local_paths[module] = output + local_paths[module] = output - # Setup the local URL properly (like git submodule init or sync would do...) - runfetchcmd("%(basecmd)s config submodule.%(module)s.url %(url)s" % {'basecmd': ud.basecmd, 'module': module, 'url' : local_paths[module]}, d, workdir=ud.destdir) + # Setup the local URL properly (like git submodule init or sync would do...) + runfetchcmd("%(basecmd)s config submodule.%(module)s.url %(url)s" % {'basecmd': ud.basecmd, 'module': module, 'url' : local_paths[module]}, d, workdir=ud.destdir) - # Ensure the submodule repository is NOT set to bare, since we're checking it out... - runfetchcmd("%s config core.bare false" % (ud.basecmd), d, quiet=True, workdir=modpath) + # Ensure the submodule repository is NOT set to bare, since we're checking it out... + runfetchcmd("%s config core.bare false" % (ud.basecmd), d, quiet=True, workdir=modpath) - if submodules: + if update_submodules: # Run submodule update, this sets up the directories -- without touching the config runfetchcmd("%s submodule update --recursive --no-fetch" % (ud.basecmd), d, quiet=True, workdir=ud.destdir) diff --git a/bitbake/lib/bb/fetch2/npm.py b/bitbake/lib/bb/fetch2/npm.py index 408dfc3..65bf5a3 100644 --- a/bitbake/lib/bb/fetch2/npm.py +++ b/bitbake/lib/bb/fetch2/npm.py @@ -226,7 +226,7 @@ class Npm(FetchMethod): self._getshrinkeddependencies(obj, data['dependencies'][obj], data['dependencies'][obj]['version'], d, ud, lockdown, manifest, False) return outputurl = "invalid" - if ('resolved' not in data) or (not data['resolved'].startswith('http')): + if ('resolved' not in data) or (not data['resolved'].startswith('http://') and not data['resolved'].startswith('https://')): # will be the case for ${PN} fetchcmd = "npm view %s@%s dist.tarball --registry %s" % (pkg, version, ud.registry) logger.debug(2, "Found this matching URL: %s" % str(fetchcmd)) diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index 9d20c32..6d7c80b 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py @@ -178,7 +178,7 @@ class MethodNode(AstNode): funcname = ("__anon_%s_%s" % (self.lineno, self.filename.translate(MethodNode.tr_tbl))) self.python = True text = "def %s(d):\n" % (funcname) + text - bb.methodpool.insert_method(funcname, text, self.filename, self.lineno - len(self.body)) + bb.methodpool.insert_method(funcname, text, self.filename, self.lineno - len(self.body) - 1) anonfuncs = data.getVar('__BBANONFUNCS', False) or [] anonfuncs.append(funcname) data.setVar('__BBANONFUNCS', anonfuncs) diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/parse_py/BBHandler.py index e5039e3..01fc47e 100644 --- a/bitbake/lib/bb/parse/parse_py/BBHandler.py +++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py @@ -45,7 +45,7 @@ __addtask_regexp__ = re.compile("addtask\s+(?P<func>\w+)\s*((before\s*(?P< __deltask_regexp__ = re.compile("deltask\s+(?P<func>\w+)") __addhandler_regexp__ = re.compile( r"addhandler\s+(.+)" ) __def_regexp__ = re.compile( r"def\s+(\w+).*:" ) -__python_func_regexp__ = re.compile( r"(\s+.*)|(^$)" ) +__python_func_regexp__ = re.compile( r"(\s+.*)|(^$)|(^#)" ) __infunc__ = [] __inpython__ = False diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index 38b923f..4e0d9c2 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py @@ -428,7 +428,11 @@ class BitBakeServer(object): bb.error("Last 10 lines of server log for this session (%s):\n%s" % (logfile, "".join(lines[-10:]))) else: bb.error("Server log for this session (%s):\n%s" % (logfile, "".join(lines))) + else: + bb.error("%s doesn't exist" % logfile) + raise SystemExit(1) + ready.close() def _startServer(self): @@ -452,16 +456,15 @@ def connectProcessServer(sockname, featureset): # AF_UNIX has path length issues so chdir here to workaround cwd = os.getcwd() - try: - os.chdir(os.path.dirname(sockname)) - sock.connect(os.path.basename(sockname)) - finally: - os.chdir(cwd) - readfd = writefd = readfd1 = writefd1 = readfd2 = writefd2 = None eq = command_chan_recv = command_chan = None try: + try: + os.chdir(os.path.dirname(sockname)) + sock.connect(os.path.basename(sockname)) + finally: + os.chdir(cwd) # Send an fd for the remote to write events to readfd, writefd = os.pipe() diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py index 03c824e..fdbb2a3 100644 --- a/bitbake/lib/bb/siggen.py +++ b/bitbake/lib/bb/siggen.py @@ -185,7 +185,7 @@ class SignatureGeneratorBasic(SignatureGenerator): if not self.rundep_check(fn, recipename, task, dep, depname, dataCache): continue if dep not in self.taskhash: - bb.fatal("%s is not in taskhash, caller isn't calling in dependency order?", dep) + bb.fatal("%s is not in taskhash, caller isn't calling in dependency order?" % dep) data = data + self.taskhash[dep] self.runtaskdeps[k].append(dep) @@ -342,10 +342,10 @@ def dump_this_task(outfile, d): def init_colors(enable_color): """Initialise colour dict for passing to compare_sigfiles()""" # First set up the colours - colors = {'color_title': '\033[1;37;40m', - 'color_default': '\033[0;37;40m', - 'color_add': '\033[1;32;40m', - 'color_remove': '\033[1;31;40m', + colors = {'color_title': '\033[1m', + 'color_default': '\033[0m', + 'color_add': '\033[0;32m', + 'color_remove': '\033[0;31m', } # Leave all keys present but clear the values if not enable_color: diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py index 17909ec..6848095 100644 --- a/bitbake/lib/bb/tests/fetch.py +++ b/bitbake/lib/bb/tests/fetch.py @@ -1708,9 +1708,8 @@ class GitShallowTest(FetcherTest): with self.assertRaises(bb.fetch2.UnpackError) as context: fetcher.unpack(self.d.getVar('WORKDIR')) - self.assertTrue("No up to date source found" in context.exception.msg) - self.assertTrue("clone directory not available or not up to date" in context.exception.msg) - self.assertTrue("shallow clone not enabled or not available" in context.exception.msg) + self.assertIn("No up to date source found", context.exception.msg) + self.assertIn("clone directory not available or not up to date", context.exception.msg) @skipIfNoNetwork() def test_that_unpack_does_work_when_using_git_shallow_tarball_but_tarball_is_not_available(self): diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index 73b6cb4..13bb5f2 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py @@ -27,7 +27,8 @@ import bb import bb.msg import multiprocessing import fcntl -import imp +import importlib +from importlib import machinery import itertools import subprocess import glob @@ -43,7 +44,7 @@ from contextlib import contextmanager from ctypes import cdll logger = logging.getLogger("BitBake.Util") -python_extensions = [e for e, _, _ in imp.get_suffixes()] +python_extensions = importlib.machinery.all_suffixes() def clean_context(): @@ -68,8 +69,8 @@ class VersionStringException(Exception): def explode_version(s): r = [] - alpha_regexp = re.compile('^([a-zA-Z]+)(.*)$') - numeric_regexp = re.compile('^(\d+)(.*)$') + alpha_regexp = re.compile(r'^([a-zA-Z]+)(.*)$') + numeric_regexp = re.compile(r'^(\d+)(.*)$') while (s != ''): if s[0] in string.digits: m = numeric_regexp.match(s) @@ -317,10 +318,13 @@ def better_compile(text, file, realfile, mode = "exec", lineno = 0): error = [] # split the text into lines again body = text.split('\n') - error.append("Error in compiling python function in %s, line %s:\n" % (realfile, lineno)) + error.append("Error in compiling python function in %s, line %s:\n" % (realfile, e.lineno)) if hasattr(e, "lineno"): error.append("The code lines resulting in this error were:") - error.extend(_print_trace(body, e.lineno)) + # e.lineno: line's position in reaflile + # lineno: function name's "position -1" in realfile + # e.lineno - lineno: line's relative position in function + error.extend(_print_trace(body, e.lineno - lineno)) else: error.append("The function causing this error was:") for line in body: @@ -1157,14 +1161,14 @@ def edit_metadata(meta_lines, variables, varfunc, match_overrides=False): var_res = {} if match_overrides: - override_re = '(_[a-zA-Z0-9-_$(){}]+)?' + override_re = r'(_[a-zA-Z0-9-_$(){}]+)?' else: override_re = '' for var in variables: if var.endswith('()'): - var_res[var] = re.compile('^(%s%s)[ \\t]*\([ \\t]*\)[ \\t]*{' % (var[:-2].rstrip(), override_re)) + var_res[var] = re.compile(r'^(%s%s)[ \\t]*\([ \\t]*\)[ \\t]*{' % (var[:-2].rstrip(), override_re)) else: - var_res[var] = re.compile('^(%s%s)[ \\t]*[?+:.]*=[+.]*[ \\t]*(["\'])' % (var, override_re)) + var_res[var] = re.compile(r'^(%s%s)[ \\t]*[?+:.]*=[+.]*[ \\t]*(["\'])' % (var, override_re)) updated = False varset_start = '' @@ -1544,12 +1548,9 @@ def export_proxies(d): def load_plugins(logger, plugins, pluginpath): def load_plugin(name): logger.debug(1, 'Loading plugin %s' % name) - fp, pathname, description = imp.find_module(name, [pluginpath]) - try: - return imp.load_module(name, fp, pathname, description) - finally: - if fp: - fp.close() + spec = importlib.machinery.PathFinder.find_spec(name, path=[pluginpath] ) + if spec: + return spec.loader.load_module() logger.debug(1, 'Loading plugins from %s...' % pluginpath) -- 2.16.4 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] bitbake: Update to fixed master revision 2018-11-22 12:58 ` [PATCH 1/3] bitbake: Update to fixed master revision Jan Kiszka @ 2018-11-22 13:12 ` Henning Schild 2018-11-22 13:14 ` Jan Kiszka 2018-11-23 11:27 ` Maxim Yu. Osipov 1 sibling, 1 reply; 20+ messages in thread From: Henning Schild @ 2018-11-22 13:12 UTC (permalink / raw) To: [ext] Jan Kiszka; +Cc: isar-users I got a report that bitbake 1.40 and this one are affected by a "gitsm://" bug. Still waiting for details but this will only fix one new bitbake bug. Was there a reason to bump, except wanting to stay up to date? Henning Am Thu, 22 Nov 2018 13:58:38 +0100 schrieb "[ext] Jan Kiszka" <jan.kiszka@siemens.com>: > From: Jan Kiszka <jan.kiszka@siemens.com> > > This primarily pulls in the essential fix f2106a3a7675 for multiconfig > setups. > > Origin: https://github.com/openembedded/bitbake.git > Commit: 19dee675bb9ad012d28e1e57a888931355a831cb > Author: Richard Purdie <richard.purdie@linuxfoundation.org> > Date: Thu Nov 22 11:59:58 2018 +0000 > > tests/fetch: Update after recent gitsm message changes > > Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> > --- > bitbake/bin/toaster | 4 +- > .../bitbake-user-manual-intro.xml | 13 +++- > .../bitbake-user-manual-metadata.xml | 31 ++++++++- > .../bitbake-user-manual-ref-variables.xml | 59 > ++++++++++++++--- .../figures/bb_multiconfig_files.png > | Bin 0 -> 19991 bytes > bitbake/lib/bb/cooker.py | 9 +-- > bitbake/lib/bb/data_smart.py | 9 ++- > bitbake/lib/bb/fetch2/__init__.py | 1 + > bitbake/lib/bb/fetch2/git.py | 13 ++-- > bitbake/lib/bb/fetch2/gitsm.py | 71 > ++++++++++----------- > bitbake/lib/bb/fetch2/npm.py | 2 +- > bitbake/lib/bb/parse/ast.py | 2 +- > bitbake/lib/bb/parse/parse_py/BBHandler.py | 2 +- > bitbake/lib/bb/server/process.py | 15 +++-- > bitbake/lib/bb/siggen.py | 10 +-- > bitbake/lib/bb/tests/fetch.py | 5 +- > bitbake/lib/bb/utils.py | 31 ++++----- 17 > files changed, 181 insertions(+), 96 deletions(-) > > diff --git a/bitbake/bin/toaster b/bitbake/bin/toaster > index 9fffbc6..ecf66fa 100755 > --- a/bitbake/bin/toaster > +++ b/bitbake/bin/toaster > @@ -161,7 +161,9 @@ fi > > export BBBASEDIR=`dirname $TOASTER`/.. > MANAGE="python3 $BBBASEDIR/lib/toaster/manage.py" > -OE_ROOT=`dirname $TOASTER`/../.. > +if [ -z "$OE_ROOT" ]; then > + OE_ROOT=`dirname $TOASTER`/../.. > +fi > > # this is the configuraton file we are using for toaster > # we are using the same logic that oe-setup-builddir uses > diff --git > a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml > b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml index > 9e2e6b2..f7d312a 100644 --- > a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml +++ > b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml @@ > -342,13 +342,14 @@ <para> > When you name an append file, you can use the > - wildcard character (%) to allow for matching recipe > names. > + "<filename>%</filename>" wildcard character to allow > for matching > + recipe names. > For example, suppose you have an append file named > as follows: > <literallayout class='monospaced'> > busybox_1.21.%.bbappend > </literallayout> > - That append file would match any > <filename>busybox_1.21.x.bb</filename> > + That append file would match any > <filename>busybox_1.21.</filename><replaceable>x</replaceable><filename>.bb</filename> > version of the recipe. So, the append file would match the following > recipe names: <literallayout class='monospaced'> > @@ -356,6 +357,14 @@ > busybox_1.21.2.bb > busybox_1.21.3.bb > </literallayout> > + <note><title>Important</title> > + The use of the "<filename>%</filename>" character > + is limited in that it only works directly in > front of the > + <filename>.bbappend</filename> portion of the > append file's > + name. > + You cannot use the wildcard character in any > other > + location of the name. > + </note> > If the <filename>busybox</filename> recipe was > updated to <filename>busybox_1.3.0.bb</filename>, the append name > would not match. > diff --git > a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml > b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml > index fc55ef6..2490f6e 100644 --- > a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml > +++ > b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml @@ > -352,8 +352,9 @@ FOO2_remove = "abc def" </literallayout> The > variable <filename>FOO</filename> becomes > - " 789 123456 " and <filename>FOO2</filename> > becomes > - " ghi abcdef ". > + " 789 123456 " > + and <filename>FOO2</filename> becomes > + " ghi abcdef ". > </para> > > <para> > @@ -2751,4 +2752,30 @@ > </itemizedlist> > </para> > </section> > + > + <section id='wildcard-support-in-variables'> > + <title>Wildcard Support in Variables</title> > + > + <para> > + Support for wildcard use in variables varies depending > on the > + context in which it is used. > + For example, some variables and file names allow limited > use of > + wildcards through the "<filename>%</filename>" and > + "<filename>*</filename>" characters. > + Other variables or names support Python's > + <ulink > url='https://docs.python.org/3/library/glob.html'><filename>glob</filename></ulink> > + syntax, > + <ulink > url='https://docs.python.org/3/library/fnmatch.html#module-fnmatch'><filename>fnmatch</filename></ulink> > + syntax, or > + <ulink > url='https://docs.python.org/3/library/re.html#re'><filename>Regular > Expression (re)</filename></ulink> > + syntax. > + </para> > + > + <para> > + For variables that have wildcard suport, the > + documentation describes which form of wildcard, its > + use, and its limitations. > + </para> > + </section> > + > </chapter> > diff --git > a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml > b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml > index c327af5..a84b2bc 100644 --- > a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml > +++ > b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml > @@ -115,7 +115,8 @@ is either not set or set to "0". > </para></listitem> <listitem><para> > - Limited support for wildcard matching > against the > + Limited support for the > "<filename>*</filename>" > + wildcard character for matching against > the beginning of host names exists. > For example, the following setting > matches <filename>git.gnu.org</filename>, > @@ -124,6 +125,20 @@ > <literallayout class='monospaced'> > BB_ALLOWED_NETWORKS = "*.gnu.org" > </literallayout> > + <note><title>Important</title> > + <para>The use of the > "<filename>*</filename>" > + character only works at the > beginning of > + a host name and it must be isolated > from > + the remainder of the host name. > + You cannot use the wildcard > character in any > + other location of the name or > combined with > + the front part of the name.</para> > + > + <para>For example, > + <filename>*.foo.bar</filename> is > supported, > + while > <filename>*aa.foo.bar</filename> is not. > + </para> > + </note> > </para></listitem> > <listitem><para> > Mirrors not in the host list are skipped > and @@ -1082,7 +1097,19 @@ > > <glossentry id='var-BBFILES'><glossterm>BBFILES</glossterm> > <glossdef> > - <para>List of recipe files BitBake uses to build > software.</para> > + <para> > + A space-separated list of recipe files BitBake > uses to > + build software. > + </para> > + > + <para> > + When specifying recipe files, you can pattern > match using > + Python's > + <ulink > url='https://docs.python.org/3/library/glob.html'><filename>glob</filename></ulink> > + syntax. > + For details on the syntax, see the documentation > by > + following the previous link. > + </para> > </glossdef> > </glossentry> > > @@ -1166,15 +1193,19 @@ > match any of the expressions. > It is as if BitBake does not see them at all. > Consequently, matching files are not parsed or > otherwise > - used by BitBake.</para> > + used by BitBake. > + </para> > + > <para> > The values you provide are passed to Python's > regular expression compiler. > + Consequently, the syntax follows Python's Regular > + Expression (re) syntax. > The expressions are compared against the full > paths to the files. > For complete syntax information, see Python's > documentation at > - <ulink > url='http://docs.python.org/release/2.3/lib/re-syntax.html'></ulink>. > + <ulink > url='http://docs.python.org/3/library/re.html#re'></ulink>. </para> > > <para> > @@ -1933,15 +1964,27 @@ > you want to select, and you should set > <link > linkend='var-PV'><filename>PV</filename></link> accordingly for > precedence. > - You can use the "<filename>%</filename>" > character as a > - wildcard to match any number of characters, > which can be > - useful when specifying versions that contain > long revision > - numbers that could potentially change. > + </para> > + > + <para> > + The <filename>PREFERRED_VERSION</filename> > variable > + supports limited wildcard use through the > + "<filename>%</filename>" character. > + You can use the character to match any number of > + characters, which can be useful when specifying > versions > + that contain long revision numbers that > potentially change. Here are two examples: > <literallayout class='monospaced'> > PREFERRED_VERSION_python = "2.7.3" > PREFERRED_VERSION_linux-yocto = "4.12%" > </literallayout> > + <note><title>Important</title> > + The use of the "<filename>%</filename>" > character > + is limited in that it only works at the end > of the > + string. > + You cannot use the wildcard character in any > other > + location of the string. > + </note> > </para> > </glossdef> > </glossentry> > diff --git > a/bitbake/doc/bitbake-user-manual/figures/bb_multiconfig_files.png > b/bitbake/doc/bitbake-user-manual/figures/bb_multiconfig_files.png > index > e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..041f06403b4cfc7cf7939ce44849d022d7b1337e > 100644 GIT binary patch literal 19991 > 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 > H{!jh|Ff{m- > > literal 0 > HcmV?d00001 > > diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py > index 71a0eba..16681ba 100644 > --- a/bitbake/lib/bb/cooker.py > +++ b/bitbake/lib/bb/cooker.py > @@ -609,14 +609,7 @@ class BBCooker: > k2 = k.split(":do_") > k = k2[0] > ktask = k2[1] > - if mc: > - # Provider might be from another mc > - for mcavailable in self.multiconfigs: > - # The first element is empty > - if mcavailable: > - > taskdata[mcavailable].add_provider(localdata[mcavailable], > self.recipecaches[mcavailable], k) > - else: > - taskdata[mc].add_provider(localdata[mc], > self.recipecaches[mc], k) > + taskdata[mc].add_provider(localdata[mc], > self.recipecaches[mc], k) current += 1 > if not ktask.startswith("do_"): > ktask = "do_%s" % ktask > diff --git a/bitbake/lib/bb/data_smart.py > b/bitbake/lib/bb/data_smart.py index 6b94fc4..67af380 100644 > --- a/bitbake/lib/bb/data_smart.py > +++ b/bitbake/lib/bb/data_smart.py > @@ -122,7 +122,11 @@ class VariableParse: > connector = self.d["_remote_data"] > return connector.expandPythonRef(self.varname, code, > self.d) > - codeobj = compile(code.strip(), self.varname or > "<expansion>", "eval") > + if self.varname: > + varname = 'Var <%s>' % self.varname > + else: > + varname = '<expansion>' > + codeobj = compile(code.strip(), varname, "eval") > > parser = bb.codeparser.PythonParser(self.varname, logger) > parser.parse_python(code) > @@ -427,7 +431,8 @@ class DataSmart(MutableMapping): > except bb.parse.SkipRecipe: > raise > except Exception as exc: > - raise ExpansionError(varname, s, exc) from exc > + tb = sys.exc_info()[2] > + raise ExpansionError(varname, s, > exc).with_traceback(tb) from exc > varparse.value = s > > diff --git a/bitbake/lib/bb/fetch2/__init__.py > b/bitbake/lib/bb/fetch2/__init__.py index 2b62b41..572b71a 100644 > --- a/bitbake/lib/bb/fetch2/__init__.py > +++ b/bitbake/lib/bb/fetch2/__init__.py > @@ -827,6 +827,7 @@ def runfetchcmd(cmd, d, quiet=False, > cleanup=None, log=None, workdir=None): 'NO_PROXY', 'no_proxy', > 'ALL_PROXY', 'all_proxy', > 'GIT_PROXY_COMMAND', > + 'GIT_SSH', > 'GIT_SSL_CAINFO', > 'GIT_SMART_HTTP', > 'SSH_AUTH_SOCK', 'SSH_AGENT_PID', > diff --git a/bitbake/lib/bb/fetch2/git.py > b/bitbake/lib/bb/fetch2/git.py index 15858a6..59a2ee8 100644 > --- a/bitbake/lib/bb/fetch2/git.py > +++ b/bitbake/lib/bb/fetch2/git.py > @@ -488,12 +488,15 @@ class Git(FetchMethod): > source_error.append("clone directory not available > or not up to date: " + ud.clonedir) > if not source_found: > - if ud.shallow and os.path.exists(ud.fullshallow): > - bb.utils.mkdirhier(destdir) > - runfetchcmd("tar -xzf %s" % ud.fullshallow, d, > workdir=destdir) > - source_found = True > + if ud.shallow: > + if os.path.exists(ud.fullshallow): > + bb.utils.mkdirhier(destdir) > + runfetchcmd("tar -xzf %s" % ud.fullshallow, d, > workdir=destdir) > + source_found = True > + else: > + source_error.append("shallow clone not > available: " + ud.fullshallow) else: > - source_error.append("shallow clone not enabled or > not available: " + ud.fullshallow) > + source_error.append("shallow clone not enabled") > > if not source_found: > raise bb.fetch2.UnpackError("No up to date source found: > " + "; ".join(source_error), ud.url) diff --git > a/bitbake/lib/bb/fetch2/gitsm.py b/bitbake/lib/bb/fetch2/gitsm.py > index 0a982da..35729db 100644 --- a/bitbake/lib/bb/fetch2/gitsm.py > +++ b/bitbake/lib/bb/fetch2/gitsm.py > @@ -92,7 +92,7 @@ class GitSM(Git): > url = uris[module].replace('%s:' % proto, 'gitsm:', 1) > url += ';protocol=%s' % proto > url += ";name=%s" % module > - url += ";bareclone=1;nocheckout=1" > + url += ";bareclone=1;nocheckout=1;nobranch=1" > > ld = d.createCopy() > # Not necessary to set SRC_URI, since we're passing the > URI to @@ -152,9 +152,9 @@ class GitSM(Git): > if submodules and not os.path.exists(os.path.join(repo_conf, > 'modules')): os.mkdir(os.path.join(repo_conf, 'modules')) > > - for module in submodules: > - srcpath = os.path.join(ud.clonedir, 'modules', module) > - modpath = os.path.join(repo_conf, 'modules', module) > + for module, md in submodules.items(): > + srcpath = os.path.join(ud.clonedir, 'modules', > md['path']) > + modpath = os.path.join(repo_conf, 'modules', md['path']) > > if os.path.exists(srcpath): > if os.path.exists(os.path.join(srcpath, '.git')): > @@ -187,9 +187,8 @@ class GitSM(Git): > # No submodules to update > continue > > - submodules = > list(self.parse_gitmodules(gitmodules).keys()) - > - self.copy_submodules(submodules, ud, dest, d) > + submodules = self.parse_gitmodules(gitmodules) > + self.copy_submodules(submodules, ud, dest, d) > > def unpack(self, ud, destdir, d): > Git.unpack(self, ud, destdir, d) > @@ -200,7 +199,7 @@ class GitSM(Git): > else: > repo_conf = os.path.join(ud.destdir, '.git') > > - submodules = [] > + update_submodules = False > paths = {} > uris = {} > local_paths = {} > @@ -211,41 +210,41 @@ class GitSM(Git): > # No submodules to update > continue > > - for m, md in self.parse_gitmodules(gitmodules).items(): > - submodules.append(m) > - paths[m] = md['path'] > - uris[m] = md['url'] > + submodules = self.parse_gitmodules(gitmodules) > + self.copy_submodules(submodules, ud, ud.destdir, d) > + > + submodules_queue = [(module, os.path.join(repo_conf, > 'modules', md['path'])) for module, md in submodules.items()] > + while len(submodules_queue) != 0: > + module, modpath = submodules_queue.pop() > > - self.copy_submodules(submodules, ud, ud.destdir, d) > + # add submodule children recursively > + try: > + gitmodules = runfetchcmd("%s show > HEAD:.gitmodules" % (ud.basecmd), d, quiet=True, workdir=modpath) > + for m, md in > self.parse_gitmodules(gitmodules).items(): > + submodules_queue.append([m, > os.path.join(modpath, 'modules', md['path'])]) > + except: > + # no children > + pass > > - submodules_queue = [(module, os.path.join(repo_conf, > 'modules', module)) for module in submodules] > - while len(submodules_queue) != 0: > - module, modpath = submodules_queue.pop() > > - # add submodule children recursively > - try: > - gitmodules = runfetchcmd("%s show HEAD:.gitmodules" > % (ud.basecmd), d, quiet=True, workdir=modpath) > - for m, md in > self.parse_gitmodules(gitmodules).items(): > - submodules_queue.append([m, > os.path.join(modpath, 'modules', m)]) > - except: > - # no children > - pass > + # There are submodules to update > + update_submodules = True > > - # Determine (from the submodule) the correct url to > reference > - try: > - output = runfetchcmd("%(basecmd)s config > remote.origin.url" % {'basecmd': ud.basecmd}, d, workdir=modpath) > - except bb.fetch2.FetchError as e: > - # No remote url defined in this submodule > - continue > + # Determine (from the submodule) the correct url to > reference > + try: > + output = runfetchcmd("%(basecmd)s config > remote.origin.url" % {'basecmd': ud.basecmd}, d, workdir=modpath) > + except bb.fetch2.FetchError as e: > + # No remote url defined in this submodule > + continue > > - local_paths[module] = output > + local_paths[module] = output > > - # Setup the local URL properly (like git submodule init > or sync would do...) > - runfetchcmd("%(basecmd)s config submodule.%(module)s.url > %(url)s" % {'basecmd': ud.basecmd, 'module': module, 'url' : > local_paths[module]}, d, workdir=ud.destdir) > + # Setup the local URL properly (like git submodule > init or sync would do...) > + runfetchcmd("%(basecmd)s config > submodule.%(module)s.url %(url)s" % {'basecmd': ud.basecmd, 'module': > module, 'url' : local_paths[module]}, d, workdir=ud.destdir) > - # Ensure the submodule repository is NOT set to bare, > since we're checking it out... > - runfetchcmd("%s config core.bare false" % (ud.basecmd), > d, quiet=True, workdir=modpath) > + # Ensure the submodule repository is NOT set to > bare, since we're checking it out... > + runfetchcmd("%s config core.bare false" % > (ud.basecmd), d, quiet=True, workdir=modpath) > - if submodules: > + if update_submodules: > # Run submodule update, this sets up the directories -- > without touching the config runfetchcmd("%s submodule update > --recursive --no-fetch" % (ud.basecmd), d, quiet=True, > workdir=ud.destdir) diff --git a/bitbake/lib/bb/fetch2/npm.py > b/bitbake/lib/bb/fetch2/npm.py index 408dfc3..65bf5a3 100644 --- > a/bitbake/lib/bb/fetch2/npm.py +++ b/bitbake/lib/bb/fetch2/npm.py > @@ -226,7 +226,7 @@ class Npm(FetchMethod): > self._getshrinkeddependencies(obj, > data['dependencies'][obj], data['dependencies'][obj]['version'], d, > ud, lockdown, manifest, False) return outputurl = "invalid" > - if ('resolved' not in data) or (not > data['resolved'].startswith('http')): > + if ('resolved' not in data) or (not > data['resolved'].startswith('http://') and not > data['resolved'].startswith('https://')): # will be the case for > ${PN} fetchcmd = "npm view %s@%s dist.tarball --registry %s" % (pkg, > version, ud.registry) logger.debug(2, "Found this matching URL: %s" % > str(fetchcmd)) diff --git a/bitbake/lib/bb/parse/ast.py > b/bitbake/lib/bb/parse/ast.py index 9d20c32..6d7c80b 100644 --- > a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py > @@ -178,7 +178,7 @@ class MethodNode(AstNode): > funcname = ("__anon_%s_%s" % (self.lineno, > self.filename.translate(MethodNode.tr_tbl))) self.python = True > text = "def %s(d):\n" % (funcname) + text > - bb.methodpool.insert_method(funcname, text, > self.filename, self.lineno - len(self.body)) > + bb.methodpool.insert_method(funcname, text, > self.filename, self.lineno - len(self.body) - 1) anonfuncs = > data.getVar('__BBANONFUNCS', False) or [] anonfuncs.append(funcname) > data.setVar('__BBANONFUNCS', anonfuncs) > diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py > b/bitbake/lib/bb/parse/parse_py/BBHandler.py index e5039e3..01fc47e > 100644 --- a/bitbake/lib/bb/parse/parse_py/BBHandler.py > +++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py > @@ -45,7 +45,7 @@ __addtask_regexp__ = > re.compile("addtask\s+(?P<func>\w+)\s*((before\s*(?P< > __deltask_regexp__ = re.compile("deltask\s+(?P<func>\w+)") > __addhandler_regexp__ = re.compile( r"addhandler\s+(.+)" ) > __def_regexp__ = re.compile( r"def\s+(\w+).*:" ) > -__python_func_regexp__ = re.compile( r"(\s+.*)|(^$)" ) > +__python_func_regexp__ = re.compile( r"(\s+.*)|(^$)|(^#)" ) > __infunc__ = [] > __inpython__ = False > diff --git a/bitbake/lib/bb/server/process.py > b/bitbake/lib/bb/server/process.py index 38b923f..4e0d9c2 100644 > --- a/bitbake/lib/bb/server/process.py > +++ b/bitbake/lib/bb/server/process.py > @@ -428,7 +428,11 @@ class BitBakeServer(object): > bb.error("Last 10 lines of server log for > this session (%s):\n%s" % (logfile, "".join(lines[-10:]))) else: > bb.error("Server log for this session > (%s):\n%s" % (logfile, "".join(lines))) > + else: > + bb.error("%s doesn't exist" % logfile) > + > raise SystemExit(1) > + > ready.close() > > def _startServer(self): > @@ -452,16 +456,15 @@ def connectProcessServer(sockname, featureset): > # AF_UNIX has path length issues so chdir here to workaround > cwd = os.getcwd() > > - try: > - os.chdir(os.path.dirname(sockname)) > - sock.connect(os.path.basename(sockname)) > - finally: > - os.chdir(cwd) > - > readfd = writefd = readfd1 = writefd1 = readfd2 = writefd2 = None > eq = command_chan_recv = command_chan = None > > try: > + try: > + os.chdir(os.path.dirname(sockname)) > + sock.connect(os.path.basename(sockname)) > + finally: > + os.chdir(cwd) > > # Send an fd for the remote to write events to > readfd, writefd = os.pipe() > diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py > index 03c824e..fdbb2a3 100644 > --- a/bitbake/lib/bb/siggen.py > +++ b/bitbake/lib/bb/siggen.py > @@ -185,7 +185,7 @@ class SignatureGeneratorBasic(SignatureGenerator): > if not self.rundep_check(fn, recipename, task, dep, > depname, dataCache): continue > if dep not in self.taskhash: > - bb.fatal("%s is not in taskhash, caller isn't > calling in dependency order?", dep) > + bb.fatal("%s is not in taskhash, caller isn't > calling in dependency order?" % dep) data = data + self.taskhash[dep] > self.runtaskdeps[k].append(dep) > > @@ -342,10 +342,10 @@ def dump_this_task(outfile, d): > def init_colors(enable_color): > """Initialise colour dict for passing to compare_sigfiles()""" > # First set up the colours > - colors = {'color_title': '\033[1;37;40m', > - 'color_default': '\033[0;37;40m', > - 'color_add': '\033[1;32;40m', > - 'color_remove': '\033[1;31;40m', > + colors = {'color_title': '\033[1m', > + 'color_default': '\033[0m', > + 'color_add': '\033[0;32m', > + 'color_remove': '\033[0;31m', > } > # Leave all keys present but clear the values > if not enable_color: > diff --git a/bitbake/lib/bb/tests/fetch.py > b/bitbake/lib/bb/tests/fetch.py index 17909ec..6848095 100644 > --- a/bitbake/lib/bb/tests/fetch.py > +++ b/bitbake/lib/bb/tests/fetch.py > @@ -1708,9 +1708,8 @@ class GitShallowTest(FetcherTest): > with self.assertRaises(bb.fetch2.UnpackError) as context: > fetcher.unpack(self.d.getVar('WORKDIR')) > > - self.assertTrue("No up to date source found" in > context.exception.msg) > - self.assertTrue("clone directory not available or not up to > date" in context.exception.msg) > - self.assertTrue("shallow clone not enabled or not available" > in context.exception.msg) > + self.assertIn("No up to date source found", > context.exception.msg) > + self.assertIn("clone directory not available or not up to > date", context.exception.msg) > @skipIfNoNetwork() > def > test_that_unpack_does_work_when_using_git_shallow_tarball_but_tarball_is_not_available(self): > diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index > 73b6cb4..13bb5f2 100644 --- a/bitbake/lib/bb/utils.py > +++ b/bitbake/lib/bb/utils.py > @@ -27,7 +27,8 @@ import bb > import bb.msg > import multiprocessing > import fcntl > -import imp > +import importlib > +from importlib import machinery > import itertools > import subprocess > import glob > @@ -43,7 +44,7 @@ from contextlib import contextmanager > from ctypes import cdll > > logger = logging.getLogger("BitBake.Util") > -python_extensions = [e for e, _, _ in imp.get_suffixes()] > +python_extensions = importlib.machinery.all_suffixes() > > > def clean_context(): > @@ -68,8 +69,8 @@ class VersionStringException(Exception): > > def explode_version(s): > r = [] > - alpha_regexp = re.compile('^([a-zA-Z]+)(.*)$') > - numeric_regexp = re.compile('^(\d+)(.*)$') > + alpha_regexp = re.compile(r'^([a-zA-Z]+)(.*)$') > + numeric_regexp = re.compile(r'^(\d+)(.*)$') > while (s != ''): > if s[0] in string.digits: > m = numeric_regexp.match(s) > @@ -317,10 +318,13 @@ def better_compile(text, file, realfile, mode = > "exec", lineno = 0): error = [] > # split the text into lines again > body = text.split('\n') > - error.append("Error in compiling python function in %s, line > %s:\n" % (realfile, lineno)) > + error.append("Error in compiling python function in %s, line > %s:\n" % (realfile, e.lineno)) if hasattr(e, "lineno"): > error.append("The code lines resulting in this error > were:") > - error.extend(_print_trace(body, e.lineno)) > + # e.lineno: line's position in reaflile > + # lineno: function name's "position -1" in realfile > + # e.lineno - lineno: line's relative position in function > + error.extend(_print_trace(body, e.lineno - lineno)) > else: > error.append("The function causing this error was:") > for line in body: > @@ -1157,14 +1161,14 @@ def edit_metadata(meta_lines, variables, > varfunc, match_overrides=False): > var_res = {} > if match_overrides: > - override_re = '(_[a-zA-Z0-9-_$(){}]+)?' > + override_re = r'(_[a-zA-Z0-9-_$(){}]+)?' > else: > override_re = '' > for var in variables: > if var.endswith('()'): > - var_res[var] = > re.compile('^(%s%s)[ \\t]*\([ \\t]*\)[ \\t]*{' % (var[:-2].rstrip(), > override_re)) > + var_res[var] = > re.compile(r'^(%s%s)[ \\t]*\([ \\t]*\)[ \\t]*{' % (var[:-2].rstrip(), > override_re)) else: > - var_res[var] = > re.compile('^(%s%s)[ \\t]*[?+:.]*=[+.]*[ \\t]*(["\'])' % (var, > override_re)) > + var_res[var] = > re.compile(r'^(%s%s)[ \\t]*[?+:.]*=[+.]*[ \\t]*(["\'])' % (var, > override_re)) updated = False > varset_start = '' > @@ -1544,12 +1548,9 @@ def export_proxies(d): > def load_plugins(logger, plugins, pluginpath): > def load_plugin(name): > logger.debug(1, 'Loading plugin %s' % name) > - fp, pathname, description = imp.find_module(name, > [pluginpath]) > - try: > - return imp.load_module(name, fp, pathname, description) > - finally: > - if fp: > - fp.close() > + spec = importlib.machinery.PathFinder.find_spec(name, > path=[pluginpath] ) > + if spec: > + return spec.loader.load_module() > > logger.debug(1, 'Loading plugins from %s...' % pluginpath) > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] bitbake: Update to fixed master revision 2018-11-22 13:12 ` Henning Schild @ 2018-11-22 13:14 ` Jan Kiszka 2018-11-22 13:18 ` Henning Schild 2018-11-22 13:19 ` Jan Kiszka 0 siblings, 2 replies; 20+ messages in thread From: Jan Kiszka @ 2018-11-22 13:14 UTC (permalink / raw) To: Henning Schild; +Cc: isar-users On 22.11.18 14:12, Henning Schild wrote: > I got a report that bitbake 1.40 and this one are affected by a > "gitsm://" bug. Still waiting for details but this will only fix one > new bitbake bug. > Was there a reason to bump, except wanting to stay up to date? Broken multiconfig in current next. So far a downstream issue (jailhouse-images, possibly other multiconfig-using layers), with patch 3 then also an upstream topic. But patch 3 is needed for other reasons (see log). Please report/track the bitbake issue upstream! Jan > > Henning > > Am Thu, 22 Nov 2018 13:58:38 +0100 > schrieb "[ext] Jan Kiszka" <jan.kiszka@siemens.com>: > >> From: Jan Kiszka <jan.kiszka@siemens.com> >> >> This primarily pulls in the essential fix f2106a3a7675 for multiconfig >> setups. >> >> Origin: https://github.com/openembedded/bitbake.git >> Commit: 19dee675bb9ad012d28e1e57a888931355a831cb >> Author: Richard Purdie <richard.purdie@linuxfoundation.org> >> Date: Thu Nov 22 11:59:58 2018 +0000 >> >> tests/fetch: Update after recent gitsm message changes >> >> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> >> --- >> bitbake/bin/toaster | 4 +- >> .../bitbake-user-manual-intro.xml | 13 +++- >> .../bitbake-user-manual-metadata.xml | 31 ++++++++- >> .../bitbake-user-manual-ref-variables.xml | 59 >> ++++++++++++++--- .../figures/bb_multiconfig_files.png >> | Bin 0 -> 19991 bytes >> bitbake/lib/bb/cooker.py | 9 +-- >> bitbake/lib/bb/data_smart.py | 9 ++- >> bitbake/lib/bb/fetch2/__init__.py | 1 + >> bitbake/lib/bb/fetch2/git.py | 13 ++-- >> bitbake/lib/bb/fetch2/gitsm.py | 71 >> ++++++++++----------- >> bitbake/lib/bb/fetch2/npm.py | 2 +- >> bitbake/lib/bb/parse/ast.py | 2 +- >> bitbake/lib/bb/parse/parse_py/BBHandler.py | 2 +- >> bitbake/lib/bb/server/process.py | 15 +++-- >> bitbake/lib/bb/siggen.py | 10 +-- >> bitbake/lib/bb/tests/fetch.py | 5 +- >> bitbake/lib/bb/utils.py | 31 ++++----- 17 >> files changed, 181 insertions(+), 96 deletions(-) >> >> diff --git a/bitbake/bin/toaster b/bitbake/bin/toaster >> index 9fffbc6..ecf66fa 100755 >> --- a/bitbake/bin/toaster >> +++ b/bitbake/bin/toaster >> @@ -161,7 +161,9 @@ fi >> >> export BBBASEDIR=`dirname $TOASTER`/.. >> MANAGE="python3 $BBBASEDIR/lib/toaster/manage.py" >> -OE_ROOT=`dirname $TOASTER`/../.. >> +if [ -z "$OE_ROOT" ]; then >> + OE_ROOT=`dirname $TOASTER`/../.. >> +fi >> >> # this is the configuraton file we are using for toaster >> # we are using the same logic that oe-setup-builddir uses >> diff --git >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml index >> 9e2e6b2..f7d312a 100644 --- >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml +++ >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml @@ >> -342,13 +342,14 @@ <para> >> When you name an append file, you can use the >> - wildcard character (%) to allow for matching recipe >> names. >> + "<filename>%</filename>" wildcard character to allow >> for matching >> + recipe names. >> For example, suppose you have an append file named >> as follows: >> <literallayout class='monospaced'> >> busybox_1.21.%.bbappend >> </literallayout> >> - That append file would match any >> <filename>busybox_1.21.x.bb</filename> >> + That append file would match any >> <filename>busybox_1.21.</filename><replaceable>x</replaceable><filename>.bb</filename> >> version of the recipe. So, the append file would match the following >> recipe names: <literallayout class='monospaced'> >> @@ -356,6 +357,14 @@ >> busybox_1.21.2.bb >> busybox_1.21.3.bb >> </literallayout> >> + <note><title>Important</title> >> + The use of the "<filename>%</filename>" character >> + is limited in that it only works directly in >> front of the >> + <filename>.bbappend</filename> portion of the >> append file's >> + name. >> + You cannot use the wildcard character in any >> other >> + location of the name. >> + </note> >> If the <filename>busybox</filename> recipe was >> updated to <filename>busybox_1.3.0.bb</filename>, the append name >> would not match. >> diff --git >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml >> index fc55ef6..2490f6e 100644 --- >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml >> +++ >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml @@ >> -352,8 +352,9 @@ FOO2_remove = "abc def" </literallayout> The >> variable <filename>FOO</filename> becomes >> - " 789 123456 " and <filename>FOO2</filename> >> becomes >> - " ghi abcdef ". >> + " 789 123456 " >> + and <filename>FOO2</filename> becomes >> + " ghi abcdef ". >> </para> >> >> <para> >> @@ -2751,4 +2752,30 @@ >> </itemizedlist> >> </para> >> </section> >> + >> + <section id='wildcard-support-in-variables'> >> + <title>Wildcard Support in Variables</title> >> + >> + <para> >> + Support for wildcard use in variables varies depending >> on the >> + context in which it is used. >> + For example, some variables and file names allow limited >> use of >> + wildcards through the "<filename>%</filename>" and >> + "<filename>*</filename>" characters. >> + Other variables or names support Python's >> + <ulink >> url='https://docs.python.org/3/library/glob.html'><filename>glob</filename></ulink> >> + syntax, >> + <ulink >> url='https://docs.python.org/3/library/fnmatch.html#module-fnmatch'><filename>fnmatch</filename></ulink> >> + syntax, or >> + <ulink >> url='https://docs.python.org/3/library/re.html#re'><filename>Regular >> Expression (re)</filename></ulink> >> + syntax. >> + </para> >> + >> + <para> >> + For variables that have wildcard suport, the >> + documentation describes which form of wildcard, its >> + use, and its limitations. >> + </para> >> + </section> >> + >> </chapter> >> diff --git >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml >> index c327af5..a84b2bc 100644 --- >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml >> +++ >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml >> @@ -115,7 +115,8 @@ is either not set or set to "0". >> </para></listitem> <listitem><para> >> - Limited support for wildcard matching >> against the >> + Limited support for the >> "<filename>*</filename>" >> + wildcard character for matching against >> the beginning of host names exists. >> For example, the following setting >> matches <filename>git.gnu.org</filename>, >> @@ -124,6 +125,20 @@ >> <literallayout class='monospaced'> >> BB_ALLOWED_NETWORKS = "*.gnu.org" >> </literallayout> >> + <note><title>Important</title> >> + <para>The use of the >> "<filename>*</filename>" >> + character only works at the >> beginning of >> + a host name and it must be isolated >> from >> + the remainder of the host name. >> + You cannot use the wildcard >> character in any >> + other location of the name or >> combined with >> + the front part of the name.</para> >> + >> + <para>For example, >> + <filename>*.foo.bar</filename> is >> supported, >> + while >> <filename>*aa.foo.bar</filename> is not. >> + </para> >> + </note> >> </para></listitem> >> <listitem><para> >> Mirrors not in the host list are skipped >> and @@ -1082,7 +1097,19 @@ >> >> <glossentry id='var-BBFILES'><glossterm>BBFILES</glossterm> >> <glossdef> >> - <para>List of recipe files BitBake uses to build >> software.</para> >> + <para> >> + A space-separated list of recipe files BitBake >> uses to >> + build software. >> + </para> >> + >> + <para> >> + When specifying recipe files, you can pattern >> match using >> + Python's >> + <ulink >> url='https://docs.python.org/3/library/glob.html'><filename>glob</filename></ulink> >> + syntax. >> + For details on the syntax, see the documentation >> by >> + following the previous link. >> + </para> >> </glossdef> >> </glossentry> >> >> @@ -1166,15 +1193,19 @@ >> match any of the expressions. >> It is as if BitBake does not see them at all. >> Consequently, matching files are not parsed or >> otherwise >> - used by BitBake.</para> >> + used by BitBake. >> + </para> >> + >> <para> >> The values you provide are passed to Python's >> regular expression compiler. >> + Consequently, the syntax follows Python's Regular >> + Expression (re) syntax. >> The expressions are compared against the full >> paths to the files. >> For complete syntax information, see Python's >> documentation at >> - <ulink >> url='http://docs.python.org/release/2.3/lib/re-syntax.html'></ulink>. >> + <ulink >> url='http://docs.python.org/3/library/re.html#re'></ulink>. </para> >> >> <para> >> @@ -1933,15 +1964,27 @@ >> you want to select, and you should set >> <link >> linkend='var-PV'><filename>PV</filename></link> accordingly for >> precedence. >> - You can use the "<filename>%</filename>" >> character as a >> - wildcard to match any number of characters, >> which can be >> - useful when specifying versions that contain >> long revision >> - numbers that could potentially change. >> + </para> >> + >> + <para> >> + The <filename>PREFERRED_VERSION</filename> >> variable >> + supports limited wildcard use through the >> + "<filename>%</filename>" character. >> + You can use the character to match any number of >> + characters, which can be useful when specifying >> versions >> + that contain long revision numbers that >> potentially change. Here are two examples: >> <literallayout class='monospaced'> >> PREFERRED_VERSION_python = "2.7.3" >> PREFERRED_VERSION_linux-yocto = "4.12%" >> </literallayout> >> + <note><title>Important</title> >> + The use of the "<filename>%</filename>" >> character >> + is limited in that it only works at the end >> of the >> + string. >> + You cannot use the wildcard character in any >> other >> + location of the string. >> + </note> >> </para> >> </glossdef> >> </glossentry> >> diff --git >> a/bitbake/doc/bitbake-user-manual/figures/bb_multiconfig_files.png >> b/bitbake/doc/bitbake-user-manual/figures/bb_multiconfig_files.png >> index >> e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..041f06403b4cfc7cf7939ce44849d022d7b1337e >> 100644 GIT binary patch literal 19991 >> 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 >> H{!jh|Ff{m- >> >> literal 0 >> HcmV?d00001 >> >> diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py >> index 71a0eba..16681ba 100644 >> --- a/bitbake/lib/bb/cooker.py >> +++ b/bitbake/lib/bb/cooker.py >> @@ -609,14 +609,7 @@ class BBCooker: >> k2 = k.split(":do_") >> k = k2[0] >> ktask = k2[1] >> - if mc: >> - # Provider might be from another mc >> - for mcavailable in self.multiconfigs: >> - # The first element is empty >> - if mcavailable: >> - >> taskdata[mcavailable].add_provider(localdata[mcavailable], >> self.recipecaches[mcavailable], k) >> - else: >> - taskdata[mc].add_provider(localdata[mc], >> self.recipecaches[mc], k) >> + taskdata[mc].add_provider(localdata[mc], >> self.recipecaches[mc], k) current += 1 >> if not ktask.startswith("do_"): >> ktask = "do_%s" % ktask >> diff --git a/bitbake/lib/bb/data_smart.py >> b/bitbake/lib/bb/data_smart.py index 6b94fc4..67af380 100644 >> --- a/bitbake/lib/bb/data_smart.py >> +++ b/bitbake/lib/bb/data_smart.py >> @@ -122,7 +122,11 @@ class VariableParse: >> connector = self.d["_remote_data"] >> return connector.expandPythonRef(self.varname, code, >> self.d) >> - codeobj = compile(code.strip(), self.varname or >> "<expansion>", "eval") >> + if self.varname: >> + varname = 'Var <%s>' % self.varname >> + else: >> + varname = '<expansion>' >> + codeobj = compile(code.strip(), varname, "eval") >> >> parser = bb.codeparser.PythonParser(self.varname, logger) >> parser.parse_python(code) >> @@ -427,7 +431,8 @@ class DataSmart(MutableMapping): >> except bb.parse.SkipRecipe: >> raise >> except Exception as exc: >> - raise ExpansionError(varname, s, exc) from exc >> + tb = sys.exc_info()[2] >> + raise ExpansionError(varname, s, >> exc).with_traceback(tb) from exc >> varparse.value = s >> >> diff --git a/bitbake/lib/bb/fetch2/__init__.py >> b/bitbake/lib/bb/fetch2/__init__.py index 2b62b41..572b71a 100644 >> --- a/bitbake/lib/bb/fetch2/__init__.py >> +++ b/bitbake/lib/bb/fetch2/__init__.py >> @@ -827,6 +827,7 @@ def runfetchcmd(cmd, d, quiet=False, >> cleanup=None, log=None, workdir=None): 'NO_PROXY', 'no_proxy', >> 'ALL_PROXY', 'all_proxy', >> 'GIT_PROXY_COMMAND', >> + 'GIT_SSH', >> 'GIT_SSL_CAINFO', >> 'GIT_SMART_HTTP', >> 'SSH_AUTH_SOCK', 'SSH_AGENT_PID', >> diff --git a/bitbake/lib/bb/fetch2/git.py >> b/bitbake/lib/bb/fetch2/git.py index 15858a6..59a2ee8 100644 >> --- a/bitbake/lib/bb/fetch2/git.py >> +++ b/bitbake/lib/bb/fetch2/git.py >> @@ -488,12 +488,15 @@ class Git(FetchMethod): >> source_error.append("clone directory not available >> or not up to date: " + ud.clonedir) >> if not source_found: >> - if ud.shallow and os.path.exists(ud.fullshallow): >> - bb.utils.mkdirhier(destdir) >> - runfetchcmd("tar -xzf %s" % ud.fullshallow, d, >> workdir=destdir) >> - source_found = True >> + if ud.shallow: >> + if os.path.exists(ud.fullshallow): >> + bb.utils.mkdirhier(destdir) >> + runfetchcmd("tar -xzf %s" % ud.fullshallow, d, >> workdir=destdir) >> + source_found = True >> + else: >> + source_error.append("shallow clone not >> available: " + ud.fullshallow) else: >> - source_error.append("shallow clone not enabled or >> not available: " + ud.fullshallow) >> + source_error.append("shallow clone not enabled") >> >> if not source_found: >> raise bb.fetch2.UnpackError("No up to date source found: >> " + "; ".join(source_error), ud.url) diff --git >> a/bitbake/lib/bb/fetch2/gitsm.py b/bitbake/lib/bb/fetch2/gitsm.py >> index 0a982da..35729db 100644 --- a/bitbake/lib/bb/fetch2/gitsm.py >> +++ b/bitbake/lib/bb/fetch2/gitsm.py >> @@ -92,7 +92,7 @@ class GitSM(Git): >> url = uris[module].replace('%s:' % proto, 'gitsm:', 1) >> url += ';protocol=%s' % proto >> url += ";name=%s" % module >> - url += ";bareclone=1;nocheckout=1" >> + url += ";bareclone=1;nocheckout=1;nobranch=1" >> >> ld = d.createCopy() >> # Not necessary to set SRC_URI, since we're passing the >> URI to @@ -152,9 +152,9 @@ class GitSM(Git): >> if submodules and not os.path.exists(os.path.join(repo_conf, >> 'modules')): os.mkdir(os.path.join(repo_conf, 'modules')) >> >> - for module in submodules: >> - srcpath = os.path.join(ud.clonedir, 'modules', module) >> - modpath = os.path.join(repo_conf, 'modules', module) >> + for module, md in submodules.items(): >> + srcpath = os.path.join(ud.clonedir, 'modules', >> md['path']) >> + modpath = os.path.join(repo_conf, 'modules', md['path']) >> >> if os.path.exists(srcpath): >> if os.path.exists(os.path.join(srcpath, '.git')): >> @@ -187,9 +187,8 @@ class GitSM(Git): >> # No submodules to update >> continue >> >> - submodules = >> list(self.parse_gitmodules(gitmodules).keys()) - >> - self.copy_submodules(submodules, ud, dest, d) >> + submodules = self.parse_gitmodules(gitmodules) >> + self.copy_submodules(submodules, ud, dest, d) >> >> def unpack(self, ud, destdir, d): >> Git.unpack(self, ud, destdir, d) >> @@ -200,7 +199,7 @@ class GitSM(Git): >> else: >> repo_conf = os.path.join(ud.destdir, '.git') >> >> - submodules = [] >> + update_submodules = False >> paths = {} >> uris = {} >> local_paths = {} >> @@ -211,41 +210,41 @@ class GitSM(Git): >> # No submodules to update >> continue >> >> - for m, md in self.parse_gitmodules(gitmodules).items(): >> - submodules.append(m) >> - paths[m] = md['path'] >> - uris[m] = md['url'] >> + submodules = self.parse_gitmodules(gitmodules) >> + self.copy_submodules(submodules, ud, ud.destdir, d) >> + >> + submodules_queue = [(module, os.path.join(repo_conf, >> 'modules', md['path'])) for module, md in submodules.items()] >> + while len(submodules_queue) != 0: >> + module, modpath = submodules_queue.pop() >> >> - self.copy_submodules(submodules, ud, ud.destdir, d) >> + # add submodule children recursively >> + try: >> + gitmodules = runfetchcmd("%s show >> HEAD:.gitmodules" % (ud.basecmd), d, quiet=True, workdir=modpath) >> + for m, md in >> self.parse_gitmodules(gitmodules).items(): >> + submodules_queue.append([m, >> os.path.join(modpath, 'modules', md['path'])]) >> + except: >> + # no children >> + pass >> >> - submodules_queue = [(module, os.path.join(repo_conf, >> 'modules', module)) for module in submodules] >> - while len(submodules_queue) != 0: >> - module, modpath = submodules_queue.pop() >> >> - # add submodule children recursively >> - try: >> - gitmodules = runfetchcmd("%s show HEAD:.gitmodules" >> % (ud.basecmd), d, quiet=True, workdir=modpath) >> - for m, md in >> self.parse_gitmodules(gitmodules).items(): >> - submodules_queue.append([m, >> os.path.join(modpath, 'modules', m)]) >> - except: >> - # no children >> - pass >> + # There are submodules to update >> + update_submodules = True >> >> - # Determine (from the submodule) the correct url to >> reference >> - try: >> - output = runfetchcmd("%(basecmd)s config >> remote.origin.url" % {'basecmd': ud.basecmd}, d, workdir=modpath) >> - except bb.fetch2.FetchError as e: >> - # No remote url defined in this submodule >> - continue >> + # Determine (from the submodule) the correct url to >> reference >> + try: >> + output = runfetchcmd("%(basecmd)s config >> remote.origin.url" % {'basecmd': ud.basecmd}, d, workdir=modpath) >> + except bb.fetch2.FetchError as e: >> + # No remote url defined in this submodule >> + continue >> >> - local_paths[module] = output >> + local_paths[module] = output >> >> - # Setup the local URL properly (like git submodule init >> or sync would do...) >> - runfetchcmd("%(basecmd)s config submodule.%(module)s.url >> %(url)s" % {'basecmd': ud.basecmd, 'module': module, 'url' : >> local_paths[module]}, d, workdir=ud.destdir) >> + # Setup the local URL properly (like git submodule >> init or sync would do...) >> + runfetchcmd("%(basecmd)s config >> submodule.%(module)s.url %(url)s" % {'basecmd': ud.basecmd, 'module': >> module, 'url' : local_paths[module]}, d, workdir=ud.destdir) >> - # Ensure the submodule repository is NOT set to bare, >> since we're checking it out... >> - runfetchcmd("%s config core.bare false" % (ud.basecmd), >> d, quiet=True, workdir=modpath) >> + # Ensure the submodule repository is NOT set to >> bare, since we're checking it out... >> + runfetchcmd("%s config core.bare false" % >> (ud.basecmd), d, quiet=True, workdir=modpath) >> - if submodules: >> + if update_submodules: >> # Run submodule update, this sets up the directories -- >> without touching the config runfetchcmd("%s submodule update >> --recursive --no-fetch" % (ud.basecmd), d, quiet=True, >> workdir=ud.destdir) diff --git a/bitbake/lib/bb/fetch2/npm.py >> b/bitbake/lib/bb/fetch2/npm.py index 408dfc3..65bf5a3 100644 --- >> a/bitbake/lib/bb/fetch2/npm.py +++ b/bitbake/lib/bb/fetch2/npm.py >> @@ -226,7 +226,7 @@ class Npm(FetchMethod): >> self._getshrinkeddependencies(obj, >> data['dependencies'][obj], data['dependencies'][obj]['version'], d, >> ud, lockdown, manifest, False) return outputurl = "invalid" >> - if ('resolved' not in data) or (not >> data['resolved'].startswith('http')): >> + if ('resolved' not in data) or (not >> data['resolved'].startswith('http://') and not >> data['resolved'].startswith('https://')): # will be the case for >> ${PN} fetchcmd = "npm view %s@%s dist.tarball --registry %s" % (pkg, >> version, ud.registry) logger.debug(2, "Found this matching URL: %s" % >> str(fetchcmd)) diff --git a/bitbake/lib/bb/parse/ast.py >> b/bitbake/lib/bb/parse/ast.py index 9d20c32..6d7c80b 100644 --- >> a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py >> @@ -178,7 +178,7 @@ class MethodNode(AstNode): >> funcname = ("__anon_%s_%s" % (self.lineno, >> self.filename.translate(MethodNode.tr_tbl))) self.python = True >> text = "def %s(d):\n" % (funcname) + text >> - bb.methodpool.insert_method(funcname, text, >> self.filename, self.lineno - len(self.body)) >> + bb.methodpool.insert_method(funcname, text, >> self.filename, self.lineno - len(self.body) - 1) anonfuncs = >> data.getVar('__BBANONFUNCS', False) or [] anonfuncs.append(funcname) >> data.setVar('__BBANONFUNCS', anonfuncs) >> diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py >> b/bitbake/lib/bb/parse/parse_py/BBHandler.py index e5039e3..01fc47e >> 100644 --- a/bitbake/lib/bb/parse/parse_py/BBHandler.py >> +++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py >> @@ -45,7 +45,7 @@ __addtask_regexp__ = >> re.compile("addtask\s+(?P<func>\w+)\s*((before\s*(?P< >> __deltask_regexp__ = re.compile("deltask\s+(?P<func>\w+)") >> __addhandler_regexp__ = re.compile( r"addhandler\s+(.+)" ) >> __def_regexp__ = re.compile( r"def\s+(\w+).*:" ) >> -__python_func_regexp__ = re.compile( r"(\s+.*)|(^$)" ) >> +__python_func_regexp__ = re.compile( r"(\s+.*)|(^$)|(^#)" ) >> __infunc__ = [] >> __inpython__ = False >> diff --git a/bitbake/lib/bb/server/process.py >> b/bitbake/lib/bb/server/process.py index 38b923f..4e0d9c2 100644 >> --- a/bitbake/lib/bb/server/process.py >> +++ b/bitbake/lib/bb/server/process.py >> @@ -428,7 +428,11 @@ class BitBakeServer(object): >> bb.error("Last 10 lines of server log for >> this session (%s):\n%s" % (logfile, "".join(lines[-10:]))) else: >> bb.error("Server log for this session >> (%s):\n%s" % (logfile, "".join(lines))) >> + else: >> + bb.error("%s doesn't exist" % logfile) >> + >> raise SystemExit(1) >> + >> ready.close() >> >> def _startServer(self): >> @@ -452,16 +456,15 @@ def connectProcessServer(sockname, featureset): >> # AF_UNIX has path length issues so chdir here to workaround >> cwd = os.getcwd() >> >> - try: >> - os.chdir(os.path.dirname(sockname)) >> - sock.connect(os.path.basename(sockname)) >> - finally: >> - os.chdir(cwd) >> - >> readfd = writefd = readfd1 = writefd1 = readfd2 = writefd2 = None >> eq = command_chan_recv = command_chan = None >> >> try: >> + try: >> + os.chdir(os.path.dirname(sockname)) >> + sock.connect(os.path.basename(sockname)) >> + finally: >> + os.chdir(cwd) >> >> # Send an fd for the remote to write events to >> readfd, writefd = os.pipe() >> diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py >> index 03c824e..fdbb2a3 100644 >> --- a/bitbake/lib/bb/siggen.py >> +++ b/bitbake/lib/bb/siggen.py >> @@ -185,7 +185,7 @@ class SignatureGeneratorBasic(SignatureGenerator): >> if not self.rundep_check(fn, recipename, task, dep, >> depname, dataCache): continue >> if dep not in self.taskhash: >> - bb.fatal("%s is not in taskhash, caller isn't >> calling in dependency order?", dep) >> + bb.fatal("%s is not in taskhash, caller isn't >> calling in dependency order?" % dep) data = data + self.taskhash[dep] >> self.runtaskdeps[k].append(dep) >> >> @@ -342,10 +342,10 @@ def dump_this_task(outfile, d): >> def init_colors(enable_color): >> """Initialise colour dict for passing to compare_sigfiles()""" >> # First set up the colours >> - colors = {'color_title': '\033[1;37;40m', >> - 'color_default': '\033[0;37;40m', >> - 'color_add': '\033[1;32;40m', >> - 'color_remove': '\033[1;31;40m', >> + colors = {'color_title': '\033[1m', >> + 'color_default': '\033[0m', >> + 'color_add': '\033[0;32m', >> + 'color_remove': '\033[0;31m', >> } >> # Leave all keys present but clear the values >> if not enable_color: >> diff --git a/bitbake/lib/bb/tests/fetch.py >> b/bitbake/lib/bb/tests/fetch.py index 17909ec..6848095 100644 >> --- a/bitbake/lib/bb/tests/fetch.py >> +++ b/bitbake/lib/bb/tests/fetch.py >> @@ -1708,9 +1708,8 @@ class GitShallowTest(FetcherTest): >> with self.assertRaises(bb.fetch2.UnpackError) as context: >> fetcher.unpack(self.d.getVar('WORKDIR')) >> >> - self.assertTrue("No up to date source found" in >> context.exception.msg) >> - self.assertTrue("clone directory not available or not up to >> date" in context.exception.msg) >> - self.assertTrue("shallow clone not enabled or not available" >> in context.exception.msg) >> + self.assertIn("No up to date source found", >> context.exception.msg) >> + self.assertIn("clone directory not available or not up to >> date", context.exception.msg) >> @skipIfNoNetwork() >> def >> test_that_unpack_does_work_when_using_git_shallow_tarball_but_tarball_is_not_available(self): >> diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index >> 73b6cb4..13bb5f2 100644 --- a/bitbake/lib/bb/utils.py >> +++ b/bitbake/lib/bb/utils.py >> @@ -27,7 +27,8 @@ import bb >> import bb.msg >> import multiprocessing >> import fcntl >> -import imp >> +import importlib >> +from importlib import machinery >> import itertools >> import subprocess >> import glob >> @@ -43,7 +44,7 @@ from contextlib import contextmanager >> from ctypes import cdll >> >> logger = logging.getLogger("BitBake.Util") >> -python_extensions = [e for e, _, _ in imp.get_suffixes()] >> +python_extensions = importlib.machinery.all_suffixes() >> >> >> def clean_context(): >> @@ -68,8 +69,8 @@ class VersionStringException(Exception): >> >> def explode_version(s): >> r = [] >> - alpha_regexp = re.compile('^([a-zA-Z]+)(.*)$') >> - numeric_regexp = re.compile('^(\d+)(.*)$') >> + alpha_regexp = re.compile(r'^([a-zA-Z]+)(.*)$') >> + numeric_regexp = re.compile(r'^(\d+)(.*)$') >> while (s != ''): >> if s[0] in string.digits: >> m = numeric_regexp.match(s) >> @@ -317,10 +318,13 @@ def better_compile(text, file, realfile, mode = >> "exec", lineno = 0): error = [] >> # split the text into lines again >> body = text.split('\n') >> - error.append("Error in compiling python function in %s, line >> %s:\n" % (realfile, lineno)) >> + error.append("Error in compiling python function in %s, line >> %s:\n" % (realfile, e.lineno)) if hasattr(e, "lineno"): >> error.append("The code lines resulting in this error >> were:") >> - error.extend(_print_trace(body, e.lineno)) >> + # e.lineno: line's position in reaflile >> + # lineno: function name's "position -1" in realfile >> + # e.lineno - lineno: line's relative position in function >> + error.extend(_print_trace(body, e.lineno - lineno)) >> else: >> error.append("The function causing this error was:") >> for line in body: >> @@ -1157,14 +1161,14 @@ def edit_metadata(meta_lines, variables, >> varfunc, match_overrides=False): >> var_res = {} >> if match_overrides: >> - override_re = '(_[a-zA-Z0-9-_$(){}]+)?' >> + override_re = r'(_[a-zA-Z0-9-_$(){}]+)?' >> else: >> override_re = '' >> for var in variables: >> if var.endswith('()'): >> - var_res[var] = >> re.compile('^(%s%s)[ \\t]*\([ \\t]*\)[ \\t]*{' % (var[:-2].rstrip(), >> override_re)) >> + var_res[var] = >> re.compile(r'^(%s%s)[ \\t]*\([ \\t]*\)[ \\t]*{' % (var[:-2].rstrip(), >> override_re)) else: >> - var_res[var] = >> re.compile('^(%s%s)[ \\t]*[?+:.]*=[+.]*[ \\t]*(["\'])' % (var, >> override_re)) >> + var_res[var] = >> re.compile(r'^(%s%s)[ \\t]*[?+:.]*=[+.]*[ \\t]*(["\'])' % (var, >> override_re)) updated = False >> varset_start = '' >> @@ -1544,12 +1548,9 @@ def export_proxies(d): >> def load_plugins(logger, plugins, pluginpath): >> def load_plugin(name): >> logger.debug(1, 'Loading plugin %s' % name) >> - fp, pathname, description = imp.find_module(name, >> [pluginpath]) >> - try: >> - return imp.load_module(name, fp, pathname, description) >> - finally: >> - if fp: >> - fp.close() >> + spec = importlib.machinery.PathFinder.find_spec(name, >> path=[pluginpath] ) >> + if spec: >> + return spec.loader.load_module() >> >> logger.debug(1, 'Loading plugins from %s...' % pluginpath) >> -- Siemens AG, Corporate Technology, CT RDA IOT SES-DE Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] bitbake: Update to fixed master revision 2018-11-22 13:14 ` Jan Kiszka @ 2018-11-22 13:18 ` Henning Schild 2018-11-22 13:25 ` Jan Kiszka 2018-11-22 13:19 ` Jan Kiszka 1 sibling, 1 reply; 20+ messages in thread From: Henning Schild @ 2018-11-22 13:18 UTC (permalink / raw) To: Jan Kiszka; +Cc: isar-users Am Thu, 22 Nov 2018 14:14:11 +0100 schrieb Jan Kiszka <jan.kiszka@siemens.com>: > On 22.11.18 14:12, Henning Schild wrote: > > I got a report that bitbake 1.40 and this one are affected by a > > "gitsm://" bug. Still waiting for details but this will only fix one > > new bitbake bug. > > Was there a reason to bump, except wanting to stay up to date? > > Broken multiconfig in current next. So far a downstream issue > (jailhouse-images, possibly other multiconfig-using layers), with > patch 3 then also an upstream topic. But patch 3 is needed for other > reasons (see log). Is that the answer to 1.37->1.40 or just 1.40 -> this ? > Please report/track the bitbake issue upstream! Will do, i do not even know what the problem is, or if it is known. Henning > Jan > > > > > Henning > > > > Am Thu, 22 Nov 2018 13:58:38 +0100 > > schrieb "[ext] Jan Kiszka" <jan.kiszka@siemens.com>: > > > >> From: Jan Kiszka <jan.kiszka@siemens.com> > >> > >> This primarily pulls in the essential fix f2106a3a7675 for > >> multiconfig setups. > >> > >> Origin: https://github.com/openembedded/bitbake.git > >> Commit: 19dee675bb9ad012d28e1e57a888931355a831cb > >> Author: Richard Purdie <richard.purdie@linuxfoundation.org> > >> Date: Thu Nov 22 11:59:58 2018 +0000 > >> > >> tests/fetch: Update after recent gitsm message changes > >> > >> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> > >> --- > >> bitbake/bin/toaster | 4 +- > >> .../bitbake-user-manual-intro.xml | 13 +++- > >> .../bitbake-user-manual-metadata.xml | 31 > >> ++++++++- .../bitbake-user-manual-ref-variables.xml | 59 > >> ++++++++++++++--- .../figures/bb_multiconfig_files.png > >> | Bin 0 -> 19991 bytes > >> bitbake/lib/bb/cooker.py | 9 +-- > >> bitbake/lib/bb/data_smart.py | 9 ++- > >> bitbake/lib/bb/fetch2/__init__.py | 1 + > >> bitbake/lib/bb/fetch2/git.py | 13 ++-- > >> bitbake/lib/bb/fetch2/gitsm.py | 71 > >> ++++++++++----------- > >> bitbake/lib/bb/fetch2/npm.py | 2 +- > >> bitbake/lib/bb/parse/ast.py | 2 +- > >> bitbake/lib/bb/parse/parse_py/BBHandler.py | 2 +- > >> bitbake/lib/bb/server/process.py | 15 +++-- > >> bitbake/lib/bb/siggen.py | 10 +-- > >> bitbake/lib/bb/tests/fetch.py | 5 +- > >> bitbake/lib/bb/utils.py | 31 ++++----- > >> 17 files changed, 181 insertions(+), 96 deletions(-) > >> > >> diff --git a/bitbake/bin/toaster b/bitbake/bin/toaster > >> index 9fffbc6..ecf66fa 100755 > >> --- a/bitbake/bin/toaster > >> +++ b/bitbake/bin/toaster > >> @@ -161,7 +161,9 @@ fi > >> > >> export BBBASEDIR=`dirname $TOASTER`/.. > >> MANAGE="python3 $BBBASEDIR/lib/toaster/manage.py" > >> -OE_ROOT=`dirname $TOASTER`/../.. > >> +if [ -z "$OE_ROOT" ]; then > >> + OE_ROOT=`dirname $TOASTER`/../.. > >> +fi > >> > >> # this is the configuraton file we are using for toaster > >> # we are using the same logic that oe-setup-builddir uses > >> diff --git > >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml > >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml > >> index 9e2e6b2..f7d312a 100644 --- > >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml +++ > >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml @@ > >> -342,13 +342,14 @@ <para> > >> When you name an append file, you can use the > >> - wildcard character (%) to allow for matching > >> recipe names. > >> + "<filename>%</filename>" wildcard character to > >> allow for matching > >> + recipe names. > >> For example, suppose you have an append file > >> named as follows: > >> <literallayout class='monospaced'> > >> busybox_1.21.%.bbappend > >> </literallayout> > >> - That append file would match any > >> <filename>busybox_1.21.x.bb</filename> > >> + That append file would match any > >> <filename>busybox_1.21.</filename><replaceable>x</replaceable><filename>.bb</filename> > >> version of the recipe. So, the append file would match the > >> following recipe names: <literallayout class='monospaced'> > >> @@ -356,6 +357,14 @@ > >> busybox_1.21.2.bb > >> busybox_1.21.3.bb > >> </literallayout> > >> + <note><title>Important</title> > >> + The use of the "<filename>%</filename>" > >> character > >> + is limited in that it only works directly in > >> front of the > >> + <filename>.bbappend</filename> portion of the > >> append file's > >> + name. > >> + You cannot use the wildcard character in any > >> other > >> + location of the name. > >> + </note> > >> If the <filename>busybox</filename> recipe was > >> updated to <filename>busybox_1.3.0.bb</filename>, the append name > >> would not match. > >> diff --git > >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml > >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml > >> index fc55ef6..2490f6e 100644 --- > >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml > >> +++ > >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml > >> @@ -352,8 +352,9 @@ FOO2_remove = "abc def" </literallayout> The > >> variable <filename>FOO</filename> becomes > >> - " 789 123456 " and <filename>FOO2</filename> > >> becomes > >> - " ghi abcdef ". > >> + " 789 123456 " > >> + and <filename>FOO2</filename> becomes > >> + " ghi abcdef ". > >> </para> > >> > >> <para> > >> @@ -2751,4 +2752,30 @@ > >> </itemizedlist> > >> </para> > >> </section> > >> + > >> + <section id='wildcard-support-in-variables'> > >> + <title>Wildcard Support in Variables</title> > >> + > >> + <para> > >> + Support for wildcard use in variables varies depending > >> on the > >> + context in which it is used. > >> + For example, some variables and file names allow > >> limited use of > >> + wildcards through the "<filename>%</filename>" and > >> + "<filename>*</filename>" characters. > >> + Other variables or names support Python's > >> + <ulink > >> url='https://docs.python.org/3/library/glob.html'><filename>glob</filename></ulink> > >> + syntax, > >> + <ulink > >> url='https://docs.python.org/3/library/fnmatch.html#module-fnmatch'><filename>fnmatch</filename></ulink> > >> + syntax, or > >> + <ulink > >> url='https://docs.python.org/3/library/re.html#re'><filename>Regular > >> Expression (re)</filename></ulink> > >> + syntax. > >> + </para> > >> + > >> + <para> > >> + For variables that have wildcard suport, the > >> + documentation describes which form of wildcard, its > >> + use, and its limitations. > >> + </para> > >> + </section> > >> + > >> </chapter> > >> diff --git > >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml > >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml > >> index c327af5..a84b2bc 100644 --- > >> a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml > >> +++ > >> b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml > >> @@ -115,7 +115,8 @@ is either not set or set to "0". > >> </para></listitem> <listitem><para> > >> - Limited support for wildcard matching > >> against the > >> + Limited support for the > >> "<filename>*</filename>" > >> + wildcard character for matching > >> against the beginning of host names exists. > >> For example, the following setting > >> matches <filename>git.gnu.org</filename>, > >> @@ -124,6 +125,20 @@ > >> <literallayout class='monospaced'> > >> BB_ALLOWED_NETWORKS = "*.gnu.org" > >> </literallayout> > >> + <note><title>Important</title> > >> + <para>The use of the > >> "<filename>*</filename>" > >> + character only works at the > >> beginning of > >> + a host name and it must be > >> isolated from > >> + the remainder of the host name. > >> + You cannot use the wildcard > >> character in any > >> + other location of the name or > >> combined with > >> + the front part of the name.</para> > >> + > >> + <para>For example, > >> + <filename>*.foo.bar</filename> is > >> supported, > >> + while > >> <filename>*aa.foo.bar</filename> is not. > >> + </para> > >> + </note> > >> </para></listitem> > >> <listitem><para> > >> Mirrors not in the host list are > >> skipped and @@ -1082,7 +1097,19 @@ > >> > >> <glossentry > >> id='var-BBFILES'><glossterm>BBFILES</glossterm> <glossdef> > >> - <para>List of recipe files BitBake uses to build > >> software.</para> > >> + <para> > >> + A space-separated list of recipe files BitBake > >> uses to > >> + build software. > >> + </para> > >> + > >> + <para> > >> + When specifying recipe files, you can pattern > >> match using > >> + Python's > >> + <ulink > >> url='https://docs.python.org/3/library/glob.html'><filename>glob</filename></ulink> > >> + syntax. > >> + For details on the syntax, see the > >> documentation by > >> + following the previous link. > >> + </para> > >> </glossdef> > >> </glossentry> > >> > >> @@ -1166,15 +1193,19 @@ > >> match any of the expressions. > >> It is as if BitBake does not see them at all. > >> Consequently, matching files are not parsed > >> or otherwise > >> - used by BitBake.</para> > >> + used by BitBake. > >> + </para> > >> + > >> <para> > >> The values you provide are passed to Python's > >> regular expression compiler. > >> + Consequently, the syntax follows Python's > >> Regular > >> + Expression (re) syntax. > >> The expressions are compared against the full > >> paths to the files. > >> For complete syntax information, see Python's > >> documentation at > >> - <ulink > >> url='http://docs.python.org/release/2.3/lib/re-syntax.html'></ulink>. > >> + <ulink > >> url='http://docs.python.org/3/library/re.html#re'></ulink>. > >> </para> > >> <para> > >> @@ -1933,15 +1964,27 @@ > >> you want to select, and you should set > >> <link > >> linkend='var-PV'><filename>PV</filename></link> accordingly for > >> precedence. > >> - You can use the "<filename>%</filename>" > >> character as a > >> - wildcard to match any number of characters, > >> which can be > >> - useful when specifying versions that contain > >> long revision > >> - numbers that could potentially change. > >> + </para> > >> + > >> + <para> > >> + The <filename>PREFERRED_VERSION</filename> > >> variable > >> + supports limited wildcard use through the > >> + "<filename>%</filename>" character. > >> + You can use the character to match any number > >> of > >> + characters, which can be useful when > >> specifying versions > >> + that contain long revision numbers that > >> potentially change. Here are two examples: > >> <literallayout class='monospaced'> > >> PREFERRED_VERSION_python = "2.7.3" > >> PREFERRED_VERSION_linux-yocto = "4.12%" > >> </literallayout> > >> + <note><title>Important</title> > >> + The use of the "<filename>%</filename>" > >> character > >> + is limited in that it only works at the > >> end of the > >> + string. > >> + You cannot use the wildcard character in > >> any other > >> + location of the string. > >> + </note> > >> </para> > >> </glossdef> > >> </glossentry> > >> diff --git > >> a/bitbake/doc/bitbake-user-manual/figures/bb_multiconfig_files.png > >> b/bitbake/doc/bitbake-user-manual/figures/bb_multiconfig_files.png > >> index > >> e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..041f06403b4cfc7cf7939ce44849d022d7b1337e > >> 100644 GIT binary patch literal 19991 > >> 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 > >> H{!jh|Ff{m- > >> > >> literal 0 > >> HcmV?d00001 > >> > >> diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py > >> index 71a0eba..16681ba 100644 > >> --- a/bitbake/lib/bb/cooker.py > >> +++ b/bitbake/lib/bb/cooker.py > >> @@ -609,14 +609,7 @@ class BBCooker: > >> k2 = k.split(":do_") > >> k = k2[0] > >> ktask = k2[1] > >> - if mc: > >> - # Provider might be from another mc > >> - for mcavailable in self.multiconfigs: > >> - # The first element is empty > >> - if mcavailable: > >> - > >> taskdata[mcavailable].add_provider(localdata[mcavailable], > >> self.recipecaches[mcavailable], k) > >> - else: > >> - taskdata[mc].add_provider(localdata[mc], > >> self.recipecaches[mc], k) > >> + taskdata[mc].add_provider(localdata[mc], > >> self.recipecaches[mc], k) current += 1 > >> if not ktask.startswith("do_"): > >> ktask = "do_%s" % ktask > >> diff --git a/bitbake/lib/bb/data_smart.py > >> b/bitbake/lib/bb/data_smart.py index 6b94fc4..67af380 100644 > >> --- a/bitbake/lib/bb/data_smart.py > >> +++ b/bitbake/lib/bb/data_smart.py > >> @@ -122,7 +122,11 @@ class VariableParse: > >> connector = self.d["_remote_data"] > >> return connector.expandPythonRef(self.varname, > >> code, self.d) > >> - codeobj = compile(code.strip(), self.varname or > >> "<expansion>", "eval") > >> + if self.varname: > >> + varname = 'Var <%s>' % self.varname > >> + else: > >> + varname = '<expansion>' > >> + codeobj = compile(code.strip(), varname, "eval") > >> > >> parser = bb.codeparser.PythonParser(self.varname, > >> logger) parser.parse_python(code) > >> @@ -427,7 +431,8 @@ class DataSmart(MutableMapping): > >> except bb.parse.SkipRecipe: > >> raise > >> except Exception as exc: > >> - raise ExpansionError(varname, s, exc) from exc > >> + tb = sys.exc_info()[2] > >> + raise ExpansionError(varname, s, > >> exc).with_traceback(tb) from exc > >> varparse.value = s > >> > >> diff --git a/bitbake/lib/bb/fetch2/__init__.py > >> b/bitbake/lib/bb/fetch2/__init__.py index 2b62b41..572b71a 100644 > >> --- a/bitbake/lib/bb/fetch2/__init__.py > >> +++ b/bitbake/lib/bb/fetch2/__init__.py > >> @@ -827,6 +827,7 @@ def runfetchcmd(cmd, d, quiet=False, > >> cleanup=None, log=None, workdir=None): 'NO_PROXY', 'no_proxy', > >> 'ALL_PROXY', 'all_proxy', > >> 'GIT_PROXY_COMMAND', > >> + 'GIT_SSH', > >> 'GIT_SSL_CAINFO', > >> 'GIT_SMART_HTTP', > >> 'SSH_AUTH_SOCK', 'SSH_AGENT_PID', > >> diff --git a/bitbake/lib/bb/fetch2/git.py > >> b/bitbake/lib/bb/fetch2/git.py index 15858a6..59a2ee8 100644 > >> --- a/bitbake/lib/bb/fetch2/git.py > >> +++ b/bitbake/lib/bb/fetch2/git.py > >> @@ -488,12 +488,15 @@ class Git(FetchMethod): > >> source_error.append("clone directory not > >> available or not up to date: " + ud.clonedir) > >> if not source_found: > >> - if ud.shallow and os.path.exists(ud.fullshallow): > >> - bb.utils.mkdirhier(destdir) > >> - runfetchcmd("tar -xzf %s" % ud.fullshallow, d, > >> workdir=destdir) > >> - source_found = True > >> + if ud.shallow: > >> + if os.path.exists(ud.fullshallow): > >> + bb.utils.mkdirhier(destdir) > >> + runfetchcmd("tar -xzf %s" % ud.fullshallow, d, > >> workdir=destdir) > >> + source_found = True > >> + else: > >> + source_error.append("shallow clone not > >> available: " + ud.fullshallow) else: > >> - source_error.append("shallow clone not enabled or > >> not available: " + ud.fullshallow) > >> + source_error.append("shallow clone not enabled") > >> > >> if not source_found: > >> raise bb.fetch2.UnpackError("No up to date source > >> found: " + "; ".join(source_error), ud.url) diff --git > >> a/bitbake/lib/bb/fetch2/gitsm.py b/bitbake/lib/bb/fetch2/gitsm.py > >> index 0a982da..35729db 100644 --- a/bitbake/lib/bb/fetch2/gitsm.py > >> +++ b/bitbake/lib/bb/fetch2/gitsm.py > >> @@ -92,7 +92,7 @@ class GitSM(Git): > >> url = uris[module].replace('%s:' % proto, 'gitsm:', > >> 1) url += ';protocol=%s' % proto > >> url += ";name=%s" % module > >> - url += ";bareclone=1;nocheckout=1" > >> + url += ";bareclone=1;nocheckout=1;nobranch=1" > >> > >> ld = d.createCopy() > >> # Not necessary to set SRC_URI, since we're passing > >> the URI to @@ -152,9 +152,9 @@ class GitSM(Git): > >> if submodules and not > >> os.path.exists(os.path.join(repo_conf, 'modules')): > >> os.mkdir(os.path.join(repo_conf, 'modules')) > >> - for module in submodules: > >> - srcpath = os.path.join(ud.clonedir, 'modules', module) > >> - modpath = os.path.join(repo_conf, 'modules', module) > >> + for module, md in submodules.items(): > >> + srcpath = os.path.join(ud.clonedir, 'modules', > >> md['path']) > >> + modpath = os.path.join(repo_conf, 'modules', > >> md['path']) > >> if os.path.exists(srcpath): > >> if os.path.exists(os.path.join(srcpath, '.git')): > >> @@ -187,9 +187,8 @@ class GitSM(Git): > >> # No submodules to update > >> continue > >> > >> - submodules = > >> list(self.parse_gitmodules(gitmodules).keys()) - > >> - self.copy_submodules(submodules, ud, dest, d) > >> + submodules = self.parse_gitmodules(gitmodules) > >> + self.copy_submodules(submodules, ud, dest, d) > >> > >> def unpack(self, ud, destdir, d): > >> Git.unpack(self, ud, destdir, d) > >> @@ -200,7 +199,7 @@ class GitSM(Git): > >> else: > >> repo_conf = os.path.join(ud.destdir, '.git') > >> > >> - submodules = [] > >> + update_submodules = False > >> paths = {} > >> uris = {} > >> local_paths = {} > >> @@ -211,41 +210,41 @@ class GitSM(Git): > >> # No submodules to update > >> continue > >> > >> - for m, md in > >> self.parse_gitmodules(gitmodules).items(): > >> - submodules.append(m) > >> - paths[m] = md['path'] > >> - uris[m] = md['url'] > >> + submodules = self.parse_gitmodules(gitmodules) > >> + self.copy_submodules(submodules, ud, ud.destdir, d) > >> + > >> + submodules_queue = [(module, os.path.join(repo_conf, > >> 'modules', md['path'])) for module, md in submodules.items()] > >> + while len(submodules_queue) != 0: > >> + module, modpath = submodules_queue.pop() > >> > >> - self.copy_submodules(submodules, ud, ud.destdir, d) > >> + # add submodule children recursively > >> + try: > >> + gitmodules = runfetchcmd("%s show > >> HEAD:.gitmodules" % (ud.basecmd), d, quiet=True, workdir=modpath) > >> + for m, md in > >> self.parse_gitmodules(gitmodules).items(): > >> + submodules_queue.append([m, > >> os.path.join(modpath, 'modules', md['path'])]) > >> + except: > >> + # no children > >> + pass > >> > >> - submodules_queue = [(module, os.path.join(repo_conf, > >> 'modules', module)) for module in submodules] > >> - while len(submodules_queue) != 0: > >> - module, modpath = submodules_queue.pop() > >> > >> - # add submodule children recursively > >> - try: > >> - gitmodules = runfetchcmd("%s show > >> HEAD:.gitmodules" % (ud.basecmd), d, quiet=True, workdir=modpath) > >> - for m, md in > >> self.parse_gitmodules(gitmodules).items(): > >> - submodules_queue.append([m, > >> os.path.join(modpath, 'modules', m)]) > >> - except: > >> - # no children > >> - pass > >> + # There are submodules to update > >> + update_submodules = True > >> > >> - # Determine (from the submodule) the correct url to > >> reference > >> - try: > >> - output = runfetchcmd("%(basecmd)s config > >> remote.origin.url" % {'basecmd': ud.basecmd}, d, workdir=modpath) > >> - except bb.fetch2.FetchError as e: > >> - # No remote url defined in this submodule > >> - continue > >> + # Determine (from the submodule) the correct url > >> to reference > >> + try: > >> + output = runfetchcmd("%(basecmd)s config > >> remote.origin.url" % {'basecmd': ud.basecmd}, d, workdir=modpath) > >> + except bb.fetch2.FetchError as e: > >> + # No remote url defined in this submodule > >> + continue > >> > >> - local_paths[module] = output > >> + local_paths[module] = output > >> > >> - # Setup the local URL properly (like git submodule > >> init or sync would do...) > >> - runfetchcmd("%(basecmd)s config > >> submodule.%(module)s.url %(url)s" % {'basecmd': ud.basecmd, > >> 'module': module, 'url' : local_paths[module]}, d, > >> workdir=ud.destdir) > >> + # Setup the local URL properly (like git submodule > >> init or sync would do...) > >> + runfetchcmd("%(basecmd)s config > >> submodule.%(module)s.url %(url)s" % {'basecmd': ud.basecmd, > >> 'module': module, 'url' : local_paths[module]}, d, > >> workdir=ud.destdir) > >> - # Ensure the submodule repository is NOT set to bare, > >> since we're checking it out... > >> - runfetchcmd("%s config core.bare false" % > >> (ud.basecmd), d, quiet=True, workdir=modpath) > >> + # Ensure the submodule repository is NOT set to > >> bare, since we're checking it out... > >> + runfetchcmd("%s config core.bare false" % > >> (ud.basecmd), d, quiet=True, workdir=modpath) > >> - if submodules: > >> + if update_submodules: > >> # Run submodule update, this sets up the directories > >> -- without touching the config runfetchcmd("%s submodule update > >> --recursive --no-fetch" % (ud.basecmd), d, quiet=True, > >> workdir=ud.destdir) diff --git a/bitbake/lib/bb/fetch2/npm.py > >> b/bitbake/lib/bb/fetch2/npm.py index 408dfc3..65bf5a3 100644 --- > >> a/bitbake/lib/bb/fetch2/npm.py +++ b/bitbake/lib/bb/fetch2/npm.py > >> @@ -226,7 +226,7 @@ class Npm(FetchMethod): > >> self._getshrinkeddependencies(obj, > >> data['dependencies'][obj], data['dependencies'][obj]['version'], d, > >> ud, lockdown, manifest, False) return outputurl = "invalid" > >> - if ('resolved' not in data) or (not > >> data['resolved'].startswith('http')): > >> + if ('resolved' not in data) or (not > >> data['resolved'].startswith('http://') and not > >> data['resolved'].startswith('https://')): # will be the case for > >> ${PN} fetchcmd = "npm view %s@%s dist.tarball --registry %s" % > >> (pkg, version, ud.registry) logger.debug(2, "Found this matching > >> URL: %s" % str(fetchcmd)) diff --git a/bitbake/lib/bb/parse/ast.py > >> b/bitbake/lib/bb/parse/ast.py index 9d20c32..6d7c80b 100644 --- > >> a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py > >> @@ -178,7 +178,7 @@ class MethodNode(AstNode): > >> funcname = ("__anon_%s_%s" % (self.lineno, > >> self.filename.translate(MethodNode.tr_tbl))) self.python = True > >> text = "def %s(d):\n" % (funcname) + text > >> - bb.methodpool.insert_method(funcname, text, > >> self.filename, self.lineno - len(self.body)) > >> + bb.methodpool.insert_method(funcname, text, > >> self.filename, self.lineno - len(self.body) - 1) anonfuncs = > >> data.getVar('__BBANONFUNCS', False) or [] > >> anonfuncs.append(funcname) data.setVar('__BBANONFUNCS', anonfuncs) > >> diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py > >> b/bitbake/lib/bb/parse/parse_py/BBHandler.py index e5039e3..01fc47e > >> 100644 --- a/bitbake/lib/bb/parse/parse_py/BBHandler.py > >> +++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py > >> @@ -45,7 +45,7 @@ __addtask_regexp__ = > >> re.compile("addtask\s+(?P<func>\w+)\s*((before\s*(?P< > >> __deltask_regexp__ = re.compile("deltask\s+(?P<func>\w+)") > >> __addhandler_regexp__ = re.compile( r"addhandler\s+(.+)" ) > >> __def_regexp__ = re.compile( r"def\s+(\w+).*:" ) > >> -__python_func_regexp__ = re.compile( r"(\s+.*)|(^$)" ) > >> +__python_func_regexp__ = re.compile( r"(\s+.*)|(^$)|(^#)" ) > >> __infunc__ = [] > >> __inpython__ = False > >> diff --git a/bitbake/lib/bb/server/process.py > >> b/bitbake/lib/bb/server/process.py index 38b923f..4e0d9c2 100644 > >> --- a/bitbake/lib/bb/server/process.py > >> +++ b/bitbake/lib/bb/server/process.py > >> @@ -428,7 +428,11 @@ class BitBakeServer(object): > >> bb.error("Last 10 lines of server log for > >> this session (%s):\n%s" % (logfile, "".join(lines[-10:]))) else: > >> bb.error("Server log for this session > >> (%s):\n%s" % (logfile, "".join(lines))) > >> + else: > >> + bb.error("%s doesn't exist" % logfile) > >> + > >> raise SystemExit(1) > >> + > >> ready.close() > >> > >> def _startServer(self): > >> @@ -452,16 +456,15 @@ def connectProcessServer(sockname, > >> featureset): # AF_UNIX has path length issues so chdir here to > >> workaround cwd = os.getcwd() > >> > >> - try: > >> - os.chdir(os.path.dirname(sockname)) > >> - sock.connect(os.path.basename(sockname)) > >> - finally: > >> - os.chdir(cwd) > >> - > >> readfd = writefd = readfd1 = writefd1 = readfd2 = writefd2 = > >> None eq = command_chan_recv = command_chan = None > >> > >> try: > >> + try: > >> + os.chdir(os.path.dirname(sockname)) > >> + sock.connect(os.path.basename(sockname)) > >> + finally: > >> + os.chdir(cwd) > >> > >> # Send an fd for the remote to write events to > >> readfd, writefd = os.pipe() > >> diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py > >> index 03c824e..fdbb2a3 100644 > >> --- a/bitbake/lib/bb/siggen.py > >> +++ b/bitbake/lib/bb/siggen.py > >> @@ -185,7 +185,7 @@ class > >> SignatureGeneratorBasic(SignatureGenerator): if not > >> self.rundep_check(fn, recipename, task, dep, depname, dataCache): > >> continue if dep not in self.taskhash: > >> - bb.fatal("%s is not in taskhash, caller isn't > >> calling in dependency order?", dep) > >> + bb.fatal("%s is not in taskhash, caller isn't > >> calling in dependency order?" % dep) data = data + > >> self.taskhash[dep] self.runtaskdeps[k].append(dep) > >> > >> @@ -342,10 +342,10 @@ def dump_this_task(outfile, d): > >> def init_colors(enable_color): > >> """Initialise colour dict for passing to > >> compare_sigfiles()""" # First set up the colours > >> - colors = {'color_title': '\033[1;37;40m', > >> - 'color_default': '\033[0;37;40m', > >> - 'color_add': '\033[1;32;40m', > >> - 'color_remove': '\033[1;31;40m', > >> + colors = {'color_title': '\033[1m', > >> + 'color_default': '\033[0m', > >> + 'color_add': '\033[0;32m', > >> + 'color_remove': '\033[0;31m', > >> } > >> # Leave all keys present but clear the values > >> if not enable_color: > >> diff --git a/bitbake/lib/bb/tests/fetch.py > >> b/bitbake/lib/bb/tests/fetch.py index 17909ec..6848095 100644 > >> --- a/bitbake/lib/bb/tests/fetch.py > >> +++ b/bitbake/lib/bb/tests/fetch.py > >> @@ -1708,9 +1708,8 @@ class GitShallowTest(FetcherTest): > >> with self.assertRaises(bb.fetch2.UnpackError) as context: > >> fetcher.unpack(self.d.getVar('WORKDIR')) > >> > >> - self.assertTrue("No up to date source found" in > >> context.exception.msg) > >> - self.assertTrue("clone directory not available or not up > >> to date" in context.exception.msg) > >> - self.assertTrue("shallow clone not enabled or not > >> available" in context.exception.msg) > >> + self.assertIn("No up to date source found", > >> context.exception.msg) > >> + self.assertIn("clone directory not available or not up to > >> date", context.exception.msg) > >> @skipIfNoNetwork() > >> def > >> test_that_unpack_does_work_when_using_git_shallow_tarball_but_tarball_is_not_available(self): > >> diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py > >> index 73b6cb4..13bb5f2 100644 --- a/bitbake/lib/bb/utils.py > >> +++ b/bitbake/lib/bb/utils.py > >> @@ -27,7 +27,8 @@ import bb > >> import bb.msg > >> import multiprocessing > >> import fcntl > >> -import imp > >> +import importlib > >> +from importlib import machinery > >> import itertools > >> import subprocess > >> import glob > >> @@ -43,7 +44,7 @@ from contextlib import contextmanager > >> from ctypes import cdll > >> > >> logger = logging.getLogger("BitBake.Util") > >> -python_extensions = [e for e, _, _ in imp.get_suffixes()] > >> +python_extensions = importlib.machinery.all_suffixes() > >> > >> > >> def clean_context(): > >> @@ -68,8 +69,8 @@ class VersionStringException(Exception): > >> > >> def explode_version(s): > >> r = [] > >> - alpha_regexp = re.compile('^([a-zA-Z]+)(.*)$') > >> - numeric_regexp = re.compile('^(\d+)(.*)$') > >> + alpha_regexp = re.compile(r'^([a-zA-Z]+)(.*)$') > >> + numeric_regexp = re.compile(r'^(\d+)(.*)$') > >> while (s != ''): > >> if s[0] in string.digits: > >> m = numeric_regexp.match(s) > >> @@ -317,10 +318,13 @@ def better_compile(text, file, realfile, > >> mode = "exec", lineno = 0): error = [] > >> # split the text into lines again > >> body = text.split('\n') > >> - error.append("Error in compiling python function in %s, > >> line %s:\n" % (realfile, lineno)) > >> + error.append("Error in compiling python function in %s, > >> line %s:\n" % (realfile, e.lineno)) if hasattr(e, "lineno"): > >> error.append("The code lines resulting in this error > >> were:") > >> - error.extend(_print_trace(body, e.lineno)) > >> + # e.lineno: line's position in reaflile > >> + # lineno: function name's "position -1" in realfile > >> + # e.lineno - lineno: line's relative position in > >> function > >> + error.extend(_print_trace(body, e.lineno - lineno)) > >> else: > >> error.append("The function causing this error was:") > >> for line in body: > >> @@ -1157,14 +1161,14 @@ def edit_metadata(meta_lines, variables, > >> varfunc, match_overrides=False): > >> var_res = {} > >> if match_overrides: > >> - override_re = '(_[a-zA-Z0-9-_$(){}]+)?' > >> + override_re = r'(_[a-zA-Z0-9-_$(){}]+)?' > >> else: > >> override_re = '' > >> for var in variables: > >> if var.endswith('()'): > >> - var_res[var] = > >> re.compile('^(%s%s)[ \\t]*\([ \\t]*\)[ \\t]*{' % > >> (var[:-2].rstrip(), override_re)) > >> + var_res[var] = > >> re.compile(r'^(%s%s)[ \\t]*\([ \\t]*\)[ \\t]*{' % > >> (var[:-2].rstrip(), override_re)) else: > >> - var_res[var] = > >> re.compile('^(%s%s)[ \\t]*[?+:.]*=[+.]*[ \\t]*(["\'])' % (var, > >> override_re)) > >> + var_res[var] = > >> re.compile(r'^(%s%s)[ \\t]*[?+:.]*=[+.]*[ \\t]*(["\'])' % (var, > >> override_re)) updated = False > >> varset_start = '' > >> @@ -1544,12 +1548,9 @@ def export_proxies(d): > >> def load_plugins(logger, plugins, pluginpath): > >> def load_plugin(name): > >> logger.debug(1, 'Loading plugin %s' % name) > >> - fp, pathname, description = imp.find_module(name, > >> [pluginpath]) > >> - try: > >> - return imp.load_module(name, fp, pathname, > >> description) > >> - finally: > >> - if fp: > >> - fp.close() > >> + spec = importlib.machinery.PathFinder.find_spec(name, > >> path=[pluginpath] ) > >> + if spec: > >> + return spec.loader.load_module() > >> > >> logger.debug(1, 'Loading plugins from %s...' % pluginpath) > >> > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] bitbake: Update to fixed master revision 2018-11-22 13:18 ` Henning Schild @ 2018-11-22 13:25 ` Jan Kiszka 2018-11-22 13:58 ` Henning Schild 0 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2018-11-22 13:25 UTC (permalink / raw) To: Henning Schild; +Cc: isar-users On 22.11.18 14:18, Henning Schild wrote: > Am Thu, 22 Nov 2018 14:14:11 +0100 > schrieb Jan Kiszka <jan.kiszka@siemens.com>: > >> On 22.11.18 14:12, Henning Schild wrote: >>> I got a report that bitbake 1.40 and this one are affected by a >>> "gitsm://" bug. Still waiting for details but this will only fix one >>> new bitbake bug. >>> Was there a reason to bump, except wanting to stay up to date? >> >> Broken multiconfig in current next. So far a downstream issue >> (jailhouse-images, possibly other multiconfig-using layers), with >> patch 3 then also an upstream topic. But patch 3 is needed for other >> reasons (see log). > > Is that the answer to 1.37->1.40 or just 1.40 -> this ? > The step 1.37->1.40 caused the multiconfig problem (http://lists.openembedded.org/pipermail/bitbake-devel/2018-November/019558.html) that is now fixed with this update again. Jan -- Siemens AG, Corporate Technology, CT RDA IOT SES-DE Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] bitbake: Update to fixed master revision 2018-11-22 13:25 ` Jan Kiszka @ 2018-11-22 13:58 ` Henning Schild 2018-11-22 14:28 ` Jan Kiszka 0 siblings, 1 reply; 20+ messages in thread From: Henning Schild @ 2018-11-22 13:58 UTC (permalink / raw) To: Jan Kiszka; +Cc: isar-users Am Thu, 22 Nov 2018 14:25:25 +0100 schrieb Jan Kiszka <jan.kiszka@siemens.com>: > On 22.11.18 14:18, Henning Schild wrote: > > Am Thu, 22 Nov 2018 14:14:11 +0100 > > schrieb Jan Kiszka <jan.kiszka@siemens.com>: > > > >> On 22.11.18 14:12, Henning Schild wrote: > >>> I got a report that bitbake 1.40 and this one are affected by a > >>> "gitsm://" bug. Still waiting for details but this will only fix > >>> one new bitbake bug. > >>> Was there a reason to bump, except wanting to stay up to date? > >> > >> Broken multiconfig in current next. So far a downstream issue > >> (jailhouse-images, possibly other multiconfig-using layers), with > >> patch 3 then also an upstream topic. But patch 3 is needed for > >> other reasons (see log). > > > > Is that the answer to 1.37->1.40 or just 1.40 -> this ? > > > > The step 1.37->1.40 caused the multiconfig problem > (http://lists.openembedded.org/pipermail/bitbake-devel/2018-November/019558.html) > that is now fixed with this update again. I got that, i was already thinking about going back to 1.37 ... maybe. Henning > Jan > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] bitbake: Update to fixed master revision 2018-11-22 13:58 ` Henning Schild @ 2018-11-22 14:28 ` Jan Kiszka 2018-11-22 15:36 ` Henning Schild 0 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2018-11-22 14:28 UTC (permalink / raw) To: Henning Schild; +Cc: isar-users On 22.11.18 14:58, Henning Schild wrote: > Am Thu, 22 Nov 2018 14:25:25 +0100 > schrieb Jan Kiszka <jan.kiszka@siemens.com>: > >> On 22.11.18 14:18, Henning Schild wrote: >>> Am Thu, 22 Nov 2018 14:14:11 +0100 >>> schrieb Jan Kiszka <jan.kiszka@siemens.com>: >>> >>>> On 22.11.18 14:12, Henning Schild wrote: >>>>> I got a report that bitbake 1.40 and this one are affected by a >>>>> "gitsm://" bug. Still waiting for details but this will only fix >>>>> one new bitbake bug. >>>>> Was there a reason to bump, except wanting to stay up to date? >>>> >>>> Broken multiconfig in current next. So far a downstream issue >>>> (jailhouse-images, possibly other multiconfig-using layers), with >>>> patch 3 then also an upstream topic. But patch 3 is needed for >>>> other reasons (see log). >>> >>> Is that the answer to 1.37->1.40 or just 1.40 -> this ? >>> >> >> The step 1.37->1.40 caused the multiconfig problem >> (http://lists.openembedded.org/pipermail/bitbake-devel/2018-November/019558.html) >> that is now fixed with this update again. > > I got that, i was already thinking about going back to 1.37 ... maybe. Well, if we cannot sort out the gitsm issue AND it is blocking for you, I would consider that. Jan -- Siemens AG, Corporate Technology, CT RDA IOT SES-DE Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] bitbake: Update to fixed master revision 2018-11-22 14:28 ` Jan Kiszka @ 2018-11-22 15:36 ` Henning Schild 2018-11-22 15:42 ` Jan Kiszka 0 siblings, 1 reply; 20+ messages in thread From: Henning Schild @ 2018-11-22 15:36 UTC (permalink / raw) To: Jan Kiszka; +Cc: isar-users Am Thu, 22 Nov 2018 15:28:06 +0100 schrieb Jan Kiszka <jan.kiszka@siemens.com>: > On 22.11.18 14:58, Henning Schild wrote: > > Am Thu, 22 Nov 2018 14:25:25 +0100 > > schrieb Jan Kiszka <jan.kiszka@siemens.com>: > > > >> On 22.11.18 14:18, Henning Schild wrote: > >>> Am Thu, 22 Nov 2018 14:14:11 +0100 > >>> schrieb Jan Kiszka <jan.kiszka@siemens.com>: > >>> > >>>> On 22.11.18 14:12, Henning Schild wrote: > >>>>> I got a report that bitbake 1.40 and this one are affected by a > >>>>> "gitsm://" bug. Still waiting for details but this will only fix > >>>>> one new bitbake bug. > >>>>> Was there a reason to bump, except wanting to stay up to date? > >>>> > >>>> Broken multiconfig in current next. So far a downstream issue > >>>> (jailhouse-images, possibly other multiconfig-using layers), with > >>>> patch 3 then also an upstream topic. But patch 3 is needed for > >>>> other reasons (see log). > >>> > >>> Is that the answer to 1.37->1.40 or just 1.40 -> this ? > >>> > >> > >> The step 1.37->1.40 caused the multiconfig problem > >> (http://lists.openembedded.org/pipermail/bitbake-devel/2018-November/019558.html) > >> that is now fixed with this update again. > > > > I got that, i was already thinking about going back to 1.37 ... > > maybe. > > Well, if we cannot sort out the gitsm issue AND it is blocking for > you, I would consider that. gitsm thing is known upstream and we can work around it by adjusting out .gitmodules, bet seems we need one of the changes this patch includes. So i guess it is solved and we want this one merged fast ;). http://lists.openembedded.org/pipermail/bitbake-devel/2018-November/019532.html Henning > Jan > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] bitbake: Update to fixed master revision 2018-11-22 15:36 ` Henning Schild @ 2018-11-22 15:42 ` Jan Kiszka 0 siblings, 0 replies; 20+ messages in thread From: Jan Kiszka @ 2018-11-22 15:42 UTC (permalink / raw) To: Henning Schild, Maksim Osipov; +Cc: isar-users On 22.11.18 16:36, Henning Schild wrote: > Am Thu, 22 Nov 2018 15:28:06 +0100 > schrieb Jan Kiszka <jan.kiszka@siemens.com>: > >> On 22.11.18 14:58, Henning Schild wrote: >>> Am Thu, 22 Nov 2018 14:25:25 +0100 >>> schrieb Jan Kiszka <jan.kiszka@siemens.com>: >>> >>>> On 22.11.18 14:18, Henning Schild wrote: >>>>> Am Thu, 22 Nov 2018 14:14:11 +0100 >>>>> schrieb Jan Kiszka <jan.kiszka@siemens.com>: >>>>> >>>>>> On 22.11.18 14:12, Henning Schild wrote: >>>>>>> I got a report that bitbake 1.40 and this one are affected by a >>>>>>> "gitsm://" bug. Still waiting for details but this will only fix >>>>>>> one new bitbake bug. >>>>>>> Was there a reason to bump, except wanting to stay up to date? >>>>>> >>>>>> Broken multiconfig in current next. So far a downstream issue >>>>>> (jailhouse-images, possibly other multiconfig-using layers), with >>>>>> patch 3 then also an upstream topic. But patch 3 is needed for >>>>>> other reasons (see log). >>>>> >>>>> Is that the answer to 1.37->1.40 or just 1.40 -> this ? >>>>> >>>> >>>> The step 1.37->1.40 caused the multiconfig problem >>>> (http://lists.openembedded.org/pipermail/bitbake-devel/2018-November/019558.html) >>>> that is now fixed with this update again. >>> >>> I got that, i was already thinking about going back to 1.37 ... >>> maybe. >> >> Well, if we cannot sort out the gitsm issue AND it is blocking for >> you, I would consider that. > > gitsm thing is known upstream and we can work around it by adjusting > out .gitmodules, bet seems we need one of the changes this patch > includes. > Perfect! > So i guess it is solved and we want this one merged fast ;). > Shamelessly addressing the maintainer directly then... ;) Jan > http://lists.openembedded.org/pipermail/bitbake-devel/2018-November/019532.html > > Henning > >> Jan >> > -- Siemens AG, Corporate Technology, CT RDA IOT SES-DE Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] bitbake: Update to fixed master revision 2018-11-22 13:14 ` Jan Kiszka 2018-11-22 13:18 ` Henning Schild @ 2018-11-22 13:19 ` Jan Kiszka 1 sibling, 0 replies; 20+ messages in thread From: Jan Kiszka @ 2018-11-22 13:19 UTC (permalink / raw) To: Henning Schild; +Cc: isar-users On 22.11.18 14:14, Jan Kiszka wrote: > On 22.11.18 14:12, Henning Schild wrote: >> I got a report that bitbake 1.40 and this one are affected by a >> "gitsm://" bug. Still waiting for details but this will only fix one >> new bitbake bug. >> Was there a reason to bump, except wanting to stay up to date? > > Broken multiconfig in current next. So far a downstream issue (jailhouse-images, > possibly other multiconfig-using layers), with patch 3 then also an upstream > topic. But patch 3 is needed for other reasons (see log). > > Please report/track the bitbake issue upstream! > BTW, another "feature" of this commit is that it truly aligns our bitbake with a corresponding upstream commit. The previous update left the repo in an inconsistent state behind. Jan -- Siemens AG, Corporate Technology, CT RDA IOT SES-DE Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/3] bitbake: Update to fixed master revision 2018-11-22 12:58 ` [PATCH 1/3] bitbake: Update to fixed master revision Jan Kiszka 2018-11-22 13:12 ` Henning Schild @ 2018-11-23 11:27 ` Maxim Yu. Osipov 1 sibling, 0 replies; 20+ messages in thread From: Maxim Yu. Osipov @ 2018-11-23 11:27 UTC (permalink / raw) To: Jan Kiszka, isar-users On 11/22/18 3:58 PM, Jan Kiszka wrote: > From: Jan Kiszka <jan.kiszka@siemens.com> > > This primarily pulls in the essential fix f2106a3a7675 for multiconfig > setups. > > Origin: https://github.com/openembedded/bitbake.git > Commit: 19dee675bb9ad012d28e1e57a888931355a831cb > Author: Richard Purdie <richard.purdie@linuxfoundation.org> > Date: Thu Nov 22 11:59:58 2018 +0000 > > tests/fetch: Update after recent gitsm message changes Applied to the 'next', Thanks, Maxim. > Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> > --- > bitbake/bin/toaster | 4 +- > .../bitbake-user-manual-intro.xml | 13 +++- > .../bitbake-user-manual-metadata.xml | 31 ++++++++- > .../bitbake-user-manual-ref-variables.xml | 59 ++++++++++++++--- > .../figures/bb_multiconfig_files.png | Bin 0 -> 19991 bytes > bitbake/lib/bb/cooker.py | 9 +-- > bitbake/lib/bb/data_smart.py | 9 ++- > bitbake/lib/bb/fetch2/__init__.py | 1 + > bitbake/lib/bb/fetch2/git.py | 13 ++-- > bitbake/lib/bb/fetch2/gitsm.py | 71 ++++++++++----------- > bitbake/lib/bb/fetch2/npm.py | 2 +- > bitbake/lib/bb/parse/ast.py | 2 +- > bitbake/lib/bb/parse/parse_py/BBHandler.py | 2 +- > bitbake/lib/bb/server/process.py | 15 +++-- > bitbake/lib/bb/siggen.py | 10 +-- > bitbake/lib/bb/tests/fetch.py | 5 +- > bitbake/lib/bb/utils.py | 31 ++++----- > 17 files changed, 181 insertions(+), 96 deletions(-) > > diff --git a/bitbake/bin/toaster b/bitbake/bin/toaster > index 9fffbc6..ecf66fa 100755 > --- a/bitbake/bin/toaster > +++ b/bitbake/bin/toaster > @@ -161,7 +161,9 @@ fi > > export BBBASEDIR=`dirname $TOASTER`/.. > MANAGE="python3 $BBBASEDIR/lib/toaster/manage.py" > -OE_ROOT=`dirname $TOASTER`/../.. > +if [ -z "$OE_ROOT" ]; then > + OE_ROOT=`dirname $TOASTER`/../.. > +fi > > # this is the configuraton file we are using for toaster > # we are using the same logic that oe-setup-builddir uses > diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml > index 9e2e6b2..f7d312a 100644 > --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml > +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml > @@ -342,13 +342,14 @@ > > <para> > When you name an append file, you can use the > - wildcard character (%) to allow for matching recipe names. > + "<filename>%</filename>" wildcard character to allow for matching > + recipe names. > For example, suppose you have an append file named > as follows: > <literallayout class='monospaced'> > busybox_1.21.%.bbappend > </literallayout> > - That append file would match any <filename>busybox_1.21.x.bb</filename> > + That append file would match any <filename>busybox_1.21.</filename><replaceable>x</replaceable><filename>.bb</filename> > version of the recipe. > So, the append file would match the following recipe names: > <literallayout class='monospaced'> > @@ -356,6 +357,14 @@ > busybox_1.21.2.bb > busybox_1.21.3.bb > </literallayout> > + <note><title>Important</title> > + The use of the "<filename>%</filename>" character > + is limited in that it only works directly in front of the > + <filename>.bbappend</filename> portion of the append file's > + name. > + You cannot use the wildcard character in any other > + location of the name. > + </note> > If the <filename>busybox</filename> recipe was updated to > <filename>busybox_1.3.0.bb</filename>, the append name would not > match. > diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml > index fc55ef6..2490f6e 100644 > --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml > +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml > @@ -352,8 +352,9 @@ > FOO2_remove = "abc def" > </literallayout> > The variable <filename>FOO</filename> becomes > - " 789 123456 " and <filename>FOO2</filename> becomes > - " ghi abcdef ". > + " 789 123456 " > + and <filename>FOO2</filename> becomes > + " ghi abcdef ". > </para> > > <para> > @@ -2751,4 +2752,30 @@ > </itemizedlist> > </para> > </section> > + > + <section id='wildcard-support-in-variables'> > + <title>Wildcard Support in Variables</title> > + > + <para> > + Support for wildcard use in variables varies depending on the > + context in which it is used. > + For example, some variables and file names allow limited use of > + wildcards through the "<filename>%</filename>" and > + "<filename>*</filename>" characters. > + Other variables or names support Python's > + <ulink url='https://docs.python.org/3/library/glob.html'><filename>glob</filename></ulink> > + syntax, > + <ulink url='https://docs.python.org/3/library/fnmatch.html#module-fnmatch'><filename>fnmatch</filename></ulink> > + syntax, or > + <ulink url='https://docs.python.org/3/library/re.html#re'><filename>Regular Expression (re)</filename></ulink> > + syntax. > + </para> > + > + <para> > + For variables that have wildcard suport, the > + documentation describes which form of wildcard, its > + use, and its limitations. > + </para> > + </section> > + > </chapter> > diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml > index c327af5..a84b2bc 100644 > --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml > +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml > @@ -115,7 +115,8 @@ > is either not set or set to "0". > </para></listitem> > <listitem><para> > - Limited support for wildcard matching against the > + Limited support for the "<filename>*</filename>" > + wildcard character for matching against the > beginning of host names exists. > For example, the following setting matches > <filename>git.gnu.org</filename>, > @@ -124,6 +125,20 @@ > <literallayout class='monospaced'> > BB_ALLOWED_NETWORKS = "*.gnu.org" > </literallayout> > + <note><title>Important</title> > + <para>The use of the "<filename>*</filename>" > + character only works at the beginning of > + a host name and it must be isolated from > + the remainder of the host name. > + You cannot use the wildcard character in any > + other location of the name or combined with > + the front part of the name.</para> > + > + <para>For example, > + <filename>*.foo.bar</filename> is supported, > + while <filename>*aa.foo.bar</filename> is not. > + </para> > + </note> > </para></listitem> > <listitem><para> > Mirrors not in the host list are skipped and > @@ -1082,7 +1097,19 @@ > > <glossentry id='var-BBFILES'><glossterm>BBFILES</glossterm> > <glossdef> > - <para>List of recipe files BitBake uses to build software.</para> > + <para> > + A space-separated list of recipe files BitBake uses to > + build software. > + </para> > + > + <para> > + When specifying recipe files, you can pattern match using > + Python's > + <ulink url='https://docs.python.org/3/library/glob.html'><filename>glob</filename></ulink> > + syntax. > + For details on the syntax, see the documentation by > + following the previous link. > + </para> > </glossdef> > </glossentry> > > @@ -1166,15 +1193,19 @@ > match any of the expressions. > It is as if BitBake does not see them at all. > Consequently, matching files are not parsed or otherwise > - used by BitBake.</para> > + used by BitBake. > + </para> > + > <para> > The values you provide are passed to Python's regular > expression compiler. > + Consequently, the syntax follows Python's Regular > + Expression (re) syntax. > The expressions are compared against the full paths to > the files. > For complete syntax information, see Python's > documentation at > - <ulink url='http://docs.python.org/release/2.3/lib/re-syntax.html'></ulink>. > + <ulink url='http://docs.python.org/3/library/re.html#re'></ulink>. > </para> > > <para> > @@ -1933,15 +1964,27 @@ > you want to select, and you should set > <link linkend='var-PV'><filename>PV</filename></link> > accordingly for precedence. > - You can use the "<filename>%</filename>" character as a > - wildcard to match any number of characters, which can be > - useful when specifying versions that contain long revision > - numbers that could potentially change. > + </para> > + > + <para> > + The <filename>PREFERRED_VERSION</filename> variable > + supports limited wildcard use through the > + "<filename>%</filename>" character. > + You can use the character to match any number of > + characters, which can be useful when specifying versions > + that contain long revision numbers that potentially change. > Here are two examples: > <literallayout class='monospaced'> > PREFERRED_VERSION_python = "2.7.3" > PREFERRED_VERSION_linux-yocto = "4.12%" > </literallayout> > + <note><title>Important</title> > + The use of the "<filename>%</filename>" character > + is limited in that it only works at the end of the > + string. > + You cannot use the wildcard character in any other > + location of the string. > + </note> > </para> > </glossdef> > </glossentry> > diff --git a/bitbake/doc/bitbake-user-manual/figures/bb_multiconfig_files.png b/bitbake/doc/bitbake-user-manual/figures/bb_multiconfig_files.png > index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..041f06403b4cfc7cf7939ce44849d022d7b1337e 100644 > GIT binary patch > literal 19991 > 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 > H{!jh|Ff{m- > > literal 0 > HcmV?d00001 > > diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py > index 71a0eba..16681ba 100644 > --- a/bitbake/lib/bb/cooker.py > +++ b/bitbake/lib/bb/cooker.py > @@ -609,14 +609,7 @@ class BBCooker: > k2 = k.split(":do_") > k = k2[0] > ktask = k2[1] > - if mc: > - # Provider might be from another mc > - for mcavailable in self.multiconfigs: > - # The first element is empty > - if mcavailable: > - taskdata[mcavailable].add_provider(localdata[mcavailable], self.recipecaches[mcavailable], k) > - else: > - taskdata[mc].add_provider(localdata[mc], self.recipecaches[mc], k) > + taskdata[mc].add_provider(localdata[mc], self.recipecaches[mc], k) > current += 1 > if not ktask.startswith("do_"): > ktask = "do_%s" % ktask > diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py > index 6b94fc4..67af380 100644 > --- a/bitbake/lib/bb/data_smart.py > +++ b/bitbake/lib/bb/data_smart.py > @@ -122,7 +122,11 @@ class VariableParse: > connector = self.d["_remote_data"] > return connector.expandPythonRef(self.varname, code, self.d) > > - codeobj = compile(code.strip(), self.varname or "<expansion>", "eval") > + if self.varname: > + varname = 'Var <%s>' % self.varname > + else: > + varname = '<expansion>' > + codeobj = compile(code.strip(), varname, "eval") > > parser = bb.codeparser.PythonParser(self.varname, logger) > parser.parse_python(code) > @@ -427,7 +431,8 @@ class DataSmart(MutableMapping): > except bb.parse.SkipRecipe: > raise > except Exception as exc: > - raise ExpansionError(varname, s, exc) from exc > + tb = sys.exc_info()[2] > + raise ExpansionError(varname, s, exc).with_traceback(tb) from exc > > varparse.value = s > > diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py > index 2b62b41..572b71a 100644 > --- a/bitbake/lib/bb/fetch2/__init__.py > +++ b/bitbake/lib/bb/fetch2/__init__.py > @@ -827,6 +827,7 @@ def runfetchcmd(cmd, d, quiet=False, cleanup=None, log=None, workdir=None): > 'NO_PROXY', 'no_proxy', > 'ALL_PROXY', 'all_proxy', > 'GIT_PROXY_COMMAND', > + 'GIT_SSH', > 'GIT_SSL_CAINFO', > 'GIT_SMART_HTTP', > 'SSH_AUTH_SOCK', 'SSH_AGENT_PID', > diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py > index 15858a6..59a2ee8 100644 > --- a/bitbake/lib/bb/fetch2/git.py > +++ b/bitbake/lib/bb/fetch2/git.py > @@ -488,12 +488,15 @@ class Git(FetchMethod): > source_error.append("clone directory not available or not up to date: " + ud.clonedir) > > if not source_found: > - if ud.shallow and os.path.exists(ud.fullshallow): > - bb.utils.mkdirhier(destdir) > - runfetchcmd("tar -xzf %s" % ud.fullshallow, d, workdir=destdir) > - source_found = True > + if ud.shallow: > + if os.path.exists(ud.fullshallow): > + bb.utils.mkdirhier(destdir) > + runfetchcmd("tar -xzf %s" % ud.fullshallow, d, workdir=destdir) > + source_found = True > + else: > + source_error.append("shallow clone not available: " + ud.fullshallow) > else: > - source_error.append("shallow clone not enabled or not available: " + ud.fullshallow) > + source_error.append("shallow clone not enabled") > > if not source_found: > raise bb.fetch2.UnpackError("No up to date source found: " + "; ".join(source_error), ud.url) > diff --git a/bitbake/lib/bb/fetch2/gitsm.py b/bitbake/lib/bb/fetch2/gitsm.py > index 0a982da..35729db 100644 > --- a/bitbake/lib/bb/fetch2/gitsm.py > +++ b/bitbake/lib/bb/fetch2/gitsm.py > @@ -92,7 +92,7 @@ class GitSM(Git): > url = uris[module].replace('%s:' % proto, 'gitsm:', 1) > url += ';protocol=%s' % proto > url += ";name=%s" % module > - url += ";bareclone=1;nocheckout=1" > + url += ";bareclone=1;nocheckout=1;nobranch=1" > > ld = d.createCopy() > # Not necessary to set SRC_URI, since we're passing the URI to > @@ -152,9 +152,9 @@ class GitSM(Git): > if submodules and not os.path.exists(os.path.join(repo_conf, 'modules')): > os.mkdir(os.path.join(repo_conf, 'modules')) > > - for module in submodules: > - srcpath = os.path.join(ud.clonedir, 'modules', module) > - modpath = os.path.join(repo_conf, 'modules', module) > + for module, md in submodules.items(): > + srcpath = os.path.join(ud.clonedir, 'modules', md['path']) > + modpath = os.path.join(repo_conf, 'modules', md['path']) > > if os.path.exists(srcpath): > if os.path.exists(os.path.join(srcpath, '.git')): > @@ -187,9 +187,8 @@ class GitSM(Git): > # No submodules to update > continue > > - submodules = list(self.parse_gitmodules(gitmodules).keys()) > - > - self.copy_submodules(submodules, ud, dest, d) > + submodules = self.parse_gitmodules(gitmodules) > + self.copy_submodules(submodules, ud, dest, d) > > def unpack(self, ud, destdir, d): > Git.unpack(self, ud, destdir, d) > @@ -200,7 +199,7 @@ class GitSM(Git): > else: > repo_conf = os.path.join(ud.destdir, '.git') > > - submodules = [] > + update_submodules = False > paths = {} > uris = {} > local_paths = {} > @@ -211,41 +210,41 @@ class GitSM(Git): > # No submodules to update > continue > > - for m, md in self.parse_gitmodules(gitmodules).items(): > - submodules.append(m) > - paths[m] = md['path'] > - uris[m] = md['url'] > + submodules = self.parse_gitmodules(gitmodules) > + self.copy_submodules(submodules, ud, ud.destdir, d) > + > + submodules_queue = [(module, os.path.join(repo_conf, 'modules', md['path'])) for module, md in submodules.items()] > + while len(submodules_queue) != 0: > + module, modpath = submodules_queue.pop() > > - self.copy_submodules(submodules, ud, ud.destdir, d) > + # add submodule children recursively > + try: > + gitmodules = runfetchcmd("%s show HEAD:.gitmodules" % (ud.basecmd), d, quiet=True, workdir=modpath) > + for m, md in self.parse_gitmodules(gitmodules).items(): > + submodules_queue.append([m, os.path.join(modpath, 'modules', md['path'])]) > + except: > + # no children > + pass > > - submodules_queue = [(module, os.path.join(repo_conf, 'modules', module)) for module in submodules] > - while len(submodules_queue) != 0: > - module, modpath = submodules_queue.pop() > > - # add submodule children recursively > - try: > - gitmodules = runfetchcmd("%s show HEAD:.gitmodules" % (ud.basecmd), d, quiet=True, workdir=modpath) > - for m, md in self.parse_gitmodules(gitmodules).items(): > - submodules_queue.append([m, os.path.join(modpath, 'modules', m)]) > - except: > - # no children > - pass > + # There are submodules to update > + update_submodules = True > > - # Determine (from the submodule) the correct url to reference > - try: > - output = runfetchcmd("%(basecmd)s config remote.origin.url" % {'basecmd': ud.basecmd}, d, workdir=modpath) > - except bb.fetch2.FetchError as e: > - # No remote url defined in this submodule > - continue > + # Determine (from the submodule) the correct url to reference > + try: > + output = runfetchcmd("%(basecmd)s config remote.origin.url" % {'basecmd': ud.basecmd}, d, workdir=modpath) > + except bb.fetch2.FetchError as e: > + # No remote url defined in this submodule > + continue > > - local_paths[module] = output > + local_paths[module] = output > > - # Setup the local URL properly (like git submodule init or sync would do...) > - runfetchcmd("%(basecmd)s config submodule.%(module)s.url %(url)s" % {'basecmd': ud.basecmd, 'module': module, 'url' : local_paths[module]}, d, workdir=ud.destdir) > + # Setup the local URL properly (like git submodule init or sync would do...) > + runfetchcmd("%(basecmd)s config submodule.%(module)s.url %(url)s" % {'basecmd': ud.basecmd, 'module': module, 'url' : local_paths[module]}, d, workdir=ud.destdir) > > - # Ensure the submodule repository is NOT set to bare, since we're checking it out... > - runfetchcmd("%s config core.bare false" % (ud.basecmd), d, quiet=True, workdir=modpath) > + # Ensure the submodule repository is NOT set to bare, since we're checking it out... > + runfetchcmd("%s config core.bare false" % (ud.basecmd), d, quiet=True, workdir=modpath) > > - if submodules: > + if update_submodules: > # Run submodule update, this sets up the directories -- without touching the config > runfetchcmd("%s submodule update --recursive --no-fetch" % (ud.basecmd), d, quiet=True, workdir=ud.destdir) > diff --git a/bitbake/lib/bb/fetch2/npm.py b/bitbake/lib/bb/fetch2/npm.py > index 408dfc3..65bf5a3 100644 > --- a/bitbake/lib/bb/fetch2/npm.py > +++ b/bitbake/lib/bb/fetch2/npm.py > @@ -226,7 +226,7 @@ class Npm(FetchMethod): > self._getshrinkeddependencies(obj, data['dependencies'][obj], data['dependencies'][obj]['version'], d, ud, lockdown, manifest, False) > return > outputurl = "invalid" > - if ('resolved' not in data) or (not data['resolved'].startswith('http')): > + if ('resolved' not in data) or (not data['resolved'].startswith('http://') and not data['resolved'].startswith('https://')): > # will be the case for ${PN} > fetchcmd = "npm view %s@%s dist.tarball --registry %s" % (pkg, version, ud.registry) > logger.debug(2, "Found this matching URL: %s" % str(fetchcmd)) > diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py > index 9d20c32..6d7c80b 100644 > --- a/bitbake/lib/bb/parse/ast.py > +++ b/bitbake/lib/bb/parse/ast.py > @@ -178,7 +178,7 @@ class MethodNode(AstNode): > funcname = ("__anon_%s_%s" % (self.lineno, self.filename.translate(MethodNode.tr_tbl))) > self.python = True > text = "def %s(d):\n" % (funcname) + text > - bb.methodpool.insert_method(funcname, text, self.filename, self.lineno - len(self.body)) > + bb.methodpool.insert_method(funcname, text, self.filename, self.lineno - len(self.body) - 1) > anonfuncs = data.getVar('__BBANONFUNCS', False) or [] > anonfuncs.append(funcname) > data.setVar('__BBANONFUNCS', anonfuncs) > diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/parse_py/BBHandler.py > index e5039e3..01fc47e 100644 > --- a/bitbake/lib/bb/parse/parse_py/BBHandler.py > +++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py > @@ -45,7 +45,7 @@ __addtask_regexp__ = re.compile("addtask\s+(?P<func>\w+)\s*((before\s*(?P< > __deltask_regexp__ = re.compile("deltask\s+(?P<func>\w+)") > __addhandler_regexp__ = re.compile( r"addhandler\s+(.+)" ) > __def_regexp__ = re.compile( r"def\s+(\w+).*:" ) > -__python_func_regexp__ = re.compile( r"(\s+.*)|(^$)" ) > +__python_func_regexp__ = re.compile( r"(\s+.*)|(^$)|(^#)" ) > > __infunc__ = [] > __inpython__ = False > diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py > index 38b923f..4e0d9c2 100644 > --- a/bitbake/lib/bb/server/process.py > +++ b/bitbake/lib/bb/server/process.py > @@ -428,7 +428,11 @@ class BitBakeServer(object): > bb.error("Last 10 lines of server log for this session (%s):\n%s" % (logfile, "".join(lines[-10:]))) > else: > bb.error("Server log for this session (%s):\n%s" % (logfile, "".join(lines))) > + else: > + bb.error("%s doesn't exist" % logfile) > + > raise SystemExit(1) > + > ready.close() > > def _startServer(self): > @@ -452,16 +456,15 @@ def connectProcessServer(sockname, featureset): > # AF_UNIX has path length issues so chdir here to workaround > cwd = os.getcwd() > > - try: > - os.chdir(os.path.dirname(sockname)) > - sock.connect(os.path.basename(sockname)) > - finally: > - os.chdir(cwd) > - > readfd = writefd = readfd1 = writefd1 = readfd2 = writefd2 = None > eq = command_chan_recv = command_chan = None > > try: > + try: > + os.chdir(os.path.dirname(sockname)) > + sock.connect(os.path.basename(sockname)) > + finally: > + os.chdir(cwd) > > # Send an fd for the remote to write events to > readfd, writefd = os.pipe() > diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py > index 03c824e..fdbb2a3 100644 > --- a/bitbake/lib/bb/siggen.py > +++ b/bitbake/lib/bb/siggen.py > @@ -185,7 +185,7 @@ class SignatureGeneratorBasic(SignatureGenerator): > if not self.rundep_check(fn, recipename, task, dep, depname, dataCache): > continue > if dep not in self.taskhash: > - bb.fatal("%s is not in taskhash, caller isn't calling in dependency order?", dep) > + bb.fatal("%s is not in taskhash, caller isn't calling in dependency order?" % dep) > data = data + self.taskhash[dep] > self.runtaskdeps[k].append(dep) > > @@ -342,10 +342,10 @@ def dump_this_task(outfile, d): > def init_colors(enable_color): > """Initialise colour dict for passing to compare_sigfiles()""" > # First set up the colours > - colors = {'color_title': '\033[1;37;40m', > - 'color_default': '\033[0;37;40m', > - 'color_add': '\033[1;32;40m', > - 'color_remove': '\033[1;31;40m', > + colors = {'color_title': '\033[1m', > + 'color_default': '\033[0m', > + 'color_add': '\033[0;32m', > + 'color_remove': '\033[0;31m', > } > # Leave all keys present but clear the values > if not enable_color: > diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py > index 17909ec..6848095 100644 > --- a/bitbake/lib/bb/tests/fetch.py > +++ b/bitbake/lib/bb/tests/fetch.py > @@ -1708,9 +1708,8 @@ class GitShallowTest(FetcherTest): > with self.assertRaises(bb.fetch2.UnpackError) as context: > fetcher.unpack(self.d.getVar('WORKDIR')) > > - self.assertTrue("No up to date source found" in context.exception.msg) > - self.assertTrue("clone directory not available or not up to date" in context.exception.msg) > - self.assertTrue("shallow clone not enabled or not available" in context.exception.msg) > + self.assertIn("No up to date source found", context.exception.msg) > + self.assertIn("clone directory not available or not up to date", context.exception.msg) > > @skipIfNoNetwork() > def test_that_unpack_does_work_when_using_git_shallow_tarball_but_tarball_is_not_available(self): > diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py > index 73b6cb4..13bb5f2 100644 > --- a/bitbake/lib/bb/utils.py > +++ b/bitbake/lib/bb/utils.py > @@ -27,7 +27,8 @@ import bb > import bb.msg > import multiprocessing > import fcntl > -import imp > +import importlib > +from importlib import machinery > import itertools > import subprocess > import glob > @@ -43,7 +44,7 @@ from contextlib import contextmanager > from ctypes import cdll > > logger = logging.getLogger("BitBake.Util") > -python_extensions = [e for e, _, _ in imp.get_suffixes()] > +python_extensions = importlib.machinery.all_suffixes() > > > def clean_context(): > @@ -68,8 +69,8 @@ class VersionStringException(Exception): > > def explode_version(s): > r = [] > - alpha_regexp = re.compile('^([a-zA-Z]+)(.*)$') > - numeric_regexp = re.compile('^(\d+)(.*)$') > + alpha_regexp = re.compile(r'^([a-zA-Z]+)(.*)$') > + numeric_regexp = re.compile(r'^(\d+)(.*)$') > while (s != ''): > if s[0] in string.digits: > m = numeric_regexp.match(s) > @@ -317,10 +318,13 @@ def better_compile(text, file, realfile, mode = "exec", lineno = 0): > error = [] > # split the text into lines again > body = text.split('\n') > - error.append("Error in compiling python function in %s, line %s:\n" % (realfile, lineno)) > + error.append("Error in compiling python function in %s, line %s:\n" % (realfile, e.lineno)) > if hasattr(e, "lineno"): > error.append("The code lines resulting in this error were:") > - error.extend(_print_trace(body, e.lineno)) > + # e.lineno: line's position in reaflile > + # lineno: function name's "position -1" in realfile > + # e.lineno - lineno: line's relative position in function > + error.extend(_print_trace(body, e.lineno - lineno)) > else: > error.append("The function causing this error was:") > for line in body: > @@ -1157,14 +1161,14 @@ def edit_metadata(meta_lines, variables, varfunc, match_overrides=False): > > var_res = {} > if match_overrides: > - override_re = '(_[a-zA-Z0-9-_$(){}]+)?' > + override_re = r'(_[a-zA-Z0-9-_$(){}]+)?' > else: > override_re = '' > for var in variables: > if var.endswith('()'): > - var_res[var] = re.compile('^(%s%s)[ \\t]*\([ \\t]*\)[ \\t]*{' % (var[:-2].rstrip(), override_re)) > + var_res[var] = re.compile(r'^(%s%s)[ \\t]*\([ \\t]*\)[ \\t]*{' % (var[:-2].rstrip(), override_re)) > else: > - var_res[var] = re.compile('^(%s%s)[ \\t]*[?+:.]*=[+.]*[ \\t]*(["\'])' % (var, override_re)) > + var_res[var] = re.compile(r'^(%s%s)[ \\t]*[?+:.]*=[+.]*[ \\t]*(["\'])' % (var, override_re)) > > updated = False > varset_start = '' > @@ -1544,12 +1548,9 @@ def export_proxies(d): > def load_plugins(logger, plugins, pluginpath): > def load_plugin(name): > logger.debug(1, 'Loading plugin %s' % name) > - fp, pathname, description = imp.find_module(name, [pluginpath]) > - try: > - return imp.load_module(name, fp, pathname, description) > - finally: > - if fp: > - fp.close() > + spec = importlib.machinery.PathFinder.find_spec(name, path=[pluginpath] ) > + if spec: > + return spec.loader.load_module() > > logger.debug(1, 'Loading plugins from %s...' % pluginpath) > > -- Maxim Osipov ilbers GmbH Maria-Merian-Str. 8 85521 Ottobrunn Germany +49 (151) 6517 6917 mosipov@ilbers.de http://ilbers.de/ Commercial register Munich, HRB 214197 General Manager: Baurzhan Ismagulov ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 2/3] RECIPE-API-CHANGELOG: Reorder and capitalize sentences 2018-11-22 12:58 [PATCH 0/3] Bitbake fix, kernel-specific package naming Jan Kiszka 2018-11-22 12:58 ` [PATCH 1/3] bitbake: Update to fixed master revision Jan Kiszka @ 2018-11-22 12:58 ` Jan Kiszka 2018-11-22 13:10 ` [PATCH v2 " Jan Kiszka 2018-11-22 12:58 ` [PATCH 3/3] Append KERNEL_NAME to dependent custom modules and u-boot-script Jan Kiszka 2 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2018-11-22 12:58 UTC (permalink / raw) To: isar-users From: Jan Kiszka <jan.kiszka@siemens.com> Use a consistent chronological order (oldest to newest change) by moving the upcoming 0.7 changes to the end. Make sentences out of some statements. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> --- RECIPE-API-CHANGELOG.md | 68 ++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/RECIPE-API-CHANGELOG.md b/RECIPE-API-CHANGELOG.md index 7eb5e09..c95c7ac 100644 --- a/RECIPE-API-CHANGELOG.md +++ b/RECIPE-API-CHANGELOG.md @@ -3,40 +3,6 @@ Recipe API Changelog Baseline: Release v0.5 -Upcoming changes (v0.7) ------------------------ - -### dpkg-raw recipes chown all files to "root:root" - -if your recipes rely on any other ownership, you will have to change file -ownership in the postinst script - -### location of image artifacts - -Align with OpenEmbedded and place image artifacts in a per-machine folder placed -in tmp/deploy (to avoid collisions among other things). - -### more consistent artifact names - -multiconfig image artifacts are all placed in tmp/deploy/images. They include -kernel, initrd and ext4/wic images. A consistent naming scheme is now used: -`IMAGE-DISTRO-MACHINE.TYPE`. This scheme was already used for ext4/wic images -so no visible changes there. Kernel and initrd images are however affected; for -instance: - -``` -vmlinuz-4.9.0-8-armmp_debian-stretch-qemuarm -``` - -is now - -``` -isar-image-base-debian-stretch-qemuarm.vmlinuz-4.9.0-8-armmp -``` - -It should be noted that the `KERNEL_IMAGE` and `INITRD_IMAGE` variables were -updated hence recipes using them shouldn't be impacted per se. - Changes in v0.6 --------------- @@ -106,3 +72,37 @@ reworked and simplified. If your kernel recipe is called `linux-foo_4.18.bb`, you now have to set `KERNEL_NAME = "foo"` in order to select that kernel. Alternatively, a recipe with a different naming scheme can set `KERNEL_NAME_PROVIDED = "foo"` in order to match as well. + +Upcoming changes (v0.7) +----------------------- + +### dpkg-raw recipes chown all files to "root:root" + +If your recipes rely on any other ownership, you will have to change file +ownership in the postinst script. + +### location of image artifacts + +Align with OpenEmbedded and place image artifacts in a per-machine folder placed +in tmp/deploy (to avoid collisions among other things). + +### more consistent artifact names + +Multiconfig image artifacts are all placed in tmp/deploy/images. They include +kernel, initrd and ext4/wic images. A consistent naming scheme is now used: +`IMAGE-DISTRO-MACHINE.TYPE`. This scheme was already used for ext4/wic images +so no visible changes there. Kernel and initrd images are however affected; for +instance: + +``` +vmlinuz-4.9.0-8-armmp_debian-stretch-qemuarm +``` + +is now + +``` +isar-image-base-debian-stretch-qemuarm.vmlinuz-4.9.0-8-armmp +``` + +It should be noted that the `KERNEL_IMAGE` and `INITRD_IMAGE` variables were +updated hence recipes using them shouldn't be impacted per se. -- 2.16.4 ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 2/3] RECIPE-API-CHANGELOG: Reorder and capitalize sentences 2018-11-22 12:58 ` [PATCH 2/3] RECIPE-API-CHANGELOG: Reorder and capitalize sentences Jan Kiszka @ 2018-11-22 13:10 ` Jan Kiszka 2018-11-23 11:28 ` Maxim Yu. Osipov 0 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2018-11-22 13:10 UTC (permalink / raw) To: isar-users Use a consistent chronological order (oldest to newest change) by moving the upcoming 0.7 changes to the end. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> --- Changes in v2: - rebased over next, now a pure moving RECIPE-API-CHANGELOG.md | 94 ++++++++++++++++++++++++------------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/RECIPE-API-CHANGELOG.md b/RECIPE-API-CHANGELOG.md index e3bed1b..b6315e7 100644 --- a/RECIPE-API-CHANGELOG.md +++ b/RECIPE-API-CHANGELOG.md @@ -3,53 +3,6 @@ Recipe API Changelog Baseline: Release v0.5 -Upcoming changes (v0.7) ------------------------ - -### dpkg-raw recipes build method changed - -These packages are now built using the whole dpkg-buildpackage workflow, and -not just packaged as before. - - - all files will be owned by root:root before it might have been 1000:1000 - use postinst to change that (see example-raw) - - a lot of debhelpers will help .. or complain - fix the issues or override the helpers (see example-raw) - -### Set LAYERSERIES_COMPAT_* when an own layer is defined - -When defining an own layer LAYERSERIES_COMPAT_mylayer_root_name has to be set, -the possible values are listed in the variable LAYERSERIES_CORENAMES. - -If you need to express the fact that your layer requires the -layer version higher than existing release corename, use the value 'next'. - -### location of image artifacts - -Align with OpenEmbedded and place image artifacts in a per-machine folder placed -in tmp/deploy (to avoid collisions among other things). - -### more consistent artifact names - -multiconfig image artifacts are all placed in tmp/deploy/images. They include -kernel, initrd and ext4/wic images. A consistent naming scheme is now used: -`IMAGE-DISTRO-MACHINE.TYPE`. This scheme was already used for ext4/wic images -so no visible changes there. Kernel and initrd images are however affected; for -instance: - -``` -vmlinuz-4.9.0-8-armmp_debian-stretch-qemuarm -``` - -is now - -``` -isar-image-base-debian-stretch-qemuarm.vmlinuz-4.9.0-8-armmp -``` - -It should be noted that the `KERNEL_IMAGE` and `INITRD_IMAGE` variables were -updated hence recipes using them shouldn't be impacted per se. - Changes in v0.6 --------------- @@ -119,3 +72,50 @@ reworked and simplified. If your kernel recipe is called `linux-foo_4.18.bb`, you now have to set `KERNEL_NAME = "foo"` in order to select that kernel. Alternatively, a recipe with a different naming scheme can set `KERNEL_NAME_PROVIDED = "foo"` in order to match as well. + +Upcoming changes (v0.7) +----------------------- + +### dpkg-raw recipes build method changed + +These packages are now built using the whole dpkg-buildpackage workflow, and +not just packaged as before. + + - all files will be owned by root:root before it might have been 1000:1000 + use postinst to change that (see example-raw) + - a lot of debhelpers will help .. or complain + fix the issues or override the helpers (see example-raw) + +### Set LAYERSERIES_COMPAT_* when an own layer is defined + +When defining an own layer LAYERSERIES_COMPAT_mylayer_root_name has to be set, +the possible values are listed in the variable LAYERSERIES_CORENAMES. + +If you need to express the fact that your layer requires the +layer version higher than existing release corename, use the value 'next'. + +### location of image artifacts + +Align with OpenEmbedded and place image artifacts in a per-machine folder placed +in tmp/deploy (to avoid collisions among other things). + +### more consistent artifact names + +multiconfig image artifacts are all placed in tmp/deploy/images. They include +kernel, initrd and ext4/wic images. A consistent naming scheme is now used: +`IMAGE-DISTRO-MACHINE.TYPE`. This scheme was already used for ext4/wic images +so no visible changes there. Kernel and initrd images are however affected; for +instance: + +``` +vmlinuz-4.9.0-8-armmp_debian-stretch-qemuarm +``` + +is now + +``` +isar-image-base-debian-stretch-qemuarm.vmlinuz-4.9.0-8-armmp +``` + +It should be noted that the `KERNEL_IMAGE` and `INITRD_IMAGE` variables were +updated hence recipes using them shouldn't be impacted per se. -- 2.16.4 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] RECIPE-API-CHANGELOG: Reorder and capitalize sentences 2018-11-22 13:10 ` [PATCH v2 " Jan Kiszka @ 2018-11-23 11:28 ` Maxim Yu. Osipov 0 siblings, 0 replies; 20+ messages in thread From: Maxim Yu. Osipov @ 2018-11-23 11:28 UTC (permalink / raw) To: Jan Kiszka, isar-users On 11/22/18 4:10 PM, Jan Kiszka wrote: > Use a consistent chronological order (oldest to newest change) by moving > the upcoming 0.7 changes to the end. Applied to the 'next', Thanks, Maxim. > Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> > --- > > Changes in v2: > - rebased over next, now a pure moving > > RECIPE-API-CHANGELOG.md | 94 ++++++++++++++++++++++++------------------------- > 1 file changed, 47 insertions(+), 47 deletions(-) > > diff --git a/RECIPE-API-CHANGELOG.md b/RECIPE-API-CHANGELOG.md > index e3bed1b..b6315e7 100644 > --- a/RECIPE-API-CHANGELOG.md > +++ b/RECIPE-API-CHANGELOG.md > @@ -3,53 +3,6 @@ Recipe API Changelog > > Baseline: Release v0.5 > > -Upcoming changes (v0.7) > ------------------------ > - > -### dpkg-raw recipes build method changed > - > -These packages are now built using the whole dpkg-buildpackage workflow, and > -not just packaged as before. > - > - - all files will be owned by root:root before it might have been 1000:1000 > - use postinst to change that (see example-raw) > - - a lot of debhelpers will help .. or complain > - fix the issues or override the helpers (see example-raw) > - > -### Set LAYERSERIES_COMPAT_* when an own layer is defined > - > -When defining an own layer LAYERSERIES_COMPAT_mylayer_root_name has to be set, > -the possible values are listed in the variable LAYERSERIES_CORENAMES. > - > -If you need to express the fact that your layer requires the > -layer version higher than existing release corename, use the value 'next'. > - > -### location of image artifacts > - > -Align with OpenEmbedded and place image artifacts in a per-machine folder placed > -in tmp/deploy (to avoid collisions among other things). > - > -### more consistent artifact names > - > -multiconfig image artifacts are all placed in tmp/deploy/images. They include > -kernel, initrd and ext4/wic images. A consistent naming scheme is now used: > -`IMAGE-DISTRO-MACHINE.TYPE`. This scheme was already used for ext4/wic images > -so no visible changes there. Kernel and initrd images are however affected; for > -instance: > - > -``` > -vmlinuz-4.9.0-8-armmp_debian-stretch-qemuarm > -``` > - > -is now > - > -``` > -isar-image-base-debian-stretch-qemuarm.vmlinuz-4.9.0-8-armmp > -``` > - > -It should be noted that the `KERNEL_IMAGE` and `INITRD_IMAGE` variables were > -updated hence recipes using them shouldn't be impacted per se. > - > Changes in v0.6 > --------------- > > @@ -119,3 +72,50 @@ reworked and simplified. If your kernel recipe is called `linux-foo_4.18.bb`, > you now have to set `KERNEL_NAME = "foo"` in order to select that kernel. > Alternatively, a recipe with a different naming scheme can set > `KERNEL_NAME_PROVIDED = "foo"` in order to match as well. > + > +Upcoming changes (v0.7) > +----------------------- > + > +### dpkg-raw recipes build method changed > + > +These packages are now built using the whole dpkg-buildpackage workflow, and > +not just packaged as before. > + > + - all files will be owned by root:root before it might have been 1000:1000 > + use postinst to change that (see example-raw) > + - a lot of debhelpers will help .. or complain > + fix the issues or override the helpers (see example-raw) > + > +### Set LAYERSERIES_COMPAT_* when an own layer is defined > + > +When defining an own layer LAYERSERIES_COMPAT_mylayer_root_name has to be set, > +the possible values are listed in the variable LAYERSERIES_CORENAMES. > + > +If you need to express the fact that your layer requires the > +layer version higher than existing release corename, use the value 'next'. > + > +### location of image artifacts > + > +Align with OpenEmbedded and place image artifacts in a per-machine folder placed > +in tmp/deploy (to avoid collisions among other things). > + > +### more consistent artifact names > + > +multiconfig image artifacts are all placed in tmp/deploy/images. They include > +kernel, initrd and ext4/wic images. A consistent naming scheme is now used: > +`IMAGE-DISTRO-MACHINE.TYPE`. This scheme was already used for ext4/wic images > +so no visible changes there. Kernel and initrd images are however affected; for > +instance: > + > +``` > +vmlinuz-4.9.0-8-armmp_debian-stretch-qemuarm > +``` > + > +is now > + > +``` > +isar-image-base-debian-stretch-qemuarm.vmlinuz-4.9.0-8-armmp > +``` > + > +It should be noted that the `KERNEL_IMAGE` and `INITRD_IMAGE` variables were > +updated hence recipes using them shouldn't be impacted per se. > -- Maxim Osipov ilbers GmbH Maria-Merian-Str. 8 85521 Ottobrunn Germany +49 (151) 6517 6917 mosipov@ilbers.de http://ilbers.de/ Commercial register Munich, HRB 214197 General Manager: Baurzhan Ismagulov ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 3/3] Append KERNEL_NAME to dependent custom modules and u-boot-script 2018-11-22 12:58 [PATCH 0/3] Bitbake fix, kernel-specific package naming Jan Kiszka 2018-11-22 12:58 ` [PATCH 1/3] bitbake: Update to fixed master revision Jan Kiszka 2018-11-22 12:58 ` [PATCH 2/3] RECIPE-API-CHANGELOG: Reorder and capitalize sentences Jan Kiszka @ 2018-11-22 12:58 ` Jan Kiszka 2018-11-23 11:28 ` Maxim Yu. Osipov 2 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2018-11-22 12:58 UTC (permalink / raw) To: isar-users From: Jan Kiszka <jan.kiszka@siemens.com> When building different kernels for different images of the same distro/arch tuple via multiconfig, modules and u-boot-script packages become non-differentiable. Address this by appending the kernel name to their binary package names. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> --- RECIPE-API-CHANGELOG.md | 5 +++++ meta-isar/conf/local.conf.sample | 2 +- meta-isar/conf/machine/de0-nano-soc.conf | 2 +- meta-isar/conf/multiconfig/bananapi-stretch.conf | 2 +- meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb | 2 ++ meta/recipes-kernel/linux-module/module.inc | 2 ++ 6 files changed, 12 insertions(+), 3 deletions(-) diff --git a/RECIPE-API-CHANGELOG.md b/RECIPE-API-CHANGELOG.md index c95c7ac..306971e 100644 --- a/RECIPE-API-CHANGELOG.md +++ b/RECIPE-API-CHANGELOG.md @@ -106,3 +106,8 @@ isar-image-base-debian-stretch-qemuarm.vmlinuz-4.9.0-8-armmp It should be noted that the `KERNEL_IMAGE` and `INITRD_IMAGE` variables were updated hence recipes using them shouldn't be impacted per se. + +### Append kernel name to custom module and u-boot-script packages + +These packages depend on a specific kernel. Its identification is now appended +to the binary package names in the form "-${KERNEL_NAME}". diff --git a/meta-isar/conf/local.conf.sample b/meta-isar/conf/local.conf.sample index ffcb7ab..4a60068 100644 --- a/meta-isar/conf/local.conf.sample +++ b/meta-isar/conf/local.conf.sample @@ -160,7 +160,7 @@ CONF_VERSION = "1" # # The default list of extra packages to be installed. -IMAGE_INSTALL = "example-hello example-raw example-module enable-fsck" +IMAGE_INSTALL = "example-hello example-raw example-module-${KERNEL_NAME} enable-fsck" # # Enable cross-compilation support diff --git a/meta-isar/conf/machine/de0-nano-soc.conf b/meta-isar/conf/machine/de0-nano-soc.conf index 63b2cfb..184da4a 100644 --- a/meta-isar/conf/machine/de0-nano-soc.conf +++ b/meta-isar/conf/machine/de0-nano-soc.conf @@ -15,4 +15,4 @@ WKS_FILE ?= "de0-nano-soc" IMAGER_INSTALL += "u-boot-de0-nano-soc" IMAGER_BUILD_DEPS += "u-boot-de0-nano-soc" -IMAGE_INSTALL += "u-boot-tools u-boot-script" +IMAGE_INSTALL += "u-boot-tools u-boot-script-${KERNEL_NAME}" diff --git a/meta-isar/conf/multiconfig/bananapi-stretch.conf b/meta-isar/conf/multiconfig/bananapi-stretch.conf index 7fafe69..bf89652 100644 --- a/meta-isar/conf/multiconfig/bananapi-stretch.conf +++ b/meta-isar/conf/multiconfig/bananapi-stretch.conf @@ -13,7 +13,7 @@ KERNEL_NAME ?= "armmp" DISTRO_APT_SOURCES_append = " conf/distro/debian-stretch-backports.list" DISTRO_APT_PREFERENCES += "conf/multiconfig/preferences.bananapi.conf" -IMAGE_INSTALL += "u-boot-script" +IMAGE_INSTALL += "u-boot-script-${KERNEL_NAME}" IMAGE_TYPE ?= "wic-img" WKS_FILE ?= "bananapi" diff --git a/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb b/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb index 2806ba7..a827c35 100644 --- a/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb +++ b/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb @@ -12,6 +12,8 @@ WKS_FULL_PATH = "${@get_wks_full_path(d)}" DESCRIPTION = "Boot script generator for U-Boot" +PN .= "-${KERNEL_NAME}" + SRC_URI = " \ file://update-u-boot-script \ file://u-boot-script \ diff --git a/meta/recipes-kernel/linux-module/module.inc b/meta/recipes-kernel/linux-module/module.inc index 9af3a93..509dd96 100644 --- a/meta/recipes-kernel/linux-module/module.inc +++ b/meta/recipes-kernel/linux-module/module.inc @@ -9,6 +9,8 @@ FILESPATH =. "${LAYERDIR_core}/recipes-kernel/linux-module/files:" DESCRIPTION ?= "Custom kernel module ${PN}" +PN .= "-${KERNEL_NAME}" + DEPENDS += "linux-headers-${KERNEL_NAME}" SRC_URI += "file://debian/" -- 2.16.4 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 3/3] Append KERNEL_NAME to dependent custom modules and u-boot-script 2018-11-22 12:58 ` [PATCH 3/3] Append KERNEL_NAME to dependent custom modules and u-boot-script Jan Kiszka @ 2018-11-23 11:28 ` Maxim Yu. Osipov 2018-11-23 11:34 ` Jan Kiszka 0 siblings, 1 reply; 20+ messages in thread From: Maxim Yu. Osipov @ 2018-11-23 11:28 UTC (permalink / raw) To: Jan Kiszka, isar-users On 11/22/18 3:58 PM, Jan Kiszka wrote: > From: Jan Kiszka <jan.kiszka@siemens.com> This patch breaks CI's vm_smoke_test causing failure reports (for all targets): Check example module: FAIL To reproduce the problem launch "fast" CI: $ ./scripts/ci_build.sh -q -f $ source isar-init-build-env $ vm_smoke_test -q -f Regards, Maxim. > When building different kernels for different images of the same > distro/arch tuple via multiconfig, modules and u-boot-script packages > become non-differentiable. Address this by appending the kernel name to > their binary package names. > > Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> > --- > RECIPE-API-CHANGELOG.md | 5 +++++ > meta-isar/conf/local.conf.sample | 2 +- > meta-isar/conf/machine/de0-nano-soc.conf | 2 +- > meta-isar/conf/multiconfig/bananapi-stretch.conf | 2 +- > meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb | 2 ++ > meta/recipes-kernel/linux-module/module.inc | 2 ++ > 6 files changed, 12 insertions(+), 3 deletions(-) > > diff --git a/RECIPE-API-CHANGELOG.md b/RECIPE-API-CHANGELOG.md > index c95c7ac..306971e 100644 > --- a/RECIPE-API-CHANGELOG.md > +++ b/RECIPE-API-CHANGELOG.md > @@ -106,3 +106,8 @@ isar-image-base-debian-stretch-qemuarm.vmlinuz-4.9.0-8-armmp > > It should be noted that the `KERNEL_IMAGE` and `INITRD_IMAGE` variables were > updated hence recipes using them shouldn't be impacted per se. > + > +### Append kernel name to custom module and u-boot-script packages > + > +These packages depend on a specific kernel. Its identification is now appended > +to the binary package names in the form "-${KERNEL_NAME}". > diff --git a/meta-isar/conf/local.conf.sample b/meta-isar/conf/local.conf.sample > index ffcb7ab..4a60068 100644 > --- a/meta-isar/conf/local.conf.sample > +++ b/meta-isar/conf/local.conf.sample > @@ -160,7 +160,7 @@ CONF_VERSION = "1" > > # > # The default list of extra packages to be installed. > -IMAGE_INSTALL = "example-hello example-raw example-module enable-fsck" > +IMAGE_INSTALL = "example-hello example-raw example-module-${KERNEL_NAME} enable-fsck" > > # > # Enable cross-compilation support > diff --git a/meta-isar/conf/machine/de0-nano-soc.conf b/meta-isar/conf/machine/de0-nano-soc.conf > index 63b2cfb..184da4a 100644 > --- a/meta-isar/conf/machine/de0-nano-soc.conf > +++ b/meta-isar/conf/machine/de0-nano-soc.conf > @@ -15,4 +15,4 @@ WKS_FILE ?= "de0-nano-soc" > IMAGER_INSTALL += "u-boot-de0-nano-soc" > IMAGER_BUILD_DEPS += "u-boot-de0-nano-soc" > > -IMAGE_INSTALL += "u-boot-tools u-boot-script" > +IMAGE_INSTALL += "u-boot-tools u-boot-script-${KERNEL_NAME}" > diff --git a/meta-isar/conf/multiconfig/bananapi-stretch.conf b/meta-isar/conf/multiconfig/bananapi-stretch.conf > index 7fafe69..bf89652 100644 > --- a/meta-isar/conf/multiconfig/bananapi-stretch.conf > +++ b/meta-isar/conf/multiconfig/bananapi-stretch.conf > @@ -13,7 +13,7 @@ KERNEL_NAME ?= "armmp" > DISTRO_APT_SOURCES_append = " conf/distro/debian-stretch-backports.list" > DISTRO_APT_PREFERENCES += "conf/multiconfig/preferences.bananapi.conf" > > -IMAGE_INSTALL += "u-boot-script" > +IMAGE_INSTALL += "u-boot-script-${KERNEL_NAME}" > > IMAGE_TYPE ?= "wic-img" > WKS_FILE ?= "bananapi" > diff --git a/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb b/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb > index 2806ba7..a827c35 100644 > --- a/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb > +++ b/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb > @@ -12,6 +12,8 @@ WKS_FULL_PATH = "${@get_wks_full_path(d)}" > > DESCRIPTION = "Boot script generator for U-Boot" > > +PN .= "-${KERNEL_NAME}" > + > SRC_URI = " \ > file://update-u-boot-script \ > file://u-boot-script \ > diff --git a/meta/recipes-kernel/linux-module/module.inc b/meta/recipes-kernel/linux-module/module.inc > index 9af3a93..509dd96 100644 > --- a/meta/recipes-kernel/linux-module/module.inc > +++ b/meta/recipes-kernel/linux-module/module.inc > @@ -9,6 +9,8 @@ FILESPATH =. "${LAYERDIR_core}/recipes-kernel/linux-module/files:" > > DESCRIPTION ?= "Custom kernel module ${PN}" > > +PN .= "-${KERNEL_NAME}" > + > DEPENDS += "linux-headers-${KERNEL_NAME}" > > SRC_URI += "file://debian/" > -- Maxim Osipov ilbers GmbH Maria-Merian-Str. 8 85521 Ottobrunn Germany +49 (151) 6517 6917 mosipov@ilbers.de http://ilbers.de/ Commercial register Munich, HRB 214197 General Manager: Baurzhan Ismagulov ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 3/3] Append KERNEL_NAME to dependent custom modules and u-boot-script 2018-11-23 11:28 ` Maxim Yu. Osipov @ 2018-11-23 11:34 ` Jan Kiszka 2018-11-23 11:38 ` [PATCH v2 " Jan Kiszka 0 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2018-11-23 11:34 UTC (permalink / raw) To: Maxim Yu. Osipov, isar-users On 23.11.18 12:28, Maxim Yu. Osipov wrote: > On 11/22/18 3:58 PM, Jan Kiszka wrote: >> From: Jan Kiszka <jan.kiszka@siemens.com> > > This patch breaks CI's vm_smoke_test causing failure reports (for all targets): > > Check example module: FAIL > Mind the share the logs? Would accelerate the analysis. Jan > To reproduce the problem launch "fast" CI: > > $ ./scripts/ci_build.sh -q -f > $ source isar-init-build-env > $ vm_smoke_test -q -f > > > > Regards, > Maxim. > > >> When building different kernels for different images of the same >> distro/arch tuple via multiconfig, modules and u-boot-script packages >> become non-differentiable. Address this by appending the kernel name to >> their binary package names. >> >> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> >> --- >> RECIPE-API-CHANGELOG.md | 5 +++++ >> meta-isar/conf/local.conf.sample | 2 +- >> meta-isar/conf/machine/de0-nano-soc.conf | 2 +- >> meta-isar/conf/multiconfig/bananapi-stretch.conf | 2 +- >> meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb | 2 ++ >> meta/recipes-kernel/linux-module/module.inc | 2 ++ >> 6 files changed, 12 insertions(+), 3 deletions(-) >> >> diff --git a/RECIPE-API-CHANGELOG.md b/RECIPE-API-CHANGELOG.md >> index c95c7ac..306971e 100644 >> --- a/RECIPE-API-CHANGELOG.md >> +++ b/RECIPE-API-CHANGELOG.md >> @@ -106,3 +106,8 @@ isar-image-base-debian-stretch-qemuarm.vmlinuz-4.9.0-8-armmp >> It should be noted that the `KERNEL_IMAGE` and `INITRD_IMAGE` variables were >> updated hence recipes using them shouldn't be impacted per se. >> + >> +### Append kernel name to custom module and u-boot-script packages >> + >> +These packages depend on a specific kernel. Its identification is now appended >> +to the binary package names in the form "-${KERNEL_NAME}". >> diff --git a/meta-isar/conf/local.conf.sample b/meta-isar/conf/local.conf.sample >> index ffcb7ab..4a60068 100644 >> --- a/meta-isar/conf/local.conf.sample >> +++ b/meta-isar/conf/local.conf.sample >> @@ -160,7 +160,7 @@ CONF_VERSION = "1" >> # >> # The default list of extra packages to be installed. >> -IMAGE_INSTALL = "example-hello example-raw example-module enable-fsck" >> +IMAGE_INSTALL = "example-hello example-raw example-module-${KERNEL_NAME} >> enable-fsck" >> # >> # Enable cross-compilation support >> diff --git a/meta-isar/conf/machine/de0-nano-soc.conf >> b/meta-isar/conf/machine/de0-nano-soc.conf >> index 63b2cfb..184da4a 100644 >> --- a/meta-isar/conf/machine/de0-nano-soc.conf >> +++ b/meta-isar/conf/machine/de0-nano-soc.conf >> @@ -15,4 +15,4 @@ WKS_FILE ?= "de0-nano-soc" >> IMAGER_INSTALL += "u-boot-de0-nano-soc" >> IMAGER_BUILD_DEPS += "u-boot-de0-nano-soc" >> -IMAGE_INSTALL += "u-boot-tools u-boot-script" >> +IMAGE_INSTALL += "u-boot-tools u-boot-script-${KERNEL_NAME}" >> diff --git a/meta-isar/conf/multiconfig/bananapi-stretch.conf >> b/meta-isar/conf/multiconfig/bananapi-stretch.conf >> index 7fafe69..bf89652 100644 >> --- a/meta-isar/conf/multiconfig/bananapi-stretch.conf >> +++ b/meta-isar/conf/multiconfig/bananapi-stretch.conf >> @@ -13,7 +13,7 @@ KERNEL_NAME ?= "armmp" >> DISTRO_APT_SOURCES_append = " conf/distro/debian-stretch-backports.list" >> DISTRO_APT_PREFERENCES += "conf/multiconfig/preferences.bananapi.conf" >> -IMAGE_INSTALL += "u-boot-script" >> +IMAGE_INSTALL += "u-boot-script-${KERNEL_NAME}" >> IMAGE_TYPE ?= "wic-img" >> WKS_FILE ?= "bananapi" >> diff --git a/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb >> b/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb >> index 2806ba7..a827c35 100644 >> --- a/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb >> +++ b/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb >> @@ -12,6 +12,8 @@ WKS_FULL_PATH = "${@get_wks_full_path(d)}" >> DESCRIPTION = "Boot script generator for U-Boot" >> +PN .= "-${KERNEL_NAME}" >> + >> SRC_URI = " \ >> file://update-u-boot-script \ >> file://u-boot-script \ >> diff --git a/meta/recipes-kernel/linux-module/module.inc >> b/meta/recipes-kernel/linux-module/module.inc >> index 9af3a93..509dd96 100644 >> --- a/meta/recipes-kernel/linux-module/module.inc >> +++ b/meta/recipes-kernel/linux-module/module.inc >> @@ -9,6 +9,8 @@ FILESPATH =. >> "${LAYERDIR_core}/recipes-kernel/linux-module/files:" >> DESCRIPTION ?= "Custom kernel module ${PN}" >> +PN .= "-${KERNEL_NAME}" >> + >> DEPENDS += "linux-headers-${KERNEL_NAME}" >> SRC_URI += "file://debian/" >> > > -- Siemens AG, Corporate Technology, CT RDA IOT SES-DE Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 3/3] Append KERNEL_NAME to dependent custom modules and u-boot-script 2018-11-23 11:34 ` Jan Kiszka @ 2018-11-23 11:38 ` Jan Kiszka 2018-11-23 12:35 ` Maxim Yu. Osipov 0 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2018-11-23 11:38 UTC (permalink / raw) To: Maxim Yu. Osipov, isar-users When building different kernels for different images of the same distro/arch tuple via multiconfig, modules and u-boot-script packages become non-differentiable. Address this by appending the kernel name to their binary package names. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> --- Changes in v2: - adjust AUTOLOAD of example-module: package name changed, but not the module name RECIPE-API-CHANGELOG.md | 5 +++++ meta-isar/conf/local.conf.sample | 2 +- meta-isar/conf/machine/de0-nano-soc.conf | 2 +- meta-isar/conf/multiconfig/bananapi-stretch.conf | 2 +- meta-isar/recipes-kernel/example-module/example-module.bb | 2 +- meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb | 2 ++ meta/recipes-kernel/linux-module/module.inc | 2 ++ 7 files changed, 13 insertions(+), 4 deletions(-) diff --git a/RECIPE-API-CHANGELOG.md b/RECIPE-API-CHANGELOG.md index b6315e7..06a01e3 100644 --- a/RECIPE-API-CHANGELOG.md +++ b/RECIPE-API-CHANGELOG.md @@ -119,3 +119,8 @@ isar-image-base-debian-stretch-qemuarm.vmlinuz-4.9.0-8-armmp It should be noted that the `KERNEL_IMAGE` and `INITRD_IMAGE` variables were updated hence recipes using them shouldn't be impacted per se. + +### Append kernel name to custom module and u-boot-script packages + +These packages depend on a specific kernel. Its identification is now appended +to the binary package names in the form "-${KERNEL_NAME}". diff --git a/meta-isar/conf/local.conf.sample b/meta-isar/conf/local.conf.sample index ffcb7ab..4a60068 100644 --- a/meta-isar/conf/local.conf.sample +++ b/meta-isar/conf/local.conf.sample @@ -160,7 +160,7 @@ CONF_VERSION = "1" # # The default list of extra packages to be installed. -IMAGE_INSTALL = "example-hello example-raw example-module enable-fsck" +IMAGE_INSTALL = "example-hello example-raw example-module-${KERNEL_NAME} enable-fsck" # # Enable cross-compilation support diff --git a/meta-isar/conf/machine/de0-nano-soc.conf b/meta-isar/conf/machine/de0-nano-soc.conf index 63b2cfb..184da4a 100644 --- a/meta-isar/conf/machine/de0-nano-soc.conf +++ b/meta-isar/conf/machine/de0-nano-soc.conf @@ -15,4 +15,4 @@ WKS_FILE ?= "de0-nano-soc" IMAGER_INSTALL += "u-boot-de0-nano-soc" IMAGER_BUILD_DEPS += "u-boot-de0-nano-soc" -IMAGE_INSTALL += "u-boot-tools u-boot-script" +IMAGE_INSTALL += "u-boot-tools u-boot-script-${KERNEL_NAME}" diff --git a/meta-isar/conf/multiconfig/bananapi-stretch.conf b/meta-isar/conf/multiconfig/bananapi-stretch.conf index 7fafe69..bf89652 100644 --- a/meta-isar/conf/multiconfig/bananapi-stretch.conf +++ b/meta-isar/conf/multiconfig/bananapi-stretch.conf @@ -13,7 +13,7 @@ KERNEL_NAME ?= "armmp" DISTRO_APT_SOURCES_append = " conf/distro/debian-stretch-backports.list" DISTRO_APT_PREFERENCES += "conf/multiconfig/preferences.bananapi.conf" -IMAGE_INSTALL += "u-boot-script" +IMAGE_INSTALL += "u-boot-script-${KERNEL_NAME}" IMAGE_TYPE ?= "wic-img" WKS_FILE ?= "bananapi" diff --git a/meta-isar/recipes-kernel/example-module/example-module.bb b/meta-isar/recipes-kernel/example-module/example-module.bb index b62ef65..d9d6eb1 100644 --- a/meta-isar/recipes-kernel/example-module/example-module.bb +++ b/meta-isar/recipes-kernel/example-module/example-module.bb @@ -21,4 +21,4 @@ SRC_URI += "file://src" S = "${WORKDIR}/src" -AUTOLOAD = "${PN}" +AUTOLOAD = "example-module" diff --git a/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb b/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb index 2806ba7..a827c35 100644 --- a/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb +++ b/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb @@ -12,6 +12,8 @@ WKS_FULL_PATH = "${@get_wks_full_path(d)}" DESCRIPTION = "Boot script generator for U-Boot" +PN .= "-${KERNEL_NAME}" + SRC_URI = " \ file://update-u-boot-script \ file://u-boot-script \ diff --git a/meta/recipes-kernel/linux-module/module.inc b/meta/recipes-kernel/linux-module/module.inc index 9af3a93..509dd96 100644 --- a/meta/recipes-kernel/linux-module/module.inc +++ b/meta/recipes-kernel/linux-module/module.inc @@ -9,6 +9,8 @@ FILESPATH =. "${LAYERDIR_core}/recipes-kernel/linux-module/files:" DESCRIPTION ?= "Custom kernel module ${PN}" +PN .= "-${KERNEL_NAME}" + DEPENDS += "linux-headers-${KERNEL_NAME}" SRC_URI += "file://debian/" -- 2.16.4 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 3/3] Append KERNEL_NAME to dependent custom modules and u-boot-script 2018-11-23 11:38 ` [PATCH v2 " Jan Kiszka @ 2018-11-23 12:35 ` Maxim Yu. Osipov 0 siblings, 0 replies; 20+ messages in thread From: Maxim Yu. Osipov @ 2018-11-23 12:35 UTC (permalink / raw) To: Jan Kiszka, isar-users On 11/23/18 2:38 PM, Jan Kiszka wrote: > When building different kernels for different images of the same > distro/arch tuple via multiconfig, modules and u-boot-script packages > become non-differentiable. Address this by appending the kernel name to > their binary package names. Applied to the 'next', Thanks, Maxim. > Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> > --- > > Changes in v2: > - adjust AUTOLOAD of example-module: package name changed, but not the > module name > > RECIPE-API-CHANGELOG.md | 5 +++++ > meta-isar/conf/local.conf.sample | 2 +- > meta-isar/conf/machine/de0-nano-soc.conf | 2 +- > meta-isar/conf/multiconfig/bananapi-stretch.conf | 2 +- > meta-isar/recipes-kernel/example-module/example-module.bb | 2 +- > meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb | 2 ++ > meta/recipes-kernel/linux-module/module.inc | 2 ++ > 7 files changed, 13 insertions(+), 4 deletions(-) > > diff --git a/RECIPE-API-CHANGELOG.md b/RECIPE-API-CHANGELOG.md > index b6315e7..06a01e3 100644 > --- a/RECIPE-API-CHANGELOG.md > +++ b/RECIPE-API-CHANGELOG.md > @@ -119,3 +119,8 @@ isar-image-base-debian-stretch-qemuarm.vmlinuz-4.9.0-8-armmp > > It should be noted that the `KERNEL_IMAGE` and `INITRD_IMAGE` variables were > updated hence recipes using them shouldn't be impacted per se. > + > +### Append kernel name to custom module and u-boot-script packages > + > +These packages depend on a specific kernel. Its identification is now appended > +to the binary package names in the form "-${KERNEL_NAME}". > diff --git a/meta-isar/conf/local.conf.sample b/meta-isar/conf/local.conf.sample > index ffcb7ab..4a60068 100644 > --- a/meta-isar/conf/local.conf.sample > +++ b/meta-isar/conf/local.conf.sample > @@ -160,7 +160,7 @@ CONF_VERSION = "1" > > # > # The default list of extra packages to be installed. > -IMAGE_INSTALL = "example-hello example-raw example-module enable-fsck" > +IMAGE_INSTALL = "example-hello example-raw example-module-${KERNEL_NAME} enable-fsck" > > # > # Enable cross-compilation support > diff --git a/meta-isar/conf/machine/de0-nano-soc.conf b/meta-isar/conf/machine/de0-nano-soc.conf > index 63b2cfb..184da4a 100644 > --- a/meta-isar/conf/machine/de0-nano-soc.conf > +++ b/meta-isar/conf/machine/de0-nano-soc.conf > @@ -15,4 +15,4 @@ WKS_FILE ?= "de0-nano-soc" > IMAGER_INSTALL += "u-boot-de0-nano-soc" > IMAGER_BUILD_DEPS += "u-boot-de0-nano-soc" > > -IMAGE_INSTALL += "u-boot-tools u-boot-script" > +IMAGE_INSTALL += "u-boot-tools u-boot-script-${KERNEL_NAME}" > diff --git a/meta-isar/conf/multiconfig/bananapi-stretch.conf b/meta-isar/conf/multiconfig/bananapi-stretch.conf > index 7fafe69..bf89652 100644 > --- a/meta-isar/conf/multiconfig/bananapi-stretch.conf > +++ b/meta-isar/conf/multiconfig/bananapi-stretch.conf > @@ -13,7 +13,7 @@ KERNEL_NAME ?= "armmp" > DISTRO_APT_SOURCES_append = " conf/distro/debian-stretch-backports.list" > DISTRO_APT_PREFERENCES += "conf/multiconfig/preferences.bananapi.conf" > > -IMAGE_INSTALL += "u-boot-script" > +IMAGE_INSTALL += "u-boot-script-${KERNEL_NAME}" > > IMAGE_TYPE ?= "wic-img" > WKS_FILE ?= "bananapi" > diff --git a/meta-isar/recipes-kernel/example-module/example-module.bb b/meta-isar/recipes-kernel/example-module/example-module.bb > index b62ef65..d9d6eb1 100644 > --- a/meta-isar/recipes-kernel/example-module/example-module.bb > +++ b/meta-isar/recipes-kernel/example-module/example-module.bb > @@ -21,4 +21,4 @@ SRC_URI += "file://src" > > S = "${WORKDIR}/src" > > -AUTOLOAD = "${PN}" > +AUTOLOAD = "example-module" > diff --git a/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb b/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb > index 2806ba7..a827c35 100644 > --- a/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb > +++ b/meta/recipes-bsp/u-boot-script/u-boot-script_1.0.bb > @@ -12,6 +12,8 @@ WKS_FULL_PATH = "${@get_wks_full_path(d)}" > > DESCRIPTION = "Boot script generator for U-Boot" > > +PN .= "-${KERNEL_NAME}" > + > SRC_URI = " \ > file://update-u-boot-script \ > file://u-boot-script \ > diff --git a/meta/recipes-kernel/linux-module/module.inc b/meta/recipes-kernel/linux-module/module.inc > index 9af3a93..509dd96 100644 > --- a/meta/recipes-kernel/linux-module/module.inc > +++ b/meta/recipes-kernel/linux-module/module.inc > @@ -9,6 +9,8 @@ FILESPATH =. "${LAYERDIR_core}/recipes-kernel/linux-module/files:" > > DESCRIPTION ?= "Custom kernel module ${PN}" > > +PN .= "-${KERNEL_NAME}" > + > DEPENDS += "linux-headers-${KERNEL_NAME}" > > SRC_URI += "file://debian/" > -- Maxim Osipov ilbers GmbH Maria-Merian-Str. 8 85521 Ottobrunn Germany +49 (151) 6517 6917 mosipov@ilbers.de http://ilbers.de/ Commercial register Munich, HRB 214197 General Manager: Baurzhan Ismagulov ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2018-11-23 12:36 UTC | newest] Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-11-22 12:58 [PATCH 0/3] Bitbake fix, kernel-specific package naming Jan Kiszka 2018-11-22 12:58 ` [PATCH 1/3] bitbake: Update to fixed master revision Jan Kiszka 2018-11-22 13:12 ` Henning Schild 2018-11-22 13:14 ` Jan Kiszka 2018-11-22 13:18 ` Henning Schild 2018-11-22 13:25 ` Jan Kiszka 2018-11-22 13:58 ` Henning Schild 2018-11-22 14:28 ` Jan Kiszka 2018-11-22 15:36 ` Henning Schild 2018-11-22 15:42 ` Jan Kiszka 2018-11-22 13:19 ` Jan Kiszka 2018-11-23 11:27 ` Maxim Yu. Osipov 2018-11-22 12:58 ` [PATCH 2/3] RECIPE-API-CHANGELOG: Reorder and capitalize sentences Jan Kiszka 2018-11-22 13:10 ` [PATCH v2 " Jan Kiszka 2018-11-23 11:28 ` Maxim Yu. Osipov 2018-11-22 12:58 ` [PATCH 3/3] Append KERNEL_NAME to dependent custom modules and u-boot-script Jan Kiszka 2018-11-23 11:28 ` Maxim Yu. Osipov 2018-11-23 11:34 ` Jan Kiszka 2018-11-23 11:38 ` [PATCH v2 " Jan Kiszka 2018-11-23 12:35 ` Maxim Yu. Osipov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox