<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AngryMane</title>
    <description>The latest articles on DEV Community by AngryMane (@angrymane).</description>
    <link>https://dev.to/angrymane</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F902759%2F537de591-0a22-4a2d-91e8-bc67fb87d3ac.jpeg</url>
      <title>DEV Community: AngryMane</title>
      <link>https://dev.to/angrymane</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/angrymane"/>
    <language>en</language>
    <item>
      <title>Create SPDX with Yocto</title>
      <dc:creator>AngryMane</dc:creator>
      <pubDate>Sun, 19 Feb 2023 06:07:25 +0000</pubDate>
      <link>https://dev.to/angrymane/create-spdx-with-yocto-2od9</link>
      <guid>https://dev.to/angrymane/create-spdx-with-yocto-2od9</guid>
      <description>&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;Poky(yocto) has support to generate spdx files.(create-spdx.bbclass). This article explains how to use it.&lt;br&gt;&lt;br&gt;
There are other ways to generate spddx files with using meta-spdxscanner, but they are not described here.  &lt;/p&gt;
&lt;h1&gt;
  
  
  How to generate spdx files
&lt;/h1&gt;

&lt;p&gt;At first, you have to do this as usual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source &lt;/span&gt;oe-init-build-env 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, edit conf/local.conf as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gi"&gt;+ INHERIT += "create-spdx"      # required. enable to generate spdx files.
+ SPDX_PRETTY = "1"             # optional. if "1", output spdx files will be formatted.
+ SPDX_INCLUDE_SOURCES = "1"    # optional. if "1", output spdx files includes [file-information section](https://spdx.github.io/spdx-spec/v2.3/file-information/).
+ SPDX_ARCHIVE_SOURCES = "1"    # optional. if "1", bitbake will create source files archive for each package.
+ SPDX_ARCHIVE_PACKAGED = "1"   # optional. if "1", bitbake will create output binary archive for each package.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, run build.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# for example, `bitbake core-image-minimal`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;bitbake &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_IMAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to generate one spdx file for specific package.&lt;br&gt;
Please note that this command output spdx files to ${WORKDIR}/spdx of target package.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# for example, `bitbake -c create_spdx gcc`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;bitbake &lt;span class="nt"&gt;-c&lt;/span&gt; create_spdx &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_PACKAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# if you want to confirm ${WORKDIR} of ${TARGET_PACKAGE_NAME}&lt;/span&gt;
&lt;span class="c"&gt;# for example, `bitbake -e gcc | grep ^WORKDIR=`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;bitbake &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_PACKAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; ^WORKDIR&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Outputs
&lt;/h1&gt;

&lt;p&gt;bitbake outputs as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# if you want to confirm ${DEPLOY_DIR}&lt;/span&gt;
&lt;span class="c"&gt;# for example, `bitbake -e core-image-minimal | grep ^DEPLOY_DIR=`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;bitbake &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_IMAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; ^DEPLOY_DIR&lt;span class="o"&gt;=&lt;/span&gt; 

&lt;span class="c"&gt;# for example, `cd tmp/deploy`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DEPLOY_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;tree &lt;span class="nt"&gt;-d&lt;/span&gt; 
&lt;span class="nb"&gt;.&lt;/span&gt;
├── images &lt;span class="c"&gt;# Outputs&lt;/span&gt;
│   └── &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
│       ├── &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.spdx.index.json
│       ├── &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.spdx.json
│       └── &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.spdx.tar.zst
│
└── spdx   &lt;span class="c"&gt;# intermediate product. With the exception of some ARCHIVE files, they are just intermediate generated files and are not explained here.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ${IMAGE_NAME}-${MACHINE}.spdx.json
&lt;/h2&gt;

&lt;p&gt;This is a spdx file for target image. &lt;/p&gt;



&lt;h2&gt;
  
  
  ${IMAGE_NAME}-${MACHINE}.spdx.index.json
&lt;/h2&gt;

