public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
* [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    ".
+                "&nbsp;&nbsp;789 123456&nbsp;&nbsp;&nbsp;&nbsp;"
+                and <filename>FOO2</filename> becomes
+                "&nbsp;&nbsp;ghi abcdef&nbsp;&nbsp;&nbsp;&nbsp;".
             </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

* [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 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

* [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 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    ".
> +                "&nbsp;&nbsp;789 123456&nbsp;&nbsp;&nbsp;&nbsp;"
> +                and <filename>FOO2</filename> becomes
> +                "&nbsp;&nbsp;ghi abcdef&nbsp;&nbsp;&nbsp;&nbsp;".
>              </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    ".
>> +                "&nbsp;&nbsp;789 123456&nbsp;&nbsp;&nbsp;&nbsp;"
>> +                and <filename>FOO2</filename> becomes
>> +                "&nbsp;&nbsp;ghi abcdef&nbsp;&nbsp;&nbsp;&nbsp;".
>>               </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
>> zcmd43WmFx(o-f+CTX2UEAi>?;2?Td{*WgY9!6k%X!QFzpyKW>{a1ZY8a64ya?mK7h
>> z%)Afpet5N3FW9}hSMTnws{hYwhbt*aqahO^0|0;~D<h!-08lpICWQzM?iraDy958g
>> zxQNNBAtE9!t}CvA9|>J0wOmylEnGc}KbixU4vzNbj4q}h&CMNLtQ=iWU^;{VfC7+}
>> z5LNR`J6!hCQkx-0IK5fYHZmf({=fwVl_1%r=LAt%N}84*UGkV3p&rfuNDIl7(?0%T
>> zVQryPkdvZ=yn)PA{5JJ)5WVN;&5DbE04fC?bPNn)+IY_e&Su+AEBlD=&XNna1R_*K
>> zPEpdpv>OzT<cubV(A$Vf>}ZULoJ)z#pq#gY6SrA!-z)zAZ1>c`EAlU2zP!(`E-%e`
>> zyHDN9bXH|Kp22Q8HtmLsBiR-_OAX#fiHDW15>7rX5jl?JUU)x(q_TI;nW*yjjQ@+f
>> zjTtYq&F@m3=M$LYi!sH~1Frln63XfvEa>r&P}PVemG8xazy3Hjy;!&1$(gcad{eQa
>> zmZ3M5p8$~-hcRp`#vc~`Jz%VK87zmS`}qTqwKm><4dWQq@x76AF0Xs5sn>DAbEN+z
>> zGBV?!*n>!T>Yd~aLLKY<Aic`X$=YPM6n&fw!FKT|byQVcTwGmUoy;3CMD_XUrqsO&
>> z=eq=ktf;j86=xrfCh1;xe?i)xORa~b+_^UDr3%eBxsnFyg09wuvh5_fUo6s>q756x
>> zHu5D{$T7_fCv5NZ1ZmJ27v0GDyjIfIKP4*mD~-F_crFBsAGp(UWO8`Os5+y$iE;|n
>> zVUhEx6i-7YB5?AsN0J13S!A}q=8AfGd5L9LcHdUk*ZZd^+%D<P)`%=w4Ci!}zXpDe
>> zc{w?}C=PUxJT}Vu_A+27bN*mK*CNc-84HWX1b}z`p1g!<@bxSK6AW0Xgjbm)0(8%R
>> z4)(F?f7E(vsj?bH3mi<0UJUr_@a`9ug}UqAo2#(rM(}Y8FkQ{<Q<t7KJ73ro_?0-9
>> zwA})LJR&6lBGVHo0bpxu`$?qJdFcWo?0q>nIeDG}C6}+}jK2xBl3aIqQ58dN%SdFr
>> zH)HG~@0nBJeFhaZxH}{xez7|#o^iH6ci9&d8$2j&#J;rJoO4H@FW8Qq<jYlRy(jkp
>> z=cXRxgy$&M+SJ{xgQZ9R*0*qcgVTnE%|GETW8=Y+{PWDId(4bCoJ|%`B3jZW$Sg1(
>> zRIIMNox9Ys?uAjlE!g_wX6@s30#%b`!v!~bwyyMAe}&Vg(jEEYp9{$ykL}E7g}c*_
>> zb@xW>4oh^fu@0X!%*P`uCGY403+(mf+IQ78Ex1Ixk3(HDNA3p4QQ5`ua>wvtzAmkL
>> zBgQR0zO8dO>Q1&TUR&rI`01)8qIM>o)V}FRB_eY;XWg&((x=~12#iM{kT-k(gwb70
>> zjI=ge__(pHF4`&W@IaLU<JqpdTv4N#cI)k08Hps;?Y{Vp7g(#NsvkStw4{|nWYu6q
>> z@b_m^f5_9<bA8z9JE?bJH^mf_`fcDC^Fs4pAy96PAdumKTvL2yrCcQ#Q>=`O`XgX>
>> zKktUUa#@Q>5iI}1J-up2!FfpT+!xATv*LhG!lGwv5F*H*=HeTS`wi{+h!ws>xuk6Z
>> zp+9-Y%OL+dm-TBdc4-j+6Mzy!9Keb~>JMaH_v$uXLps&^Od!N9o=XQm8)$Qt9o3Qy
>> zY{ZOGFj7JRr7oMyPv={-!b7^u3v5j($C3Cu%Wa8J$MLChkb3OeV$BnrAZbfQq`+<E
>> zUKoS9R#R2|xuRD+rlQl$;@a0s5A^{p^E-Kt9}L^B&@M*UQwy%bYQ0fo$m?r=z70!o
>> z#>WPro4tkN8O0v1)6*&F?xZ4!1oFn+OT2K-0z*eKrTy3Ve1{f#=ovZIcHT_W91;==
>> ztcSf`YqN$FdK2WQFJE5``!CPiPGmbK15SI=g>Hn^^w~qHo0b8~{TXr{F2_kzabBlb
>> zEL>0ZkBOXKR#v}Tbgw_y)4;!}$8eo_Zg3VkO>@aXH?{B=92fQ5Nvdd&-~CS49^m>t
>> zJ}U>hRgmfBey>kA?%l%IMCy3jlGK;f3pxL_Swr;7!j>1}Vx0&K@L`^j3>e3V%ZzLZ
>> z0wF9iGKiGP2r)eZMlsYRidu=4B*wf(tQ8vA3CJ!2ze`G|B5A14%aLm>X=~4Y&$AAE
>> z_)i{LvYYbWFsdQpZ-`7b1wrD&)%toOk&M`BI;8-fo#z=fC*l+P2mo+;UM?E=Rhygi
>> z4giWAEBqX<c_HtNCv?3RSpb%T3USR?>saNa2ulsOE1vo*KPKI;a}uzDykr1?FSKmE
>> z{#05F^!sNg^$1<Qv)1&p+*(7DmM_d~y|5?ehXOilZ**^N2%3%-59Ds#ar^Cv*z7cI
>> z2ACbw3^3KcMWSfh%xJ*|ni<$HarAZGV)!&DVi3au5@cu2FT6Vpw4@#Nb(w7dV5G;L
>> ztynl(dfkVvJFTas4Au9UYx@+^aT6gU2Oh6C`ONzg>5_JRg5$`Czi2hHvKzGH6|;#L
>> ziUpVuya9|bjR0s^7NZy^o$hL_Qc5CDW!rEmh%JZK=s5$H4adyxC!7HZ0qFP!4ZGBp
>> zCB(qW^FNS>S$`j^;fH5?W=1p?cyOROtc<{nmm4U$$Ci*wE?H)4TVj|3Zry!aEDp2n
>> zZ}ilV)}1N#Cdaf<0Umz4y;+a^6B6y2se(7?!RVwujpA<>SEMz%(hAGT3S4$}YQ8`e
>> z#}F#r8}PbZ(o3+J`k_4on!Qx^r171u!}|<Z>Ir>pw7CgOHEO`SpKMKM52hB<*i4Je
>> z^mm4Ho4>wj&7w7>GwSVcW^*<kNx*R;-BLY|<++F*uYaTM=X8J2ew}|osIs~Ol{30N
>> zVXb2|CTIu*%3gd;JiT}d*qAw4kO};g`QUp7XIw!pe4sYLUPu(a5Q&j!?v=6Qm4OM2
>> z9K>)_CesQ?YcWn(RceTH5arCA+HfkDR=ppkPteLYuan49QOiYeGwBs4YYmMd<Q*yd
>> zV|w;n>HdD4+rzJg*XH;-h6c!r=)lClJ84~4;tG{PK9MXCi5F#LBv^AfSsH}CQ5bby
>> z@7`K!PeC|N7oY}2kf}VL^S`%U7<(+znj+<>TZ!&sFV*IxcQ<?M1*N76J|LM+F-hZp
>> z-dog9CF-h4-}k>t<Ez!yPR*k**&(F1y1uSoeUO)<@!!t*d}?2aV{yXZKVG)cQNYJ4
>> zfG$zS-?-l$_{VSoe@v%MxHwm`shOp8OVq?+L`@9<SQ5)xxV{WRxLt0qnGOR|ElwcT
>> zO}@*OG_FE*tfg(y_!&E_{SpwYn7;SCm}KB^q$P>e#<fyQ(~+IF`Ke)2_oJvztH(GR
>> zuaq}NQY*Kt8AH$W<UO5M`<A8ZF(ae1{SmAaEvx2D^k{+MLj}Q)gv=<V{)|Y<C`Vck
>> zQ$Vu2&+}_Y>x2Y8)Bf!#EXx7*pSRF}{cyqqk=1oUgLM<rg@bfK;35z66mt7#x2rH8
>> zgcc$G+h4tpwFg4UXz9Nc;DM4tesyZSD1@m7{uZITQybNCp<jWk=bO6Cx&q5srW+&_
>> z3ffO1Fb0CYqjdiIx2-SbNsG`hANH@b@Rs<6I4N^wn-asis2Yo%CE);oprvDe*zBmu
>> z1tTH;*Myg?sa^jwC#1nUbW#aTy-Xq9BuZP7RRhROmGb0VuM3`f6$2APEfC8aQ^{bV
>> zowFXUanl1e022vlZvN78d;FpmSU{SwFi<kunu%nTzxW<d5^PR`{Y~{lnAfC~=e{tW
>> zm-<1YaX`5NxwFP)2qAJbtXUP7EL|WP3aD(BL8HJ#$?y%F4;D|Q>MAnyNkT>-Kf^bH
>> zTH^Of5qfIeU-6h~kAgYLm-Er0^sEQVB$@t?1pZqb+do8rW#)A{-@HJkYRNz!5%5Xo
>> z^m7@an~5j13}1sAT}m#+&j>h7#FUQ^ddHLHOho(bcJpy3*>QZ3Arvr*x30(PCLKRN
>> zLAu#}XOAGO)p?7I(RyXajeP{A<b~GNDx9&{^J%V3!lCi_=Mg3f`5WqV2E`ldIzKlm
>> z3ofN0*o@Lz8K>$eM1N`=CAR|eGaZ|{LhrjU<ZjG9FY}Y%CfUUdqNsJ+&VAdyP3sWO
>> zY~;k2SRq}Cg8F{8j$|}nQkTx8rvCTendStCiqgT~5cIW`D*7gBdRwyNwE8#5oo%_6
>> zk^?CR`>a=t4|C9fvLNz9t4F9;Qe)uwHM5;L>Zx8~v!O0RqHu`%;qDHsli%#w^f|%+
>> zrkg|kE0{1+9X{x#ry~=MCj9W(kNM%HV`1Ykwit_(Y*A?oo-C(pYObO~uNo<Q`x>u?
>> ze&=dLxngT*fsY39Xl3^gB8K}|dMnkG%Ss4_L1nQ7=j%Ftx8dqwTCLK)_qdp-fq@{X
>> zFoG87CxIu!#=}meB~h#u*sTu2RihOG5#I&?yC?n9z^4avf{@^K%%iIi68FpQ4QIL>
>> z{B?nlerng3OlgdU%$a4nhkJ72G!@P|pz`RCJ#yBE7H>_c3=lZ?;M?!lJ<y#V{v`Gd
>> z{AJ$xUExAV;M%`JHuD2Im)wixO-K+1=c&AifG$S7kMHKbEp#{CIon3gSm+b6E^6X(
>> zJI}*`rM(+=3WyFK>LM-gD8F}FpKh$n!N0Hx?H-+Cgx0&TsaW(aKkkgP-2J3qXHP{=
>> zU(x2dow|vMK_tWEt#foy^*Ub;i^sR;(wo0X!~r_zx_XeiF@7Rmk!?_Oy6<!4>2~zx
>> z9^D`MRV2BtC%fapaR;ncANgvmeM4Ejs<NPC5*cWmU-Zv88Ivf`YW1))IQYTWno*)C
>> zGpgHu(0!e&`TTe>j&O6ltR*D4*MhMrgchMYN9SN%+6Y&+A!Loq&rIPS^U@QmBXnDN
>> z7gW5$iv44meA7Q5_+U9(!2^L$>dOAy=|=PJAFU(3qs3L)Q!?F(+;@Is&yuG4{P?~r
>> zV$~$Vxv9^oYsM|8?E{pE899&L-C0Y3VkOj2XFOc+*H&Tg$S(f{>Msrxmj2YiR;n+0
>> zbIa<ez~EBN;`C@o`6<GwA^CttAz9p)$QNCzZAbJ-zmhCu{&b!4sc+2*RiXGDQwv>)
>> zKp<<Cvm?J#|17O)9rX*{i{t8HhEVfUkJRtc=BVd=6DC8A_rr1X`tM(lIqXxzQEJ_-
>> z?aVv2q(TG9Jat|kLlqdfjpxvaloBoh2^heXgKAoRjxf~B?sPw41HHSUYb{%~C0m=G
>> z{&(qy#pH{HUKxsf%XUmL7J!BtA<CJ6N1lg_M_!8z(aQ6a>m12qc6|2b_ojq+z8Tli
>> z>5Im^qh*0Yn(<awN7KsM^2lrhgu3Rl&%7~4pJy1DG=zCCzF>+0EKp=H{lQeh1D$6g
>> zt}lo{n8EL&<MlLEIXvlPbfMNF!BO=0g&H19HWA2`V%bBoG?F$V&B_>1(7}Ka5CwJM
>> z?}bdmA+-N06W{Hz_sVCdf#E@R#`dOP^b*spM2)czp@+qU?7TdLcwm`X!-7%)#+?6Y
>> zxDO5rcDES&1_{c}q<@gXwoqZ8H}7;+ah231B;NB<m$2UBC;jrOSVD0=caY2*oAnv7
>> z(MlsqQ+ht`4%q(S&Eaofun>D+S5@UFaAfHpP0I=*XrnzxmYv<PmKcC|KGYtY_HZqX
>> zwcM;a5fl1$NJu9bvxg-r5K01J1m|j@I6;ouw$6Eo7e5;96c_KJC@YcKSweX_a=Jfe
>> zu_e4|^~JyD-27X7JoT&avNHRGvJa#Lm}}ZsCZL*8yAT$;KiBA-+tTuoB^tEfj2V$r
>> z5;^wn|C1<S!(&-tqvd~5G0S%T9o~9$e9B+GA`w;m#7s<?dD>}%idxS9*y6r1BZHTh
>> z*W|3GL4hJz=FO|(+UBG^J&)b%mgUy`SIRSyDr%-PP8%?QeDs%eorU48{_<^;*W+|8
>> zc66^Ix>o4dm8)gmU?S2r(wFAvQ}+nekv5z)@YgA`O3qlKIUVQz!NVcIRyhx1#bb%8
>> zsi~=|s@esw$15<dx$Iz1Avv)cjb4rYI{0hRO?Y>6d1wyZRF)JuAILhJ#E-9pv9`1A
>> z<eh~{K=#xHd#Y+|T&#g#7>0?N{Xy0GV5QFR6nj6lG-PDSaLMD$qvuCzN+Z06>xEo|
>> zw>?MgEjY18flv*%kINql6&lEapnYat*ZPcPgenm0g-QSu`T@63&mp9M0%3&opx%?|
>> zse4cQ*9HU)V&OR@i@$$0`)dQnm3wN7XXIlTrQI=%5dl1FFlKj6a8GhiuqhJ6IFXtG
>> zLkHcqRwDm35n2V;hyn2vz2={{z)!n;T={XO>4U=TQ9n#Eo|sLqj8g(icve&@5ekXG
>> zKmfBFs)90&$TmTXYGBy6ohONTY#ry$*BMKrxMUtBleo!EN(P0PRZND$1)YTDL?lOJ
>> zw&Q#~`wPsYy(A*#r+mdhX&(n%!6sLM2Pb>E;Llu=8CtBpt5RW@Y*&cdo(x~$zP>z_
>> zPxBb53v||nD?kT-y=sh%AoBe5cG$@va$;aL;KlFHAXc1=>%s3b?HUVho&5mSw_=Ep
>> zYJqX=3<RLtC71#b^CWX&n6L@c2;#KKnJ}s&DxHx4%QoFlwF?{ch{%#DxG^E#Hv0}z
>> z+4^)^-{$sc(j-C`UWP-hLwu^`KD&)_O3`@5nszF@pC=}oo^CJAj<mIHiKKr1pB$Tr
>> zf3G5u@=!S~{4m6C!0abC5TJDZMUk2eaam-*KsmU3nkz;ycR}}^ot1j)jGo0^RcPSo
>> zMoyj?@O-y7Rfvl$sjRH*?S0=Di9cImcye-5VQAajVtg(T%gL}_+p2;t5@^)zl05UO
>> z?3L|zt^C(?)P>4e3GlXBITlqvwm6cNOG_uj&+^A<j%7X)1Uz2H_}5eG64E2mAj)*j
>> z_gyH`3+xz1JkrgfLX9M|P4n{@4OzOxMDbp=i_eS1#w*-C4GxPS0j*e-+!uK}1N`Xy
>> zW6#|U5Z&8aoX*J#+gP#>L<^N)ZNm0%^@+&I$?@<KzkT}%R;TaZzb7Xr6LUNGKHu$p
>> zY|=a7a;qs!Yel5r(o;ZAO~@McEgB6oW+$uGj%{3WZD&bU{bOp*s$m-@C0EN(Dc~fq
>> zUg|vIwRPkt%}!~wK50<DW$_j>2>9-S{;ZBDdSOw|PS2~QzQJv+?2&!ltvEY;^4X1C
>> zsMUP0Q_O0WW{^lFN2N4g59i9ec=PslGgcTDT2x9(YMu%#djy*SFHf2s@NT&nQB`cb
>> zqN%CnL*BjH79Zif^s3TS={yr6G>bhGh)Q{WZdZo%5TV<8jeL}Vh;qg}Q$+mn(Kec=
>> z`}N%9OsrhcyZtFYvtl$}Pn0c_OCd`(W|ZE;Q~`zdf|j1$M3vPlg0rIUi0$ou{`6Tt
>> zN)OBXt(pgZf{-SUlMI<RCffD)AI!JtXHu$m#&^suEf*K(u~4;gyO41yU;|xEUv&mM
>> zB|CvNN~`^kG~`nvt&SLvo*Q>a;BE?sT9DGf8LQdgS1Rck7Std)M|=8L;RGS9Y;410
>> zWB!k~&R3~)DmL18n|W`_v$90;l>ip4{PoB>YVIYPW|)4&E{TS8F|C+N0&q*VVqIr3
>> zHuOC?RvDb0nMHr?AZ7m1(Oc+ggAyCxk-pLO#(`;drq&D)`%|U7XN0q1u6`3Qk7I7-
>> z_E_%j=7xrju2DL}?Xc8IkeZqrOTzojI5}H9^ha{CmbSKfM{#5A=Z8h6D8fy0Y;02o
>> zqlizG$ec`(vEMd7AQ_3dPLYsE^FT95^Pmbqea_+w!iW!?2qLX_e6YDPBtJZ~)onhK
>> zW)Y1Fe+kRL6DHAndAgd&KFUV~rf=LspGPCarRq2Xnr6S`><2Z!sOYtMUu}=3nzN<I
>> z(@a@$s1&;{)LKJ->Kq)D>40bLPo9Fds1yr|oH0*DhQ+3U{ad*eSwcSzbS9a>Qx<u%
>> zi%zcL^7m&FR2F6$KIZKO1s&f0oU=8y{1qXG;H}fzwq2SLprE~2raJt1mVOjbeq`7{
>> zt25_+bWe%yDvdk?%=q~te(8=CekPzaGc~>FCw3e(V*^;&*w{EZXL320jZJ?%>gCM5
>> z-8|Ve`C#pf`56jPWQgF;d>lLtMW7Ao(Ywlnj;H>PGCaTQ(d;c3_s^Xp@7BuVP}-uQ
>> zME(fv?V`<BH_^L?j@_joq-fq?c$Dd~kBv7DOT8;0D|xv6MH!r&lETZ+ZyMESQnezE
>> zk*zdXxzJrizft@B^;>vG-TE`=Eq4dZUIF%iA=cO7b$)I>RR?@NvmG@af-lU2y_UC{
>> zv>^fNXWp+*zT6CU7m|Ieec(#>Eqw@}dQm?!Q|GkJD&o6o?nMAF#V(1RzgwD^Y-}Et
>> zZ6&k@iJKR$*Vt*NQG{Sc_F5FsSbXZLnB$k^q^nT&B?wk}TkGQ1GsZ+<DrVrx0@vj`
>> zZv;!(%Yxd&()o)JIl>zWjZVljgZb^-q650OB~?~DXOyp4-ZRd-^W~rSl^b@f<VZ%+
>> zHGG3bZIfq{RL@@T4NVPVaJ5NF>!wp^4)8oOd)Q7tIx0=3CS4qu?M*hQ{##l9mT?{K
>> znzD~6FmLD^o9aSCZ5gM<mC=aP8S?&L%oEk11!rA|zp#hPRaXnV9ZO!>;*X(pv^fgN
>> znYTpb_bsVvJo}6dP)8)-+)TYQtA<W#W@AH#iTIu9x#z@@pk6GZM43a#AVGxUmws+=
>> z4iPbU5<3?c8yB9omKH%CXI%3>eVNL%?U(*gsNVj54HwyP2@^|8TD(ZxTC#`|QVt<h
>> zz?1|BM{Ucbsi}!5nud{abYbB>p~1uH{uo^Wd&}0uf$_X}f~BM`CPO+Rr{l$G;~ZvU
>> zUI5XDbewl4*1-AxN^G+SaJ{Jmhd}~!fAvogu28<==hyW>A-1(W(0Nzsud=GgX}0~m
>> z(H_}B{CjDnm-AO%IZ953<lpmJ^h=iR#1P|T-l!C-mCo!RcMn~(rl;%Mf7ilr-osZA
>> z{)}hnpvBdbYQVRCCGn3dHNJoUJ|Z@@!i*IK1;x_RlAWEs44fBipt6dJ2En$J7BfWO
>> zN&gWC(5RoZ(SOM(LAflNf)9F2PNu`txvCM2`AX|P*td2^L%C^D`Lroc*D|=a5{oJr
>> zmTjjK>H__Z4OHL<K{CF4$FHgRSYn8>%b%qy9=H$k-J#oxwo2ZckeAzsEBz`M#HJ6q
>> zT|~qZD<GppiOsJB&O25Uh!B28AT)AK$Od9olX)l`f7J|Ud&76nf+`jk`M1eYLvV0$
>> z`+9pRf;}^Kc+i1f6K5Nn5>YAg|EaQ9umb-RC@6Vxci>YeVY|$Y%ZQQk`UlI4cToPK
>> zJgW)+zGTXgno-k0rI<e(#u8RR_u^m!ulu$qk~SEf$PC-X%OQ2k*jTWGoc}7zZtT;^
>> z{Q@HO7}N}1Xo>niI!6?%0@!3^ipI`YK=Ho39LQ37i;RMTrUdnlr^WNx`peFvT$~|X
>> zDrF#{YKS)i0>ho%SR8BNiieWHz1>F4o6xfX$CF)4-D<|l&qkkt&Yz3zz0z#5dn}hd
>> zvX1EI{sF31x3r;RB~>m(w_g}Fl~v{|lm23XFs9NK#JN<j$%{==1XIg^^~EhlUmawl
>> zz1ceHSQ^)_kKQ&CXK@)B{=2`j2V%)rTfL^1mq`hag>FE9Aq>RCH8n0*nos~eeQ9s6
>> z1dLi%tIKJH7$S1|{MgSw+Om%{jQh`hVJO1-^u8SrPyeX>J%4NeHrCf;onM1m8ux8u
>> zwww(0hit95X^md*B#Ae4w_<d*j_~V$7S-lKCFY~FV34m=*8<sosT8(6m<c5zB@YGr
>> z2BzV$<N=S)Jt1fy3J}Y7T5fg=MJHXTHjm8DH=nW92x1bNoSdY~<a2XznL^{s(4GL`
>> z-m02hbXIqO^&Nxt+g+{m=bE7^FT2oxAOQMb?cE*q_Y>sVC>lpX{(^N&>II}OILz$>
>> zzvKOJneCd+zwuNu==XFFJq`^=&8eaOFo}jTz%Ie#h`5#c@L{>qSR90PzP`ST_4X&r
>> zEjPDkn{X(2cJtMeZ#g>Yvlcz88X9Iv2b9<S^@6|3yy;e4)zxg+D8<hbR`K+AFZ8G{
>> zZI(A|FAVJ{t(%t7@-?=|>`R%$tkPf%A%;__D^u<r7#DtFz>D16+#DSpg@gW-kdUCq
>> zq$nr1*x;BM8ahDFp~nWJ#T8b>7L_rCBOWdEH9WEbSFhQJJL$wm=iFZLKZ-pyo7+`g
>> zP*|#R%2H~^I8ISx(}Pm;P^a+AZFxujvFS*^fl2A|Nu+LhYo63uy)7(J-zuxHa7R%Q
>> zA}}&K`b8`|Apv*5IrwW>SXf@(8>v+v)%R^ad(YAy;v==SwRw4Y`#;~t4?R9UW?ed|
>> zKY0g4{7<zW;XlKJdpjhWFiKFe8?ljVP?Hhu<z8KZbMiFSl!$Y^a3`w2!MJ2GrLzX#
>> zMiG3ra<6nOnc!GDKLRi`G<1D^?d<GKmq5qD;`C=Q&aw3@WTkNA`J~f4DDe*YYu}=6
>> z`~Ka|_qt`i{1Nii`SRU`XE&dmFGsWGq>N|{|B(eC-{=Hnf;0~a0!%tH{Qb}33oy{D
>> zH)~8PzNCxNGm-9Mu~dg%HV8}Iq_{eYN%L<#ZR$1{a@Umnq<0%B_(aNGL>nT!Fh5lL
>> zEzw8A;MEK!*gZTSjvCU_)5(SXe-e|jptAcvdd6(FwzZ+LyT~H;H_FD-eE7jp{7k3B
>> zXXkYV4g9yzK(WD(`oBdKpW@I~{JfW=2(x{JQmcp=e%xeUK~gkcP&^wJ@RfaxA?gVd
>> zoWP)x<Emz@^QM%C$Bk$Z{EX5ANM|p0#>XKL)nc{!`uf*#R>w<C?(Xgu78YQw=-_(s
>> zSgS6svg*~%(5x`9pDGy5m5v34fYKThu%p94LjhrZ8z3pDwVg!=aBPl)e!1*$w-p+)
>> z;;26m_3gp{c6N5|$4g#E3w0G8&&`gj?fNb5xZx6@Z9VK`t{Lip5Rv=0nR05rBlep<
>> z%fOHDhKr^a0z}^8z#|~&YH8g*Jjms%RB74S*w}mx8gM0M_Kw;_Z9EfGuB*W63q=<j
>> z92prIE}7ixO3EV^%_}S{EGW>h^kQeP0ik1(VN%Y1t`t5w=O@hW3-FnP&5u)aA|HPI
>> z!u3*g#t@u+MH<e&rKF@JCTiS$1N#s-51V&PM&p+l<oc|=19KXreguKw*96O@Te*Oi
>> zf1~J4tI`!wGzLtTk3ms?I9T&{{q`fW6;g7G_(V51)z1VlfCh(U?*u$oglrYHr@xi^
>> z^XJc(8Qs4gd<`Q?T>cG8WO?Xh5rMIZdl!%D6|ct*xtr>Y7usm4__(<F+G5=+-Az{K
>> zDt2}~Hyrg%E8pFd^s!N$Ms?q$A#ju}x4dXyc0tmG4vZvEdSqs3IfO0;Sc<;r_U()j
>> zoWZ?%9Wc?MqShm_bM${LXd<|&K|b($<6`T_d%Qsi1S00(qqtmJU5w61>Ziwurb#3@
>> zLq<f-d~_K7=c(|d-cfl^knn4z?o9^oon!)c{?_TCqlrQpvB}{5+miZUx1QDvvCE_*
>> zQtf*`($W~>WQJGGbUn6QQ{*kIt+mrr9qFf+3};K-boC;<(I%QOp0sszycZ!qWYtEa
>> z5}L^!*;fW2s`)A)$=cD#Q*cE7GUd@AUL?5-b5zP``c{JMX}Rb(7pfRyxOe8D-=)26
>> z@Z;~kD$Z3-a{|}PY~f|CAR|<zj}>^ItHO-a($hhNlW8bKMI}xX-^P`sF#xC8P$3-S
>> z6ChBQtFHe&uf5KDcO-Mm4?lqWXH!bJZ5Gm-X;Iwi(yX&=;f$TGCCZ!oOvDQ%JY>)j
>> z0iZDDfs3uA2DQ>iRSCqfUj@arZYK-Ox7Lko!@m>gdFPXdwl;#S*_iaMgu<eFIhO^K
>> z&K$K~*WP~YsU}=`tuLy|yd4W4F0VGFuNoq@DX!Se4>=PUr;o6IgeCx;(<EY8)9xx*
>> z>`nqtvI_zhc=S}dh^8gf52EPF{J-7qnES(`qiu7^+j*p+jLhj7TSW1wxN3^drgKpD
>> zI0<ED<pjoENJ6#IS%XI-jZsYQx_QbeVjuyXTLV>1RSSm%qni&uqF$zpJ*I~mIQDLu
>> zKBMNm+nyP=;TRXvTYQzBH9CRM-AZmoD<)&L>fU|5*awTR_hezmFHIHv^~=jcYVMYK
>> zLz9|>e6^(1Q}^)E={r8oPJ(%PL`{L^#`AMm%bQpSsHLY~xhPCA8LkbzvkMn;Uxz=x
>> z2`L%vdO>k$gx9IF6(-z#>b1n(>9206=Xy|G>zt(hlPlN|ajM$q7$Hz)64nuoNolr^
>> zReh=z;b0*CeAA+`8K`~+%+l~7DS4T@kn_CkH<&K+hGB|XWC(7PMLe5UzN;pAa;zc?
>> zcvlj_Q9dE9qobpsFm}A$A{|XM1F{iK>j=zlXOi)Y-~mL|FypTPR8SxlY#=7OXQGqN
>> z&l!`lA4QxJWqm|w8n#}Xp=u>IH}Q>rb6F-8%H)2$Dqe0knmz^B-7JC*6An{YQ?sa3
>> zQb!N_JKBEcP#6vFenb4d1Py5q2mT!QL5z=i<nHJmuK+fOS8u#5DAW8tdN2C(f3xFP
>> zymj>>=4WEx{-`xqHODN~90?-iCC)ci=hnYHdOu(3A0k&A8{QlR*Uwhxjx(P!lD04X
>> z*E&?@ZP<r}|0G3)Kmlv)vGSyC`DP!EdK?kl?|7E-roPW)HpE#xx7fZPkMEyB(l6oS
>> z%(=aNemL<sS}?b;aDTi#168X+b4X$;m;E=HjHeMbY|3DB?Tj6yaTs8oR}2%N1U<n-
>> zD^7{hE+S6QN!E#;vB^<8qr=rG@!~}2QzyYtQ4sYGHNCk(t2760v5t#B6dtDEj}ES$
>> z9Fdz10H-HD`JAL4P6t<R`m5jC)$XE3=o?j0P=K+*sYSsb2_Lw>ud=H7?$w0ze<SH9
>> z?`X@-v>&4BNB)ci4N$;Y;*SfLou&o6J1;e2hh;GxRytV=q|O}WW!s*9KyS|H-TS^8
>> z`xEs$&`AvC!>;J<-@0jZc*yMAm)Neq(p{JjB>L<7Tv~O5DT&x)UBC$d-n@)#jCa?G
>> z+UC9({F)>HXkrg|2Ra}$m7c}4vNN^))o16R0C}|1#?Q^IS*+II*C#0<At5Ejq+2h4
>> z0*^!~Fn;kLLf#lY{`onyLB=@#)|uqIo-s{QX4h6hwbwg62RhxaL-^aL=f35Qn58o_
>> z#{+vo^MZD60o0%LoiH$f(DfRhg#-bUMW$YCWO9MQO?q2#;o-%H7z?q^?))}8$Z`iU
>> zYjcnGzldk;lK&*0UGp{lh0PopU#{&x|D>d*t0NlM_uBcz%R6O$Jhx4~N$|#&+up`S
>> zT!4P~D-mSZbUZ^a_$vtL_*=f^O1?at2;<`?fr#G2!{cdTdNkwX`RkwGU3lNY+9Fj@
>> zr-AvDb>430;4PNYKAjjVmI+WzgMz?>A}N+Qv<2I<FIHzmQL%Evf90rocM~>3Afo!S
>> z5BMBG{0m?C%_;;MV({r2w@o^XjhYLC;o)IHU=MG|cY&vC{?D8Mx~nPWKkIGk!X7y?
>> z(GUcFVZ|ESRR@y+jSrGvi(f9XZA47NF`D$AAFBx1QW)sy-ZS8JOji-WdCe0^`fF%t
>> zI5?Dp`qf`G@StSKI~WrNfJIzqHInCvsT43~wcyQ}=|fP|im_tdC>7Qcf!<EZ)trco
>> zEZgPLe0-&C?li-5o>($KB<Jh8KfSj<Q@TZth5Y4XlK>6P_Wjj?tgP&e<NN$|HKOBE
>> zTd@#h=*K4{_@5I-Uyw1OMVeVbB@DEpP)TSQ49|17L_n9AQV)&PC!$w{>K7hFTZM>P
>> z&)=jU1%pBo5g0_7giC3@Ul8pbEs{U}Fut=wGuYd=h|ILymJ0FUWF!p4^s-aqBlzN}
>> z-L}z!oWjRl6Fm5`@ux9JR#wA?-GOGZN7;}YgiI?wCvArQchq1VyD1f+NM<pHrZfWw
>> za6v)A_V)IS<NoxF^iBn>!pXt&>AJW^F1%6Y`yPB-IiX4kk4^&0WMBY012d6|0Uq3F
>> zbmT#uvK&6+H9){y=MK~8cWLunDWriIIOu3M?~0w({osl6X8ToO>%d2{tQ@L3d1xsN
>> z_qq0?(wP9i%9;xMy|7TD&jheW8^Sq-eHaL{0ReulRzB~bfvdLV?0}k$ugdnLPzLr)
>> z{k<n`4I|g2^OYxEm5Mq9P{6z9X152JEY-q_l>S%bufokBiH!e-P!FaGW5dIdAk`P!
>> zqvD9+689wAT5N758Zayp+5P5c${$<bLCGV6cL5Aw#Q+d2bQr}zilSm{LxKl`n)}ok
>> z0iN2ziO0CIsHx|tvrsE*>_FrS#=sGn71vN^55M~_i-?9ORmGNrSuxjJ4Uu_W^zKo@
>> ztVW8$9k;Sm2nh3M+EugNV_CRK=$GH2sy%&1H3eVNs_S(Nzu#^0FXHMib~q^3Rz59U
>> ziIXI2Mq`-Gn2uJj3GXoOPE$R{E8CB-Jug@7)%KE!sGh+SsY`=h3kXb2U2OMz=#M6z
>> zZTIsrG+f1F)CrS#9VcUEVv=JRL|{5%4aKgN-PN~Wjpp|m2@^UQi2X#H+|y~gCdU?p
>> zspi7p3LA5BB$yyzuCu$6aM9Iz*U5|Ug8W!NlQoEp&vpG`cCw#r{i1s_L5OO^^=RiU
>> z{ZMFt{7L`ii2K>TZnwq}oiVcp8`eSr$}w7RSHGHD;=k1;DF%KL-TC@H8g@yuYo6!{
>> z_@x#<EXFrv9-oV!{(4)S+&^Fo8;5WI@Vh*kn7g^91%rsAsDS?mkMjm?rmu;kqaq?!
>> zWFOcUXLxJc1(y3E(<=@h$4ky!cuoi%Ro|-h?t3P0DI`45_5Y!uh9p`_=&yL(pRxl=
>> zMNJrD<LRrH8O9m9;{E+)D3|xJPs~g<<+OtDw%sPeq{z*CO{(&@N)6WJ-r}(RtY_Je
>> z;9<;1j1Ywg5o#o%n0-#RoD4UWcxC&bdDym2^)mwdy+l3?-`!Q&>MGo<*K(Sbd#e<Y
>> zDX46Qhlj^DG$d-Cqoey$^Mi^$g92txn4}52Dt1lhnoddeGhI6iuT_2PjgKQ-<B#E!
>> z^o90ynH;;$=U5n<EmxtEA0SkheT%cu)NE{tALUF<90+@19)$JRZAI<rJoq>iJDVJ*
>> zd(&{#!PmGyXMrbTwzKNf#r*PMlFaVc(XO$ZDNa75Eg3p4?0My0tA|Enx55&Z8olc7
>> z{#f746jXu}9h>x9aFFv|&D+wVd&^M`u}X{gmg2SI%5H)E19I3%Da9}_`_0G^B|ffH
>> zY5$0p7h!>SrCK0g{8x;%n7A#%>g(%EVm2)Q_s{=1dhW6G8)o38sqV^*1WN3bK7BQe
>> zAQ*t^{OTZteSc3_#8+~bbEb?T(f`L4rSf39Tc=oM-!FtiY*50a8!_3p>AD5mnM0^Z
>> zQ+hMk|7%JZN!bVBvXw*DYg}I-;cwnOmkbopzsbD8!wYFr%fv(d*eECoekn~8Q`6F>
>> zJc-v;H8t3gdxECLMBuSPT?7blaOzE3;A}3HD=Q~gQ(vDrWLBp{FvA0$r0B|BFlj~C
>> zdU=M;00A-GE3xXD8tp_l!1e%{xn4oJBDi1LFK6*cWoryy?C-#OpRZG<!IT68j9-{H
>> z%;vro&puPmG>U?vc=zs|kWl-#J_ZH`kPwWHjMRb$mcj+*<h-V$%1vrcN0U?!Cv$rb
>> z2HSUcb2BJ|8~@SNs^vk|M_wKj9{=VM0TBi~kbX{1Aed``8361k)_xw4U{g|N^Fe%k
>> zd|H~Dp##OTJ)hCn)$A!j`#6Bd`R>!M9a(T&%ud?=tjNc-{?PSewGv1YGd?aZE*>7y
>> zHA*I?7@{*s$lcw`pXmT2bMu7c<f4Fqf69nYH4A+EV?Nvo$9-+Tgo{T;=yhii0c}U~
>> zZ$boDiEqsPb_pf>4gQV(<8tM;1x@)UcpleVPSMStPK6ACCf7ZcU?mNW-<_Xef`WoH
>> z%XFx5h_>B+_x(l5TdIW)4i3$t1MKws%gjmMc30nKJeM22yt$1Lnbku!7Lr^v9?i+-
>> z%GGTnzlT9rFp+&DVy-mNyZ<s3o7I;@oH%;wV8q>&b7m|<NJtoo&-~kp1A|<smq1!V
>> zVsPtYv05{D^`P2{f7ZvAKXjZ;aSu$F6?t^@-HZ#tmaZR>T>0Nz5OER^qFk1*Z9!P}
>> zTKUsC;}JO;l4^O#DD6*dl{H(CJSAhGJBKyyBNSgaC2m>?Cd>6(qN1Y61UxBlkO@I6
>> zqmPx96$=Xsv|YzN;mnVc&|U|NWh=d%Uf$4s<cO0|tN+7(>GfW(yB{!{e`zE-zjjY}
>> z9gJyH_bv_wP(NHxh`)zz)+Pk0PH*v3@`t#){2Qq8r?ODYrcoj1jf06UCK^PfMSHnz
>> zK<2CsCiBwPx{u<GJ8DMjLI2ix8|Ho`Z5zWv<6&4C`@`*gIF?wHI^<Jkru>YCPJblg
>> z8;e&^K-_@dd+1Ldv^R9eiUT`R4(V9n@`EVMSA%IV2qXMoix_>@6EH9sN!A?c#SoDg
>> z{KSM7TuO`b%&ylL5)t9-{}VexMgjgSxjcJ(6;%19$wR)!#VIQ(Wi9f4i;G)7Il%xJ
>> zAmuuB!@UwOj4Rue?5;1lExGz&Cs0vQantxdWajVhujJiWBIL*ZUnZk*p^L~5wd=P+
>> zX0vW~qTTBLkfkryJrBhC;I{OWli5N35%(rz3n07ubZ|;-i&0VgD=;%&#Q6e}afC0e
>> z<B?hAZDDJDzvpOi6;(M1Gho2T=w@iT5G+U)L`$L!+sbW!r-qSRTeH}1Fkiv%!^p?6
>> zD`~DKnNDzqDL$njG&wxR-ak)U*l^T9HB^5QtT@|HwaI466#9iU^2sExg#eiA)ffLv
>> zlWE~6&7if~SAM$x?6#_4<-^E-{|LQ0Dc_9E=OndO%h|!?Kp7?6>M6FHCCbH`Bz%UI
>> zTB}Wl_xs|ZN)=;xo8-2<B3fyKL`joanKQ6IloAdeUP?j&2y}4R7*3!^%#NdyR!HNi
>> zvR|wRMYMa)78Aur%2MBVQ6r_%sRaZCFUBX=d&U=k*sZ2Frb^%0%D+eWGu2;Dymo!u
>> z)Z>v5)FSKrFQMzZu;QGg7%dWO_Psx4_I`E*0Kw|2(A;LOz;wQuSyp?E`)M#$!Ia|4
>> zU43ji7$#nLD0}dUTDm^E%J*q$&x)d3``n^A)zuh)pqcwVk*@u6zL!)MeKU4-Wn#Sk
>> z4`CTaG6evrIJuuaP9cxqCB5!I<`M_k3sA4n(Y4O!)2K`p+D@``fBZMe0ZqHTf3XbE
>> z>}nM^d%j9V6S?jFq6BS$)>eUKD$v%31sokuh8=SC?VCj<{vml<t30V^xz6Pn7B;eM
>> zzejG2@!ozQCLDU-ubMn#<@LI<nj0=pS0des6|eJQYBc_R4UCif+zv6B%qlO@0;J#%
>> z`y1E8%K{WV=_5ZgL@)-b^|)o9T2+|n7GGsk=WyuwAE{~>89Jt1<dWM+XMjw<jgI)?
>> zo#P4r4<sn!#OrECZoyCQ%Oi9C$+pO|3}4NYT<#!nUN5x$a)R*{8VGziU1yY&#ua<u
>> z68-H&L8p$^j`kR3Nkks<CQgRSZm!a5BB!;rmEYsI^=8FKQc}`odjty+7JmLtrGAH+
>> zm$!)z(qO-+L4ny>dgP@{8#3^z$PHn(kOt#+snkcK;{N&9>V)+c6Zr=It{rUW&Pr1p
>> zT!v~W7yZL9?U%TgvA2vNWBU#le^8R0h{%E&gHnm0zJ3l%xBQ+pzqsgs!VZ^wn-XcL
>> zCWYIWrmM_Lf#Q{0J+F}?)1CyE*am$>e~*o2{@#vE>-wh7>lLHS_EbO87|p=8b5<nA
>> zKQpZgSMwq7PyL~v?(XkFWyE73hV<<043uk+eq{%#(cvP(78JnqY>PC&^iBM2RX<9<
>> zM+;ppUv%$0c|5Ul9PO%?`wJc1{^5o{RCfPyI&lvtI!ZDUEm=|;c|YDlius2E`mI7E
>> z0Y-tN2U9~=)`xaqLzoQ5L~^*boH<>>HLeK=4wRM3KZTkFTaDz?VDdT(1r4QU{su~+
>> zTAMw8-}=JXd{1)9Ju~)9Oic8<znpJyG|Uw8L!>mRnj0BGCER$*U-X<XB{@STX5Q~T
>> zh5hR4aByixQtnr2zmkEoTF1JBce_hQ{l(H_#j>kLjvWcO;n~-K@^rP<5TfJw$QdZ|
>> z#`m1=)H=YSO(M#>!Gm>@F$>D++IqEE^$R<3#15p0DAoBXhQw~Mwz}9Z^WDD~Dt;9I
>> zV!TYE#tlg22PuaosZ+f?a-0`}s6GVDk+IsPHe*S6dwYYbwp$`MJG<>ltJj^IVFn+S
>> z5XMhIJBXhh=U&5<=&$->^&vc{B*N>xyf$7VZk|pZKnaID14tClSir-a_gaJzK#Zg#
>> zm>oxk0v>h?wJ&<StX3wbU;&Z;od(X{)Em}#v%f@QXKmZ9rY1G>y=pxi5Y-pRSX`rw
>> z$V+XQs%#6$3MDjs#o}Grb8T-}_IwbO?q@H@U5-c-CJN9zQ+ew=IypVv%u0vWC%p!g
>> zRu@U{x#`gfXMU4(0;)P!_|dWVV7Tl*3GDYVLQ$jwKPetNBa}`k4OC1E9mH4M<2VkE
>> z$4P{QkCtP}+IB{1L&%r>G#GIKj)M(j)PGO@>I*;uEWV7v6u77GKh3VUjV8%k(T*an
>> zHr(BCKpXArvSncMpcx4G4y_sXBean|um5sakQ)BknELWaNR#PC?Q5Z0ki%w>{ANK~
>> zn(H_w5nG7+F^35DizS!unG!?gF^9Ru2@SQQ=f7JvaxrE}@D+2c&%J?yPmde4AIM3}
>> z1}yswQ22v1^!R?M!Vhj7aT;Ddx(qKkq^oSlp4e%++P^dlPIO<}&SE$lflD2)LL4@!
>> zL64k~vFx1s=;$atEp6D}?@KiP)Y=TcCGFTk^~e59z+IIY&3CacZ!Z`o)I@50q19_0
>> zE?o7YtH%Fs(b@c$*6y##&rnLeQg1##c?y>nauEc7pndwt;B|O;#gDJ}GI18|A@sPO
>> z>}lNqxAAqGI+Z7CIZH4J!^gkc=H_{e`~<qcw|}(3G*fXK-Tf6f_2c&;WD?fftPk&2
>> zubw>L&gcV(3v9-}BQx?k%U`aEU+Q%(=ea`@$LEot*$V?3q?j(5kVN7h@^ZP&Alv10
>> zq<lM;WM&4-!b^1yqdXl+DZTc|ze>}PjYUAm$JN7woWn}#g9nH6MlZEoqNk_lv=uW*
>> z=?FP(rjHgI&?Xlm1lNzzEnq$`Ga0lJ5D+A1WIR`&QDP$I<mR@x?m+|Ea3x;46_0mY
>> z{P4ve4D~j)jbgP+n8_uW?W|}&bG&xFRL<OW&zhT`SKk>9+Ug)MI7>^?l;+`t5JbxD
>> z;BuV#STeRV?KPdiDE=V5A^`hf9@BLzLCE7$a$szo_yDLlO7nUsoIGDQ_*7>L9}}$S
>> z-B_CiPgylaWWJ*Ef2F4O0c0|npnEe+pHcZTjOci{Oi~}vu!eya*g3p2%1Yc}c(<O4
>> zOID~ZxUVbs1HoVYEJfInZ0N<Z()hSoQaz$yx-Fak@acD%ZpGy1V~S~=P==OrJ~zh%
>> zC|!>846n;c5pzjxx=Op^ogv9-xxW{Kg@fA@{L;mOW+M<QuLm7O-?B!pj$-9IO$_}h
>> z(BL51yX@C(5yDT#yntnyjwC&^ufL~t3@jEp$6@nr5TawfjZB1v$u;R=xOR6GPPAnS
>> z0dQZZ7Q^90f8GAp+Y)!qqCJj?9Gm}Uaj_~)Y%J*FYqpDsihj~4E%POe$f29=^jMOT
>> zmL}(M$}$~@5fv3ZK0XHZGa4EioiZ*iu4~X=1+72zVl_|#E;(R(S7KnZc82xpRW)el
>> z1tDO7=(_T-3k)_UJ-sZ{*&gIDMc5z`dHN#4er7f8Z+%OpQ*Sp90&yKCS&Tlq>+`m#
>> zlBCl5-=lW+BgDVjUKR6Ac5cGFN1)hp<j}V`oU5ucj3sNIJ5$uiUg%cqbxv5uX?`!3
>> zjY;`Nvzm4^|G?6nUCB*tbLMn&QxfLuJ=-M^Xu`?QGuM>RBA>0a>o-Fl{I$5aScD=>
>> z_T4=r+f*g4O0;TEEQV(nkk^hXIE)Ajog%L>tFAPS9sOD;gFJ9LHyZ%}xuL2ms5<xP
>> z1t{t$CC$ng5Pg%vB0pUM@>b9UUH_Gvx(OB$O>1rBJ_33EXoAB%|0hK)Smak5wPrYj
>> z+JdLJa@~c>*VLK)*Wga7xi(N)UoeZ1gIe*4yw)JY0Z<7DB~$X=p;bY96)r)S@FOK<
>> zXba3)W+Wu2&(?8U<h{LbnGkgs1A{eJLdsgRR|N7@M1FvXj7(Tdi;uo0Xlt4Oj{o*;
>> zV{?;Ud!)O&dwza?WJDfJ`;6_rqoV^uYm+bUA^$=f(>{2GvxU9BzQo|aCKYmi9&VGz
>> zWzlH&D=c5SyfcdBYh*3^KbRv;ouL?-wcg)h42B){n<MT+<pk@!hiqCMmRj#s;D>|-
>> zO*=<AMxT7HGk7}13mRQqA5OBx%guwA7iShr5<{2%i5ps3HC)*1olSrNG`+u#uBA`*
>> z|KZcipGr)scsM!LPbQ?#o@y|<Y&`j;+g6`irO>4MD?B4hlHS6Y7N!)Ek$FKN@=3UV
>> zrq*k8T<;uSnq3TUyl3ItbV!-Q|2@*|_A#`aXeMl1hzM9tFOQFpe<@Z|Q=10+uPf5V
>> z{@-R}ZC$+clppvsy$t@wz_-7@3(y!G4K-N(;>`Ky=!g!?E>GL2zD58_=6dL9uaI18
>> z*rX6C!P%QN_4S3^Jw;Q;73S-Pd0GWuLB6>@SW4p-`ymqGUAxCxygy?ZL2z$OSG>n^
>> z<6{%P80mFh(oDa(v|alAz_>ybrpZqo^v6fDlKM$DI+{vr;UXVvcL4Zy?`nhGxwTVb
>> zaLV>y<fjt#hd%umVJlhw!=5@uEaU|oFOxpZ0Afn9!D%Y9^(q`Z0QeKoLC=Y<g^S^2
>> zpA!#Inh74~h-G&49E8URp~~m0fMM$G%e^U3Edupc!&<92s2lIy0!c8s0JhQ&WB?3+
>> zQq$1vPf?prIYJz@<3mF%+FHz4r!7oGOddouDFg4jGR$=yJkh)ZR<tzbjwhP*4+0(=
>> zHLGkN*SqRbt;i$=)+jG_;>a7(4XdwD-=m=2@*?4IcO1_9JLkFG5SCijCl+KrTWE|U
>> zMhZ9`&P=M@@Xr1Z%XdYY>2jNy#a9w?U!Zv0kgAKVPy=fe6&x2GrN7zlAZ3<2nhu!v
>> z>!G9Y<304rc(4MM;VmJsAB0BlW3(#UBlXv3o(|g6e_iXiU*5sB=d-`_5JMP4Osn6X
>> z?PCl+3&mGNB;^>S**>QgGKuGc^mKds3%l=&&ZohwUe#f}PlF+vY>Jpk>92qz=CZqe
>> zx>-GFj?nC@wo78t=X2ftl_!f0PDp!ugs)zmpRV_4+Fkct1*A7$QV0vbfLZW3$QGCq
>> z09W;cwbV@b15?t=#klalE#kq?-J~rOe0sH9T0ZUuRj|lB-}soTrC+p`@i=TrdQ1;>
>> zaWf7<qV(Mc`Cez^;x>W${Hx(2Ff{RjCVgbv4WkliwG|2|f{e$qQU(_}R3HLQnf~X_
>> z)-AsMpM+jjl3X~Rp+Ji8xQ=F(uYm%;8=4y2r<TVJH3R^Rk<|<fQjHw&b>A6NjX;4>
>> zayq&_Z7&};dcb*5kx+ng0l}~y0LJ^2hbLDyxa*-$b*?j|Zd&fIUtt8+w@lt9F+IA0
>> z#U!NGbO60f!)IrVG+zY?0ExuMCg1sL^M{)g=|O;asW}=S6vURpLcSjlFm|Adfr~c;
>> zYl?GpmB$rOOw02E58jgRsg4668@#44(#YKk?;Kvid7qKTw{F4^cvF~4d-vU6aPzQo
>> zoLk^)y9-Bc(uX0MFTbj$Qkk4c>u%yGfiyppv!n+5{tTVpANosXnyWfwFWkp46K}Q9
>> zD2f}SO03C9)9!x{W_}F9OMg0pNs3rG{da>c<gdYo_5m~ZK*nol&F~8*4qr{Ww(R(;
>> z4%x`&0M-pKn~uCnP5~~VyjkzjO^l%n{%f(Vi>Q?l`4ZnMcYu+ScLD;fm6b}My4Bcd
>> zW@+i;?F}sg3T#VFE{1zixZ2Xo0d8>^fS56EK%*sFzMZ6C5q8g}$aHhifohAu-9K@{
>> z657~%I6h*i(<ToGvrjwI*`raz$Zw;T+@!2oT{S#XX{YRir%oyC2$!Z2192n{1#)3W
>> zS5~flGT(Lfj_W<<u$72JIM@;VHeE3+n!Ts*@Fy|TFh0kWJa1#DJjAs!oQQn?{auxp
>> z(fn$|k_N{A&cu=IZv0EoErZ!p5R9>Wm6w-y4GqS_#dRhr<kx}>3=AwTE<zxs!{d*U
>> zBr(7J@L~FsF~5PV?E81MbX+jEota7govge>bH{fjV3u5bD#oB-iwwdibQcZf^F5u$
>> zx7J@&i5<bkG;V)C=lQ|`0hTumhyWK$2kkAU>q91CYKM|eY&$PLRD2u|`0rTa6Q$+<
>> zW{J3sQSq6VWQ}L_553|60m36?76{NG1bV-P!M9>PS83efxaxnot88pc34kx=;r_lv
>> ztz@OmXK`*0%v$fw9<J}Q!!uswgYN?yTvcB-75~3_In!vi(>;#=Z9`imcGq-jE4Q`8
>> z(rHz#t*BB``xewL8nharAwgS0uBA<ha*K?s2py`58YP11h$UPGVNi@E_I+z3a{qVk
>> zIrr6_xA)z1&htCxIp_D{cb@0@e!kyl)Pwd$T!J&6{YxQorZgc}ws;Ch6&ZlB&I6Nk
>> zG^EJPV42q!+CP~ifFOCRyCU-r7qhAnIQ+3SgB&Fw0nQ^XqDX7<ZPg=sW)F0M=NmL#
>> zjBld-x|7kB7hALE2nk+UL5oTml^XtJWJcv$s{9F~Kf<)I$U0vB*7Mda=4Kl|+W^#!
>> z8r|PSPSaZ}D#E}?l9?re`LQ$#I{5kzpv*N%?!tGCOCuHk>p{7#;1fDlk#n$^JT(KL
>> z1uUKLj|4p>arcm*91#iGQqigM_p#6x2G&Zcp)3fe1ZQ(6hyNjtZ{Wm^KHD`tZL)C{
>> z>L|YHUvbG&O2SJYs%OPi&h!<!p>)kzuijcy)A(Ikl69V)1FAq<E{P(O=5^CH+@jWi
>> z8LZ-tu#_R2td$?%GQK)<bkL=$Z?b(fxy;t1pW_Qme<a8rOmet9JbhYS?FBcLM$$S%
>> zkF>+#wgg3{vAZ{^hr)5B>VQd?yS;CXPi=4JKD(n!`;BVOV%^L>%6`M?U*)=9>J&89
>> z*eL0JL5L&daX)vLCDhAo<PtaMj8ECjn`3Mzn|P@caqh4Q>4kPFCw6KpGI5Qphrjqx
>> zha3{jFDgB=Gi!ggYhhtQPF7Y{K|x#gGzl)PtlZ|`E~xepgXxGb+LtE!y}ch1QO`L7
>> zod}h#c9Ona$D?mDE9yFpkx%3u_8n<K3anT2S3*wgy9e+3C2VIAhgEthbseo1SllgA
>> zIb8HYdh>o8f8_e(!N*oP%Z3K3>hV)m|M;{WWK^BMFz6Hepo<+}jOugY?VhT<hMW7{
>> zq1$GtlS8RS6qLnY{)=9bwl3_ahDCd?#T;p5XOoR>6hE(;H122f*?@GNeHw$=z)xS+
>> z$F2`8^V(8tGL$vUbJz`aKL!jG8qAk;j~AWzcF;Liu(moaW1nz?QL3)-r-fYQ>|HhR
>> z4tI!|``g_qc@xfWU-!Z&{9@kkorDpX(?p}*4#jlw3!`IQD8R7b9vUt2&C_;&R8&->
>> zdGPabMn|NrEol%n{H$;grE~FO0J3SF9vcxE!#93vSlR-nHGH0Y5EEHX%}t*ib_z${
>> zaaT@XL=83fAc{H2?5<whk)#=@8BylGUg4S@ye3g9!zjt+@88<VZimk?yu+!LCriI5
>> z6dzzU)Lt}kk8CvQC+(#2jRZ(%UVqhE_Z9vS!NX0Q&UF2<2v?(0LOzHR4+oZy<uF1m
>> zAf{TpQv36Msz;xY)oPPxes$4yN^Uw6y>dJvGP2I=tsPCBs4emkW#b*f40-9V;#yc=
>> z7cTfUEj$`Mv(rzZQbCIrH8=PCo@F7CgL^;Tx7*?a`+yM04_Pd-%QrK=*IWmxM5d--
>> zfKN9J26J<BQ_3QypG2UHAM6ZmNJM9gcL%h3#G(X8W1_076VdfkVmpfM-Mvpcq6^={
>> zaN@N!#fsv@@^a0D?8Ci1aY@N@U%gAVT7Au=Q;++xBD)Jh=qv8cpT6@^N{>xf+)>pu
>> z9YE^HQ|!u|E7$O(1||6n>#^{~YU<0hP;A9(w3XXrmPO(icl)J6i?jK3E1YGjJD0#(
>> z^qb(HC*k#7w^US>13Px{pxV5@%HEIXZP`@0YBhM9ZIuaW>mk~ave(<|S92t~Sn#3k
>> zUjy?voA@|vCX3*Guv|4Rdo~Z9aCp1#-RMv-$J9fKn2KjuF>nJ@$GlV)0&m0qq3>;v
>> zj6)-W`TFxEMWZo>7<gD<E7rQwRg2QYJ!cxzJj*oGd#2e>aLx~HN-JhqCF9dc`}3)@
>> z-@})36cme|LkwoU?)$#088RW5Zsl8<!#e}tL7f~NveY+cW+Y{kOTda#5J(t3MV0KY
>> zD^n=`1)7$J3=R5Nz<liBE^pZIinJ8UC76etW+0epVyMe5v2s+4hhOi9wFazUj_OZ8
>> z5S+IXu7A&KcyE2Y?5^)UiwA$yRh0pT7#JdUlPL=5-!KP~rFH~>%#`l5{Z2<Bduoa>
>> z9RyffcFdR3>E<9>N~6(AN&=RueL$WRi~Tow-os>~&}f<92*CfZ?dK?<i0JF(WeYbf
>> z=<DjT(agcd#)5RMH&v(*^wCi$8cYVjKs;H$HnJQuir?GY``*Y1!Xw*j-oAZX2IT|z
>> z>$Ss*h$$%`S~PY{c7M~r3HJt6bW}b3Vy;c`+enq7$(~{bkXJHLdo$qY8#4suI0sAp
>> zeE=%;csH6YEbIaSq@)tr%Zxvk(NgBhLjNhXKEgxEh>Ff(A<G!y32gjJ5RxAo^DMCu
>> z0Mxf=^FjceL%xa=01W=ygXa*yKLrl}>fq*|wCVp*GMGdkUN`-rqHhpPCje}%5%8KD
>> 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    ".
> >> +                "&nbsp;&nbsp;789 123456&nbsp;&nbsp;&nbsp;&nbsp;"
> >> +                and <filename>FOO2</filename> becomes
> >> +                "&nbsp;&nbsp;ghi abcdef&nbsp;&nbsp;&nbsp;&nbsp;".
> >>               </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: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 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 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    ".
> +                "&nbsp;&nbsp;789 123456&nbsp;&nbsp;&nbsp;&nbsp;"
> +                and <filename>FOO2</filename> becomes
> +                "&nbsp;&nbsp;ghi abcdef&nbsp;&nbsp;&nbsp;&nbsp;".
>               </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

* 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

* 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