Hi Joshua

On master-next poky, I am seeing a failure in usb-modeswitch
do_create_runtime_spdx from meta-oe (. musl/qemuarm64 )

https://errors.yoctoproject.org/Errors/Build/172015/

building individually works ok. So perhaps some sort of race ?

Another issue similar to this I see is in qtwayland-native from
meta-qt6 ( machine glibc/rpi4-64 )

  ERROR: qtwayland-native-6.5.3-r0 do_create_spdx: Cannot find any
SPDX file for recipe wayland-native, True
sstate:wayland-native:x86_64-linux:1.22.0:r0:x86_64:11:
sstate:wayland-native::1.22.0:r0::11:

detailed log

https://snips.sh/f/Kaupf_5AJU

Any ideas ?

On Thu, Sep 21, 2023 at 8:09 AM Joshua Watt <jpewhac...@gmail.com> wrote:
>
> From: Richard Purdie <richard.pur...@linuxfoundation.org>
>
> Currently the by-id and by-namespace SPDX files are created without reference
> to PACKAGE_ARCH. This means that for two machines using a common package 
> architecture
> (e.g. genericx86-64 and qqemux86-64), there would be overlapping files. This 
> means
> that the build of one can remove files from the other leading to build 
> failures. An
> example would be:
>
> MACHINE=qemux86-64 bitbake core-image-minimal
> MACHINE=genericx86-64 bitbake core-image-minimal
> MACHINE=qemux86-64 bitbake linux-yocto -c clean
> MACHINE=genericx86-64 bitbake core-image-minimal -C rootfs
>
> To fix this, add PACKAGE_ARCH to the path used for the files and use a search
> path based upon PACKAGE_ARCHS to access them.
>
> Signed-off-by: Richard Purdie <richard.pur...@linuxfoundation.org>
> Signed-off-by: Joshua Watt <jpewhac...@gmail.com>
> ---
>  meta/classes/create-spdx-2.2.bbclass | 41 ++++++++++++++++++++--------
>  meta/lib/oe/sbom.py                  | 34 ++++++++++++++++++-----
>  2 files changed, 57 insertions(+), 18 deletions(-)
>
> diff --git a/meta/classes/create-spdx-2.2.bbclass 
> b/meta/classes/create-spdx-2.2.bbclass
> index 9b28d124c78..a2b96da61a9 100644
> --- a/meta/classes/create-spdx-2.2.bbclass
> +++ b/meta/classes/create-spdx-2.2.bbclass
> @@ -349,6 +349,8 @@ def collect_dep_recipes(d, doc, spdx_recipe):
>
>      deploy_dir_spdx = Path(d.getVar("DEPLOY_DIR_SPDX"))
>      spdx_deps_file = Path(d.getVar("SPDXDEPS"))
> +    package_archs = d.getVar("SSTATE_ARCHS").split()
> +    package_archs.reverse()
>
>      dep_recipes = []
>
> @@ -356,7 +358,9 @@ def collect_dep_recipes(d, doc, spdx_recipe):
>          deps = json.load(f)
>
>      for dep_pn, dep_hashfn in deps:
> -        dep_recipe_path = oe.sbom.doc_path_by_hashfn(deploy_dir_spdx, 
> "recipe-" + dep_pn, dep_hashfn)
> +        dep_recipe_path = oe.sbom.doc_find_by_hashfn(deploy_dir_spdx, 
> package_archs, "recipe-" + dep_pn, dep_hashfn)
> +        if not dep_recipe_path:
> +            bb.fatal("Cannot find any SPDX file for recipe %s, %s" % 
> (dep_pn, dep_hashfn))
>
>          spdx_dep_doc, spdx_dep_sha1 = oe.sbom.read_doc(dep_recipe_path)
>
> @@ -385,6 +389,7 @@ def collect_dep_recipes(d, doc, spdx_recipe):
>
>      return dep_recipes
>
> +collect_dep_recipes[vardepsexclude] = "SSTATE_ARCHS"
>
>  def collect_dep_sources(d, dep_recipes):
>      import oe.sbom
> @@ -533,6 +538,7 @@ python do_create_spdx() {
>      include_sources = d.getVar("SPDX_INCLUDE_SOURCES") == "1"
>      archive_sources = d.getVar("SPDX_ARCHIVE_SOURCES") == "1"
>      archive_packaged = d.getVar("SPDX_ARCHIVE_PACKAGED") == "1"
> +    pkg_arch = d.getVar("SSTATE_PKGARCH")
>
>      creation_time = 
> datetime.now(tz=timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
>
> @@ -620,7 +626,7 @@ python do_create_spdx() {
>
>      dep_recipes = collect_dep_recipes(d, doc, recipe)
>
> -    doc_sha1 = oe.sbom.write_doc(d, doc, d.getVar("SSTATE_PKGARCH"), 
> "recipes", indent=get_json_indent(d))
> +    doc_sha1 = oe.sbom.write_doc(d, doc, pkg_arch, "recipes", 
> indent=get_json_indent(d))
>      dep_recipes.append(oe.sbom.DepRecipe(doc, doc_sha1, recipe))
>
>      recipe_ref = oe.spdx.SPDXExternalDocumentRef()
> @@ -685,7 +691,7 @@ python do_create_spdx() {
>
>              add_package_sources_from_debug(d, package_doc, spdx_package, 
> package, package_files, sources)
>
> -            oe.sbom.write_doc(d, package_doc, d.getVar("SSTATE_PKGARCH"), 
> "packages", indent=get_json_indent(d))
> +            oe.sbom.write_doc(d, package_doc, pkg_arch, "packages", 
> indent=get_json_indent(d))
>  }
>  do_create_spdx[vardepsexclude] += "BB_NUMBER_THREADS"
>  # NOTE: depending on do_unpack is a hack that is necessary to get it's 
> dependencies for archive the source
> @@ -756,6 +762,9 @@ python do_create_runtime_spdx() {
>      creation_time = 
> datetime.now(tz=timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
>
>      providers = collect_package_providers(d)
> +    pkg_arch = d.getVar("SSTATE_PKGARCH")
> +    package_archs = d.getVar("SSTATE_ARCHS").split()
> +    package_archs.reverse()
>
>      if not is_native:
>          bb.build.exec_func("read_subpackage_metadata", d)
> @@ -772,7 +781,7 @@ python do_create_runtime_spdx() {
>              if not oe.packagedata.packaged(package, localdata):
>                  continue
>
> -            pkg_spdx_path = oe.sbom.doc_path(deploy_dir_spdx, pkg_name, 
> d.getVar("SSTATE_PKGARCH"), "packages")
> +            pkg_spdx_path = oe.sbom.doc_path(deploy_dir_spdx, pkg_name, 
> pkg_arch, "packages")
>
>              package_doc, package_doc_sha1 = oe.sbom.read_doc(pkg_spdx_path)
>
> @@ -827,7 +836,9 @@ python do_create_runtime_spdx() {
>                  if dep in dep_package_cache:
>                      (dep_spdx_package, dep_package_ref) = 
> dep_package_cache[dep]
>                  else:
> -                    dep_path = oe.sbom.doc_path_by_hashfn(deploy_dir_spdx, 
> dep_pkg, dep_hashfn)
> +                    dep_path = oe.sbom.doc_find_by_hashfn(deploy_dir_spdx, 
> package_archs, dep_pkg, dep_hashfn)
> +                    if not dep_path:
> +                        bb.fatal("No SPDX file found for package %s, %s" % 
> (dep_pkg, dep_hashfn))
>
>                      spdx_dep_doc, spdx_dep_sha1 = oe.sbom.read_doc(dep_path)
>
> @@ -855,10 +866,10 @@ python do_create_runtime_spdx() {
>                  )
>                  seen_deps.add(dep)
>
> -            oe.sbom.write_doc(d, runtime_doc, d.getVar("SSTATE_PKGARCH"), 
> "runtime", spdx_deploy, indent=get_json_indent(d))
> +            oe.sbom.write_doc(d, runtime_doc, pkg_arch, "runtime", 
> spdx_deploy, indent=get_json_indent(d))
>  }
>
> -do_create_runtime_spdx[vardepsexclude] += "OVERRIDES"
> +do_create_runtime_spdx[vardepsexclude] += "OVERRIDES SSTATE_ARCHS"
>
>  addtask do_create_runtime_spdx after do_create_spdx before do_build 
> do_rm_work
>  SSTATETASKS += "do_create_runtime_spdx"
> @@ -993,6 +1004,8 @@ def combine_spdx(d, rootfs_name, rootfs_deploydir, 
> rootfs_spdxid, packages, spdx
>      import bb.compress.zstd
>
>      providers = collect_package_providers(d)
> +    package_archs = d.getVar("SSTATE_ARCHS").split()
> +    package_archs.reverse()
>
>      creation_time = 
> datetime.now(tz=timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
>      deploy_dir_spdx = Path(d.getVar("DEPLOY_DIR_SPDX"))
> @@ -1022,7 +1035,10 @@ def combine_spdx(d, rootfs_name, rootfs_deploydir, 
> rootfs_spdxid, packages, spdx
>
>          pkg_name, pkg_hashfn = providers[name]
>
> -        pkg_spdx_path = oe.sbom.doc_path_by_hashfn(deploy_dir_spdx, 
> pkg_name, pkg_hashfn)
> +        pkg_spdx_path = oe.sbom.doc_find_by_hashfn(deploy_dir_spdx, 
> package_archs, pkg_name, pkg_hashfn)
> +        if not pkg_spdx_path:
> +            bb.fatal("No SPDX file found for package %s, %s" % (pkg_name, 
> pkg_hashfn))
> +
>          pkg_doc, pkg_doc_sha1 = oe.sbom.read_doc(pkg_spdx_path)
>
>          for p in pkg_doc.packages:
> @@ -1039,7 +1055,10 @@ def combine_spdx(d, rootfs_name, rootfs_deploydir, 
> rootfs_spdxid, packages, spdx
>          else:
>              bb.fatal("Unable to find package with name '%s' in SPDX file %s" 
> % (name, pkg_spdx_path))
>
> -        runtime_spdx_path = oe.sbom.doc_path_by_hashfn(deploy_dir_spdx, 
> "runtime-" + name, pkg_hashfn)
> +        runtime_spdx_path = oe.sbom.doc_find_by_hashfn(deploy_dir_spdx, 
> package_archs, "runtime-" + name, pkg_hashfn)
> +        if not runtime_spdx_path:
> +            bb.fatal("No runtime SPDX document found for %s, %s" % (name, 
> pkg_hashfn))
> +
>          runtime_doc, runtime_doc_sha1 = oe.sbom.read_doc(runtime_spdx_path)
>
>          runtime_ref = oe.spdx.SPDXExternalDocumentRef()
> @@ -1111,7 +1130,7 @@ def combine_spdx(d, rootfs_name, rootfs_deploydir, 
> rootfs_spdxid, packages, spdx
>                      })
>
>                  for ref in doc.externalDocumentRefs:
> -                    ref_path = 
> oe.sbom.doc_path_by_namespace(deploy_dir_spdx, ref.spdxDocument)
> +                    ref_path = 
> oe.sbom.doc_find_by_namespace(deploy_dir_spdx, package_archs, 
> ref.spdxDocument)
>                      collect_spdx_document(ref_path)
>
>              collect_spdx_document(image_spdx_path)
> @@ -1134,4 +1153,4 @@ def combine_spdx(d, rootfs_name, rootfs_deploydir, 
> rootfs_spdxid, packages, spdx
>
>              tar.addfile(info, fileobj=index_str)
>
> -combine_spdx[vardepsexclude] += "BB_NUMBER_THREADS"
> +combine_spdx[vardepsexclude] += "BB_NUMBER_THREADS SSTATE_ARCHS"
> diff --git a/meta/lib/oe/sbom.py b/meta/lib/oe/sbom.py
> index 1130fa668bd..fd4b6895d8f 100644
> --- a/meta/lib/oe/sbom.py
> +++ b/meta/lib/oe/sbom.py
> @@ -38,16 +38,34 @@ def get_sdk_spdxid(sdk):
>      return "SPDXRef-SDK-%s" % sdk
>
>
> -def doc_path_by_namespace(spdx_deploy, doc_namespace):
> -    return spdx_deploy / "by-namespace" / doc_namespace.replace("/", "_")
> +def _doc_path_by_namespace(spdx_deploy, arch, doc_namespace):
> +    return spdx_deploy / "by-namespace" / arch / doc_namespace.replace("/", 
> "_")
>
>
> -def doc_path_by_hashfn(spdx_deploy, doc_name, hashfn):
> -    return spdx_deploy / "by-hash" / hashfn.split()[1] / (doc_name + 
> ".spdx.json")
> +def doc_find_by_namespace(spdx_deploy, search_arches, doc_namespace):
> +    for pkgarch in search_arches:
> +        p = _doc_path_by_namespace(spdx_deploy, pkgarch, doc_namespace)
> +        if os.path.exists(p):
> +            return p
> +    return None
> +
> +
> +def _doc_path_by_hashfn(spdx_deploy, arch, doc_name, hashfn):
> +    return (
> +        spdx_deploy / "by-hash" / arch / hashfn.split()[1] / (doc_name + 
> ".spdx.json")
> +    )
> +
> +
> +def doc_find_by_hashfn(spdx_deploy, search_arches, doc_name, hashfn):
> +    for pkgarch in search_arches:
> +        p = _doc_path_by_hashfn(spdx_deploy, pkgarch, doc_name, hashfn)
> +        if os.path.exists(p):
> +            return p
> +    return None
>
>
>  def doc_path(spdx_deploy, doc_name, arch, subdir):
> -    return spdx_deploy / arch/ subdir / (doc_name + ".spdx.json")
> +    return spdx_deploy / arch / subdir / (doc_name + ".spdx.json")
>
>
>  def write_doc(d, spdx_doc, arch, subdir, spdx_deploy=None, indent=None):
> @@ -61,11 +79,13 @@ def write_doc(d, spdx_doc, arch, subdir, 
> spdx_deploy=None, indent=None):
>      with dest.open("wb") as f:
>          doc_sha1 = spdx_doc.to_json(f, sort_keys=True, indent=indent)
>
> -    l = doc_path_by_namespace(spdx_deploy, spdx_doc.documentNamespace)
> +    l = _doc_path_by_namespace(spdx_deploy, arch, spdx_doc.documentNamespace)
>      l.parent.mkdir(exist_ok=True, parents=True)
>      l.symlink_to(os.path.relpath(dest, l.parent))
>
> -    l = doc_path_by_hashfn(spdx_deploy, spdx_doc.name, 
> d.getVar("BB_HASHFILENAME"))
> +    l = _doc_path_by_hashfn(
> +        spdx_deploy, arch, spdx_doc.name, d.getVar("BB_HASHFILENAME")
> +    )
>      l.parent.mkdir(exist_ok=True, parents=True)
>      l.symlink_to(os.path.relpath(dest, l.parent))
>
> --
> 2.34.1
>
>
> 
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#188165): 
https://lists.openembedded.org/g/openembedded-core/message/188165
Mute This Topic: https://lists.openembedded.org/mt/101502122/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to