&lt;p&gt;This file includes a spdx file list that is correspondint to packages following below conditions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the package installed into target image&lt;/li&gt;
&lt;li&gt;the package depended by packages installed into target image&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  ${IMAGE_NAME}-${MACHINE}.spdx.tar.zst
&lt;/h2&gt;

&lt;p&gt;This archive file contains spdx files listed in ${IMAGE_NAME}-${MACHINE}.spdx.index.json.&lt;br&gt;
There are 3-types of spdx file in this archive.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;${PN}.spdx.json&lt;/li&gt;
&lt;li&gt;recipe-${PN}.spdx.json&lt;/li&gt;
&lt;li&gt;runtime-${PN}.spdx.json&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only &lt;code&gt;file-information section&lt;/code&gt; and &lt;code&gt;relationship information section&lt;/code&gt; of these files are described below.&lt;br&gt;&lt;br&gt;
The other sections are not so distinctive and should be checked by actually looking at the files.&lt;br&gt;&lt;br&gt;
If you don't know &lt;code&gt;file-information section&lt;/code&gt; or &lt;code&gt;relationship information section&lt;/code&gt;, see following links.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://spdx.github.io/spdx-spec/v2.3/file-information/"&gt;file-information section&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spdx.github.io/spdx-spec/v2.3/relationships-between-SPDX-elements/"&gt;relationship information section&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  ${PN}.spdx.json
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;file-information section(&lt;code&gt;files&lt;/code&gt;)

&lt;ul&gt;
&lt;li&gt;files created by the target package and installed in the target image&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;relationship information section(&lt;code&gt;relationships&lt;/code&gt;)

&lt;ul&gt;
&lt;li&gt;reference to &lt;a href="https://spdx.github.io/spdx-spec/v2.3/file-information/"&gt;the file-information section&lt;/a&gt; of the source files of this package&lt;/li&gt;
&lt;li&gt;reference to &lt;a href="https://spdx.github.io/spdx-spec/v2.3/file-information/"&gt;the file-information section&lt;/a&gt; of the header files of external libraries&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  recipe-${PN}.spdx.json
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;file-information section(&lt;code&gt;files&lt;/code&gt;)

&lt;ul&gt;
&lt;li&gt;the source files of the target package.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;relationship information section(&lt;code&gt;relationships&lt;/code&gt;)

&lt;ul&gt;
&lt;li&gt;reference to &lt;a href="https://spdx.github.io/spdx-spec/v2.3/file-information/"&gt;the file-information section&lt;/a&gt; of the source files of this package&lt;/li&gt;
&lt;li&gt;reference to &lt;a href="https://spdx.github.io/spdx-spec/v2.3/file-information/"&gt;the file-information section&lt;/a&gt; of the recipe files of external libraries&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  runtime-${PN}.spdx.json
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;file-information section(&lt;code&gt;files&lt;/code&gt;)

&lt;ul&gt;
&lt;li&gt;Nothing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;relationship information section(&lt;code&gt;relationships&lt;/code&gt;)

&lt;ul&gt;
&lt;li&gt;reference to &lt;a href="https://spdx.github.io/spdx-spec/v2.3/package-information/"&gt;the package information section&lt;/a&gt; of the packages this package depends on&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Which information is where?
&lt;/h1&gt;
&lt;h2&gt;
  
  
  installed packages list
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# for example, `cat tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.manifest`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;  &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DEPLOY_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/images/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_IMAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.manifest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  license info of package
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# for example, `tar -I zstd -xvf core-image-minimal-qemux86-64.spdx.tar.zst`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt; zstd &lt;span class="nt"&gt;-xvf&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.spdx.tar.zst

&lt;span class="c"&gt;# for example, `cat tmp/deploy/images/qemux86-64/libc6.spdx.json`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DEPLOY_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/images/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_PACKAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.spdx.json
...
  &lt;span class="s2"&gt;"packages"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"SPDXID"&lt;/span&gt;: &lt;span class="s2"&gt;"SPDXRef-Package-libc6"&lt;/span&gt;,
      &lt;span class="s2"&gt;"copyrightText"&lt;/span&gt;: &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;,
      &lt;span class="s2"&gt;"downloadLocation"&lt;/span&gt;: &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;,
      &lt;span class="s2"&gt;"hasFiles"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-1"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-2"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-3"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-4"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-5"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-6"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-7"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-8"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-9"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-10"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-11"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-12"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-13"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-14"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-15"&lt;/span&gt;,
        &lt;span class="s2"&gt;"SPDXRef-PackagedFile-libc6-16"&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"licenseConcluded"&lt;/span&gt;: &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;,
      &lt;span class="s2"&gt;"licenseDeclared"&lt;/span&gt;: &lt;span class="s2"&gt;"GPL-2.0-only AND LGPL-2.1-only"&lt;/span&gt;,
      &lt;span class="s2"&gt;"licenseInfoFromFiles"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"libc6"&lt;/span&gt;,
      &lt;span class="s2"&gt;"packageFileName"&lt;/span&gt;: &lt;span class="s2"&gt;"libc6.tar.zst"&lt;/span&gt;,
      &lt;span class="s2"&gt;"packageVerificationCode"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"packageVerificationCodeValue"&lt;/span&gt;: &lt;span class="s2"&gt;"dc1d4ff83689b1922ab1a0b8dfaa80e40986c3b2"&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;,
      &lt;span class="s2"&gt;"supplier"&lt;/span&gt;: &lt;span class="s2"&gt;"Organization: OpenEmbedded ()"&lt;/span&gt;,
      &lt;span class="s2"&gt;"versionInfo"&lt;/span&gt;: &lt;span class="s2"&gt;"2.35"&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;]&lt;/span&gt;,
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  license info of source files
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# for example, `tar -I zstd -xvf core-image-minimal-qemux86-64.spdx.tar.zst`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt; zstd &lt;span class="nt"&gt;-xvf&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.spdx.tar.zst

&lt;span class="c"&gt;# for example, `cat tmp/deploy/images/qemux86-64/recipe-libffi.spdx.json`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DEPLOY_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/images/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/recipe-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_PACKAGE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.spdx.json
...
  &lt;span class="s2"&gt;"files"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"SPDXID"&lt;/span&gt;: &lt;span class="s2"&gt;"SPDXRef-SourceFile-libffi-1"&lt;/span&gt;,
      &lt;span class="s2"&gt;"checksums"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"algorithm"&lt;/span&gt;: &lt;span class="s2"&gt;"SHA1"&lt;/span&gt;,
          &lt;span class="s2"&gt;"checksumValue"&lt;/span&gt;: &lt;span class="s2"&gt;"1541a69f581bcdf9405369d32fc834cb0d6aa621"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"algorithm"&lt;/span&gt;: &lt;span class="s2"&gt;"SHA256"&lt;/span&gt;,
          &lt;span class="s2"&gt;"checksumValue"&lt;/span&gt;: &lt;span class="s2"&gt;"e99c283675c59ad08620044e9b8758acb318dc1c93944009470b594db31e961b"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"copyrightText"&lt;/span&gt;: &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;,
      &lt;span class="s2"&gt;"fileName"&lt;/span&gt;: &lt;span class="s2"&gt;"not-win32.patch"&lt;/span&gt;,
      &lt;span class="s2"&gt;"fileTypes"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"SOURCE"&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"licenseConcluded"&lt;/span&gt;: &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;,
      &lt;span class="s2"&gt;"licenseInfoInFiles"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"SPDXID"&lt;/span&gt;: &lt;span class="s2"&gt;"SPDXRef-SourceFile-libffi-2"&lt;/span&gt;,
      &lt;span class="s2"&gt;"checksums"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"algorithm"&lt;/span&gt;: &lt;span class="s2"&gt;"SHA1"&lt;/span&gt;,
          &lt;span class="s2"&gt;"checksumValue"&lt;/span&gt;: &lt;span class="s2"&gt;"245bae99b2b5916865ee2e5c9dc9f817cf8771bb"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"algorithm"&lt;/span&gt;: &lt;span class="s2"&gt;"SHA256"&lt;/span&gt;,
          &lt;span class="s2"&gt;"checksumValue"&lt;/span&gt;: &lt;span class="s2"&gt;"328c7c2908c43ce42eefda072307d2fc7fe8f5ae1d21f7f9f0b832e469e21be9"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"copyrightText"&lt;/span&gt;: &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;,
      &lt;span class="s2"&gt;"fileName"&lt;/span&gt;: &lt;span class="s2"&gt;"0001-arm-sysv-reverted-clang-VFP-mitigation.patch"&lt;/span&gt;,
      &lt;span class="s2"&gt;"fileTypes"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"SOURCE"&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"licenseConcluded"&lt;/span&gt;: &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;,
      &lt;span class="s2"&gt;"licenseInfoInFiles"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"SPDXID"&lt;/span&gt;: &lt;span class="s2"&gt;"SPDXRef-SourceFile-libffi-3"&lt;/span&gt;,
      &lt;span class="s2"&gt;"checksums"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"algorithm"&lt;/span&gt;: &lt;span class="s2"&gt;"SHA1"&lt;/span&gt;,
          &lt;span class="s2"&gt;"checksumValue"&lt;/span&gt;: &lt;span class="s2"&gt;"88f1017994a6dc390903d73474fd193b86038564"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"algorithm"&lt;/span&gt;: &lt;span class="s2"&gt;"SHA256"&lt;/span&gt;,
          &lt;span class="s2"&gt;"checksumValue"&lt;/span&gt;: &lt;span class="s2"&gt;"e4d016c7690f82469d7eb52487e56c3c26429c5400f7f86e056b12e54a746ad3"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"copyrightText"&lt;/span&gt;: &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;,
      &lt;span class="s2"&gt;"fileName"&lt;/span&gt;: &lt;span class="s2"&gt;"libffi-3.4.4/fficonfig.h.in"&lt;/span&gt;,
      &lt;span class="s2"&gt;"fileTypes"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"SOURCE"&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"licenseConcluded"&lt;/span&gt;: &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;,
      &lt;span class="s2"&gt;"licenseInfoInFiles"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"NOASSERTION"&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  source files of the package
&lt;/h2&gt;

&lt;p&gt;To do this, please set SPDX_INCLUDE_SOURCES and SPDX_ARCHIVE_SOURCES as "1".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt; zstd &lt;span class="nt"&gt;-xvf&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DEPLOY_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/spdx/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/recipes/recipe-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.yst.zst
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  installed binary of the package
&lt;/h2&gt;

&lt;p&gt;To do this, please set SPDX_ARCHIVE_PACKAGED as "1".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt; zstd &lt;span class="nt"&gt;-xvf&lt;/span&gt;  &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DEPLOY_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/spdx/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MACHINE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/packages/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.yst.zst
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>yoct</category>
      <category>spdx</category>
      <category>sbom</category>
    </item>
    <item>
      <title>Let's use bitbake commands from python!</title>
      <dc:creator>AngryMane</dc:creator>
      <pubDate>Sat, 20 Aug 2022 12:36:37 +0000</pubDate>
      <link>https://dev.to/angrymane/lets-use-bitbake-commands-from-python-3k8c</link>
      <guid>https://dev.to/angrymane/lets-use-bitbake-commands-from-python-3k8c</guid>
      <description>&lt;h2&gt;
  
  
  First of all
&lt;/h2&gt;

&lt;p&gt;I'm working on building a custom linux build using yocto.&lt;br&gt;
In this job, I often get requests like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I need a list of files that inherit from a specific bbclass (like core-image.bbclass).&lt;/li&gt;
&lt;li&gt;I need to list the variables (e.g. PE, PV, PR) with all packages&lt;/li&gt;
&lt;li&gt;I need to list the bbappend files for a specific package (e.g. gcc).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isn't that a pain in the ass? I don't want to grep, and I don't want to build because it takes too long...&lt;/p&gt;
&lt;h2&gt;
  
  
  Let's use Bitbake from python.
&lt;/h2&gt;

&lt;p&gt;It's a pain in the ass I think, so let's investigate how to do something about it. First of all, the build mechanism by bitbake command is roughly like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q4_pFOC_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tapctn2pmysdw1sq5sis.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q4_pFOC_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tapctn2pmysdw1sq5sis.png" alt="How to build with bitbake" width="851" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This Tinfoil is a little bit complicated, so it's not easy to use. The actual code is &lt;a href="https://git.yoctoproject.org/poky/tree/bitbake/lib/bb/tinfoil.py?h=kirkstone"&gt;here&lt;/a&gt;. On the other hand, IF between server_client is defined somewhat nicely &lt;a href="https://git.yoctoproject.org/poky/tree/bitbake/lib/bb/command.py?h=kirkstone"&gt;here&lt;/a&gt;. Considering these circumstances, it seems like I should do like below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E_Vml4EI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mm9rd1kykc8bip9nkm5h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E_Vml4EI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mm9rd1kykc8bip9nkm5h.png" alt="How to implement bbclient" width="870" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If I make this bbclient in python, it will be easy to use from language server and so on.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I made
&lt;/h2&gt;

&lt;p&gt;Based on the results of the study so far, the bbclient I made is shown in below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pypi.org/project/bbclient/"&gt;https://pypi.org/project/bbclient/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've also prepared some documentation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://angrymane.github.io/bbclient/bbclient.html"&gt;IF Specifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://angrymane.github.io/bbclient/usecase.html"&gt;Concrete use case&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What you can do
&lt;/h2&gt;

&lt;p&gt;There are so many IFs that I can't show you all of them, but for now, let's try to implement the use case I mentioned at the beginning of this article.&lt;br&gt;
First of all, the way to initialize the bbclient instance is shown in below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;bbclient&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize bbclient instance
&lt;/span&gt;&lt;span class="n"&gt;project_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/PATH/TO/POKY"&lt;/span&gt;
&lt;span class="n"&gt;init_command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;". oe-init-build-env"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BBClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BBClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;init_command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# launch server 
&lt;/span&gt;&lt;span class="n"&gt;server_adder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"localhost"&lt;/span&gt;
&lt;span class="n"&gt;server_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8081&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_adder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server_port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# set event filter
&lt;/span&gt;&lt;span class="n"&gt;ui_handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_uihandler_num&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_event_mask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ui_handler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# paser recipes and create caches
&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_files&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait_done_async&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use this client to implement each of the following use cases. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I need a list of recipe files that inherit a specific bbclass (like core-image.bbclass).&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;GetRecipeInheritsResult&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_recipe_inherits&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;recipes_inherit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s"&gt;"/PATH/TO/core-image.bbclass"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inherit_file_paths&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;recipes_inherit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recipe_file_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;I need you to list the variables (e.g. PE, PV, PR) with all packages&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;GetRecipesResult&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_recipes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;data_store_index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_recipe_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recipe_files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data_store_connector_cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_store_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"getVar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"PE"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data_store_connector_cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_store_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"getVar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"PE"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data_store_connector_cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_store_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"getVar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"PE"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;I need you to list the bbappend files for a specific package (e.g. gcc).&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_best_provider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"gcc"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;target_recipe_file_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_file_appends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_recipe_file_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also build images from this client and generate dependency taskdepends files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally
&lt;/h2&gt;

&lt;p&gt;If you would like to try it, please use it! &lt;/p&gt;

</description>
      <category>python</category>
      <category>yocto</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
