summaryrefslogtreecommitdiff
path: root/poky
diff options
context:
space:
mode:
authorPatrick Williams <patrick@stwcx.xyz>2023-11-25 03:59:46 +0300
committerPatrick Williams <patrick@stwcx.xyz>2023-11-25 04:46:02 +0300
commitac13d5f36a6bd845f1709b7f41c02bd3b412ad15 (patch)
treef87a518e0f8b6a148681253a77a972bb85c566bb /poky
parent9d21a9409c159e4fa32c20a774337669da351413 (diff)
downloadopenbmc-ac13d5f36a6bd845f1709b7f41c02bd3b412ad15.tar.xz
subtree updates
poky: 8d0ba08aa6..2696bf8cf3: Adam Johnston (1): useradd_base: Fix sed command line for passwd-expire Adrian Freihofer (1): vscode: add minimal configuration Alassane Yattara (44): bitbake: Update toaster-requirements to add django-log-viewer==1.1.7 bitbake: toaster: bug-fix on tests.browser.test_most_recent_builds_states bitbake: Toaster: Bug-fix failure on tests.browser.test_layerdetails_page bitbake: Toaster: Fixed javascript issue on tests.browser.test_js_unit_tests bitbake: Toaster: bug-fix on /toastermain/logs.py bitbake: Toaster: bug-fix on custom image test cases bitbake: Toaster: bug-fix on tests/views/test_views.py bitbake: Toaster: bug-fix on tests.views.test_views.py bitbake: toaster: Write logs to BUILDDIR/toaster_logs bitbake: toaster: Add toaster-tests-requirements.txt to add pytest and some plugins bitbake: toaster: Update orm.models to catch error ProcessLookupError bitbake: toaster: Bug-fix pytest and Failed: Database access not allowed bitbake: toaster: fixed pytest error: Database access not allowed, use the "django_db" bitbake: toaster: Bug-fix django.db.utils.IntegrityError: Problem installing fixture bitbake: toaster: fixed: Tests fail when executed one after the other out of sequence bitbake: toaster: Added pytest.ini file bitbake: toaster: Check info_sign is visible and clickable in landing page bitbake: toaster: Test documentation link in landing header is displayed bitbake: toaster: Test jumbotron links visible and clickable bitbake: toaster: Bug-fix webdriver No parameter named options bitbake: Toaster: Write UI TestCase create new project bitbake: Toaster: Test create new project without project name bitbake: Toaster: Write UI TestCase import new project using bitbake: toaster/tests: Add UI TestCase to test if 'no build' message is shown bitbake: toaster/tests: Add UI TestCase to test search box on all build page bitbake: toaster/tests: Add UI TestCase to test the filtering feature on 'failure tasks' column bitbake: toaster/tests: Add UI TestCase to test filtering feature on 'completed_on' column bitbake: toaster/tests: Add UI TestCase to test "edit column" feature show/hide column bitbake: toaster/tests: Add UI TestCase to test "show rows" feature, change displaying rows in table bitbake: toaster/tests: Add UI TestCase for deleting project bitbake: toaster/tests: Add UI TestCase for Visualize all projects bitbake: toaster/tests: Add UI TestCase for visualize all projects edit column bitbake: toaster/tests: Add UI TestCase for visualize all projects show rows bitbake: toaster/tests/create_new_project: Code cleanup bitbake: toaster/tests: Add UI TestCase - Check project header contains right items bitbake: toaster/tests: Add UI TestCase - Test edit project name on project page bitbake: toaster/tests: Add UI TestCase - Test project page has right tabs displayed bitbake: toaster/tests: Add UI TestCase - Test project config tab navigation: bitbake: toaster/tests: Add UI TestCase - Test project config tab bitbake: toaster/tests: Add UI TestCase - Test project page tab import layer bitbake: toaster/tests: Add UI TestCase - Test project page tab "New custom image" bitbake: toaster/tests: Add UI TestCase - Test project page section images bitbake: toaster/tests: Add UI TestCase for the edit column feature in image recipe bitbake: toaster/tests: Add UI TestCase - Test the show rows feature in image recipe Alberto Pianon (1): bitbake: fetch2: Add API for upstream source tracing Alejandro Hernandez Samaniego (2): qemuarmv5: Drop QB_DTB conditional for older kernels baremetal-helloworld: Pull in fix for race condition on x86-64 Alex Stewart (1): libsndfile1: fix CVE-2022-33065 Alexander Kanavin (10): scripts/bitbake-whatchanged: remove selftest/buildoptions: tag the download mirror test with 'yocto-mirrors' bitbake: runqueue.py: clarify that 'closest' signature means 'most recent' (and not closest in its content) selftest/sstatetests: add tests for 'bitbake -S printdiff' lib/oe/sstatesig.py: dump locked.sigs.inc only when explicitly asked via -S lockedsigs selftest/sstatetests: add a test for CDN sstate cache populate_sdk_ext.bbclass: do not symlink unfsd from sdk image sysroot into eSDK tools path meta/lib/oe/copy_buildsystem.py: do not derefence symlinks scripts/esdk-tools: use a dedicated, static directory for esdk tools populate_sdk_ext: split copy_buildsystem() into logical steps defined as functions Alexander Lussier-Cullen (2): bitbake: toaster/tests: add passthroughs for relevant build environment variables bitbake: toaster: make django temp directory configurable Alexandre Belloni (1): strace: further clean up of ptest folders Alexis Lothoré (5): scripts/resulttool: limit the number of changes displayed per test scripts/resulttool: rearrange regressions report order scripts/resulttool: make additional info more compact scripts/yocto_testresults_query: add option to change display limit scripts/resulttool: group all regressions in regression report Anuj Mittal (9): gstreamer1.0: upgrade 1.22.6 -> 1.22.7 gsettings-desktop-schemas: upgrade 44.0 -> 45.0 harfbuzz: upgrade 8.2.2 -> 8.3.0 libnotify: upgrade 0.8.2 -> 0.8.3 libtirpc: upgrade 1.3.3 -> 1.3.4 mmc-utils: upgrade to latest revision puzzles: upgrade to latest revision sqlite3: upgrade 3.43.2 -> 3.44.0 vulkan: upgrade 1.3.261.1 -> 1.3.268.0 Archana Polampalli (1): vim: Upgrade 9.0.2048 -> 9.0.2068 Arne Schwerdt (1): ref-manual: Warn about COMPATIBLE_MACHINE skipping native recipes BELHADJ SALEM Talel (8): bitbake.conf: Drop DEPLOY_DIR_TAR ref-manual: Fix PACKAGECONFIG term and add an example dev-manual: layers: Add notes about layer.conf ref-manual: variables: add RECIPE_SYSROOT and RECIPE_SYSROOT_NATIVE ref-manual: variables: add TOOLCHAIN_OPTIONS variable ref-manual: variables: add example for SYSROOT_DIRS variable bitbake: Fix find_bbfiles string endswith call overview-manual: concepts: Add Bitbake Tasks Map Bastian Krause (1): linux-firmware: add new fw file to ${PN}-rtl8821 Bruce Ashfield (22): linux-yocto/6.1: update to v6.1.56 linux-yocto/6.5: update to v6.5.6 linux-yocto/6.1: tiny: fix arm 32 boot linux-yocto/6.5: tiny: fix arm 32 boot linux-yocto/6.5: update to v6.5.7 linux-yocto/6.1: update to v6.1.57 linux-yocto/6.4: drop recipes linux-yocto/6.5: avoid serial port suspend issues linux-yocto/6.5: config: remove VIDEO_STK1160_COMMON linux-yocto/6.5: serial: core: integrate upstream fixes linux-yocto/6.5: update to v6.5.8 linux-yocto/6.1: update to v6.1.59 linux-yocto/6.5: update to v6.5.9 linux-yocto/6.1: update to v6.1.60 kern-tools: make lower context patches reproducible kern-tools: bump SRCREV for queue processing changes kern-tools: update SRCREV to include SECURITY.md file kernel-yocto: improve metadata patching linux-yocto/6.1: cfg: restore CONFIG_DEVMEM linux-yocto/6.1: update to v6.1.61 linux-yocto/6.5: cfg: restore CONFIG_DEVMEM linux-yocto/6.5: update to v6.5.10 Chen Qi (2): kernel.bbclass: add preceding space in appendVar setting systemd: fix DynamicUser issue Chris Laplante (4): bitbake: codeparser: replace deprecated ast.Str and 's' bitbake: runqueue: set has 'add', not 'append' method bitbake: codeparser: add missing 'import os' bitbake: codegen: cleanup deprecated AST usages Deepthi Hemraj (1): binutils: Fix CVE-2022-47007 Desone Burns (1): bitbake: bitbake: fetch2: git: Update Git-LFS download and tests Dmitry Baryshkov (11): kernel-arch: drop CCACHE from KERNEL_STRIP definition meson: use correct targets for rust binaries linux-firmware: upgrade 20230804 -> 20231030 linux-firmware: add missing depenencies on license packages linux-firmware: add notice file to sdm845 modem firmware linux-firmware: add audio topology symlink to the X13's audio package linux-firmware: package firmware for Qualcomm Adreno a702 linux-firmware: package firmware for Qualcomm QCM2290 / QRB4210 linux-firmware: package Qualcomm Venus 6.0 firmware linux-firmware: package Robotics RB5 sensors DSP firmware libdrm: upgrade 2.4.116 -> 2.4.117 Eero Aaltonen (3): base-files, systemd: add nss-resolve plugin systemd: add option to use stub-resolv.conf ref-manual: add systemd-resolved to distro features Etienne Cordonnier (1): bitbake: bitbake-worker: add header with length of message Fabio Estevam (1): packagegroup-core-tools-profile: Remove PROFILE_TOOLS_X Fahad Arslan (1): linux-firmware: create separate packages Felix Moessbauer (1): bitbake: fetch2/aws: forward env-vars used in gitlab-ci K8s Florian Wickert (1): systemd: fix libnss-mymachines packaging Glenn Strauss (3): lighttpd: upgrade 1.4.71 -> 1.4.72 lighttpd: update init script lighttpd: modernize lighttpd.conf Javier Tia (1): kernel-arch: use ccache only for compiler Jermain Horsman (3): lib/oe/buildcfg.py: Include missing import lib/oe/buildcfg.py: Remove unused parameter lib/bblayers/setupwriters/oe-setup-layers.py: Fix indentation Joakim Tjernlund (1): sed -i destroys symlinks Johannes Schneider (1): base-files: profile: allow profile.d to set EDITOR Jon Mason (2): qemu: drop unreferenced patch linux-yocto: Update dtb path for qemuarmv5 Jose Quaresma (5): sstatesig: be more precise and show the full path in exceptions systemd: sort packages before pn systemd: add systemd-crypt package systemd: add cryptsetup-plugins package config systemd: add p11kit package config Joshua Watt (24): goarch: Move Go architecture mapping to a library bitbake: asyncrpc: Abstract sockets bitbake: hashserv: Add websocket connection implementation bitbake: asyncrpc: Add context manager API bitbake: hashserv: tests: Add external database tests bitbake: asyncrpc: Prefix log messages with client info bitbake: bitbake-hashserv: Allow arguments from environment bitbake: hashserv: Abstract database bitbake: hashserv: Add SQLalchemy backend bitbake: hashserv: Implement read-only version of "report" RPC bitbake: asyncrpc: Add InvokeError bitbake: asyncrpc: client: Prevent double closing of loop bitbake: asyncrpc: client: Add disconnect API bitbake: hashserv: Add user permissions bitbake: hashserv: Add become-user API bitbake: hashserv: Add db-usage API bitbake: hashserv: Add database column query API bitbake: hashserv: test: Add bitbake-hashclient tests bitbake: bitbake-hashclient: Output stats in JSON format bitbake: bitbake-hashserver: Allow anonymous permissions to be space separated bitbake: hashserv: tests: Allow authentication for external server tests bitbake: hashserv: Allow self-service deletion bitbake: hashserv: server: Add owner if user is logged in bitbake: asyncrpc: Add option to set log level when running as a process Julien Stephan (10): oeqa/selftest/devtool: abort if a local workspace already exist oeqa/selftest/devtool: remove spaces on empty line recipetool/create_buildsys_python: fix license note recipetool/create_buildsys_python: prefix created recipes with python3- recipetool/create_buildsys_python: refactor code for futur PEP517 addition recipetool/create_buildsys_python: add PEP517 support oeqa/selftest/recipetool: add selftest for PEP-517 recipe creation oeqa/selftest/devtool: fix test_devtool_modify_overrides test bitbake: bitbake: utils: remove spaces on empty lines bitbake: fetch2: git: add missing destsuffix and subpath parameters in docstrings Jérémy Rosen (5): insane: Add unimplemented-ptest infrastructure insane: Detect python and perl based tests insane: Detect build-system test harnesses insane: Add a naive heuristic to detect test subdirectories ref-manual: Add documentation for the unimplemented-ptest QA warning Jörg Sommer (3): libtirpc: Support ipv6 in DISTRO_FEATURES base-files: Remove localhost ::1 from hosts if ipv6 missing package_qa_check_rdepends: Allow /usr/bin/sh if usrmerge Khem Raj (23): gcompat: Add fcntl64 wrapper gcompat: Upgrade to 1.1.0 release python3-urllib3: Update to 2.0.6 llvm: Upgrade to 17.0.3 shared-mime-info: Fix missing sentinel warning openssl: Match target name for riscv64/riscv32 openssl: Inherit riscv32 config from latomic config on linux kernel.bbclass: Use strip utility used for kernel build in do_package python3-urllib3: Upgrade to 2.0.7 qemuriscv: Add to common MACHINE_FEATURES instead of overriding them meson: Add check for riscv64 in link template machine-sdk: Add SDK_ARCH for riscv64 uninative.bbclass: Add ldso information for riscv64 rust-cross-canadian: Add riscv64 to cross-canadian hosts cdrtools: Fix build on riscv64 llvm: Upgrade to 17.0.4 release systemd: Make libnss-mymachines conditional upon packageconfig ptest-packagelists: Remove strace/valgrind/lttng-tools on riscv32 libarchive: Add packageconfig knob for libb2 librsvg: Fix build for riscv32 librsvg: Enable 64bit atomics in crossbeam again for riscv32 libsoup: Upgrade to 3.4.2 -> 3.4.4 llvm: Upgrade to 17.0.5 Lee Chee Yang (6): qemu: ignore RHEL specific CVE-2023-2680 machine: drop obsolete SERIAL_CONSOLES_CHECK documentation.conf: drop SERIAL_CONSOLES_CHECK release-notes-4.3: add Repositories / Downloads section migration-guide: add release notes for 4.0.14 migration-guide: add release notes for 4.2.4 Logan Gunthorpe (1): runqemu: Add squashfs filesystem types Lukas Funke (5): classes: go-vendor: Add go-vendor class selftest: recipetool: Add test for go recipe handler recipetool: Ignore *.go files while scanning for licenses recipetool: Add handler to create go recipes udev-extraconf: mount.sh: check if filesystem is supported before mounting Malte Schmidt (3): systemd: use nonarch libdir for tmpfiles.d pam: use nonarch libdir for tmpfiles.d sysstat: use nonarch libdir for tmpfiles.d Marcus Folkesson (1): qemuboot.bbclass: fix typos in documentation Markus Fuchs (1): systemd: Add 'no-ntp-fallback' PACKAGECONFIG option Markus Volk (6): libcroco: drop recipe gnomebase.bbclass: Use meson as default buildsystem ghostscript: Build and install shared lib cups: Upgrade 2.4.6 -> 2.4.7 gtk: Add rdepend on printbackend for cups ffmpeg: Upgrade 6.0 -> 6.1 Marlon Rodriguez Garcia (6): bitbake: toaster: updated bootstrap version 3.3.6 -> 3.3.7 bitbake: toaster: Update bootstrap version to 3.4.1 bitbake: toaster: update jquery version 2.0.3 -> 3.7.1 bitbake: toaster: fixed functional test bitbake: toaster: add tox.ini file to execute test suite bitbake: toaster: replace deprecated tags ifequal and ifnotequal Marta Rybczynska (6): SECURITY.md: add file bitbake: SECURITY.md: add file dev-manual: add security team processes python3-beartype: upgrade 0.16.2 -> 0.16.4 python3-spdx-tools: upgrade 0.8.1 -> 0.8.2 dev-manual: extend the description of CVE patch preparation Martin Jansa (13): staging.bbclass: process installed dependencies in deterministic order as well bitbake.conf: drop ${PE} and ${PR} from -f{file,macro,debug}-prefix-map ovmf: drop PE, PR from /usr/src/debug paths go-cross-canadian.inc: drop PE, PR from /usr/src/debug paths acpica: drop PE, PR from /usr/src/debug paths libjpeg-turbo: drop PE, PR from /usr/src/debug paths ffmpeg: drop PE, PR from /usr/src/debug paths perf: drop PE, PR from /usr/src/debug paths rust: drop PE, PR from /usr/src/debug paths vulkan-samples: drop PE, PR from /usr/src/debug paths valgrind: drop PE, PR from /usr/src/debug paths python3-cython: drop PE, PR from /usr/src/debug paths igt-gpu-tools: drop PR from /usr/src/debug paths Massimiliano Minella (1): systemd: update LICENSE statement Max Krummenacher (2): Revert "bin_package.bbclass: Inhibit the default dependencies" perf: fix build with latest kernel Meenali Gupta (5): avahi: fix CVE-2023-38469 avahi: fix CVE-2023-38470 avahi: fix CVE-2023-38471 avahi: fix CVE-2023-38472 avahi: fix CVE-2023-38473 Michael Halstead (1): docs: add support for nanbield (4.3) release Michael Opdenacker (29): manuals: update linux-yocto append examples dev-manual: wic: update "wic list images" output sdk-manual: appendix-obtain: improve and update descriptions manuals: update list of supported machines bsp-guide: bsp: skip Intel machines no longer supported in Poky brief-yoctoprojectqs: use new CDN mirror for sstate dev-manual: start.rst: remove obsolete reference local.conf.sample: remove mips edgerouter machine oeqa/runtime/cases/parselogs: remove "edgerouter" case manuals: correct "yocto-linux" by "linux-yocto" test-manual: reproducible-builds: stop mentioning LTO bug ref-manual: document KERNEL_LOCALVERSION ref-manual: variables: document OEQA_REPRODUCIBLE_TEST_PACKAGE migration-guides: updates for 4.3 migration-guides: mention runqemu change in serial port management ref-manual: document KERNEL_STRIP migration-guides: further updates for 4.3 manuals: improve description of CVE_STATUS and CVE_STATUS_GROUPS ref-manual: document MESON_TARGET ref-manual: document cargo_c class ref-manual: variables: mention new CDN for SSTATE_MIRRORS ref-manual: variables: add RECIPE_MAINTAINER ref-manual: variables: remove SERIAL_CONSOLES_CHECK migration-guides: further updates for release 4.3 bsp-guide: bsp.rst: update beaglebone example ref-manual: classes: explain cml1 class name migration-guides: fix empty sections manuals: fix URL ref-manual: releases.svg: update nanbield release status Mickael RAMILISON (1): scripts/patchreview: Add a custom pattern for finding recipe patches Mingli Yu (2): openssh: Add sshd.service openssh: Don't hardcode the dir in sshd.service Niko Mauno (6): package_rpm: Fix some pycodestyle issues package_rpm: Minor cosmetic and style fixes package_rpm: Remove unused definitions package_rpm: Allow compression mode override image_types.bbclass: Use xz default compression preset level ccache.conf: Remove obsolete configuration option Paul Barker (1): ref-manual: Fix reference to MIRRORS/PREMIRRORS defaults Paul Eggleton (12): Remove references to apm in MACHINE_FEATURES ref-manual: update SDK_NAME variable documentation ref-manual: remove semicolons from *PROCESS_COMMAND variables release-notes-4.3: fix some typos release-notes-4.3: tweaks to existing text release-notes-4.3: add CVEs, recipe upgrades, license changes, contributors release-notes-4.3: remove the Distribution section release-notes-4.3: move new classes to Rust section release-notes-4.3: feature additions migration-4.3: remove some unnecessary items migration-4.3: adjustments to existing text migration-4.3: additional migration items Pavel Zhukov (1): bitbake: tests/fetch.py: Add tests to cover multiple branch/name parameters Peter Kjellerstedt (5): bb-matrix-plot.sh: Show underscores correctly in labels bitbake: command: Make parseRecipeFile() handle virtual recipes correctly bitbake: cookerdata: Be consistent with what type bb_data represents bitbake: cache: Simplify virtualfn2realfn() oeqa/selftest/tinfoil: Add tests that parse virtual recipes Peter Marko (1): openssl: Upgrade 3.1.3 -> 3.1.4 Quentin Schulz (2): recipes-rt: update README to match newer override syntax ref-manual: variables: provide no-match example for COMPATIBLE_MACHINE Ragesh Nair (1): bitbake: fetch2/git: fix lfs fetch with destsuffix param Randy MacLeod (2): strace: backport fix for so_peerpidfd-test strace: upgrade 6.5 -> 6.6 Rasmus Villemoes (3): perf: lift TARGET_CC_ARCH modification out of security_flags.inc valgrind: split helper scripts to separate packages, update dependencies perf: add jevents PACKAGECONFIG item Richard Purdie (34): reproducible: Exclude rust for now again linux/cve-exclusion6.1/6.5: Update to latest kernel point releases oeqa/qemurunner: Drop newlines serial workaround local.conf.sample: Document new CDN mirror for sstate poky.conf: Bump version for 4.3 nanbield release build-appliance-image: Update to master head revision poky.conf: Update to post release versioning base: Ensure recipes using mercurial-native have certificates qemu: Upgrade 8.1.0 -> 8.1.2 oeqa/selftest: Drop machines support sstate: Ensure sstate searches update file mtime insane: Move unpack tests to do_recipe_qa go-vendor: Minor style tweaks package/package_write: Improve packagedata code location debianutils: Fix warnings bitbake: runqueue: Fix runall option for setscene tasks bitbake: runqueue: Fix errors when using -S printdiff oeqa/selftest/sstatetests: Fix intermitttent errors and improve performance layer.conf: Switch layer to nanbield series only libdnf: Fix arm arch mapping issues for qemuarmv5 linux/cve-exclusion6.1/6.5: Update to latest kernel point releases bitbake: Revert "toaster: Bug-fix webdriver No parameter named options" vim: Improve locale handling selftest/reproducible: Allow packages exclusion via config bitbake: runqueue: Move 'cantskip' into sqdata bitbake: runqueue: Refactor StaleSetSceneTasks event out of build_scenequeue_data bitbake: toaster/tox.ini: Add py 3.11 and 3.12 bitbake.conf: Drop oldincludedir bitbake: cooker: Add support for BB_DEFAULT_EVENTLOG bitbake: cooker: Avoid sideeffects for autorev from getAllKeysWithFlags oeqa/selftest/sstatetests: Re-enable CDN tests bitbake.conf: Log events by default using BB_DEFAULT_EVENTLOG package_ipk: Fix Source: field variable dependency Revert "binutils: Fix CVE-2022-47007" Robert P. J. Day (2): dev-manual: new-recipe.rst: add missing parenthesis to "Patching Code" section profile-manual: aesthetic cleanups Ross Burton (36): man-db: add RRECOMMENDS on glibc-utils for iconv man-db: remove inexplicable man_db.conf patch patchtest: remove unused imports patchtest: sort when reading patches from a directory linux-yocto: update CVE exclusions libxml2: ignore disputed CVE-2023-45322 zlib: ignore CVE-2023-45853 cve-check: sort the package list in the JSON report cve-check: slightly more verbose warning when adding the same package twice pixman: ignore CVE-2023-37769 scripts/patchreview: rework patch detection scripts/contrib/patchreview: add commit and recipe count fields to JSON scripts/contrib/patchreview: consolidate imports scripts/contrib/patchreview: fix commit identification cve-check: don't warn if a patch is remote migration-guides: add debian 12 to newly supported distros migration-guides: edgerouter machine removed migration-guides: QEMU_USE_SLIRP variable removed migration-guides: remove non-notable change migration-guides: mention LLVM 17 migration-guides: mention CDN migration-guides: add kernel notes migration-guides: remove SERIAL_CONSOLES_CHECK migration-guides: enabling SPDX only for Poky, not a global default migration-guides: add testing notes migration-guides: add utility notes migration-guides: add BitBake changes migration-guides: packaging changes migration-guides: git recipes reword poky-tiny: fix PACKAGE_EXCLUDE Revert "xserver-xorg: Fix for CVE-2023-5574" xwayland: upgrade to 23.2.2 lib/oe/patch: ensure os.chdir restoring always happens oeqa/selftest/debuginfod: improve selftest shared-mime-info: embed PV in the filename rust-llvm: remove python3native dependency Rouven Czerwinski (1): glib-2.0: Remove unnecessary assignement Sean Nyekjaer (3): rust-cross-canadian: set CARGO_TARGET_<triple>_RUSTFLAGS rust-cross-canadian: set CARGO_TARGET_<triple>_RUNNER for nativesdk oeqa/sdk/rust: Add build and run test of rust binary with SDK host Sergei Zhmylev (1): classes: Move package RDEPENDS processing out of debian.bbclass Siddharth Doshi (2): vim: Upgrade 9.0.1894 -> 9.0.2009 vim: Upgrade 9.0.2009 -> 9.0.2048 Stefan Herbrechtsmeier (2): glibc: use nonarch libdir for tmpfiles.d classes: go-mod: do not pack go mod cache Steve Sakoman (1): vim: use upstream generated .po files Stéphane Veyret (2): volatile-binds: Allow creation of subdirectories volatile-binds: Calculate the name of the /var/lib service Thomas Perrot (1): opensbi: Upgrade to 1.3.1 release Thomas Wolber (1): kea: drop unused directory Tim Orling (9): recipetool: add python_hatchling support lsb-release: use https for UPSTREAM_CHECK_URI bitbake: toaster: drop deprecated USE_L10N from settings bitbake: toaster: use docs for BitBake link on landing page bitbake: toaster: fix obsolete use of find_element_by_link_text bitbake: toaster: test_create_new_project typos, whitespace python3-hypothesis: upgrade 6.88.3 -> 6.89.0 python3-setuptools-scm: upgrade 7.1.0 -> 8.0.4 python3-poetry-core: upgrade 1.7.0 -> 1.8.1 Trevor Gamblin (30): patchtest: improve test issue messages patchtest: clean up test suite patchtest/requirements.txt: update patchtest: add supporting modules patchtest: add scripts to oe-core patchtest: set default repo and testdir targets patchtest: update SPDX identifiers patchtest/selftest: fix command arguments patchtest: check for untracked changes patchtest: test regardless of mergeability patchtest: skip merge test if not targeting master contributor-guide: add patchtest section contributor-guide: clarify patchtest usage patchtest: fix lic_files_chksum test regex patchtest-send-results: improve subject line patchtest: disable merge test patchtest-send-results: check max line length, simplify responses patchtest/selftest: add XSKIP, update test files patchtest: simplify test directory structure patchtest: reduce checksum test output length patchtest: shorten test result outputs patchtest-send-results: send results to submitter patchtest-send-results: add In-Reply-To patchtest: make pylint tests compatible with 3.x patchtest: remove test for CVE tag in mbox patchtest-send-results: fix sender parsing patchtest: rework license checksum tests python3-mako: upgrade 1.2.4 -> 1.3.0 python3-trove-classifiers: upgrade 2023.10.18 -> 2023.11.14 python3-numpy: upgrade 1.26.0 -> 1.26.2 Vijay Anusuri (1): xserver-xorg: Fix for CVE-2023-5574 Vincent Davis Jr (1): acpica: add nativesdk to BBCLASSEXTEND Vyacheslav Yurkov (1): lib/oe/path: Deploy files can start only with a dot Wang Mingyu (79): openssh: upgrade 9.4p1 -> 9.5p1 bluez5: upgrade 5.69 -> 5.70 btrfs-tools: upgrade 6.5.1 -> 6.5.2 createrepo-c: upgrade 1.0.0 -> 1.0.1 dhcpcd: upgrade 10.0.2 -> 10.0.3 ell: upgrade 0.58 -> 0.59 kmod: upgrade 30 -> 31 libcomps: upgrade 0.1.19 -> 0.1.20 libsdl2: upgrade 2.28.3 -> 2.28.4 libubootenv: upgrade 0.3.4 -> 0.3.5 ltp: upgrade 20230516 -> 20230929 libva: upgrade 2.19.0 -> 2.20.0 python3-git: upgrade 3.1.36 -> 3.1.37 python3-babel: upgrade 2.12.1 -> 2.13.0 python3-beartype: upgrade 0.15.0 -> 0.16.2 python3-cffi: upgrade 1.15.1 -> 1.16.0 python3-hypothesis: upgrade 6.86.2 -> 6.87.4 python3-iso8601: upgrade 2.0.0 -> 2.1.0 python3-markdown: upgrade 3.4.4 -> 3.5 python3-packaging: upgrade 23.1 -> 23.2 python3-pycairo: upgrade 1.24.0 -> 1.25.0 python3-ruamel-yaml: upgrade 0.17.32 -> 0.17.35 xkeyboard-config: upgrade 2.39 -> 2.40 python3-wcwidth: upgrade 0.2.6 -> 0.2.8 repo: upgrade 2.36.1 -> 2.37 shared-mime-info: upgrade 2.2 -> 2.3 sqlite3: upgrade 3.43.1 -> 3.43.2 stress-ng: upgrade 0.16.05 -> 0.17.00 base-passwd: upgrade 3.6.1 -> 3.6.2 createrepo-c: upgrade 1.0.1 -> 1.0.2 cronie: upgrade 1.6.1 -> 1.7.0 dhcpcd: upgrade 10.0.3 -> 10.0.4 enchant2: upgrade 2.6.1 -> 2.6.2 btrfs-tools: upgrade 6.5.2 -> 6.5.3 debianutils: upgrade 5.13 -> 5.14 gpgme: upgrade 1.22.0 -> 1.23.1 harfbuzz: upgrade 8.2.1 -> 8.2.2 libdnf: upgrade 0.71.0 -> 0.72.0 libical: upgrade 3.0.16 -> 3.0.17 libjpeg-turbo: upgrade 3.0.0 -> 3.0.1 libnewt: upgrade 0.52.23 -> 0.52.24 libnsl2: upgrade 2.0.0 -> 2.0.1 lighttpd: upgrade 1.4.72 -> 1.4.73 msmtp: upgrade 1.8.24 -> 1.8.25 ghostscript: upgrade 10.02.0 -> 10.02.1 glib-2.0: upgrade 2.78.0 -> 2.78.1 python3-pyrsistent: upgrade 0.19.3 -> 0.20.0 python3-babel: upgrade 2.13.0 -> 2.13.1 python3-gitdb: upgrade 4.0.10 -> 4.0.11 python3-git: upgrade 3.1.37 -> 3.1.40 python3-hypothesis: upgrade 6.87.4 -> 6.88.1 python3-pip: upgrade 23.2.1 -> 23.3.1 python3-psutil: upgrade 5.9.5 -> 5.9.6 python3-pycairo: upgrade 1.25.0 -> 1.25.1 python3-pyopenssl: upgrade 23.2.0 -> 23.3.0 python3-pytest: upgrade 7.4.2 -> 7.4.3 python3-setuptools-rust: upgrade 1.7.0 -> 1.8.1 python3-testtools: upgrade 2.6.0 -> 2.7.0 python3-trove-classifiers: upgrade 2023.9.19 -> 2023.10.18 python3-wcwidth: upgrade 0.2.8 -> 0.2.9 python3-wheel: upgrade 0.41.2 -> 0.41.3 shaderc: upgrade 2023.6 -> 2023.7 xserver-xorg: upgrade 21.1.8 -> 21.1.9 python3-cryptography(-vectors): upgrade 41.0.4 -> 41.0.5 dhcpcd: upgrade 10.0.4 -> 10.0.5 diffoscope: upgrade 249 -> 251 git: upgrade 2.42.0 -> 2.42.1 iproute2: upgrade 6.5.0 -> 6.6.0 libsdl2: upgrade 2.28.4 -> 2.28.5 libsolv: upgrade 0.7.25 -> 0.7.26 libuv: upgrade 1.46.0 -> 1.47.0 bash: upgrade 5.2.15 -> 5.2.21 dnf: upgrade 4.17.0 -> 4.18.1 python3-hatch-vcs: upgrade 0.3.0 -> 0.4.0 python3-hypothesis: upgrade 6.88.1 -> 6.88.3 python3-pbr: upgrade 5.11.1 -> 6.0.0 python3-testtools: upgrade 2.7.0 -> 2.7.1 shared-mime-info: upgrade 2.3 -> 2.4 stress-ng: upgrade 0.17.00 -> 0.17.01 William A. Kennington III (1): kernel: Commit without running hooks William Lyu (2): perl: fix intermittent test failure openssl: improve handshake test error reporting Xiangyu Chen (4): linux-yocto: make sure the pahole-native available before do_kernel_configme grub: Fix for CVE-2023-4692 and CVE-2023-4693 sudo: upgrade 1.9.14p3 -> 1.9.15p2 openssh: add systemd readiness notification support Yoann Congal (4): insane: skip unimplemented-ptest on S=WORKDIR recipes insane: unimplemented-ptest: ignore source file errors selftest/reproducible: Split a long line meta-selftest/files: add xuser to static-passwd/-group david d zuhn (1): bitbake.conf: remove ${CCACHE} from FORTRAN compiler luca fancellu (1): oeqa/ssh: Handle SSHCall timeout error code meta-arm: e914891eee..1dff3300fb: Abdellatif El Khlifi (6): arm-bsp/linux-yocto: corstone1000: bump to v6.5% arm-bsp/documentation: corstone1000: enable debug-tweaks arm-bsp/documentation: corstone1000: update the release note arm-bsp/documentation: corstone1000: update the change log arm-bsp/documentation: corstone1000: update the user guide kas: corstone1000: pin the SHAs Ali Can Ozaslan (1): arm-bsp/documentation: corstone1000: Update the user guide Debbie Martin (10): arm-bsp/u-boot: Divide the U-boot configuration by machine arm-bsp/fvp-base: Merge fvp-common.inc into fvp-base.conf arm-bsp/trusted-firmware-a/fvp-base: Add stdout path and virtio net and rng arm-bsp/u-boot/fvp-base: Configure FVP base U-boot machine and enable U-boot sysreset, CRC-32 and virtio RNG arm-bsp/fvp-base: Configure grub as the EFI provider arm/fvp-base: Update the default testsuites arm-systemready: Introduce the Arm SystemReady layer arm-bsp/systemready: Bring up the Arm SystemReady IR ACS 2.0 suite on FVP base kas: Add kas configuration for Arm SystemReady and fvp-base ci: Add fvpboot to IMAGE_CLASSES Delane Brandy (1): arm-bsp/documentation: corstone1000: Update the user guide Drew Reed (2): arm-bsp: Enable TF-A test building for the N1SDP CI: Enable TF-A TFTF test builds Emekcan Aras (17): arm-bsp/u-boot: corstone1000: enable on-disk capsule update arm-bsp/u-boot: corstone1000: fix runtime capsule update flag checks arm-bsp/trusted-firmware-m: fix capsule update alignment arm-bsp/trusted-firmware-m: update the upstream status of the out-of-tree patches arm-bsp/u-boot: corstone1000: scatter gather list workaround for ondisk capsule update arm-bsp/trusted-services: enable signaled handling interrupts for SPs arm-bsp/corstone1000: fix synchronization issue on openamp notification arm/fvp-corstone1000: upgrade to 11.23_25 arm-bsp/corstone1000-fvp: Add virtio-net configuration arm-bsp/corstone1000-fvp: add unpadded image support for MMC card config arm-bsp/corstone1000-fvp: Disable Time Annotation arm-bsp/u-boot: corstone1000: enable virtio-net support for FVP arm-bsp/documentation: corstone1000: update the architecture document arm-bsp/documentation: corstone1000: Add EFI system partition section arm-bsp/documentation: corstone1000: add a note and fix instructions arm-bsp/documentation: corstone1000: add readthedocs.yaml file arm-bsp/documentation: corstone1000: fix the requirements.txt and conf.py path Harsimran Singh Tungal (4): arm-bsp/u-boot: corstone1000: Remove External system patches arm-bsp/linux: corstone1000: update the defconfig arm-bsp/linux: corstone1000: Remove External system patches arm-bsp/images: corstone1000: Remove the external system test package Javier Tia (1): trusted-firmware-a: fix build error when using ccache Jon Mason (10): arm-bsp/linux-yocto: add recipe for v6.4 kernel arm/linux-yocto: remove defconfig patch CI: add sbsa-acs to recipe report arm/linux-yocto: remove PHYS_VIRT config frag arm-bsp/optee: remove 3.18 recipes and patches arm-bsp/edk2: remove 202211 arm/hafnium: update to v2.9 arm/optee: update to 4.0.0 arm/optee: cleanups from code review arm/toolchains: update to 13.2.Rel1 Mariam Elshakfy (3): arm-bsp/n1sdp: Move OP-TEE to DDR4 arm-bsp/n1sdp: Enable OP-TEE cache in N1SDP arm-bsp/corstone1000: Remove inappropriate kernel delay patch Ross Burton (24): arm/oeqa/selftest: tag all tests with "meta-arm" CI: don't hardcode the selftest tests to run CI: also run the _qemutiny testcase for poky-tiny CI: track nanbield branches arm/fvp-corstone1000: upgrade to 11.22.35, add aarch64 binaries kas/corstone1000: don't limit the FVP use to x86-64 CI: don't pin corstone1000-fvp to x86-64 CI: build both aarch64 and x86-64 packages for as many FVPs as possible arm-bsp/u-boot: remove 2023.01 arm/trusted-firmware-a: update mbedtls to recommended release CI: Add meta-secure-core to pending-upgrades for corstone1000 arm-bsp: corstone1000 depends on meta-efi-secure-boot arm/generic-arm64: remove obsolete SERIAL_CONSOLES_CHECK arm/lib/fvp/runner: don't pass '' as cwd scripts/runfvp: exit code should be the FVP exit code arm/selftest: add test that DISPLAY is forwarded into the runfvp child CI: use nanbield branch for meta-virtualization CI: use nanbield branch of meta-clang arm/optee: handle CVE-2021-36133 as disputed arm-bsp/optee-os: backport fix for CVE-2023-41325 arm/fvp-base-a-aem: upgrade to 11.23.9 arm-bsp/fvp-base: upgrade tune to v8.4 arm-bsp/trusted-firmware-a: use v8.4 instructions on fvp-base arm-bsp/optee-os: update Upstream-Status tags Vikas Katariya (1): arm-bsp/corstone1000: Fix RSA key generation issue Xueliang Zhong (2): Update Corstone-1000 doc with security issue reporting guideline arm-bsp/n1sdp: update to linux yocto kernel 6.5 meta-raspberrypi: 482d864b8f..8231f97534: Andrei Gherzan (1): docs: Fix ReadTheDocs builds.os requirement Carlos Alberto Lopez Perez (1): linux-raspberrypi: stop setting powersave as the default CPU governor Jose Quaresma (2): linux-raspberrypi/linux-raspberrypi-v7: drop 5.10 version rpi-base: Adds EXTRA_IMAGEDEPENDS to fix the image task do_populate_lic_deploy Khem Raj (1): linux-raspberrypi_6.1.bb: Update to 6.1.61 release Leon Anavi (2): rpi-config: Upgrade to tip of tree rpi-config: reintroduce start_x Matthew Draws (1): rpi-eeprom: Update to 2023.10.18-2712 Vincent Davis Jr (1): rpidistro-vlc: add new patch po-Fix-typos-in-oc meta-openembedded: 62039a2c33..991e6852a5: Akash Hadke (1): libeigen: Update GPL-3.0-only to GPL-2.0-only Alex Kiernan (2): reptyr: Add 0.10.0 mdns: Upgrade 2200.0.8 -> 2200.40.37.0.1 Alper Ak (1): unionfs-fuse: upgrade 2.2 --> 3.4 Andrew Jeffery (1): mdio-tools: Add virtual/kernel dependency to avoid stale SPDX reference Armin Kuster (4): netkit: Drop old and no upstream MAINTANERS: drop netkit README: drop netkit maintainer pkggrp: drop netkit Arthur Oliveira (5): python3-objectpath: Add ObjectPath Python Recipe python3-flask-restx: Add Flask-RestX Python Recipe python3-zopeevent: Add Zope.Event Python Recipe python3-aniso8601: Add ISO 8601 parsing library python3-flask-restx: Switch dependency from isodate to aniso8601 Bartosz Golaszewski (5): shunit2: new recipe libgpiod: update to v2.1 python3-gpiod: update to v2.1.3 python3-gpiod: setup target config in ptest compile python3-gpiod: fix the required version of libgpiod Beniamin Sandu (2): mbedtls: upgrade 3.4.1 -> 3.5.0 unbound: upgrade 1.18.0 -> 1.19.0 Benjamin Bouvier (1): libsmi: enable native build Carlos Alberto Lopez Perez (1): libbacktrace: Update version and enable shared library. Charles Perry (4): libosip2: add recipe libexosip2: add recipe libexosip2: add c-ares and openssl PACKAGECONFIG libexosip2: package binaries in a separate package Chi Xu (1): re2: Add ptest support Christian Eggers (1): python3-gcovr: switch to main branch Christophe Vu-Brugier (1): exfatprogs: upgrade 1.2.1 -> 1.2.2 Clément Péron (2): proj: Upgrade to 9.3.0 release pcapplusplus: Add recipe for 23.09 release Daiane Angolini (1): wireguard-tools: Use PACKAGECONFIG to select wg-quick and bash-completion Daniel McGregor (1): python3-pylint: allow native build Daniel Semkowicz (2): cockpit: Fix cockpit-askpass path cockpit: Bump to version 304 David Pierret (3): libtext: add ptest cjson: Add ptest python3-rapidjson: add missing ptest dependency Edi Feschiyan (1): libbytesize: update SRC_URI Etienne Cordonnier (1): uutils-coreutils: upgrade 0.0.21 -> 0.0.22 Fabien Thomas (2): klibc/klibc.inc : Add DEBUG_PREFIX_MAP flag. samba.bb : Disable ad-dc by default Fabio Estevam (5): edid-decode: Upgrade to latest master openocd: Use https for github python3-piccata: Use https for github multipath-tools: Use https for github crucible: Upgrade to 2023.11.02 Gianfranco Costamagna (3): vbxguestdrivers: upgrade 7.0.10 -> 7.0.12 cpulimit: add DESCRIPTION field dlt-daemon: cherry-pick another upstream-proposed patch Hains van den Bosch (1): libebml: Enable shared libraries Jamin Lin (1): Brotli: fix build failed if the path includes "-static" Jan Claußen (1): btop: Add recipe Jan Vermaete (3): netdata: chown in systemd service with ':' iso '.' netdata: version bump 1.43.0 -> 1.43.2 README.md: was a Markdown paragraph and should be a list Jeffrey Pautler (1): apache2: add vendor to product name used for CVE checking Joe Slater (2): python3-pynacl: add RCONFLICTS with python3-nacl python3-django: move to version 4.2.5 Johannes Kauffmann (1): open62541: update to v1.3.8 Johnathan Mantey (1): ipmitool: Update and eliminate unneeded patch Jonas Gorski (1): frr: fix CVEs CVE-2023-4675{2,3} and CVE-2023-4723{4,5} Jose Quaresma (4): ostree: Upgrade 2023.5 -> 2023.6 ostree: drop trivial-httpd-cmdline ostree: add ed25519-openssl ostree: Upgrade 2023.6 -> 2023.7 Kai Kang (4): xfce4-panel-profiles: 1.0.13 -> 1.0.14 python3-nacl: drop duplicate recipe python3-blivet: 3.4.3 -> 3.8.2 python3-blivetgui: 2.3.0 -> 2.4.2 Khem Raj (209): libnet-idn-encode: Fix build with perl 2.38 and gcc13 poco: Fix data race when create POSIX thread static-group: Match nogroup id to base-passwd from core. gutenprint: Upgrade to 5.3.4 meta-perl: Add libtext-diff-perl to fast ptest list leveldb: Upgrade to 1.23 plus latest git meta-python: Add python3-rapidjson to PTESTS_FAST_META_PYTHON leveldb: Print uint64_t with PRI64 network-manager-applet,networkmanager-openvpn, networkmanager: Apply linker versioning patch when using lld only emlog: Add PV ccid: upgrade 1.5.2 -> 1.5.4 jack: upgrade 1.19.22 -> 2 abseil-cpp: upgrade 20230802.0 -> 20230802.1 xterm: upgrade 387 -> 388 toybox: upgrade 0.8.8 -> 0.8.10 pahole: upgrade 1.24 -> 1.25 gcab: upgrade 1.4 -> 1.6 feh: upgrade 3.10 -> 3.10.1 xmlsec1: upgrade 1.2.37 -> 1.3.2 xmlsec1: Fix the key name in verify2 test ctags: upgrade 6.0.20231001.0 -> 6.0.20231029.0 googlebenchmark: upgrade 1.8.0 -> 1.8.3 opencl-headers: upgrade 04.17 -> 2023.04.17 thingsboard-gateway: upgrade 3.4.1 -> 3.4.2 neatvnc: upgrade 0.6.0 -> 0.7.0 lastlog2: upgrade 1.1.0 -> 1.2.0 libmbim: upgrade 1.30.0 -> 1.31.1 ser2net: upgrade 4.3.13 -> 4.5.0 fio: upgrade 3.32 -> 2022 libosinfo: upgrade 1.10 -> 1.11.0 webkitgtk3: upgrade 2.42.0 -> 2.42.1 mstpd: upgrade 0.1 -> 0.05 smarty: upgrade 4.3.0 -> 4.3.4 geos: upgrade 3.12.0 -> 3.12.0beta2 wtmpdb: upgrade 0.7.1 -> 0.9.3 lsscsi: upgrade 0.32 -> 030 glibmm-2.68: upgrade 2.74.0 -> 2.78.0 mcelog: upgrade 194 -> 196 libfastjson: upgrade 0.99.9 -> 1.2304.0 libraw: upgrade 0.20.2 -> 0.21.1 cairomm-1.16: upgrade 1.16.2 -> 1.18.0 libbpf: upgrade 1.2.0 -> 1.2.2 libtorrent: upgrade 0.13.8 -> 1 modemmanager: upgrade 1.22.0 -> 1.23.1 c-ares: upgrade 1.20.1 -> 1.21.0 pmdk: upgrade 1.12.1 -> 2.0.0 hwdata: upgrade 0.370 -> 0.375 mksh: upgrade 59 -> R59c sdbus-c++: upgrade 1.3.0 -> 1.4.0 cjson: upgrade 1.7.15 -> 1.7.16 uftrace: upgrade 0.13.1 -> 0.14 python3-trustme: upgrade 0.9.0 -> 1.1.0 python3-eth-utils: upgrade 2.2.2 -> 2.3.0 python3-xstatic-font-awesome: upgrade 4.7.0.0 -> 6.2.1.1 python3-process-tests: upgrade 2.1.2 -> 3.0.0 python3-pyperf: upgrade 2.6.1 -> 2.6.2 python3-sentry-sdk: upgrade 1.26.0 -> 1.34.0 python3-websockets: upgrade 11.0.3 -> 12.0 python3-alembic: upgrade 1.12.0 -> 1.12.1 python3-pymisp: upgrade 2.4.176 -> 2.4.178 python3-traitlets: upgrade 5.11.2 -> 5.13.0 python3-pytest-mock: upgrade 3.11.1 -> 3.12.0 python3-kivy: upgrade 2.1.0 -> 2.2.1 python3-web3: upgrade 6.11.1 -> 6.11.2 python3-m2crypto: upgrade 0.39.0 -> 0.40.1 python3-rapidjson: upgrade 1.12 -> 1.13 python3-eth-typing: upgrade 3.5.0 -> 3.5.1 python3-email-validator: upgrade 2.0.0 -> 2.1.0 python3-icu: upgrade 2.11 -> 2.12 python3-virtualenv: upgrade 20.24.5 -> 20.24.6 python3-tzlocal: upgrade 5.1 -> 5.2 python3-cantools: upgrade 39.2.0 -> 39.3.0 python3-flask-login: upgrade 0.6.2 -> 0.6.3 python3-argcomplete: upgrade 3.1.2 -> 3.1.4 python3-wxgtk4: upgrade 4.2.0 -> 4.2.1 python3-meson-python: upgrade 0.14.0 -> 0.15.0 python3-pymongo: upgrade 4.5.0 -> 4.6.0 python3-imgtool: upgrade 1.10.0 -> 2.0.0 python3-google-api-python-client: upgrade 2.104.0 -> 2.106.0 python3-tornado: upgrade 6.3 -> 6.3.3 python3-imageio: upgrade 2.31.5 -> 2.31.6 python3-blinker: upgrade 1.6.3 -> 1.7.0 python3-pyhamcrest: upgrade 2.0.4 -> 2.1.0 python3-pytest-asyncio: upgrade 0.21.1 -> 0.22.0 python3-pyjwt: upgrade 2.7.0 -> 2.8.0 python3-bitstruct: upgrade 8.18.0 -> 8.19.0 python3-filelock: upgrade 3.12.4 -> 3.13.1 python3-sqlalchemy: upgrade 2.0.22 -> 2.0.23 python3-greenlet: upgrade 2.0.2 -> 3.0.1 python3-charset-normalizer: upgrade 3.3.0 -> 3.3.2 python3-cbor2: upgrade 5.4.6 -> 5.5.1 python3-cbor2: Add missing hypothesis rdep for ptests python3-asttokens: upgrade 2.4.0 -> 2.4.1 python3-xlsxwriter: upgrade 3.1.8 -> 3.1.9 python3-cachetools: upgrade 5.3.1 -> 5.3.2 python3-paramiko: upgrade 3.2.0 -> 3.3.1 python3-tomlkit: upgrade 0.12.1 -> 0.12.2 python3-eth-account: upgrade 0.9.0 -> 0.10.0 python3-reedsolo: upgrade 1.7.0 -> 2.0.13 python3-shellingham: upgrade 1.5.3 -> 1.5.4 python3-ipython: upgrade 8.16.1 -> 8.17.2 python3-argh: upgrade 0.29.4 -> 0.30.3 python3-executing: upgrade 2.0.0 -> 2.0.1 python3-pylint: upgrade 3.0.1 -> 3.0.2 python3-google-auth: upgrade 2.23.3 -> 2.23.4 libtest-harness-perl: upgrade 3.47 -> 3.48 libmodule-build-tiny-perl: upgrade 0.046 -> 0.047 libdbd-sqlite-perl: upgrade 1.72 -> 1.74 libconfig-tiny-perl: upgrade 2.29 -> 2.30 libcgi-perl: upgrade 4.57 -> 4.60 ipset: upgrade 7.15 -> 7.19 openvpn: upgrade 2.6.3 -> 2.6.6 nng: upgrade 1.5.2 -> 12 usrsctp: upgrade to latest revision python3-scapy: upgrade to latest revision wolfssl: upgrade 5.5.4 -> 5.6.4 tnftp: upgrade 20210827 -> 20230507 fluidsynth: upgrade 2.3.2 -> 2.3.4 libuvc: upgrade 0.0.6 -> 0.0.7 libdc1394: upgrade 2.2.6 -> 2.2.7 ncmpc: upgrade 0.47 -> 0.49 gerbera: upgrade 1.11.0 -> 1.12.1 gst-shark: upgrade 0.7.3.1 -> 0.8.1 gupnp-av: upgrade 0.14.0 -> 0.14.1 libmediaart-2.0: upgrade 1.9.5 -> 1.9.6 libdvbpsi: upgrade 1.3.0 -> 1.3.3 fdk-aac: upgrade 2.0.1 -> 2.0.2 libavif: upgrade 0.11.1 -> 1.0.1 libdvdcss: upgrade 1.4.2 -> 1.4.3 aom: upgrade 3.6.1 -> 3.7.0 aom: Disable neon when building on arm dav1d: upgrade 1.2.0 -> 1.3.0 network-manager-applet: upgrade 1.32.0 -> 1.34.0 gvfs: upgrade 1.52.0 -> 1.52.1 gnome-text-editor: upgrade 45.0 -> 45.1 libwacom: upgrade 2.6.0 -> 2.8.0 evolution-data-server: upgrade 3.50.0 -> 3.50.1 orage: upgrade 4.16.0 -> 4.18.0 xfce4-systemload-plugin: upgrade 1.3.1 -> 1.3.2 xfce4-screenshooter: upgrade 1.10.3 -> 1.10.4 xfce4-appfinder: upgrade 4.18.0 -> 4.19.1 xfce4-netload-plugin: upgrade 1.4.0 -> 1.4.1 thunar-shares-plugin: upgrade 0.3.1 -> 0.3.2 xfce4-battery-plugin: upgrade 1.1.4 -> 1.1.5 xfce4-places-plugin: upgrade 1.8.1 -> 1.8.3 libxfce4util: upgrade 4.18.1 -> 4.19.2 xfce4-notes-plugin: upgrade 1.9.0 -> 1.10.0 xfce4-weather-plugin: upgrade 0.11.0 -> 0.11.1 thunar: upgrade 4.18.4 -> 4.19.0 catfish: upgrade 4.16.3 -> 4.18.0 xfce4-time-out-plugin: upgrade 1.1.2 -> 1.1.3 thunar-archive-plugin: upgrade 0.5.1 -> 0.5.2 xfce4-timer-plugin: upgrade 1.7.1 -> 1.7.2 xfce4-calculator-plugin: upgrade 0.7.1 -> 0.7.2 xfmpc: upgrade 0.3.0 -> 0.3.1 garcon: upgrade 4.18.1 -> 4.19.0 xfce4-genmon-plugin: upgrade 4.1.1 -> 4.2.0 xfce4-fsguard-plugin: upgrade 1.1.2 -> 1.1.3 xfce4-cpugraph-plugin: upgrade 1.2.7 -> 1.2.8 parole: upgrade 4.16.0 -> 4.18.0 xfce4-datetime-plugin: upgrade 0.8.1 -> 0.8.3 menulibre: upgrade 2.2.3 -> 2.3.2 xfce4-pulseaudio-plugin: upgrade 0.4.3 -> 0.4.8 libxfce4ui: upgrade 4.18.3 -> 4.19.3 xfce4-taskmanager: upgrade 1.5.5 -> 1.5.6 xfce4-mpc-plugin: upgrade 0.5.2 -> 0.5.3 mousepad: upgrade 0.5.9 -> 0.6.1 gigolo: upgrade 0.5.2 -> 0.5.3 xfce4-verve-plugin: upgrade 2.0.1 -> 2.0.3 exo: upgrade 4.18.0 -> 4.19.0 xfce4-mailwatch-plugin: upgrade 1.3.0 -> 1.3.1 xarchiver: upgrade 0.5.4.17 -> 0.5.4.21 xfsprogs: upgrade 6.1.1 -> 6.5.0 xfstests: upgrade 2023.03.05 -> 2023.10.29 xfstests: Fix build with clang17 xfstests: Fix build on musl ufs-utils: upgrade to latest revision xfce4-systemload-plugin: Fix build on 32bit machines libsodium: upgrade 1.0.18 -> 1.0.19 libsodium: Fix build with clang on aarch64 Revert "modemmanager: upgrade 1.22.0 -> 1.23.1" modemmanager: inherit upstream-version-is-even Revert "geos: upgrade 3.12.0 -> 3.12.0beta2" emlog: Drop SRCPV makedumpfile: Change COMPATIBLE_HOST check to exclude unsupported arches packagegroup-meta-oe: Update makedumpfile architecture support list gupnp: Add missing rdep on python3-core vte9: Upgrade to 0.74.1 rygel: Upgrade to 0.40.4 -> 0.42.4 vte9: Add knob for enabling systemd meta-networking: Use autotools make system meta-oe: Use autotools make system toscoterm: Skip recipe, slated for removal loudmouth: Upgrade to 1.5.4 toscoterm: Delete recipe librest: Use autotools make system cannelloni: Fix build with clang and libc++ runtime gnome-console: Add missing dependency on gtk4-native gnome-terminal: Add missing dependency on libhandy dleyna-core: Update to tip of master dleyna: Skip all dleyna recipes, slated for removal packagegroup-meta-multimedia: Remove dleyna recipes beep: Upgrade to 1.4.12 yelp: Use autotools for build system gstd: Upgrade to 0.15.0 gimp: Update to 2.10.36 projucer: Refresh patch to apply cleanly ledmon: Fix systemd unit install libxml++-5.0: Make use of gnomebase bbclass LI Qingwu (1): kmsxx: Add recipe Lei Maohui (1): gexiv2: Fix do_package QA issue when usrmerge enabled. Leon Anavi (32): sip: upgrade 6.7.11 -> 6.7.12 python3-rarfile: add recipe python3-colorclass: add recipe python3-inflate64: add recipe python3-jsbeautifier: add recipe python3-pymemcache: add recipe python3-multivolumefile: add recipe python3-oletools: add recipe python3-olefile: add recipe python3-pcodedmp: add recipe python3-screeninfo: add recipe python3-unoconv: add recipe python3-pybcj: add recipe python3-pyppmd: add recipe python3-py7zr: add recipe python3-wand: add recipe python3-pdm-backend: add recipe python3-pdm: add recipe python3-jsonref: Upgrade 1.0.1 -> 1.1.0 imlib2: Upgrade 1.7.1 -> 1.12.1 libblockdev: Upgrade 3.0.3 -> 3.0.4 exiftool: add recipe bindfs: add recipe qpdf: Update 10.6.3 -> 11.6.3 python3-file-magic: add recipe python3-wrapt: Upgrade 1.15.0 -> 1.16.0 python3-bitarray: Upgrade 2.8.2 -> 2.8.3 python3-pillow: Upgrade 10.0.1 -> 10.1.0 python3-polyline: upgrade 1.4.0 -> 2.0.1 python3-py7zr: Upgrade 0.20.7 -> 0.20.8 python3-zeroconf: upgrade 0.120.0 -> 0.126.0 python3-pystemd: upgrade 0.10.0 -> 0.13.2 Luca Fancellu (5): linuxptp: update linuxptp recipe to 4.1 linuxptp: install default configuration file in sysconfdir linuxptp: add systemd services linuxptp: Drop unneeded downstream patches linuxptp: Use templates for the systemd services Marek Vasut (2): lvgl: lv-drivers: Allow empty package lvgl: Allow empty package Markus Fuchs (1): remove unused AUTHOR variable Markus Volk (52): libdecor: Upgrade 0.1.99 -> 0.2.0 wireplumber: Upgrade 0.4.14 -> 0.4.15 pipewire: Update 0.3.81 -> 0.3.83 gnome-software: Update 45.0 -> 45.1 gnome-calendar: Update 45.0 -> 45.1 gnome-disk-utility: Update 44.0 -> 45.0 gnome-control-center: Update 45.0 -> 45.1 eog: Update 45.0 -> 45.1 gnome-remote-desktop: Update 45.0 -> 45.1 gnome-shell: Add missing dependency on pipewire gnome-shell: Remove deprecated libcroco dependency openbox: Drop deprecated libcroco dependency pipewire: Update 0.3.83 -> 0.3.84 tracker-miners: Upgrade 3.6.0 -> 3.6.2 libgweather4: Upgrade 4.2.0 -> 4.4.0 gtksourceview5: Upgrade 5.7.1 -> 5.10.0 openal-soft: Upgrade 1.20.1 -> 1.23.1 gnome-shell: Upgrade 45.0 -> 45.1 mutter: Upgrade 45.0 -> 45.1 dconf-editor: Upgrade 43 -> 45.0.1 libgsf: Upgrade 1.14.50 -> 1.14.51 xdg-desktop-portal: Upgrade 1.18.0 -> 1.18.1 xdg-desktop-portal-gtk: Upgrade 1.14.1 -> 1.15.1 rest: Upgrade 0.9.0 -> 0.9.1 nv-codec-headers: Upgrade 12.0.16.0 -> 12.1.14.0 webp-pixbuf-loader: Upgrade 0.2.4 -> 0.2.5 libchamplain: Upgrade 0.12.20 -> 0.12.21 rest: Add packageconfigs for examples and tests gssdp: Fix build with api-documentation enabled gupnp: Upgrade 0.10.2 -> 0.12.1 Gupnp-tools upgrade 0.10.2 -> 0.12.1 gupnp-idg: Upgrade 1.2.0 -> 1.6.0 gssdp: Upgrade 1.4.0.1 -> 1.6.3 ghex: Upgrade 3.18.4 -> 45.0 Adjust vala build according to changes in vala.bbclass drop GNOMEBASEBUILDCLASS = "meson" gnome-shell-extensions: Upgrade 44.1 -> 45.1 cups-filters: Fix for current gcc gnome-console: Add recipe vte9: Fix build with api-documentation enabled gnome-terminal: Upgrade 3.48.1 -> 3.50.1 cups-filters: Upgrade 1.28.17 -> 2.0.0 gnome-terminal: Remove recommendation on vte-prompt ghex: backport patch to fix build for clang qpdf: cleanup gtksourceview4: Upgrade 4.8.2 -> 4.8.4 gnome-control-center: Add rdepends system-config-printer: Add cups to rdepends pipewire: Upgrade 0.3.84 -> 0.3.85 flatpak: Upgrade 1.15.4 -> 1.15.6 flatpak: Add packageconfigs for man and docbook docs musicpd: unbreak build with ffmpeg 6.1 Martin Jansa (12): nodejs: update to latest v20 version 20.8.1 nodejs: Revert io_uring support from bundled libuv-1.46.0 opencv: refresh protobuf-v22 compatibility patch with backported version leveldb: prevent installing gtest android-tools: drop ${PE}, ${PR} from /usr/src/debug paths minifi-cpp: drop ${PE}, ${PR} from /usr/src/debug paths xmlrcp-c: drop ${PE}, ${PR} from /usr/src/debug paths fluentbit: drop ${PE}, ${PR} from /usr/src/debug paths ntpsec, net-snmp: drop ${PE}, ${PR} from /usr/src/debug paths aom, x265: drop ${PE}, ${PR} from /usr/src/debug paths python3-{h5py,pandas}: drop ${PE}, ${PR} from /usr/src/debug paths evince, gnome-calendar, tracker: drop ${PE}, ${PR} from /usr/src/debug paths Martin Maurer (1): libqmi: Upgrade 1.32.4 -> 1.34.0 Matthias Klein (1): paho-mqtt-c: upgrade 1.3.12 -> 1.3.13 Mingli Yu (3): vboxguestdrivers: Remove the buildpath nlohmann-json: Add ptest support ptest-packagelists-meta-oe.inc: Add nlohmann-json Peter Kjellerstedt (18): libwebsockets: Support building for native mosquitto: Support building for native again jack: Revert to 1.9.22 pahole: Correct the version in the recipe file name neatvnc: Specify the version in the recipe file name mstpd: Update to 0.1.0+ Revert "libtorrent: upgrade 0.13.8 -> 1" libtorrent: Add UPSTREAM_CHECK_GITTAGREGEX mksh: Update to 59c properly fluidsynth: Specify the version in the recipe file name libuvc: Specify the version in the recipe file name gst-shark: Update to 0.8.1 properly xarchiver: Specify the version in the recipe file name python3-kivy: Move a comment so it makes more sense python3-greenlet: Avoid duplicate URI in SRC_URI python3-pylint: Only set SRCREV once python3-pytest-mock: Only set SRCREV once zeromq: Update to 4.3.5 Peter Marko (1): grpc: Upgrade 1.56.2 -> 1.59.2 Petr Gotthard (2): libmbim: upgrade 1.28.4 -> 1.30.0 modemmanager: upgrade 1.20.6 -> 1.22.0 Poonam Jadhav (1): sdbus-c++: Update ptest path Potin Lai (2): libplist: Upgrade to latest master idevicerestore: Upgrade to latest master Richard Purdie (4): meta-python: Drop broken BBCLASSEXTEND variants meta-oe: Drop broken BBCLASSEXTEND variants meta-networking: Drop broken BBCLASSEXTEND variants meta-perl: Drop broken BBCLASSEXTEND variants Ross Burton (1): yajl: fix CVE-2017-16516, CVE-2022-24795, CVE-2023-33460 Sam Van Den Berge (1): netdata: Upgrade 1.36.1 -> 1.43.0 Samuli Piippo (2): abseil-cpp: fix mingw build protobuf: stage protoc binary to sysroot Thomas Gessler (1): influxdb: Add start script used by systemd service Tim Orling (2): po4a: remove old recipe debsums: remove old recipe Trevor Gamblin (5): python-git-pw: add from meta-patchtest python3-py-cpuinfo: disable broken ptests python3-arrow: add from meta-patchtest python3-pytest-mock: disable broken ptests meta-python: update ptests status for py-cpuinfo, pytest-mock Wang Mingyu (149): dnf-plugin-tui: create symlinks from /usr/ to /. c-ares: upgrade 1.19.1 -> 1.20.1 adw-gtk3: upgrade 4.9 -> 5.1 ctags: upgrade 6.0.20230917.0 -> 6.0.20231001.0 dialog: upgrade 1.3-20230209 -> 1.3-20231002 freerdp: upgrade 2.11.1 -> 2.11.2 gnome-backgrounds: upgrade 44.0 -> 45.0 gnome-calculator: upgrade 45.0 -> 45.0.2 gnome-font-viewer: upgrade 44.0 -> 45.0 ipc-run: upgrade 20220807.0 -> 20231003.0 libbytesize: upgrade 2.9 -> 2.10 libcoap: upgrade 4.3.3 -> 4.3.4 libyang: upgrade 2.1.111 -> 2.1.128 lvgl: upgrade 8.3.9 -> 8.3.10 metacity: upgrade 3.46.1 -> 3.50.0 nautilus: upgrade 45.0 -> 45.1 ceres-solver: upgrade 2.1.0 -> 2.2.0 python3-eth-abi: upgrade 3.0.1 -> 4.2.1 python3-mypy: upgrade 1.5.1 -> 1.6.1 python3-pylint: upgrade 3.0.0 -> 3.0.1 python3-aiodns: upgrade 3.0.0 -> 3.1.1 python3-aiohttp: upgrade 3.8.5 -> 3.8.6 python3-astroid: upgrade 3.0.0 -> 3.0.1 python3-bitarray: upgrade 2.8.1 -> 2.8.2 python3-bitstruct: upgrade 8.17.0 -> 8.18.0 python3-blinker: upgrade 1.6.2 -> 1.6.3 python3-charset-normalizer: upgrade 3.2.0 -> 3.3.0 python3-cmake: upgrade 3.27.5 -> 3.27.7 python3-coverage: upgrade 7.3.1 -> 7.3.2 python3-croniter: upgrade 1.4.1 -> 2.0.1 python3-dbus-fast: upgrade 1.85.0 -> 2.12.0 python3-email-validator: upgrade 1.3.1 -> 2.0.0 python3-engineio: upgrade 4.7.1 -> 4.8.0 python3-eth-typing: upgrade 3.4.0 -> 3.5.0 python3-eth-utils: upgrade 2.2.1 -> 2.2.2 python3-executing: upgrade 1.2.0 -> 2.0.0 python3-flask-babel: upgrade 3.1.0 -> 4.0.0 python3-flask-jwt-extended: upgrade 4.5.2 -> 4.5.3 python3-google-api-python-client: upgrade 2.101.0 -> 2.104.0 python3-googleapis-common-protos: upgrade 1.60.0 -> 1.61.0 python3-google-auth: upgrade 2.23.1 -> 2.23.3 python3-h5py: upgrade 3.9.0 -> 3.10.0 python3-huey: upgrade 2.4.5 -> 2.5.0 python3-imageio: upgrade 2.31.3 -> 2.31.5 python3-ipython: upgrade 8.15.0 -> 8.16.1 python3-jedi: upgrade 0.19.0 -> 0.19.1 python3-meson-python: upgrade 0.13.1 -> 0.14.0 python3-msgpack: upgrade 1.0.6 -> 1.0.7 python3-platformdirs: upgrade 3.10.0 -> 3.11.0 python3-prompt-toolkit: upgrade 3.0.36 -> 3.0.39 python3-protobuf: upgrade 4.24.3 -> 4.24.4 python3-pycares: upgrade 4.3.0 -> 4.4.0 python3-pycodestyle: upgrade 2.11.0 -> 2.11.1 python3-pydantic: upgrade 2.4.1 -> 2.4.2 python3-pyephem: upgrade 4.1.4 -> 4.1.5 python3-pytest-timeout: upgrade 2.1.0 -> 2.2.0 python3-rapidjson: upgrade 1.11 -> 1.12 python3-regex: upgrade 2023.8.8 -> 2023.10.3 python3-rich: upgrade 13.5.3 -> 13.6.0 python3-schedule: upgrade 1.2.0 -> 1.2.1 python3-semver: upgrade 3.0.1 -> 3.0.2 python3-simplejson: upgrade 3.19.1 -> 3.19.2 python3-socketio: upgrade 5.9.0 -> 5.10.0 python3-sqlalchemy: upgrade 2.0.21 -> 2.0.22 python3-stack-data: upgrade 0.6.2 -> 0.6.3 python3-texttable: upgrade 1.6.7 -> 1.7.0 python3-traitlets: upgrade 5.10.1 -> 5.11.2 python3-types-psutil: upgrade 5.9.5.16 -> 5.9.5.17 python3-tzlocal: upgrade 5.0.1 -> 5.1 python3-web3: upgrade 6.10.0 -> 6.11.1 python3-websocket-client: upgrade 1.6.3 -> 1.6.4 python3-xlsxwriter: upgrade 3.1.3 -> 3.1.8 python3-xxhash: upgrade 3.3.0 -> 3.4.1 python3-zeroconf: upgrade 0.112.0 -> 0.119.0 python3-zopeinterface: upgrade 6.0 -> 6.1 rdma-core: upgrade 47.0 -> 48.0 redis: upgrade 7.2.1 -> 7.2.2 remmina: upgrade 1.4.32 -> 1.4.33 tesseract: upgrade 5.3.2 -> 5.3.3 thingsboard-gateway: upgrade 3.3 -> 3.4.1 tio: upgrade 2.6 -> 2.7 wireshark: upgrade 4.0.8 -> 4.0.10 xterm: upgrade 384 -> 387 zchunk: upgrade 1.3.1 -> 1.3.2 hdf5: Fix install conflict when enable multilib. dnf-plugin-tui: Recover BBCLASSEXTEND variants gensio: upgrade 2.7.6 -> 2.7.7 hwdata: upgrade 0.375 -> 0.376 libio-socket-ssl-perl: upgrade 2.083 -> 2.084 makedumpfile: upgrade 1.7.3 -> 1.7.4 gnome-remote-desktop: move from meta-virtualization to meta-security ctags: upgrade 6.0.20231029.0 -> 6.0.20231105.0 function2: upgrade 4.2.3 -> 4.2.4 neatvnc: upgrade 0.7.0 -> 0.7.1 python3-argh: upgrade 0.30.3 -> 0.30.4 python3-geojson: upgrade 3.0.1 -> 3.1.0 python3-imageio: upgrade 2.31.6 -> 2.32.0 python3-inflate64: upgrade 0.3.1 -> 1.0.0 python3-jsbeautifier: upgrade 1.14.9 -> 1.14.11 python3-lru-dict: upgrade 1.2.0 -> 1.3.0 python3-python-vlc: upgrade 3.0.18122 -> 3.0.20123 python3-zeroconf: upgrade 0.119.0 -> 0.120.0 c-ares: upgrade 1.21.0 -> 1.22.0 ctags: upgrade 6.0.20231105.0 -> 6.0.20231112.0 libencode-perl: upgrade 3.19 -> 3.20 bindfs: upgrade 1.17.5 -> 1.17.6 python3-hexbytes: upgrade 0.3.1 -> 1.0.0 python3-linux-procfs: upgrade 0.7.1 -> 0.7.3 openvpn: upgrade 2.6.6 -> 2.6.7 python3-argcomplete: upgrade 3.1.4 -> 3.1.6 python3-awesomeversion: upgrade 23.8.0 -> 23.11.0 python3-dbus-fast: upgrade 2.12.0 -> 2.14.0 python3-eth-typing: upgrade 3.5.1 -> 3.5.2 python3-eth-utils: upgrade 2.3.0 -> 2.3.1 python3-geomet: upgrade 1.0.0 -> 1.1.0 python3-google-api-core: upgrade 2.12.0 -> 2.14.0 python3-google-api-python-client: upgrade 2.106.0 -> 2.108.0 python3-mypy: upgrade 1.6.1 -> 1.7.0 python3-platformdirs: upgrade 3.11.0 -> 4.0.0 python3-prompt-toolkit: upgrade 3.0.39 -> 3.0.41 python3-pyaudio: upgrade 0.2.13 -> 0.2.14 python3-pydantic: upgrade 2.4.2 -> 2.5.0 python3-pymetno: upgrade 0.11.0 -> 0.12.0 python3-pytest-xdist: upgrade 3.3.1 -> 3.4.0 python3-sentry-sdk: upgrade 1.34.0 -> 1.35.0 python3-tomlkit: upgrade 0.12.2 -> 0.12.3 python3-types-setuptools: upgrade 68.2.0.0 -> 68.2.0.1 python3-web3: upgrade 6.11.2 -> 6.11.3 python3-zeroconf: upgrade 0.126.0 -> 0.127.0 ser2net: upgrade 4.5.0 -> 4.5.1 uftp: upgrade 5.0.1 -> 5.0.2 webkitgtk3: upgrade 2.42.1 -> 2.42.2 imlib2: delete non-existent file c-ares: upgrade 1.22.0 -> 1.22.1 ctags: upgrade 6.0.20231112.0 -> 6.0.20231119.0 exiftool: upgrade 12.69 -> 12.70 gnome-bluetooth: upgrade 42.6 -> 42.7 libextutils-cppguess-perl: upgrade 0.26 -> 0.27 libwebsockets: upgrade 4.3.2 -> 4.3.3 python3-aiohttp: upgrade 3.8.6 -> 3.9.0 python3-dateparser: upgrade 1.1.8 -> 1.2.0 python3-django: upgrade 4.2.5 -> 4.2.7 python3-imageio: upgrade 2.32.0 -> 2.33.0 python3-ldap: upgrade 3.4.3 -> 3.4.4 python3-pastedeploy: upgrade 3.0.1 -> 3.1.0 python3-pdm: upgrade 2.10.1 -> 2.10.3 python3-pydantic: upgrade 2.5.0 -> 2.5.1 python3-rich: upgrade 13.6.0 -> 13.7.0 strongswan: upgrade 5.9.11 -> 5.9.12 Yi Zhao (6): samba: upgrade 4.18.6 -> 4.18.8 samba: use external cmocka instead of bundled cmocka libtevent: fix ptest libldb: add ptest conntrack-tools: upgrade 1.4.7 -> 1.4.8 nftables: upgrade 1.0.8 -> 1.0.9 Yoann Congal (5): emlog: ignore CVE-2022-3968 & CVE-2023-43291 juce/projucer: Backport a fix for the compilation under recent GCC meta-oe/static-ids: Change postgres to 28 to match forced id in recipe static-id: add missing netdata group python3-soupsieve: Break circular dependency with beautifulsoup4 Zoltán Böszörményi (3): python3-ninja-syntax: Set BBCLASSEXTEND = "native nativesdk" python3-ninja: Set BBCLASSEXTEND = "native nativesdk" geos: Fix packaging alperak (39): xdebug: upgrade 3.2.0 -> 3.2.2 catch2: upgrade 2.13.7 -> 2.13.10 tuna: upgrade 0.18 -> 0.19 libsrtp: upgrade 2.4.2 -> 2.5.0 libupnp: upgrade 1.14.6 -> 1.14.18 libisofs: upgrade 1.5.4 -> 1.5.6 libisoburn: 1.5.4 -> 1.5.6 fuse-exfat: upgrade 1.3.0 -> 1.4.0 fuse3: upgrade 3.15.1 -> 3.16.2 ufs-utils: upgrade 3.12.3 -> 4.13.5 libebml: upgrade 1.3.0 -> 1.4.4 libmatroska: upgrade 1.4.1 -> 1.7.1 libde265: upgrade 1.0.5 -> 1.0.12 libopenmpt: upgrade 0.6.2 -> 0.7.3 mpd: upgrade 0.23.12 -> 0.23.14 opencore-amr: upgrade 0.1.3 -> 0.1.6 tinyalsa: upgrade 1.1.1 -> 2.0.0 cannelloni: upgrade 1.0.0 -> 1.1.0 civetweb: upgrade 1.12 -> 1.16 libdnet: upgrade 1.16.3 -> 1.17.0 openfortivpn: upgrade 1.20.5 -> 1.21.0 fuse-exfat: Dropped md5sum libopenmpt: Added license change reason and dropped md5sum bolt: upgrade 0.9.5 -> 0.9.6 irssi: upgrade 1.4.4 -> 1.4.5 libmtp: upgrade 1.1.20 -> 1.1.21 libsigc++-2.0: upgrade 2.10.7 -> 2.12.1 libsigc++-3: upgrade 3.2.0 -> 3.6.0 ocl-icd: upgrade 2.3.1 -> 2.3.2 opencl-icd-loader: upgrade v2022.01.04 -> v2023.04.17 uutils-coreutils: upgrade 0.0.22 -> 0.0.23 botan: upgrade 2.19.3 -> 3.2.0 capnproto: upgrade 0.10.4 -> 1.0.1 cloc: upgrade 1.94 -> 1.98 cpuid: upgrade 20211129 -> 20230614 gst-editing-services: upgrade 1.20.5 -> 1.22.7 luaposix: upgrade 35.1 -> 36.2.1 mercurial: upgrade 6.1 -> 6.5 ledmon: upgrade 0.93 -> 0.97 skandigraun (1): libvpx: don't specify armv5 and armv6 toolchains explicitly meta-security: 3f7d40b0fc..070a1e82cc: Gowtham Suresh Kumar (1): Update parsec recipes Mingli Yu (1): samhain: remove the buildpath Stefan Berger (1): ima,evm: Add two variables to write filenames and signatures into Change-Id: Ib809aa0df4162c50a06c542a94a0b06cdc149a2d Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Diffstat (limited to 'poky')
-rw-r--r--poky/.gitignore2
-rw-r--r--poky/.vscode/settings.json32
-rw-r--r--poky/SECURITY.md22
-rw-r--r--poky/bitbake/SECURITY.md24
-rwxr-xr-xpoky/bitbake/bin/bitbake-hashclient145
-rwxr-xr-xpoky/bitbake/bin/bitbake-hashserv132
-rwxr-xr-xpoky/bitbake/bin/bitbake-worker34
-rwxr-xr-xpoky/bitbake/bin/toaster12
-rw-r--r--poky/bitbake/lib/bb/asyncrpc/__init__.py33
-rw-r--r--poky/bitbake/lib/bb/asyncrpc/client.py120
-rw-r--r--poky/bitbake/lib/bb/asyncrpc/connection.py146
-rw-r--r--poky/bitbake/lib/bb/asyncrpc/exceptions.py21
-rw-r--r--poky/bitbake/lib/bb/asyncrpc/serv.py370
-rw-r--r--poky/bitbake/lib/bb/cache.py6
-rw-r--r--poky/bitbake/lib/bb/codeparser.py5
-rw-r--r--poky/bitbake/lib/bb/command.py8
-rw-r--r--poky/bitbake/lib/bb/cooker.py36
-rw-r--r--poky/bitbake/lib/bb/cookerdata.py11
-rw-r--r--poky/bitbake/lib/bb/fetch2/__init__.py80
-rw-r--r--poky/bitbake/lib/bb/fetch2/crate.py2
-rw-r--r--poky/bitbake/lib/bb/fetch2/git.py28
-rw-r--r--poky/bitbake/lib/bb/fetch2/gitsm.py4
-rw-r--r--poky/bitbake/lib/bb/fetch2/hg.py1
-rw-r--r--poky/bitbake/lib/bb/fetch2/npm.py1
-rw-r--r--poky/bitbake/lib/bb/fetch2/npmsw.py3
-rw-r--r--poky/bitbake/lib/bb/runqueue.py93
-rw-r--r--poky/bitbake/lib/bb/tests/fetch.py136
-rw-r--r--poky/bitbake/lib/bb/utils.py16
-rw-r--r--poky/bitbake/lib/codegen.py12
-rw-r--r--poky/bitbake/lib/hashserv/__init__.py190
-rw-r--r--poky/bitbake/lib/hashserv/client.py147
-rw-r--r--poky/bitbake/lib/hashserv/server.py952
-rw-r--r--poky/bitbake/lib/hashserv/sqlalchemy.py427
-rw-r--r--poky/bitbake/lib/hashserv/sqlite.py408
-rw-r--r--poky/bitbake/lib/hashserv/tests.py736
-rw-r--r--poky/bitbake/lib/prserv/client.py8
-rw-r--r--poky/bitbake/lib/prserv/serv.py39
-rw-r--r--poky/bitbake/lib/toaster/orm/models.py5
-rw-r--r--poky/bitbake/lib/toaster/pytest.ini19
-rw-r--r--poky/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py8
-rw-r--r--poky/bitbake/lib/toaster/tests/browser/test_all_builds_page.py262
-rw-r--r--poky/bitbake/lib/toaster/tests/browser/test_all_projects_page.py126
-rw-r--r--poky/bitbake/lib/toaster/tests/browser/test_delete_project.py103
-rw-r--r--poky/bitbake/lib/toaster/tests/browser/test_landing_page.py121
-rw-r--r--poky/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py2
-rw-r--r--poky/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py5
-rw-r--r--poky/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py4
-rw-r--r--poky/bitbake/lib/toaster/tests/browser/test_sample.py9
-rw-r--r--poky/bitbake/lib/toaster/tests/builds/buildtest.py9
-rw-r--r--poky/bitbake/lib/toaster/tests/functional/functional_helpers.py6
-rw-r--r--poky/bitbake/lib/toaster/tests/functional/test_create_new_project.py177
-rw-r--r--poky/bitbake/lib/toaster/tests/functional/test_functional_basic.py37
-rw-r--r--poky/bitbake/lib/toaster/tests/functional/test_project_page.py247
-rw-r--r--poky/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py578
-rw-r--r--poky/bitbake/lib/toaster/tests/toaster-tests-requirements.txt6
-rw-r--r--poky/bitbake/lib/toaster/tests/views/test_views.py10
-rw-r--r--poky/bitbake/lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml16
-rw-r--r--poky/bitbake/lib/toaster/toastergui/static/js/bootstrap-3.4.1.js (renamed from poky/bitbake/lib/toaster/toastergui/static/js/bootstrap.js)431
-rw-r--r--poky/bitbake/lib/toaster/toastergui/static/js/bootstrap-3.4.1.min.js6
-rw-r--r--poky/bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js7
-rw-r--r--poky/bitbake/lib/toaster/toastergui/static/js/jquery-3.7.1.min.js2
-rw-r--r--poky/bitbake/lib/toaster/toastergui/static/js/jquery-3.7.1.min.map1
-rw-r--r--poky/bitbake/lib/toaster/toastergui/static/js/libtoaster.js2
-rw-r--r--poky/bitbake/lib/toaster/toastergui/static/js/projectpage.js2
-rw-r--r--poky/bitbake/lib/toaster/toastergui/templates/base.html6
-rw-r--r--poky/bitbake/lib/toaster/toastergui/templates/base_specific.html4
-rw-r--r--poky/bitbake/lib/toaster/toastergui/templates/js-unit-tests.html2
-rw-r--r--poky/bitbake/lib/toaster/toastergui/templates/landing.html2
-rw-r--r--poky/bitbake/lib/toaster/toastergui/templates/mrb_section.html2
-rw-r--r--poky/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html8
-rw-r--r--poky/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html8
-rw-r--r--poky/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html4
-rw-r--r--poky/bitbake/lib/toaster/toastergui/templates/recipe.html4
-rw-r--r--poky/bitbake/lib/toaster/toastergui/templates/target.html4
-rw-r--r--poky/bitbake/lib/toaster/toastermain/logs.py17
-rw-r--r--poky/bitbake/lib/toaster/toastermain/settings.py13
-rw-r--r--poky/bitbake/lib/toaster/toastermain/settings_test.py4
-rw-r--r--poky/bitbake/lib/toaster/tox.ini24
-rw-r--r--poky/bitbake/toaster-requirements.txt1
-rw-r--r--poky/documentation/brief-yoctoprojectqs/index.rst2
-rw-r--r--poky/documentation/bsp-guide/bsp.rst117
-rw-r--r--poky/documentation/contributor-guide/submit-changes.rst40
-rw-r--r--poky/documentation/dev-manual/index.rst1
-rw-r--r--poky/documentation/dev-manual/layers.rst14
-rw-r--r--poky/documentation/dev-manual/new-machine.rst2
-rw-r--r--poky/documentation/dev-manual/new-recipe.rst4
-rw-r--r--poky/documentation/dev-manual/runtime-testing.rst8
-rw-r--r--poky/documentation/dev-manual/security-subjects.rst189
-rw-r--r--poky/documentation/dev-manual/start.rst24
-rw-r--r--poky/documentation/dev-manual/vulnerabilities.rst114
-rw-r--r--poky/documentation/dev-manual/wic.rst28
-rw-r--r--poky/documentation/kernel-dev/advanced.rst3
-rw-r--r--poky/documentation/kernel-dev/common.rst42
-rw-r--r--poky/documentation/migration-guides/migration-4.3.rst157
-rw-r--r--poky/documentation/migration-guides/release-4.0.rst1
-rw-r--r--poky/documentation/migration-guides/release-4.2.rst1
-rw-r--r--poky/documentation/migration-guides/release-notes-4.0.14.rst227
-rw-r--r--poky/documentation/migration-guides/release-notes-4.2.4.rst364
-rw-r--r--poky/documentation/migration-guides/release-notes-4.3.rst897
-rw-r--r--poky/documentation/overview-manual/concepts.rst170
-rw-r--r--poky/documentation/overview-manual/svg/bitbake_tasks_map.svg4
-rw-r--r--poky/documentation/poky.yaml.in12
-rw-r--r--poky/documentation/profile-manual/intro.rst40
-rw-r--r--poky/documentation/ref-manual/classes.rst27
-rw-r--r--poky/documentation/ref-manual/features.rst6
-rw-r--r--poky/documentation/ref-manual/qa-checks.rst11
-rw-r--r--poky/documentation/ref-manual/svg/releases.svg32
-rw-r--r--poky/documentation/ref-manual/variables.rst287
-rw-r--r--poky/documentation/sdk-manual/appendix-obtain.rst50
-rwxr-xr-xpoky/documentation/set_versions.py6
-rw-r--r--poky/documentation/test-manual/reproducible-builds.rst11
-rw-r--r--poky/documentation/what-i-wish-id-known.rst5
-rw-r--r--poky/meta-poky/conf/distro/poky-tiny.conf2
-rw-r--r--poky/meta-poky/conf/distro/poky.conf4
-rw-r--r--poky/meta-poky/conf/templates/default/local.conf.sample13
-rw-r--r--poky/meta-selftest/classes/base-do-configure-modified.bbclass3
-rw-r--r--poky/meta-selftest/files/static-group1
-rw-r--r--poky/meta-selftest/files/static-passwd1
-rw-r--r--poky/meta-selftest/recipes-test/gcc-source/gcc-source_%.bbappend2
-rw-r--r--poky/meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend2
-rw-r--r--poky/meta-yocto-bsp/conf/machine/beaglebone-yocto.conf1
-rw-r--r--poky/meta-yocto-bsp/conf/machine/genericx86-64.conf1
-rw-r--r--poky/meta/classes-global/base.bbclass2
-rw-r--r--poky/meta/classes-global/debian.bbclass15
-rw-r--r--poky/meta/classes-global/insane.bbclass105
-rw-r--r--poky/meta/classes-global/package.bbclass1
-rw-r--r--poky/meta/classes-global/package_deb.bbclass4
-rw-r--r--poky/meta/classes-global/package_ipk.bbclass10
-rw-r--r--poky/meta/classes-global/package_rpm.bbclass46
-rw-r--r--poky/meta/classes-global/sstate.bbclass12
-rw-r--r--poky/meta/classes-global/staging.bbclass2
-rw-r--r--poky/meta/classes-global/uninative.bbclass2
-rw-r--r--poky/meta/classes-recipe/autotools.bbclass2
-rw-r--r--poky/meta/classes-recipe/bin_package.bbclass3
-rw-r--r--poky/meta/classes-recipe/gnomebase.bbclass2
-rw-r--r--poky/meta/classes-recipe/go-mod.bbclass4
-rw-r--r--poky/meta/classes-recipe/goarch.bbclass29
-rw-r--r--poky/meta/classes-recipe/image_types.bbclass2
-rw-r--r--poky/meta/classes-recipe/kernel-arch.bbclass8
-rw-r--r--poky/meta/classes-recipe/kernel-yocto.bbclass32
-rw-r--r--poky/meta/classes-recipe/kernel.bbclass4
-rw-r--r--poky/meta/classes-recipe/meson.bbclass4
-rw-r--r--poky/meta/classes-recipe/populate_sdk_ext.bbclass82
-rw-r--r--poky/meta/classes-recipe/qemuboot.bbclass4
-rw-r--r--poky/meta/classes-recipe/rootfs-postcommands.bbclass4
-rw-r--r--poky/meta/classes-recipe/rust-common.bbclass2
-rw-r--r--poky/meta/classes/cve-check.bbclass2
-rw-r--r--poky/meta/classes/go-vendor.bbclass196
-rw-r--r--poky/meta/classes/useradd_base.bbclass2
-rw-r--r--poky/meta/conf/bitbake.conf16
-rw-r--r--poky/meta/conf/ccache.conf1
-rw-r--r--poky/meta/conf/distro/include/maintainers.inc2
-rw-r--r--poky/meta/conf/distro/include/ptest-packagelists.inc2
-rw-r--r--poky/meta/conf/distro/include/security_flags.inc1
-rw-r--r--poky/meta/conf/documentation.conf1
-rw-r--r--poky/meta/conf/layer.conf2
-rw-r--r--poky/meta/conf/machine-sdk/riscv64.conf2
-rw-r--r--poky/meta/conf/machine/include/riscv/qemuriscv.inc2
-rw-r--r--poky/meta/conf/machine/qemuarmv5.conf2
-rw-r--r--poky/meta/files/fs-perms-persistent-log.txt1
-rw-r--r--poky/meta/files/fs-perms.txt1
-rw-r--r--poky/meta/lib/bblayers/setupwriters/oe-setup-layers.py2
-rw-r--r--poky/meta/lib/oe/__init__.py2
-rw-r--r--poky/meta/lib/oe/buildcfg.py11
-rw-r--r--poky/meta/lib/oe/copy_buildsystem.py2
-rw-r--r--poky/meta/lib/oe/cve_check.py13
-rw-r--r--poky/meta/lib/oe/go.py34
-rw-r--r--poky/meta/lib/oe/package.py3
-rw-r--r--poky/meta/lib/oe/patch.py7
-rw-r--r--poky/meta/lib/oe/path.py3
-rw-r--r--poky/meta/lib/oe/sstatesig.py11
-rw-r--r--poky/meta/lib/oe/utils.py12
-rw-r--r--poky/meta/lib/oeqa/core/target/ssh.py17
-rw-r--r--poky/meta/lib/oeqa/runtime/cases/parselogs.py6
-rw-r--r--poky/meta/lib/oeqa/runtime/cases/ssh.py3
-rw-r--r--poky/meta/lib/oeqa/sdk/cases/rust.py22
-rw-r--r--poky/meta/lib/oeqa/selftest/case.py12
-rw-r--r--poky/meta/lib/oeqa/selftest/cases/archiver.py2
-rw-r--r--poky/meta/lib/oeqa/selftest/cases/buildoptions.py2
-rw-r--r--poky/meta/lib/oeqa/selftest/cases/debuginfod.py124
-rw-r--r--poky/meta/lib/oeqa/selftest/cases/devtool.py12
-rw-r--r--poky/meta/lib/oeqa/selftest/cases/recipetool.py326
-rw-r--r--poky/meta/lib/oeqa/selftest/cases/reproducible.py18
-rw-r--r--poky/meta/lib/oeqa/selftest/cases/signing.py2
-rw-r--r--poky/meta/lib/oeqa/selftest/cases/sstatetests.py157
-rw-r--r--poky/meta/lib/oeqa/selftest/cases/tinfoil.py25
-rw-r--r--poky/meta/lib/oeqa/selftest/context.py51
-rw-r--r--poky/meta/lib/oeqa/utils/qemurunner.py12
-rw-r--r--poky/meta/lib/patchtest/data.py86
-rw-r--r--poky/meta/lib/patchtest/patch.py62
-rw-r--r--poky/meta/lib/patchtest/repo.py174
-rw-r--r--poky/meta/lib/patchtest/requirements.txt2
-rw-r--r--poky/meta/lib/patchtest/selftest/files/CVE.test_cve_presence_in_commit_message.fail72
-rw-r--r--poky/meta/lib/patchtest/selftest/files/CVE.test_cve_presence_in_commit_message.pass74
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.1.fail (renamed from poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.1.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.1.pass (renamed from poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.1.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.2.fail (renamed from poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.2.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.2.pass (renamed from poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.2.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_bugzilla_entry_format.fail (renamed from poky/meta/lib/patchtest/selftest/files/Bugzilla.test_bugzilla_entry_format.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_bugzilla_entry_format.pass (renamed from poky/meta/lib/patchtest/selftest/files/Bugzilla.test_bugzilla_entry_format.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_commit_message_presence.fail (renamed from poky/meta/lib/patchtest/selftest/files/CommitMessage.test_commit_message_presence.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_commit_message_presence.pass (renamed from poky/meta/lib/patchtest/selftest/files/CommitMessage.test_commit_message_presence.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_mbox_format.1.fail (renamed from poky/meta/lib/patchtest/selftest/files/MboxFormat.test_mbox_format.1.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_mbox_format.2.fail (renamed from poky/meta/lib/patchtest/selftest/files/MboxFormat.test_mbox_format.2.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_mbox_format.pass (renamed from poky/meta/lib/patchtest/selftest/files/MboxFormat.test_mbox_format.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_series_merge_on_head.1.skip (renamed from poky/meta/lib/patchtest/selftest/files/Merge.test_series_merge_on_head.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_series_merge_on_head.2.skip (renamed from poky/meta/lib/patchtest/selftest/files/Merge.test_series_merge_on_head.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_format.fail (renamed from poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_format.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_format.pass (renamed from poky/meta/lib/patchtest/selftest/files/CVE.test_cve_tag_format.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_length.fail (renamed from poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_length.fail)2
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_length.pass (renamed from poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_format.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_signed_off_by_presence.1.fail (renamed from poky/meta/lib/patchtest/selftest/files/SignedOffBy.test_signed_off_by_presence.1.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_signed_off_by_presence.2.fail (renamed from poky/meta/lib/patchtest/selftest/files/SignedOffBy.test_signed_off_by_presence.2.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMbox.test_signed_off_by_presence.pass (renamed from poky/meta/lib/patchtest/selftest/files/PatchSignedOffBy.test_signed_off_by_presence.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_modified_not_mentioned.fail (renamed from poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_modified_not_mentioned.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_modified_not_mentioned.pass (renamed from poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_modified_not_mentioned.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_presence.fail (renamed from poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_presence.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_presence.pass (renamed from poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_presence.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMetadata.test_src_uri_left_files.fail (renamed from poky/meta/lib/patchtest/selftest/files/SrcUri.test_src_uri_left_files.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMetadata.test_src_uri_left_files.pass (renamed from poky/meta/lib/patchtest/selftest/files/SrcUri.test_src_uri_left_files.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMetadata.test_summary_presence.fail (renamed from poky/meta/lib/patchtest/selftest/files/Summary.test_summary_presence.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestMetadata.test_summary_presence.pass (renamed from poky/meta/lib/patchtest/selftest/files/Summary.test_summary_presence.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestPatch.test_cve_tag_format.fail (renamed from poky/meta/lib/patchtest/selftest/files/CVE.test_cve_tag_format.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestPatch.test_cve_tag_format.pass (renamed from poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_length.pass)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestPatch.test_signed_off_by_presence.fail (renamed from poky/meta/lib/patchtest/selftest/files/PatchSignedOffBy.test_signed_off_by_presence.fail)0
-rw-r--r--poky/meta/lib/patchtest/selftest/files/TestPatch.test_signed_off_by_presence.pass (renamed from poky/meta/lib/patchtest/selftest/files/SignedOffBy.test_signed_off_by_presence.pass)0
-rwxr-xr-xpoky/meta/lib/patchtest/selftest/selftest17
-rw-r--r--poky/meta/lib/patchtest/tests/base.py2
-rw-r--r--poky/meta/lib/patchtest/tests/pyparsing/common.py2
-rw-r--r--poky/meta/lib/patchtest/tests/pyparsing/parse_cve_tags.py2
-rw-r--r--poky/meta/lib/patchtest/tests/pyparsing/parse_shortlog.py2
-rw-r--r--poky/meta/lib/patchtest/tests/pyparsing/parse_signed_off_by.py2
-rw-r--r--poky/meta/lib/patchtest/tests/pyparsing/parse_upstream_status.py2
-rw-r--r--poky/meta/lib/patchtest/tests/test_mbox.py159
-rw-r--r--poky/meta/lib/patchtest/tests/test_mbox_author.py29
-rw-r--r--poky/meta/lib/patchtest/tests/test_mbox_bugzilla.py22
-rw-r--r--poky/meta/lib/patchtest/tests/test_mbox_cve.py49
-rw-r--r--poky/meta/lib/patchtest/tests/test_mbox_description.py17
-rw-r--r--poky/meta/lib/patchtest/tests/test_mbox_format.py16
-rw-r--r--poky/meta/lib/patchtest/tests/test_mbox_mailinglist.py64
-rw-r--r--poky/meta/lib/patchtest/tests/test_mbox_merge.py25
-rw-r--r--poky/meta/lib/patchtest/tests/test_mbox_shortlog.py41
-rw-r--r--poky/meta/lib/patchtest/tests/test_mbox_signed_off_by.py28
-rw-r--r--poky/meta/lib/patchtest/tests/test_metadata.py180
-rw-r--r--poky/meta/lib/patchtest/tests/test_metadata_lic_files_chksum.py82
-rw-r--r--poky/meta/lib/patchtest/tests/test_metadata_license.py55
-rw-r--r--poky/meta/lib/patchtest/tests/test_metadata_max_length.py26
-rw-r--r--poky/meta/lib/patchtest/tests/test_metadata_src_uri.py75
-rw-r--r--poky/meta/lib/patchtest/tests/test_metadata_summary.py32
-rw-r--r--poky/meta/lib/patchtest/tests/test_patch.py (renamed from poky/meta/lib/patchtest/tests/test_patch_upstream_status.py)62
-rw-r--r--poky/meta/lib/patchtest/tests/test_patch_cve.py51
-rw-r--r--poky/meta/lib/patchtest/tests/test_patch_signed_off_by.py43
-rw-r--r--poky/meta/lib/patchtest/tests/test_python_pylint.py24
-rw-r--r--poky/meta/lib/patchtest/utils.py168
-rw-r--r--poky/meta/recipes-bsp/grub/files/CVE-2023-4692.patch98
-rw-r--r--poky/meta/recipes-bsp/grub/files/CVE-2023-4693.patch63
-rw-r--r--poky/meta/recipes-bsp/grub/grub2.inc2
-rw-r--r--poky/meta/recipes-bsp/opensbi/opensbi_1.3.bb (renamed from poky/meta/recipes-bsp/opensbi/opensbi_1.2.bb)4
-rw-r--r--poky/meta/recipes-bsp/u-boot/libubootenv_0.3.5.bb (renamed from poky/meta/recipes-bsp/u-boot/libubootenv_0.3.4.bb)2
-rw-r--r--poky/meta/recipes-connectivity/avahi/avahi_0.8.bb5
-rw-r--r--poky/meta/recipes-connectivity/avahi/files/CVE-2023-38469.patch48
-rw-r--r--poky/meta/recipes-connectivity/avahi/files/CVE-2023-38470.patch59
-rw-r--r--poky/meta/recipes-connectivity/avahi/files/CVE-2023-38471.patch73
-rw-r--r--poky/meta/recipes-connectivity/avahi/files/CVE-2023-38472.patch46
-rw-r--r--poky/meta/recipes-connectivity/avahi/files/CVE-2023-38473.patch110
-rw-r--r--poky/meta/recipes-connectivity/bluez5/bluez5_5.70.bb (renamed from poky/meta/recipes-connectivity/bluez5/bluez5_5.69.bb)2
-rw-r--r--poky/meta/recipes-connectivity/dhcpcd/dhcpcd_10.0.5.bb (renamed from poky/meta/recipes-connectivity/dhcpcd/dhcpcd_10.0.2.bb)3
-rw-r--r--poky/meta/recipes-connectivity/dhcpcd/files/0001-privsep-fix-strlcpy-overflow-in-psp_ifname-239.patch33
-rw-r--r--poky/meta/recipes-connectivity/iproute2/iproute2_6.6.0.bb (renamed from poky/meta/recipes-connectivity/iproute2/iproute2_6.5.0.bb)2
-rw-r--r--poky/meta/recipes-connectivity/kea/files/kea-dhcp-ddns.service1
-rw-r--r--poky/meta/recipes-connectivity/libuv/libuv_1.47.0.bb (renamed from poky/meta/recipes-connectivity/libuv/libuv_1.46.0.bb)2
-rw-r--r--poky/meta/recipes-connectivity/openssh/openssh/0001-systemd-Add-optional-support-for-systemd-sd_notify.patch99
-rw-r--r--poky/meta/recipes-connectivity/openssh/openssh/sshd.service17
-rw-r--r--poky/meta/recipes-connectivity/openssh/openssh_9.5p1.bb (renamed from poky/meta/recipes-connectivity/openssh/openssh_9.4p1.bb)11
-rw-r--r--poky/meta/recipes-connectivity/openssl/openssl/0001-Added-handshake-history-reporting-when-test-fails.patch374
-rw-r--r--poky/meta/recipes-connectivity/openssl/openssl/0001-Link-libatomic-on-riscv32.patch35
-rw-r--r--poky/meta/recipes-connectivity/openssl/openssl_3.1.4.bb (renamed from poky/meta/recipes-connectivity/openssl/openssl_3.1.3.bb)8
-rw-r--r--poky/meta/recipes-core/base-files/base-files/0001-add-nss-resolve-to-nsswitch.patch31
-rw-r--r--poky/meta/recipes-core/base-files/base-files/profile16
-rw-r--r--poky/meta/recipes-core/base-files/base-files_3.0.14.bb6
-rw-r--r--poky/meta/recipes-core/base-passwd/base-passwd/0006-Make-it-possible-to-configure-whether-to-use-SELinux.patch35
-rw-r--r--poky/meta/recipes-core/base-passwd/base-passwd_3.6.2.bb (renamed from poky/meta/recipes-core/base-passwd/base-passwd_3.6.1.bb)3
-rw-r--r--poky/meta/recipes-core/ell/ell_0.59.bb (renamed from poky/meta/recipes-core/ell/ell_0.58.bb)2
-rw-r--r--poky/meta/recipes-core/gettext/gettext/use-pkgconfig.patch319
-rw-r--r--poky/meta/recipes-core/gettext/gettext_0.22.bb6
-rw-r--r--poky/meta/recipes-core/glib-2.0/glib-2.0_2.78.1.bb (renamed from poky/meta/recipes-core/glib-2.0/glib-2.0_2.78.0.bb)2
-rw-r--r--poky/meta/recipes-core/glib-2.0/glib.inc5
-rw-r--r--poky/meta/recipes-core/glib-networking/glib-networking_2.76.1.bb1
-rw-r--r--poky/meta/recipes-core/glibc/glibc-package.inc8
-rw-r--r--poky/meta/recipes-core/images/build-appliance-image_15.0.0.bb2
-rw-r--r--poky/meta/recipes-core/libxml/libxml2_2.11.5.bb4
-rw-r--r--poky/meta/recipes-core/musl/gcompat/0001-Add-fcntl64-wrapper.patch44
-rw-r--r--poky/meta/recipes-core/musl/gcompat/0001-auxv-new-module.patch59
-rw-r--r--poky/meta/recipes-core/musl/gcompat_git.bb8
-rw-r--r--poky/meta/recipes-core/ovmf/ovmf_git.bb2
-rw-r--r--poky/meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb4
-rw-r--r--poky/meta/recipes-core/systemd/systemd.inc3
-rw-r--r--poky/meta/recipes-core/systemd/systemd_254.4.bb71
-rw-r--r--poky/meta/recipes-core/udev/udev-extraconf/mount.sh15
-rw-r--r--poky/meta/recipes-core/volatile-binds/files/volatile-binds.service.in3
-rw-r--r--poky/meta/recipes-core/volatile-binds/volatile-binds.bb18
-rw-r--r--poky/meta/recipes-core/zlib/zlib_1.3.bb2
-rw-r--r--poky/meta/recipes-devtools/btrfs-tools/btrfs-tools_6.5.3.bb (renamed from poky/meta/recipes-devtools/btrfs-tools/btrfs-tools_6.5.1.bb)2
-rw-r--r--poky/meta/recipes-devtools/cdrtools/cdrtools-native_3.01.bb9
-rw-r--r--poky/meta/recipes-devtools/cdrtools/cdrtools/riscv64-linux-gcc.rul65
-rw-r--r--poky/meta/recipes-devtools/createrepo-c/createrepo-c/0001-Move-cr_compress_groupfile-outside-WITH_LIBMODULEMD.patch46
-rw-r--r--poky/meta/recipes-devtools/createrepo-c/createrepo-c/time64fix.patch69
-rw-r--r--poky/meta/recipes-devtools/createrepo-c/createrepo-c_1.0.2.bb (renamed from poky/meta/recipes-devtools/createrepo-c/createrepo-c_1.0.0.bb)4
-rw-r--r--poky/meta/recipes-devtools/dnf/dnf_4.18.1.bb (renamed from poky/meta/recipes-devtools/dnf/dnf_4.17.0.bb)2
-rw-r--r--poky/meta/recipes-devtools/git/git_2.42.1.bb (renamed from poky/meta/recipes-devtools/git/git_2.42.0.bb)2
-rw-r--r--poky/meta/recipes-devtools/go/go-cross-canadian.inc2
-rw-r--r--poky/meta/recipes-devtools/libcomps/libcomps/0001-libcomps-Use-Py_hash_t-instead-of-long-in-PyCOMPS_ha.patch66
-rw-r--r--poky/meta/recipes-devtools/libcomps/libcomps_0.1.20.bb (renamed from poky/meta/recipes-devtools/libcomps/libcomps_0.1.19.bb)3
-rw-r--r--poky/meta/recipes-devtools/libdnf/libdnf/armarch.patch42
-rw-r--r--poky/meta/recipes-devtools/libdnf/libdnf_0.72.0.bb (renamed from poky/meta/recipes-devtools/libdnf/libdnf_0.71.0.bb)3
-rw-r--r--poky/meta/recipes-devtools/llvm/llvm_git.bb4
-rw-r--r--poky/meta/recipes-devtools/meson/meson_1.2.2.bb2
-rw-r--r--poky/meta/recipes-devtools/mmc/mmc-utils_git.bb2
-rw-r--r--poky/meta/recipes-devtools/perl/files/0001-Fix-intermittent-failure-of-test-t-op-sigsystem.t.patch77
-rw-r--r--poky/meta/recipes-devtools/perl/perl_5.38.0.bb1
-rw-r--r--poky/meta/recipes-devtools/python/python-testtools.inc2
-rw-r--r--poky/meta/recipes-devtools/python/python3-babel_2.13.1.bb (renamed from poky/meta/recipes-devtools/python/python3-babel_2.12.1.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-beartype_0.16.4.bb (renamed from poky/meta/recipes-devtools/python/python3-beartype_0.15.0.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-cffi_1.16.0.bb (renamed from poky/meta/recipes-devtools/python/python3-cffi_1.15.1.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-cryptography-vectors_41.0.5.bb (renamed from poky/meta/recipes-devtools/python/python3-cryptography-vectors_41.0.4.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-cryptography_41.0.5.bb (renamed from poky/meta/recipes-devtools/python/python3-cryptography_41.0.4.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-cython_0.29.36.bb18
-rw-r--r--poky/meta/recipes-devtools/python/python3-git_3.1.40.bb (renamed from poky/meta/recipes-devtools/python/python3-git_3.1.36.bb)4
-rw-r--r--poky/meta/recipes-devtools/python/python3-gitdb_4.0.11.bb (renamed from poky/meta/recipes-devtools/python/python3-gitdb_4.0.10.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-hatch-vcs_0.4.0.bb (renamed from poky/meta/recipes-devtools/python/python3-hatch-vcs_0.3.0.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-hypothesis_6.89.0.bb (renamed from poky/meta/recipes-devtools/python/python3-hypothesis_6.86.2.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-iso8601_2.1.0.bb (renamed from poky/meta/recipes-devtools/python/python3-iso8601_2.0.0.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-mako_1.3.0.bb (renamed from poky/meta/recipes-devtools/python/python3-mako_1.2.4.bb)4
-rw-r--r--poky/meta/recipes-devtools/python/python3-markdown_3.5.bb (renamed from poky/meta/recipes-devtools/python/python3-markdown_3.4.4.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-numpy_1.26.2.bb (renamed from poky/meta/recipes-devtools/python/python3-numpy_1.26.0.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-packaging_23.2.bb (renamed from poky/meta/recipes-devtools/python/python3-packaging_23.1.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-pbr_5.11.1.bb4
-rw-r--r--poky/meta/recipes-devtools/python/python3-pbr_6.0.0.bb4
-rw-r--r--poky/meta/recipes-devtools/python/python3-pip_23.3.1.bb (renamed from poky/meta/recipes-devtools/python/python3-pip_23.2.1.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-poetry-core_1.8.1.bb (renamed from poky/meta/recipes-devtools/python/python3-poetry-core_1.7.0.bb)9
-rw-r--r--poky/meta/recipes-devtools/python/python3-psutil_5.9.6.bb (renamed from poky/meta/recipes-devtools/python/python3-psutil_5.9.5.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-pycairo_1.25.1.bb (renamed from poky/meta/recipes-devtools/python/python3-pycairo_1.24.0.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-pygobject_3.46.0.bb1
-rw-r--r--poky/meta/recipes-devtools/python/python3-pyopenssl_23.3.0.bb (renamed from poky/meta/recipes-devtools/python/python3-pyopenssl_23.2.0.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-pyrsistent_0.20.0.bb (renamed from poky/meta/recipes-devtools/python/python3-pyrsistent_0.19.3.bb)4
-rw-r--r--poky/meta/recipes-devtools/python/python3-pytest_7.4.3.bb (renamed from poky/meta/recipes-devtools/python/python3-pytest_7.4.2.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-ruamel-yaml_0.17.35.bb (renamed from poky/meta/recipes-devtools/python/python3-ruamel-yaml_0.17.32.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-setuptools-rust_1.8.1.bb (renamed from poky/meta/recipes-devtools/python/python3-setuptools-rust_1.7.0.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-setuptools-scm_8.0.4.bb (renamed from poky/meta/recipes-devtools/python/python3-setuptools-scm_7.1.0.bb)9
-rw-r--r--poky/meta/recipes-devtools/python/python3-spdx-tools_0.8.2.bb (renamed from poky/meta/recipes-devtools/python/python3-spdx-tools_0.8.1.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-testtools_2.7.1.bb (renamed from poky/meta/recipes-devtools/python/python3-testtools_2.6.0.bb)0
-rw-r--r--poky/meta/recipes-devtools/python/python3-trove-classifiers_2023.11.14.bb (renamed from poky/meta/recipes-devtools/python/python3-trove-classifiers_2023.9.19.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-urllib3_2.0.7.bb (renamed from poky/meta/recipes-devtools/python/python3-urllib3_2.0.5.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-wcwidth_0.2.9.bb (renamed from poky/meta/recipes-devtools/python/python3-wcwidth_0.2.6.bb)2
-rw-r--r--poky/meta/recipes-devtools/python/python3-wheel_0.41.3.bb (renamed from poky/meta/recipes-devtools/python/python3-wheel_0.41.2.bb)2
-rw-r--r--poky/meta/recipes-devtools/qemu/qemu-native_8.1.2.bb (renamed from poky/meta/recipes-devtools/qemu/qemu-native_8.1.0.bb)0
-rw-r--r--poky/meta/recipes-devtools/qemu/qemu-system-native_8.1.2.bb (renamed from poky/meta/recipes-devtools/qemu/qemu-system-native_8.1.0.bb)0
-rw-r--r--poky/meta/recipes-devtools/qemu/qemu.inc8
-rw-r--r--poky/meta/recipes-devtools/qemu/qemu/0001-CVE-2023-40360-hw-nvme-fix-null-pointer-access-in-di.patch39
-rw-r--r--poky/meta/recipes-devtools/qemu/qemu/0001-softmmu-Assert-data-in-bounds-in-iotlb_to_section.patch42
-rw-r--r--poky/meta/recipes-devtools/qemu/qemu/0001-softmmu-Use-async_run_on_cpu-in-tcg_commit.patch157
-rw-r--r--poky/meta/recipes-devtools/qemu/qemu/CVE-2023-42467.patch49
-rw-r--r--poky/meta/recipes-devtools/qemu/qemu_8.1.2.bb (renamed from poky/meta/recipes-devtools/qemu/qemu_8.1.0.bb)0
-rw-r--r--poky/meta/recipes-devtools/repo/repo_2.37.bb (renamed from poky/meta/recipes-devtools/repo/repo_2.36.1.bb)2
-rw-r--r--poky/meta/recipes-devtools/rust/cargo_1.70.0.bb2
-rw-r--r--poky/meta/recipes-devtools/rust/rust-cross-canadian.inc7
-rw-r--r--poky/meta/recipes-devtools/rust/rust-llvm_1.70.0.bb11
-rw-r--r--poky/meta/recipes-devtools/strace/strace/ptest-spacesave.patch2
-rw-r--r--poky/meta/recipes-devtools/strace/strace/skip-test-so_peerpidfd.gen.test.patch25
-rw-r--r--poky/meta/recipes-devtools/strace/strace_6.6.bb (renamed from poky/meta/recipes-devtools/strace/strace_6.5.bb)5
-rw-r--r--poky/meta/recipes-devtools/valgrind/valgrind_3.21.0.bb18
-rw-r--r--poky/meta/recipes-extended/acpica/acpica_20230628.bb4
-rw-r--r--poky/meta/recipes-extended/baremetal-example/baremetal-helloworld_git.bb2
-rw-r--r--poky/meta/recipes-extended/bash/bash_5.2.21.bb (renamed from poky/meta/recipes-extended/bash/bash_5.2.15.bb)2
-rw-r--r--poky/meta/recipes-extended/cronie/cronie_1.7.0.bb (renamed from poky/meta/recipes-extended/cronie/cronie_1.6.1.bb)2
-rw-r--r--poky/meta/recipes-extended/cups/cups.inc8
-rw-r--r--poky/meta/recipes-extended/cups/cups/CVE-2023-4504.patch42
-rw-r--r--poky/meta/recipes-extended/cups/cups_2.4.7.bb (renamed from poky/meta/recipes-extended/cups/cups_2.4.6.bb)2
-rw-r--r--poky/meta/recipes-extended/ghostscript/ghostscript_10.02.1.bb (renamed from poky/meta/recipes-extended/ghostscript/ghostscript_10.02.0.bb)5
-rw-r--r--poky/meta/recipes-extended/libarchive/libarchive_3.7.2.bb1
-rw-r--r--poky/meta/recipes-extended/libnsl/libnsl2_git.bb4
-rw-r--r--poky/meta/recipes-extended/libsolv/libsolv_0.7.26.bb (renamed from poky/meta/recipes-extended/libsolv/libsolv_0.7.25.bb)2
-rw-r--r--poky/meta/recipes-extended/libtirpc/libtirpc/ipv6.patch52
-rw-r--r--poky/meta/recipes-extended/libtirpc/libtirpc_1.3.4.bb (renamed from poky/meta/recipes-extended/libtirpc/libtirpc_1.3.3.bb)11
-rw-r--r--poky/meta/recipes-extended/lighttpd/lighttpd/lighttpd19
-rw-r--r--poky/meta/recipes-extended/lighttpd/lighttpd/lighttpd.conf38
-rw-r--r--poky/meta/recipes-extended/lighttpd/lighttpd_1.4.73.bb (renamed from poky/meta/recipes-extended/lighttpd/lighttpd_1.4.71.bb)2
-rw-r--r--poky/meta/recipes-extended/lsb/lsb-release_1.4.bb3
-rw-r--r--poky/meta/recipes-extended/ltp/ltp_20230929.bb (renamed from poky/meta/recipes-extended/ltp/ltp_20230516.bb)2
-rw-r--r--poky/meta/recipes-extended/man-db/files/man_db.conf-avoid-multilib-install-file-conflict.patch16
-rw-r--r--poky/meta/recipes-extended/man-db/man-db_2.11.2.bb7
-rw-r--r--poky/meta/recipes-extended/msmtp/msmtp_1.8.25.bb (renamed from poky/meta/recipes-extended/msmtp/msmtp_1.8.24.bb)2
-rw-r--r--poky/meta/recipes-extended/newt/libnewt_0.52.24.bb (renamed from poky/meta/recipes-extended/newt/libnewt_0.52.23.bb)2
-rw-r--r--poky/meta/recipes-extended/pam/libpam_1.5.3.bb9
-rw-r--r--poky/meta/recipes-extended/stress-ng/stress-ng_0.17.01.bb (renamed from poky/meta/recipes-extended/stress-ng/stress-ng_0.16.05.bb)2
-rw-r--r--poky/meta/recipes-extended/sudo/sudo_1.9.15p2.bb (renamed from poky/meta/recipes-extended/sudo/sudo_1.9.14p3.bb)2
-rw-r--r--poky/meta/recipes-extended/sysstat/sysstat_12.7.4.bb10
-rw-r--r--poky/meta/recipes-gnome/epiphany/epiphany_44.6.bb1
-rw-r--r--poky/meta/recipes-gnome/gcr/gcr_4.1.0.bb1
-rw-r--r--poky/meta/recipes-gnome/gnome/adwaita-icon-theme_45.0.bb1
-rw-r--r--poky/meta/recipes-gnome/gnome/gconf_3.2.6.bb1
-rw-r--r--poky/meta/recipes-gnome/gsettings-desktop-schemas/gsettings-desktop-schemas_45.0.bb (renamed from poky/meta/recipes-gnome/gsettings-desktop-schemas/gsettings-desktop-schemas_44.0.bb)3
-rw-r--r--poky/meta/recipes-gnome/gtk+/gtk+3.inc2
-rw-r--r--poky/meta/recipes-gnome/gtk+/gtk4_4.12.3.bb2
-rw-r--r--poky/meta/recipes-gnome/gtk-doc/gtk-doc_1.33.2.bb1
-rw-r--r--poky/meta/recipes-gnome/json-glib/json-glib_1.6.6.bb1
-rw-r--r--poky/meta/recipes-gnome/libadwaita/libadwaita_1.4.0.bb1
-rw-r--r--poky/meta/recipes-gnome/libdazzle/libdazzle_3.44.0.bb1
-rw-r--r--poky/meta/recipes-gnome/libgudev/libgudev_238.bb1
-rw-r--r--poky/meta/recipes-gnome/libnotify/libnotify_0.8.3.bb (renamed from poky/meta/recipes-gnome/libnotify/libnotify_0.8.2.bb)3
-rw-r--r--poky/meta/recipes-gnome/librsvg/librsvg/0001-Add-riscv32-support.patch1511
-rw-r--r--poky/meta/recipes-gnome/librsvg/librsvg_2.56.3.bb3
-rw-r--r--poky/meta/recipes-gnome/libsecret/libsecret_0.21.1.bb1
-rw-r--r--poky/meta/recipes-graphics/drm/libdrm_2.4.117.bb (renamed from poky/meta/recipes-graphics/drm/libdrm_2.4.116.bb)2
-rw-r--r--poky/meta/recipes-graphics/glslang/glslang_1.3.268.0.bb (renamed from poky/meta/recipes-graphics/glslang/glslang_1.3.261.1.bb)6
-rw-r--r--poky/meta/recipes-graphics/graphene/graphene_1.10.8.bb1
-rw-r--r--poky/meta/recipes-graphics/harfbuzz/harfbuzz_8.3.0.bb (renamed from poky/meta/recipes-graphics/harfbuzz/harfbuzz_8.2.1.bb)2
-rw-r--r--poky/meta/recipes-graphics/igt-gpu-tools/igt-gpu-tools_git.bb2
-rw-r--r--poky/meta/recipes-graphics/jpeg/libjpeg-turbo_3.0.1.bb (renamed from poky/meta/recipes-graphics/jpeg/libjpeg-turbo_3.0.0.bb)4
-rw-r--r--poky/meta/recipes-graphics/libsdl2/libsdl2_2.28.5.bb (renamed from poky/meta/recipes-graphics/libsdl2/libsdl2_2.28.3.bb)2
-rw-r--r--poky/meta/recipes-graphics/libva/libva-initial_2.20.0.bb (renamed from poky/meta/recipes-graphics/libva/libva-initial_2.19.0.bb)0
-rw-r--r--poky/meta/recipes-graphics/libva/libva.inc2
-rw-r--r--poky/meta/recipes-graphics/libva/libva_2.20.0.bb (renamed from poky/meta/recipes-graphics/libva/libva_2.19.0.bb)0
-rw-r--r--poky/meta/recipes-graphics/pango/pango_1.51.0.bb1
-rw-r--r--poky/meta/recipes-graphics/shaderc/shaderc_2023.7.bb (renamed from poky/meta/recipes-graphics/shaderc/shaderc_2023.6.bb)2
-rw-r--r--poky/meta/recipes-graphics/spir/spirv-headers_1.3.268.0.bb (renamed from poky/meta/recipes-graphics/spir/spirv-headers_1.3.261.1.bb)3
-rw-r--r--poky/meta/recipes-graphics/spir/spirv-tools_1.3.268.0.bb (renamed from poky/meta/recipes-graphics/spir/spirv-tools_1.3.261.1.bb)3
-rw-r--r--poky/meta/recipes-graphics/vulkan/vulkan-headers_1.3.268.0.bb (renamed from poky/meta/recipes-graphics/vulkan/vulkan-headers_1.3.261.1.bb)5
-rw-r--r--poky/meta/recipes-graphics/vulkan/vulkan-loader_1.3.268.0.bb (renamed from poky/meta/recipes-graphics/vulkan/vulkan-loader_1.3.261.1.bb)7
-rw-r--r--poky/meta/recipes-graphics/vulkan/vulkan-samples/0001-vulkan-samples-Fix-reproducibility-issue.patch2
-rw-r--r--poky/meta/recipes-graphics/vulkan/vulkan-samples_git.bb2
-rw-r--r--poky/meta/recipes-graphics/vulkan/vulkan-tools_1.3.268.0.bb (renamed from poky/meta/recipes-graphics/vulkan/vulkan-tools_1.3.261.1.bb)3
-rw-r--r--poky/meta/recipes-graphics/vulkan/vulkan-utility-libraries_1.3.268.0.bb33
-rw-r--r--poky/meta/recipes-graphics/vulkan/vulkan-validation-layers_1.3.268.0.bb (renamed from poky/meta/recipes-graphics/vulkan/vulkan-validation-layers_1.3.261.1.bb)9
-rw-r--r--poky/meta/recipes-graphics/xorg-lib/pixman_0.42.2.bb2
-rw-r--r--poky/meta/recipes-graphics/xorg-lib/xkeyboard-config_2.40.bb (renamed from poky/meta/recipes-graphics/xorg-lib/xkeyboard-config_2.39.bb)4
-rw-r--r--poky/meta/recipes-graphics/xorg-xserver/xserver-xorg_21.1.9.bb (renamed from poky/meta/recipes-graphics/xorg-xserver/xserver-xorg_21.1.8.bb)2
-rw-r--r--poky/meta/recipes-graphics/xwayland/xwayland_23.2.2.bb (renamed from poky/meta/recipes-graphics/xwayland/xwayland_23.2.1.bb)2
-rw-r--r--poky/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb2
-rw-r--r--poky/meta/recipes-kernel/kmod/kmod_31.bb (renamed from poky/meta/recipes-kernel/kmod/kmod_30.bb)2
-rw-r--r--poky/meta/recipes-kernel/linux-firmware/linux-firmware_20231030.bb (renamed from poky/meta/recipes-kernel/linux-firmware/linux-firmware_20230804.bb)288
-rw-r--r--poky/meta/recipes-kernel/linux/cve-exclusion_6.1.inc68
-rw-r--r--poky/meta/recipes-kernel/linux/cve-exclusion_6.4.inc5072
-rw-r--r--poky/meta/recipes-kernel/linux/cve-exclusion_6.5.inc78
-rw-r--r--poky/meta/recipes-kernel/linux/linux-yocto-rt_6.1.bb6
-rw-r--r--poky/meta/recipes-kernel/linux/linux-yocto-rt_6.4.bb48
-rw-r--r--poky/meta/recipes-kernel/linux/linux-yocto-rt_6.5.bb8
-rw-r--r--poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.1.bb6
-rw-r--r--poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.4.bb33
-rw-r--r--poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.5.bb8
-rw-r--r--poky/meta/recipes-kernel/linux/linux-yocto.inc5
-rw-r--r--poky/meta/recipes-kernel/linux/linux-yocto_6.1.bb28
-rw-r--r--poky/meta/recipes-kernel/linux/linux-yocto_6.4.bb72
-rw-r--r--poky/meta/recipes-kernel/linux/linux-yocto_6.5.bb30
-rw-r--r--poky/meta/recipes-kernel/perf/perf.bb20
-rw-r--r--poky/meta/recipes-multimedia/ffmpeg/ffmpeg/0001-avcodec-x86-mathops-clip-constants-used-with-shift-i.patch77
-rw-r--r--poky/meta/recipes-multimedia/ffmpeg/ffmpeg/0001-libswscale-riscv-Fix-syntax-of-vsetvli.patch35
-rw-r--r--poky/meta/recipes-multimedia/ffmpeg/ffmpeg_6.1.bb (renamed from poky/meta/recipes-multimedia/ffmpeg/ffmpeg_6.0.bb)8
-rw-r--r--poky/meta/recipes-multimedia/gstreamer/gst-devtools_1.22.7.bb (renamed from poky/meta/recipes-multimedia/gstreamer/gst-devtools_1.22.6.bb)2
-rw-r--r--poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.22.7.bb (renamed from poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.22.6.bb)2
-rw-r--r--poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.22.7.bb (renamed from poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.22.6.bb)2
-rw-r--r--poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.7.bb (renamed from poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.6.bb)2
-rw-r--r--poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.7.bb (renamed from poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.6.bb)2
-rw-r--r--poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.7.bb (renamed from poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.6.bb)2
-rw-r--r--poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.7.bb (renamed from poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.6.bb)2
-rw-r--r--poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-python_1.22.7.bb (renamed from poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-python_1.22.6.bb)2
-rw-r--r--poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.22.7.bb (renamed from poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.22.6.bb)2
-rw-r--r--poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi_1.22.7.bb (renamed from poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi_1.22.6.bb)2
-rw-r--r--poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.22.7.bb (renamed from poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.22.6.bb)2
-rw-r--r--poky/meta/recipes-multimedia/libsndfile/libsndfile1/cve-2022-33065.patch739
-rw-r--r--poky/meta/recipes-multimedia/libsndfile/libsndfile1_1.2.2.bb1
-rw-r--r--poky/meta/recipes-rt/README2
-rw-r--r--poky/meta/recipes-sato/puzzles/puzzles_git.bb2
-rw-r--r--poky/meta/recipes-support/debianutils/debianutils_5.14.bb (renamed from poky/meta/recipes-support/debianutils/debianutils_5.13.bb)8
-rw-r--r--poky/meta/recipes-support/diffoscope/diffoscope_251.bb (renamed from poky/meta/recipes-support/diffoscope/diffoscope_249.bb)2
-rw-r--r--poky/meta/recipes-support/enchant/enchant2_2.6.2.bb (renamed from poky/meta/recipes-support/enchant/enchant2_2.6.1.bb)2
-rw-r--r--poky/meta/recipes-support/gpgme/gpgme_1.23.1.bb (renamed from poky/meta/recipes-support/gpgme/gpgme_1.22.0.bb)2
-rw-r--r--poky/meta/recipes-support/libcroco/files/CVE-2020-12825.patch192
-rw-r--r--poky/meta/recipes-support/libcroco/libcroco_0.6.13.bb26
-rw-r--r--poky/meta/recipes-support/libical/libical_3.0.17.bb (renamed from poky/meta/recipes-support/libical/libical_3.0.16.bb)2
-rw-r--r--poky/meta/recipes-support/libsoup/libsoup_3.4.4.bb (renamed from poky/meta/recipes-support/libsoup/libsoup_3.4.2.bb)2
-rw-r--r--poky/meta/recipes-support/shared-mime-info/shared-mime-info_2.4.bb (renamed from poky/meta/recipes-support/shared-mime-info/shared-mime-info_git.bb)4
-rw-r--r--poky/meta/recipes-support/sqlite/sqlite3_3.44.0.bb (renamed from poky/meta/recipes-support/sqlite/sqlite3_3.43.1.bb)2
-rw-r--r--poky/meta/recipes-support/vim/vim.inc20
-rw-r--r--poky/meta/recipes-support/vte/vte_0.72.2.bb1
-rwxr-xr-xpoky/scripts/bitbake-whatchanged318
-rwxr-xr-xpoky/scripts/contrib/bb-perf/bb-matrix-plot.sh4
-rwxr-xr-xpoky/scripts/contrib/patchreview.py64
l---------poky/scripts/esdk-tools/devtool1
l---------poky/scripts/esdk-tools/oe-find-native-sysroot1
l---------poky/scripts/esdk-tools/recipetool1
l---------poky/scripts/esdk-tools/runqemu1
l---------poky/scripts/esdk-tools/runqemu-addptable2image1
l---------poky/scripts/esdk-tools/runqemu-export-rootfs1
l---------poky/scripts/esdk-tools/runqemu-extract-sdk1
l---------poky/scripts/esdk-tools/runqemu-gen-tapdevs1
l---------poky/scripts/esdk-tools/runqemu-ifdown1
l---------poky/scripts/esdk-tools/runqemu-ifup1
l---------poky/scripts/esdk-tools/wic1
-rw-r--r--poky/scripts/lib/checklayer/__init__.py2
-rw-r--r--poky/scripts/lib/recipetool/create.py2
-rw-r--r--poky/scripts/lib/recipetool/create_buildsys_python.py989
-rw-r--r--poky/scripts/lib/recipetool/create_go.py751
-rw-r--r--poky/scripts/lib/resulttool/regression.py61
-rwxr-xr-xpoky/scripts/patchtest225
-rwxr-xr-xpoky/scripts/patchtest-get-branch81
-rwxr-xr-xpoky/scripts/patchtest-get-series115
-rwxr-xr-xpoky/scripts/patchtest-send-results96
-rwxr-xr-xpoky/scripts/patchtest-setup-sharedir83
-rw-r--r--poky/scripts/patchtest.README156
-rwxr-xr-xpoky/scripts/runqemu4
-rwxr-xr-xpoky/scripts/yocto_testresults_query.py13
512 files changed, 17056 insertions, 10295 deletions
diff --git a/poky/.gitignore b/poky/.gitignore
index 8f48d452da..f6ce090b5f 100644
--- a/poky/.gitignore
+++ b/poky/.gitignore
@@ -36,3 +36,5 @@ _toaster_clones/
downloads/
sstate-cache/
toaster.sqlite
+.vscode/
+vscode-bitbake-build/
diff --git a/poky/.vscode/settings.json b/poky/.vscode/settings.json
new file mode 100644
index 0000000000..517a86d1bf
--- /dev/null
+++ b/poky/.vscode/settings.json
@@ -0,0 +1,32 @@
+{
+ "files.watcherExclude": {
+ "**/.git/**": true,
+ "**/cache/**": true,
+ "**/tmp*/**": true,
+ "**/downloads/**": true,
+ "**/sstate-cache/**": true,
+ "**/vscode-bitbake-build/**": true,
+ "**/workspace/sources/**": true,
+ "**/workspace/attic/**": true
+ },
+ "files.exclude": {
+ "**/.git/**": true,
+ "**/cache/**": true,
+ "**/tmp*/**": true,
+ "**/downloads/**": true,
+ "**/sstate-cache/**": true,
+ "**/vscode-bitbake-build/**": true,
+ "**/workspace/sources/**": true,
+ "**/workspace/attic/**": true
+ },
+ "python.analysis.exclude": [
+ "**/.git/**",
+ "**/cache/**",
+ "**/tmp*/**",
+ "**/downloads/**",
+ "**/sstate-cache/**",
+ "**/vscode-bitbake-build/**",
+ "**/workspace/sources/**",
+ "**/workspace/attic/**"
+ ]
+}
diff --git a/poky/SECURITY.md b/poky/SECURITY.md
new file mode 100644
index 0000000000..1b63da4f69
--- /dev/null
+++ b/poky/SECURITY.md
@@ -0,0 +1,22 @@
+How to Report a Potential Vulnerability?
+========================================
+
+If you would like to report a public issue (for example, one with a released
+CVE number), please report it using the
+[https://bugzilla.yoctoproject.org/enter_bug.cgi?product=Security Security Bugzilla]
+
+If you are dealing with a not-yet released or urgent issue, please send a
+message to security AT yoctoproject DOT org, including as many details as
+possible: the layer or software module affected, the recipe and its version,
+and any example code, if available.
+
+Branches maintained with security fixes
+---------------------------------------
+
+See [https://wiki.yoctoproject.org/wiki/Stable_Release_and_LTS Stable release and LTS]
+for detailed info regarding the policies and maintenance of Stable branches.
+
+The [https://wiki.yoctoproject.org/wiki/Releases Release page] contains a list of all
+releases of the Yocto Project. Versions in grey are no longer actively maintained with
+security patches, but well-tested patches may still be accepted for them for
+significant issues.
diff --git a/poky/bitbake/SECURITY.md b/poky/bitbake/SECURITY.md
new file mode 100644
index 0000000000..7d2ce1f631
--- /dev/null
+++ b/poky/bitbake/SECURITY.md
@@ -0,0 +1,24 @@
+How to Report a Potential Vulnerability?
+========================================
+
+If you would like to report a public issue (for example, one with a released
+CVE number), please report it using the
+[https://bugzilla.yoctoproject.org/enter_bug.cgi?product=Security Security Bugzilla].
+If you have a patch ready, submit it following the same procedure as any other
+patch as described in README.md.
+
+If you are dealing with a not-yet released or urgent issue, please send a
+message to security AT yoctoproject DOT org, including as many details as
+possible: the layer or software module affected, the recipe and its version,
+and any example code, if available.
+
+Branches maintained with security fixes
+---------------------------------------
+
+See [https://wiki.yoctoproject.org/wiki/Stable_Release_and_LTS Stable release and LTS]
+for detailed info regarding the policies and maintenance of Stable branches.
+
+The [https://wiki.yoctoproject.org/wiki/Releases Release page] contains a list of all
+releases of the Yocto Project. Versions in grey are no longer actively maintained with
+security patches, but well-tested patches may still be accepted for them for
+significant issues.
diff --git a/poky/bitbake/bin/bitbake-hashclient b/poky/bitbake/bin/bitbake-hashclient
index 3f265e8fa7..3ff7b76378 100755
--- a/poky/bitbake/bin/bitbake-hashclient
+++ b/poky/bitbake/bin/bitbake-hashclient
@@ -14,6 +14,8 @@ import sys
import threading
import time
import warnings
+import netrc
+import json
warnings.simplefilter("default")
try:
@@ -36,10 +38,18 @@ except ImportError:
sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(__file__)), 'lib'))
import hashserv
+import bb.asyncrpc
DEFAULT_ADDRESS = 'unix://./hashserve.sock'
METHOD = 'stress.test.method'
+def print_user(u):
+ print(f"Username: {u['username']}")
+ if "permissions" in u:
+ print("Permissions: " + " ".join(u["permissions"]))
+ if "token" in u:
+ print(f"Token: {u['token']}")
+
def main():
def handle_stats(args, client):
@@ -47,7 +57,7 @@ def main():
s = client.reset_stats()
else:
s = client.get_stats()
- pprint.pprint(s)
+ print(json.dumps(s, sort_keys=True, indent=4))
return 0
def handle_stress(args, client):
@@ -56,25 +66,24 @@ def main():
nonlocal missed_hashes
nonlocal max_time
- client = hashserv.create_client(args.address)
-
- for i in range(args.requests):
- taskhash = hashlib.sha256()
- taskhash.update(args.taskhash_seed.encode('utf-8'))
- taskhash.update(str(i).encode('utf-8'))
+ with hashserv.create_client(args.address) as client:
+ for i in range(args.requests):
+ taskhash = hashlib.sha256()
+ taskhash.update(args.taskhash_seed.encode('utf-8'))
+ taskhash.update(str(i).encode('utf-8'))
- start_time = time.perf_counter()
- l = client.get_unihash(METHOD, taskhash.hexdigest())
- elapsed = time.perf_counter() - start_time
+ start_time = time.perf_counter()
+ l = client.get_unihash(METHOD, taskhash.hexdigest())
+ elapsed = time.perf_counter() - start_time
- with lock:
- if l:
- found_hashes += 1
- else:
- missed_hashes += 1
+ with lock:
+ if l:
+ found_hashes += 1
+ else:
+ missed_hashes += 1
- max_time = max(elapsed, max_time)
- pbar.update()
+ max_time = max(elapsed, max_time)
+ pbar.update()
max_time = 0
found_hashes = 0
@@ -126,9 +135,57 @@ def main():
print("Removed %d rows" % (result["count"]))
return 0
+ def handle_refresh_token(args, client):
+ r = client.refresh_token(args.username)
+ print_user(r)
+
+ def handle_set_user_permissions(args, client):
+ r = client.set_user_perms(args.username, args.permissions)
+ print_user(r)
+
+ def handle_get_user(args, client):
+ r = client.get_user(args.username)
+ print_user(r)
+
+ def handle_get_all_users(args, client):
+ users = client.get_all_users()
+ print("{username:20}| {permissions}".format(username="Username", permissions="Permissions"))
+ print(("-" * 20) + "+" + ("-" * 20))
+ for u in users:
+ print("{username:20}| {permissions}".format(username=u["username"], permissions=" ".join(u["permissions"])))
+
+ def handle_new_user(args, client):
+ r = client.new_user(args.username, args.permissions)
+ print_user(r)
+
+ def handle_delete_user(args, client):
+ r = client.delete_user(args.username)
+ print_user(r)
+
+ def handle_get_db_usage(args, client):
+ usage = client.get_db_usage()
+ print(usage)
+ tables = sorted(usage.keys())
+ print("{name:20}| {rows:20}".format(name="Table name", rows="Rows"))
+ print(("-" * 20) + "+" + ("-" * 20))
+ for t in tables:
+ print("{name:20}| {rows:<20}".format(name=t, rows=usage[t]["rows"]))
+ print()
+
+ total_rows = sum(t["rows"] for t in usage.values())
+ print(f"Total rows: {total_rows}")
+
+ def handle_get_db_query_columns(args, client):
+ columns = client.get_db_query_columns()
+ print("\n".join(sorted(columns)))
+
parser = argparse.ArgumentParser(description='Hash Equivalence Client')
parser.add_argument('--address', default=DEFAULT_ADDRESS, help='Server address (default "%(default)s")')
parser.add_argument('--log', default='WARNING', help='Set logging level')
+ parser.add_argument('--login', '-l', metavar="USERNAME", help="Authenticate as USERNAME")
+ parser.add_argument('--password', '-p', metavar="TOKEN", help="Authenticate using token TOKEN")
+ parser.add_argument('--become', '-b', metavar="USERNAME", help="Impersonate user USERNAME (if allowed) when performing actions")
+ parser.add_argument('--no-netrc', '-n', action="store_false", dest="netrc", help="Do not use .netrc")
subparsers = parser.add_subparsers()
@@ -159,6 +216,37 @@ def main():
clean_unused_parser.add_argument("max_age", metavar="SECONDS", type=int, help="Remove unused entries older than SECONDS old")
clean_unused_parser.set_defaults(func=handle_clean_unused)
+ refresh_token_parser = subparsers.add_parser('refresh-token', help="Refresh auth token")
+ refresh_token_parser.add_argument("--username", "-u", help="Refresh the token for another user (if authorized)")
+ refresh_token_parser.set_defaults(func=handle_refresh_token)
+
+ set_user_perms_parser = subparsers.add_parser('set-user-perms', help="Set new permissions for user")
+ set_user_perms_parser.add_argument("--username", "-u", help="Username", required=True)
+ set_user_perms_parser.add_argument("permissions", metavar="PERM", nargs="*", default=[], help="New permissions")
+ set_user_perms_parser.set_defaults(func=handle_set_user_permissions)
+
+ get_user_parser = subparsers.add_parser('get-user', help="Get user")
+ get_user_parser.add_argument("--username", "-u", help="Username")
+ get_user_parser.set_defaults(func=handle_get_user)
+
+ get_all_users_parser = subparsers.add_parser('get-all-users', help="List all users")
+ get_all_users_parser.set_defaults(func=handle_get_all_users)
+
+ new_user_parser = subparsers.add_parser('new-user', help="Create new user")
+ new_user_parser.add_argument("--username", "-u", help="Username", required=True)
+ new_user_parser.add_argument("permissions", metavar="PERM", nargs="*", default=[], help="New permissions")
+ new_user_parser.set_defaults(func=handle_new_user)
+
+ delete_user_parser = subparsers.add_parser('delete-user', help="Delete user")
+ delete_user_parser.add_argument("--username", "-u", help="Username", required=True)
+ delete_user_parser.set_defaults(func=handle_delete_user)
+
+ db_usage_parser = subparsers.add_parser('get-db-usage', help="Database Usage")
+ db_usage_parser.set_defaults(func=handle_get_db_usage)
+
+ db_query_columns_parser = subparsers.add_parser('get-db-query-columns', help="Show columns that can be used in database queries")
+ db_query_columns_parser.set_defaults(func=handle_get_db_query_columns)
+
args = parser.parse_args()
logger = logging.getLogger('hashserv')
@@ -172,11 +260,28 @@ def main():
console.setLevel(level)
logger.addHandler(console)
+ login = args.login
+ password = args.password
+
+ if login is None and args.netrc:
+ try:
+ n = netrc.netrc()
+ auth = n.authenticators(args.address)
+ if auth is not None:
+ login, _, password = auth
+ except FileNotFoundError:
+ pass
+
func = getattr(args, 'func', None)
if func:
- client = hashserv.create_client(args.address)
-
- return func(args, client)
+ try:
+ with hashserv.create_client(args.address, login, password) as client:
+ if args.become:
+ client.become_user(args.become)
+ return func(args, client)
+ except bb.asyncrpc.InvokeError as e:
+ print(f"ERROR: {e}")
+ return 1
return 0
diff --git a/poky/bitbake/bin/bitbake-hashserv b/poky/bitbake/bin/bitbake-hashserv
index 00af76b2d1..c560b3e58a 100755
--- a/poky/bitbake/bin/bitbake-hashserv
+++ b/poky/bitbake/bin/bitbake-hashserv
@@ -11,56 +11,148 @@ import logging
import argparse
import sqlite3
import warnings
+
warnings.simplefilter("default")
-sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(__file__)), 'lib'))
+sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(__file__)), "lib"))
import hashserv
+from hashserv.server import DEFAULT_ANON_PERMS
VERSION = "1.0.0"
-DEFAULT_BIND = 'unix://./hashserve.sock'
+DEFAULT_BIND = "unix://./hashserve.sock"
def main():
- parser = argparse.ArgumentParser(description='Hash Equivalence Reference Server. Version=%s' % VERSION,
- epilog='''The bind address is the path to a unix domain socket if it is
- prefixed with "unix://". Otherwise, it is an IP address
- and port in form ADDRESS:PORT. To bind to all addresses, leave
- the ADDRESS empty, e.g. "--bind :8686". To bind to a specific
- IPv6 address, enclose the address in "[]", e.g.
- "--bind [::1]:8686"'''
- )
-
- parser.add_argument('-b', '--bind', default=DEFAULT_BIND, help='Bind address (default "%(default)s")')
- parser.add_argument('-d', '--database', default='./hashserv.db', help='Database file (default "%(default)s")')
- parser.add_argument('-l', '--log', default='WARNING', help='Set logging level')
- parser.add_argument('-u', '--upstream', help='Upstream hashserv to pull hashes from')
- parser.add_argument('-r', '--read-only', action='store_true', help='Disallow write operations from clients')
+ parser = argparse.ArgumentParser(
+ description="Hash Equivalence Reference Server. Version=%s" % VERSION,
+ formatter_class=argparse.RawTextHelpFormatter,
+ epilog="""
+The bind address may take one of the following formats:
+ unix://PATH - Bind to unix domain socket at PATH
+ ws://ADDRESS:PORT - Bind to websocket on ADDRESS:PORT
+ ADDRESS:PORT - Bind to raw TCP socket on ADDRESS:PORT
+
+To bind to all addresses, leave the ADDRESS empty, e.g. "--bind :8686" or
+"--bind ws://:8686". To bind to a specific IPv6 address, enclose the address in
+"[]", e.g. "--bind [::1]:8686" or "--bind ws://[::1]:8686"
+
+Note that the default Anonymous permissions are designed to not break existing
+server instances when upgrading, but are not particularly secure defaults. If
+you want to use authentication, it is recommended that you use "--anon-perms
+@read" to only give anonymous users read access, or "--anon-perms @none" to
+give un-authenticated users no access at all.
+
+Setting "--anon-perms @all" or "--anon-perms @user-admin" is not allowed, since
+this would allow anonymous users to manage all users accounts, which is a bad
+idea.
+
+If you are using user authentication, you should run your server in websockets
+mode with an SSL terminating load balancer in front of it (as this server does
+not implement SSL). Otherwise all usernames and passwords will be transmitted
+in the clear. When configured this way, clients can connect using a secure
+websocket, as in "wss://SERVER:PORT"
+ """,
+ )
+
+ parser.add_argument(
+ "-b",
+ "--bind",
+ default=os.environ.get("HASHSERVER_BIND", DEFAULT_BIND),
+ help='Bind address (default $HASHSERVER_BIND, "%(default)s")',
+ )
+ parser.add_argument(
+ "-d",
+ "--database",
+ default=os.environ.get("HASHSERVER_DB", "./hashserv.db"),
+ help='Database file (default $HASHSERVER_DB, "%(default)s")',
+ )
+ parser.add_argument(
+ "-l",
+ "--log",
+ default=os.environ.get("HASHSERVER_LOG_LEVEL", "WARNING"),
+ help='Set logging level (default $HASHSERVER_LOG_LEVEL, "%(default)s")',
+ )
+ parser.add_argument(
+ "-u",
+ "--upstream",
+ default=os.environ.get("HASHSERVER_UPSTREAM", None),
+ help="Upstream hashserv to pull hashes from ($HASHSERVER_UPSTREAM)",
+ )
+ parser.add_argument(
+ "-r",
+ "--read-only",
+ action="store_true",
+ help="Disallow write operations from clients ($HASHSERVER_READ_ONLY)",
+ )
+ parser.add_argument(
+ "--db-username",
+ default=os.environ.get("HASHSERVER_DB_USERNAME", None),
+ help="Database username ($HASHSERVER_DB_USERNAME)",
+ )
+ parser.add_argument(
+ "--db-password",
+ default=os.environ.get("HASHSERVER_DB_PASSWORD", None),
+ help="Database password ($HASHSERVER_DB_PASSWORD)",
+ )
+ parser.add_argument(
+ "--anon-perms",
+ metavar="PERM[,PERM[,...]]",
+ default=os.environ.get("HASHSERVER_ANON_PERMS", ",".join(DEFAULT_ANON_PERMS)),
+ help='Permissions to give anonymous users (default $HASHSERVER_ANON_PERMS, "%(default)s")',
+ )
+ parser.add_argument(
+ "--admin-user",
+ default=os.environ.get("HASHSERVER_ADMIN_USER", None),
+ help="Create default admin user with name ADMIN_USER ($HASHSERVER_ADMIN_USER)",
+ )
+ parser.add_argument(
+ "--admin-password",
+ default=os.environ.get("HASHSERVER_ADMIN_PASSWORD", None),
+ help="Create default admin user with password ADMIN_PASSWORD ($HASHSERVER_ADMIN_PASSWORD)",
+ )
args = parser.parse_args()
- logger = logging.getLogger('hashserv')
+ logger = logging.getLogger("hashserv")
level = getattr(logging, args.log.upper(), None)
if not isinstance(level, int):
- raise ValueError('Invalid log level: %s' % args.log)
+ raise ValueError("Invalid log level: %s" % args.log)
logger.setLevel(level)
console = logging.StreamHandler()
console.setLevel(level)
logger.addHandler(console)
- server = hashserv.create_server(args.bind, args.database, upstream=args.upstream, read_only=args.read_only)
+ read_only = (os.environ.get("HASHSERVER_READ_ONLY", "0") == "1") or args.read_only
+ if "," in args.anon_perms:
+ anon_perms = args.anon_perms.split(",")
+ else:
+ anon_perms = args.anon_perms.split()
+
+ server = hashserv.create_server(
+ args.bind,
+ args.database,
+ upstream=args.upstream,
+ read_only=read_only,
+ db_username=args.db_username,
+ db_password=args.db_password,
+ anon_perms=anon_perms,
+ admin_username=args.admin_user,
+ admin_password=args.admin_password,
+ )
server.serve_forever()
return 0
-if __name__ == '__main__':
+if __name__ == "__main__":
try:
ret = main()
except Exception:
ret = 1
import traceback
+
traceback.print_exc()
sys.exit(ret)
diff --git a/poky/bitbake/bin/bitbake-worker b/poky/bitbake/bin/bitbake-worker
index 609e276fe2..eba9c562c7 100755
--- a/poky/bitbake/bin/bitbake-worker
+++ b/poky/bitbake/bin/bitbake-worker
@@ -433,18 +433,30 @@ class BitbakeWorker(object):
while self.process_waitpid():
continue
-
def handle_item(self, item, func):
- if self.queue.startswith(b"<" + item + b">"):
- index = self.queue.find(b"</" + item + b">")
- while index != -1:
- try:
- func(self.queue[(len(item) + 2):index])
- except pickle.UnpicklingError:
- workerlog_write("Unable to unpickle data: %s\n" % ":".join("{:02x}".format(c) for c in self.queue))
- raise
- self.queue = self.queue[(index + len(item) + 3):]
- index = self.queue.find(b"</" + item + b">")
+ opening_tag = b"<" + item + b">"
+ if not self.queue.startswith(opening_tag):
+ return
+
+ tag_len = len(opening_tag)
+ if len(self.queue) < tag_len + 4:
+ # we need to receive more data
+ return
+ header = self.queue[tag_len:tag_len + 4]
+ payload_len = int.from_bytes(header, 'big')
+ # closing tag has length (tag_len + 1)
+ if len(self.queue) < tag_len * 2 + 1 + payload_len:
+ # we need to receive more data
+ return
+
+ index = self.queue.find(b"</" + item + b">")
+ if index != -1:
+ try:
+ func(self.queue[(tag_len + 4):index])
+ except pickle.UnpicklingError:
+ workerlog_write("Unable to unpickle data: %s\n" % ":".join("{:02x}".format(c) for c in self.queue))
+ raise
+ self.queue = self.queue[(index + len(b"</") + len(item) + len(b">")):]
def handle_cookercfg(self, data):
self.cookercfg = pickle.loads(data)
diff --git a/poky/bitbake/bin/toaster b/poky/bitbake/bin/toaster
index 558a819570..f002c8c159 100755
--- a/poky/bitbake/bin/toaster
+++ b/poky/bitbake/bin/toaster
@@ -84,7 +84,7 @@ webserverStartAll()
echo "Starting webserver..."
$MANAGE runserver --noreload "$ADDR_PORT" \
- </dev/null >>${BUILDDIR}/toaster_web.log 2>&1 \
+ </dev/null >>${TOASTER_LOGS_DIR}/web.log 2>&1 \
& echo $! >${BUILDDIR}/.toastermain.pid
sleep 1
@@ -181,6 +181,14 @@ WEBSERVER=1
export TOASTER_BUILDSERVER=1
ADDR_PORT="localhost:8000"
TOASTERDIR=`dirname $BUILDDIR`
+# ${BUILDDIR}/toaster_logs/ became the default location for toaster logs
+# This is needed for implemented django-log-viewer: https://pypi.org/project/django-log-viewer/
+# If the directory does not exist, create it.
+TOASTER_LOGS_DIR="${BUILDDIR}/toaster_logs/"
+if [ ! -d $TOASTER_LOGS_DIR ]
+then
+ mkdir $TOASTER_LOGS_DIR
+fi
unset CMD
for param in $*; do
case $param in
@@ -299,7 +307,7 @@ case $CMD in
export BITBAKE_UI='toasterui'
if [ $TOASTER_BUILDSERVER -eq 1 ] ; then
$MANAGE runbuilds \
- </dev/null >>${BUILDDIR}/toaster_runbuilds.log 2>&1 \
+ </dev/null >>${TOASTER_LOGS_DIR}/toaster_runbuilds.log 2>&1 \
& echo $! >${BUILDDIR}/.runbuilds.pid
else
echo "Toaster build server not started."
diff --git a/poky/bitbake/lib/bb/asyncrpc/__init__.py b/poky/bitbake/lib/bb/asyncrpc/__init__.py
index 9a85e9965b..a4371643d7 100644
--- a/poky/bitbake/lib/bb/asyncrpc/__init__.py
+++ b/poky/bitbake/lib/bb/asyncrpc/__init__.py
@@ -4,30 +4,13 @@
# SPDX-License-Identifier: GPL-2.0-only
#
-import itertools
-import json
-
-# The Python async server defaults to a 64K receive buffer, so we hardcode our
-# maximum chunk size. It would be better if the client and server reported to
-# each other what the maximum chunk sizes were, but that will slow down the
-# connection setup with a round trip delay so I'd rather not do that unless it
-# is necessary
-DEFAULT_MAX_CHUNK = 32 * 1024
-
-
-def chunkify(msg, max_chunk):
- if len(msg) < max_chunk - 1:
- yield ''.join((msg, "\n"))
- else:
- yield ''.join((json.dumps({
- 'chunk-stream': None
- }), "\n"))
-
- args = [iter(msg)] * (max_chunk - 1)
- for m in map(''.join, itertools.zip_longest(*args, fillvalue='')):
- yield ''.join(itertools.chain(m, "\n"))
- yield "\n"
-
from .client import AsyncClient, Client
-from .serv import AsyncServer, AsyncServerConnection, ClientError, ServerError
+from .serv import AsyncServer, AsyncServerConnection
+from .connection import DEFAULT_MAX_CHUNK
+from .exceptions import (
+ ClientError,
+ ServerError,
+ ConnectionClosedError,
+ InvokeError,
+)
diff --git a/poky/bitbake/lib/bb/asyncrpc/client.py b/poky/bitbake/lib/bb/asyncrpc/client.py
index fa042bbe87..0d7cd85780 100644
--- a/poky/bitbake/lib/bb/asyncrpc/client.py
+++ b/poky/bitbake/lib/bb/asyncrpc/client.py
@@ -10,13 +10,13 @@ import json
import os
import socket
import sys
-from . import chunkify, DEFAULT_MAX_CHUNK
+from .connection import StreamConnection, WebsocketConnection, DEFAULT_MAX_CHUNK
+from .exceptions import ConnectionClosedError, InvokeError
class AsyncClient(object):
def __init__(self, proto_name, proto_version, logger, timeout=30):
- self.reader = None
- self.writer = None
+ self.socket = None
self.max_chunk = DEFAULT_MAX_CHUNK
self.proto_name = proto_name
self.proto_version = proto_version
@@ -25,7 +25,8 @@ class AsyncClient(object):
async def connect_tcp(self, address, port):
async def connect_sock():
- return await asyncio.open_connection(address, port)
+ reader, writer = await asyncio.open_connection(address, port)
+ return StreamConnection(reader, writer, self.timeout, self.max_chunk)
self._connect_sock = connect_sock
@@ -40,27 +41,39 @@ class AsyncClient(object):
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
sock.connect(os.path.basename(path))
finally:
- os.chdir(cwd)
- return await asyncio.open_unix_connection(sock=sock)
+ os.chdir(cwd)
+ reader, writer = await asyncio.open_unix_connection(sock=sock)
+ return StreamConnection(reader, writer, self.timeout, self.max_chunk)
+
+ self._connect_sock = connect_sock
+
+ async def connect_websocket(self, uri):
+ import websockets
+
+ async def connect_sock():
+ websocket = await websockets.connect(uri, ping_interval=None)
+ return WebsocketConnection(websocket, self.timeout)
self._connect_sock = connect_sock
async def setup_connection(self):
- s = '%s %s\n\n' % (self.proto_name, self.proto_version)
- self.writer.write(s.encode("utf-8"))
- await self.writer.drain()
+ # Send headers
+ await self.socket.send("%s %s" % (self.proto_name, self.proto_version))
+ # End of headers
+ await self.socket.send("")
async def connect(self):
- if self.reader is None or self.writer is None:
- (self.reader, self.writer) = await self._connect_sock()
+ if self.socket is None:
+ self.socket = await self._connect_sock()
await self.setup_connection()
- async def close(self):
- self.reader = None
+ async def disconnect(self):
+ if self.socket is not None:
+ await self.socket.close()
+ self.socket = None
- if self.writer is not None:
- self.writer.close()
- self.writer = None
+ async def close(self):
+ await self.disconnect()
async def _send_wrapper(self, proc):
count = 0
@@ -71,6 +84,7 @@ class AsyncClient(object):
except (
OSError,
ConnectionError,
+ ConnectionClosedError,
json.JSONDecodeError,
UnicodeDecodeError,
) as e:
@@ -82,49 +96,27 @@ class AsyncClient(object):
await self.close()
count += 1
- async def send_message(self, msg):
- async def get_line():
- try:
- line = await asyncio.wait_for(self.reader.readline(), self.timeout)
- except asyncio.TimeoutError:
- raise ConnectionError("Timed out waiting for server")
-
- if not line:
- raise ConnectionError("Connection closed")
-
- line = line.decode("utf-8")
-
- if not line.endswith("\n"):
- raise ConnectionError("Bad message %r" % (line))
-
- return line
+ def check_invoke_error(self, msg):
+ if isinstance(msg, dict) and "invoke-error" in msg:
+ raise InvokeError(msg["invoke-error"]["message"])
+ async def invoke(self, msg):
async def proc():
- for c in chunkify(json.dumps(msg), self.max_chunk):
- self.writer.write(c.encode("utf-8"))
- await self.writer.drain()
-
- l = await get_line()
+ await self.socket.send_message(msg)
+ return await self.socket.recv_message()
- m = json.loads(l)
- if m and "chunk-stream" in m:
- lines = []
- while True:
- l = (await get_line()).rstrip("\n")
- if not l:
- break
- lines.append(l)
+ result = await self._send_wrapper(proc)
+ self.check_invoke_error(result)
+ return result
- m = json.loads("".join(lines))
+ async def ping(self):
+ return await self.invoke({"ping": {}})
- return m
+ async def __aenter__(self):
+ return self
- return await self._send_wrapper(proc)
-
- async def ping(self):
- return await self.send_message(
- {'ping': {}}
- )
+ async def __aexit__(self, exc_type, exc_value, traceback):
+ await self.close()
class Client(object):
@@ -142,7 +134,7 @@ class Client(object):
# required (but harmless) with it.
asyncio.set_event_loop(self.loop)
- self._add_methods('connect_tcp', 'ping')
+ self._add_methods("connect_tcp", "ping")
@abc.abstractmethod
def _get_async_client(self):
@@ -171,8 +163,20 @@ class Client(object):
def max_chunk(self, value):
self.client.max_chunk = value
- def close(self):
+ def disconnect(self):
self.loop.run_until_complete(self.client.close())
- if sys.version_info >= (3, 6):
- self.loop.run_until_complete(self.loop.shutdown_asyncgens())
- self.loop.close()
+
+ def close(self):
+ if self.loop:
+ self.loop.run_until_complete(self.client.close())
+ if sys.version_info >= (3, 6):
+ self.loop.run_until_complete(self.loop.shutdown_asyncgens())
+ self.loop.close()
+ self.loop = None
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ self.close()
+ return False
diff --git a/poky/bitbake/lib/bb/asyncrpc/connection.py b/poky/bitbake/lib/bb/asyncrpc/connection.py
new file mode 100644
index 0000000000..7f0cf6ba96
--- /dev/null
+++ b/poky/bitbake/lib/bb/asyncrpc/connection.py
@@ -0,0 +1,146 @@
+#
+# Copyright BitBake Contributors
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+import asyncio
+import itertools
+import json
+from datetime import datetime
+from .exceptions import ClientError, ConnectionClosedError
+
+
+# The Python async server defaults to a 64K receive buffer, so we hardcode our
+# maximum chunk size. It would be better if the client and server reported to
+# each other what the maximum chunk sizes were, but that will slow down the
+# connection setup with a round trip delay so I'd rather not do that unless it
+# is necessary
+DEFAULT_MAX_CHUNK = 32 * 1024
+
+
+def chunkify(msg, max_chunk):
+ if len(msg) < max_chunk - 1:
+ yield "".join((msg, "\n"))
+ else:
+ yield "".join((json.dumps({"chunk-stream": None}), "\n"))
+
+ args = [iter(msg)] * (max_chunk - 1)
+ for m in map("".join, itertools.zip_longest(*args, fillvalue="")):
+ yield "".join(itertools.chain(m, "\n"))
+ yield "\n"
+
+
+def json_serialize(obj):
+ if isinstance(obj, datetime):
+ return obj.isoformat()
+ raise TypeError("Type %s not serializeable" % type(obj))
+
+
+class StreamConnection(object):
+ def __init__(self, reader, writer, timeout, max_chunk=DEFAULT_MAX_CHUNK):
+ self.reader = reader
+ self.writer = writer
+ self.timeout = timeout
+ self.max_chunk = max_chunk
+
+ @property
+ def address(self):
+ return self.writer.get_extra_info("peername")
+
+ async def send_message(self, msg):
+ for c in chunkify(json.dumps(msg, default=json_serialize), self.max_chunk):
+ self.writer.write(c.encode("utf-8"))
+ await self.writer.drain()
+
+ async def recv_message(self):
+ l = await self.recv()
+
+ m = json.loads(l)
+ if not m:
+ return m
+
+ if "chunk-stream" in m:
+ lines = []
+ while True:
+ l = await self.recv()
+ if not l:
+ break
+ lines.append(l)
+
+ m = json.loads("".join(lines))
+
+ return m
+
+ async def send(self, msg):
+ self.writer.write(("%s\n" % msg).encode("utf-8"))
+ await self.writer.drain()
+
+ async def recv(self):
+ if self.timeout < 0:
+ line = await self.reader.readline()
+ else:
+ try:
+ line = await asyncio.wait_for(self.reader.readline(), self.timeout)
+ except asyncio.TimeoutError:
+ raise ConnectionError("Timed out waiting for data")
+
+ if not line:
+ raise ConnectionClosedError("Connection closed")
+
+ line = line.decode("utf-8")
+
+ if not line.endswith("\n"):
+ raise ConnectionError("Bad message %r" % (line))
+
+ return line.rstrip()
+
+ async def close(self):
+ self.reader = None
+ if self.writer is not None:
+ self.writer.close()
+ self.writer = None
+
+
+class WebsocketConnection(object):
+ def __init__(self, socket, timeout):
+ self.socket = socket
+ self.timeout = timeout
+
+ @property
+ def address(self):
+ return ":".join(str(s) for s in self.socket.remote_address)
+
+ async def send_message(self, msg):
+ await self.send(json.dumps(msg, default=json_serialize))
+
+ async def recv_message(self):
+ m = await self.recv()
+ return json.loads(m)
+
+ async def send(self, msg):
+ import websockets.exceptions
+
+ try:
+ await self.socket.send(msg)
+ except websockets.exceptions.ConnectionClosed:
+ raise ConnectionClosedError("Connection closed")
+
+ async def recv(self):
+ import websockets.exceptions
+
+ try:
+ if self.timeout < 0:
+ return await self.socket.recv()
+
+ try:
+ return await asyncio.wait_for(self.socket.recv(), self.timeout)
+ except asyncio.TimeoutError:
+ raise ConnectionError("Timed out waiting for data")
+ except websockets.exceptions.ConnectionClosed:
+ raise ConnectionClosedError("Connection closed")
+
+ async def close(self):
+ if self.socket is not None:
+ await self.socket.close()
+ self.socket = None
diff --git a/poky/bitbake/lib/bb/asyncrpc/exceptions.py b/poky/bitbake/lib/bb/asyncrpc/exceptions.py
new file mode 100644
index 0000000000..ae1043a38b
--- /dev/null
+++ b/poky/bitbake/lib/bb/asyncrpc/exceptions.py
@@ -0,0 +1,21 @@
+#
+# Copyright BitBake Contributors
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+
+class ClientError(Exception):
+ pass
+
+
+class InvokeError(Exception):
+ pass
+
+
+class ServerError(Exception):
+ pass
+
+
+class ConnectionClosedError(Exception):
+ pass
diff --git a/poky/bitbake/lib/bb/asyncrpc/serv.py b/poky/bitbake/lib/bb/asyncrpc/serv.py
index d2de4891b8..f0be9a6cdb 100644
--- a/poky/bitbake/lib/bb/asyncrpc/serv.py
+++ b/poky/bitbake/lib/bb/asyncrpc/serv.py
@@ -12,241 +12,321 @@ import signal
import socket
import sys
import multiprocessing
-from . import chunkify, DEFAULT_MAX_CHUNK
+import logging
+from .connection import StreamConnection, WebsocketConnection
+from .exceptions import ClientError, ServerError, ConnectionClosedError, InvokeError
-class ClientError(Exception):
- pass
-
-
-class ServerError(Exception):
- pass
+class ClientLoggerAdapter(logging.LoggerAdapter):
+ def process(self, msg, kwargs):
+ return f"[Client {self.extra['address']}] {msg}", kwargs
class AsyncServerConnection(object):
- def __init__(self, reader, writer, proto_name, logger):
- self.reader = reader
- self.writer = writer
+ # If a handler returns this object (e.g. `return self.NO_RESPONSE`), no
+ # return message will be automatically be sent back to the client
+ NO_RESPONSE = object()
+
+ def __init__(self, socket, proto_name, logger):
+ self.socket = socket
self.proto_name = proto_name
- self.max_chunk = DEFAULT_MAX_CHUNK
self.handlers = {
- 'chunk-stream': self.handle_chunk,
- 'ping': self.handle_ping,
+ "ping": self.handle_ping,
}
- self.logger = logger
+ self.logger = ClientLoggerAdapter(
+ logger,
+ {
+ "address": socket.address,
+ },
+ )
+
+ async def close(self):
+ await self.socket.close()
async def process_requests(self):
try:
- self.addr = self.writer.get_extra_info('peername')
- self.logger.debug('Client %r connected' % (self.addr,))
+ self.logger.info("Client %r connected" % (self.socket.address,))
# Read protocol and version
- client_protocol = await self.reader.readline()
+ client_protocol = await self.socket.recv()
if not client_protocol:
return
- (client_proto_name, client_proto_version) = client_protocol.decode('utf-8').rstrip().split()
+ (client_proto_name, client_proto_version) = client_protocol.split()
if client_proto_name != self.proto_name:
- self.logger.debug('Rejecting invalid protocol %s' % (self.proto_name))
+ self.logger.debug("Rejecting invalid protocol %s" % (self.proto_name))
return
- self.proto_version = tuple(int(v) for v in client_proto_version.split('.'))
+ self.proto_version = tuple(int(v) for v in client_proto_version.split("."))
if not self.validate_proto_version():
- self.logger.debug('Rejecting invalid protocol version %s' % (client_proto_version))
+ self.logger.debug(
+ "Rejecting invalid protocol version %s" % (client_proto_version)
+ )
return
# Read headers. Currently, no headers are implemented, so look for
# an empty line to signal the end of the headers
while True:
- line = await self.reader.readline()
- if not line:
- return
-
- line = line.decode('utf-8').rstrip()
- if not line:
+ header = await self.socket.recv()
+ if not header:
break
# Handle messages
while True:
- d = await self.read_message()
+ d = await self.socket.recv_message()
if d is None:
break
- await self.dispatch_message(d)
- await self.writer.drain()
- except ClientError as e:
+ try:
+ response = await self.dispatch_message(d)
+ except InvokeError as e:
+ await self.socket.send_message(
+ {"invoke-error": {"message": str(e)}}
+ )
+ break
+
+ if response is not self.NO_RESPONSE:
+ await self.socket.send_message(response)
+
+ except ConnectionClosedError as e:
+ self.logger.info(str(e))
+ except (ClientError, ConnectionError) as e:
self.logger.error(str(e))
finally:
- self.writer.close()
+ await self.close()
async def dispatch_message(self, msg):
for k in self.handlers.keys():
if k in msg:
- self.logger.debug('Handling %s' % k)
- await self.handlers[k](msg[k])
- return
+ self.logger.debug("Handling %s" % k)
+ return await self.handlers[k](msg[k])
raise ClientError("Unrecognized command %r" % msg)
- def write_message(self, msg):
- for c in chunkify(json.dumps(msg), self.max_chunk):
- self.writer.write(c.encode('utf-8'))
+ async def handle_ping(self, request):
+ return {"alive": True}
- async def read_message(self):
- l = await self.reader.readline()
- if not l:
- return None
- try:
- message = l.decode('utf-8')
+class StreamServer(object):
+ def __init__(self, handler, logger):
+ self.handler = handler
+ self.logger = logger
+ self.closed = False
- if not message.endswith('\n'):
- return None
+ async def handle_stream_client(self, reader, writer):
+ # writer.transport.set_write_buffer_limits(0)
+ socket = StreamConnection(reader, writer, -1)
+ if self.closed:
+ await socket.close()
+ return
+
+ await self.handler(socket)
+
+ async def stop(self):
+ self.closed = True
+
+
+class TCPStreamServer(StreamServer):
+ def __init__(self, host, port, handler, logger):
+ super().__init__(handler, logger)
+ self.host = host
+ self.port = port
+
+ def start(self, loop):
+ self.server = loop.run_until_complete(
+ asyncio.start_server(self.handle_stream_client, self.host, self.port)
+ )
+
+ for s in self.server.sockets:
+ self.logger.debug("Listening on %r" % (s.getsockname(),))
+ # Newer python does this automatically. Do it manually here for
+ # maximum compatibility
+ s.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
+ s.setsockopt(socket.SOL_TCP, socket.TCP_QUICKACK, 1)
+
+ # Enable keep alives. This prevents broken client connections
+ # from persisting on the server for long periods of time.
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
+ s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 30)
+ s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 15)
+ s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 4)
+
+ name = self.server.sockets[0].getsockname()
+ if self.server.sockets[0].family == socket.AF_INET6:
+ self.address = "[%s]:%d" % (name[0], name[1])
+ else:
+ self.address = "%s:%d" % (name[0], name[1])
+
+ return [self.server.wait_closed()]
+
+ async def stop(self):
+ await super().stop()
+ self.server.close()
+
+ def cleanup(self):
+ pass
- return json.loads(message)
- except (json.JSONDecodeError, UnicodeDecodeError) as e:
- self.logger.error('Bad message from client: %r' % message)
- raise e
- async def handle_chunk(self, request):
- lines = []
- try:
- while True:
- l = await self.reader.readline()
- l = l.rstrip(b"\n").decode("utf-8")
- if not l:
- break
- lines.append(l)
+class UnixStreamServer(StreamServer):
+ def __init__(self, path, handler, logger):
+ super().__init__(handler, logger)
+ self.path = path
- msg = json.loads(''.join(lines))
- except (json.JSONDecodeError, UnicodeDecodeError) as e:
- self.logger.error('Bad message from client: %r' % lines)
- raise e
+ def start(self, loop):
+ cwd = os.getcwd()
+ try:
+ # Work around path length limits in AF_UNIX
+ os.chdir(os.path.dirname(self.path))
+ self.server = loop.run_until_complete(
+ asyncio.start_unix_server(
+ self.handle_stream_client, os.path.basename(self.path)
+ )
+ )
+ finally:
+ os.chdir(cwd)
- if 'chunk-stream' in msg:
- raise ClientError("Nested chunks are not allowed")
+ self.logger.debug("Listening on %r" % self.path)
+ self.address = "unix://%s" % os.path.abspath(self.path)
+ return [self.server.wait_closed()]
- await self.dispatch_message(msg)
+ async def stop(self):
+ await super().stop()
+ self.server.close()
- async def handle_ping(self, request):
- response = {'alive': True}
- self.write_message(response)
+ def cleanup(self):
+ os.unlink(self.path)
-class AsyncServer(object):
- def __init__(self, logger):
- self._cleanup_socket = None
+class WebsocketsServer(object):
+ def __init__(self, host, port, handler, logger):
+ self.host = host
+ self.port = port
+ self.handler = handler
self.logger = logger
- self.start = None
- self.address = None
- self.loop = None
- def start_tcp_server(self, host, port):
- def start_tcp():
- self.server = self.loop.run_until_complete(
- asyncio.start_server(self.handle_client, host, port)
+ def start(self, loop):
+ import websockets.server
+
+ self.server = loop.run_until_complete(
+ websockets.server.serve(
+ self.client_handler,
+ self.host,
+ self.port,
+ ping_interval=None,
)
+ )
- for s in self.server.sockets:
- self.logger.debug('Listening on %r' % (s.getsockname(),))
- # Newer python does this automatically. Do it manually here for
- # maximum compatibility
- s.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
- s.setsockopt(socket.SOL_TCP, socket.TCP_QUICKACK, 1)
+ for s in self.server.sockets:
+ self.logger.debug("Listening on %r" % (s.getsockname(),))
- # Enable keep alives. This prevents broken client connections
- # from persisting on the server for long periods of time.
- s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
- s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 30)
- s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 15)
- s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 4)
+ # Enable keep alives. This prevents broken client connections
+ # from persisting on the server for long periods of time.
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
+ s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 30)
+ s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 15)
+ s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 4)
- name = self.server.sockets[0].getsockname()
- if self.server.sockets[0].family == socket.AF_INET6:
- self.address = "[%s]:%d" % (name[0], name[1])
- else:
- self.address = "%s:%d" % (name[0], name[1])
+ name = self.server.sockets[0].getsockname()
+ if self.server.sockets[0].family == socket.AF_INET6:
+ self.address = "ws://[%s]:%d" % (name[0], name[1])
+ else:
+ self.address = "ws://%s:%d" % (name[0], name[1])
- self.start = start_tcp
+ return [self.server.wait_closed()]
- def start_unix_server(self, path):
- def cleanup():
- os.unlink(path)
+ async def stop(self):
+ self.server.close()
- def start_unix():
- cwd = os.getcwd()
- try:
- # Work around path length limits in AF_UNIX
- os.chdir(os.path.dirname(path))
- self.server = self.loop.run_until_complete(
- asyncio.start_unix_server(self.handle_client, os.path.basename(path))
- )
- finally:
- os.chdir(cwd)
+ def cleanup(self):
+ pass
- self.logger.debug('Listening on %r' % path)
+ async def client_handler(self, websocket):
+ socket = WebsocketConnection(websocket, -1)
+ await self.handler(socket)
- self._cleanup_socket = cleanup
- self.address = "unix://%s" % os.path.abspath(path)
- self.start = start_unix
+class AsyncServer(object):
+ def __init__(self, logger):
+ self.logger = logger
+ self.loop = None
+ self.run_tasks = []
- @abc.abstractmethod
- def accept_client(self, reader, writer):
- pass
+ def start_tcp_server(self, host, port):
+ self.server = TCPStreamServer(host, port, self._client_handler, self.logger)
- async def handle_client(self, reader, writer):
- # writer.transport.set_write_buffer_limits(0)
+ def start_unix_server(self, path):
+ self.server = UnixStreamServer(path, self._client_handler, self.logger)
+
+ def start_websocket_server(self, host, port):
+ self.server = WebsocketsServer(host, port, self._client_handler, self.logger)
+
+ async def _client_handler(self, socket):
+ address = socket.address
try:
- client = self.accept_client(reader, writer)
+ client = self.accept_client(socket)
await client.process_requests()
except Exception as e:
import traceback
- self.logger.error('Error from client: %s' % str(e), exc_info=True)
+
+ self.logger.error(
+ "Error from client %s: %s" % (address, str(e)), exc_info=True
+ )
traceback.print_exc()
- writer.close()
- self.logger.debug('Client disconnected')
+ finally:
+ self.logger.debug("Client %s disconnected", address)
+ await socket.close()
- def run_loop_forever(self):
- try:
- self.loop.run_forever()
- except KeyboardInterrupt:
- pass
+ @abc.abstractmethod
+ def accept_client(self, socket):
+ pass
+
+ async def stop(self):
+ self.logger.debug("Stopping server")
+ await self.server.stop()
+
+ def start(self):
+ tasks = self.server.start(self.loop)
+ self.address = self.server.address
+ return tasks
def signal_handler(self):
self.logger.debug("Got exit signal")
- self.loop.stop()
+ self.loop.create_task(self.stop())
- def _serve_forever(self):
+ def _serve_forever(self, tasks):
try:
self.loop.add_signal_handler(signal.SIGTERM, self.signal_handler)
+ self.loop.add_signal_handler(signal.SIGINT, self.signal_handler)
+ self.loop.add_signal_handler(signal.SIGQUIT, self.signal_handler)
signal.pthread_sigmask(signal.SIG_UNBLOCK, [signal.SIGTERM])
- self.run_loop_forever()
- self.server.close()
+ self.loop.run_until_complete(asyncio.gather(*tasks))
- self.loop.run_until_complete(self.server.wait_closed())
- self.logger.debug('Server shutting down')
+ self.logger.debug("Server shutting down")
finally:
- if self._cleanup_socket is not None:
- self._cleanup_socket()
+ self.server.cleanup()
def serve_forever(self):
"""
Serve requests in the current process
"""
+ self._create_loop()
+ tasks = self.start()
+ self._serve_forever(tasks)
+ self.loop.close()
+
+ def _create_loop(self):
# Create loop and override any loop that may have existed in
# a parent process. It is possible that the usecases of
# serve_forever might be constrained enough to allow using
# get_event_loop here, but better safe than sorry for now.
self.loop = asyncio.new_event_loop()
asyncio.set_event_loop(self.loop)
- self.start()
- self._serve_forever()
- def serve_as_process(self, *, prefunc=None, args=()):
+ def serve_as_process(self, *, prefunc=None, args=(), log_level=None):
"""
Serve requests in a child process
"""
+
def run(queue):
# Create loop and override any loop that may have existed
# in a parent process. Without doing this and instead
@@ -259,18 +339,22 @@ class AsyncServer(object):
# more general, though, as any potential use of asyncio in
# Cooker could create a loop that needs to replaced in this
# new process.
- self.loop = asyncio.new_event_loop()
- asyncio.set_event_loop(self.loop)
+ self._create_loop()
try:
- self.start()
+ self.address = None
+ tasks = self.start()
finally:
+ # Always put the server address to wake up the parent task
queue.put(self.address)
queue.close()
if prefunc is not None:
prefunc(self, *args)
- self._serve_forever()
+ if log_level is not None:
+ self.logger.setLevel(log_level)
+
+ self._serve_forever(tasks)
if sys.version_info >= (3, 6):
self.loop.run_until_complete(self.loop.shutdown_asyncgens())
diff --git a/poky/bitbake/lib/bb/cache.py b/poky/bitbake/lib/bb/cache.py
index 5ea41c5de0..18d5574a31 100644
--- a/poky/bitbake/lib/bb/cache.py
+++ b/poky/bitbake/lib/bb/cache.py
@@ -344,9 +344,7 @@ def virtualfn2realfn(virtualfn):
"""
mc = ""
if virtualfn.startswith('mc:') and virtualfn.count(':') >= 2:
- elems = virtualfn.split(':')
- mc = elems[1]
- virtualfn = ":".join(elems[2:])
+ (_, mc, virtualfn) = virtualfn.split(':', 2)
fn = virtualfn
cls = ""
@@ -369,7 +367,7 @@ def realfn2virtual(realfn, cls, mc):
def variant2virtual(realfn, variant):
"""
- Convert a real filename + the associated subclass keyword to a virtual filename
+ Convert a real filename + a variant to a virtual filename
"""
if variant == "":
return realfn
diff --git a/poky/bitbake/lib/bb/codeparser.py b/poky/bitbake/lib/bb/codeparser.py
index eabeda591a..cd39409434 100644
--- a/poky/bitbake/lib/bb/codeparser.py
+++ b/poky/bitbake/lib/bb/codeparser.py
@@ -62,6 +62,7 @@ def check_indent(codestr):
modulecode_deps = {}
def add_module_functions(fn, functions, namespace):
+ import os
fstat = os.stat(fn)
fixedhash = fn + ":" + str(fstat.st_size) + ":" + str(fstat.st_mtime)
for f in functions:
@@ -255,8 +256,8 @@ class PythonParser():
def visit_Call(self, node):
name = self.called_node_name(node.func)
if name and (name.endswith(self.getvars) or name.endswith(self.getvarflags) or name in self.containsfuncs or name in self.containsanyfuncs):
- if isinstance(node.args[0], ast.Str):
- varname = node.args[0].s
+ if isinstance(node.args[0], ast.Constant) and isinstance(node.args[0].value, str):
+ varname = node.args[0].value
if name in self.containsfuncs and isinstance(node.args[1], ast.Str):
if varname not in self.contains:
self.contains[varname] = set()
diff --git a/poky/bitbake/lib/bb/command.py b/poky/bitbake/lib/bb/command.py
index f2ee587161..79b6c0738f 100644
--- a/poky/bitbake/lib/bb/command.py
+++ b/poky/bitbake/lib/bb/command.py
@@ -550,8 +550,8 @@ class CommandsSync:
and return a datastore object representing the environment
for the recipe.
"""
- fn = params[0]
- mc = bb.runqueue.mc_from_tid(fn)
+ virtualfn = params[0]
+ (fn, cls, mc) = bb.cache.virtualfn2realfn(virtualfn)
appends = params[1]
appendlist = params[2]
if len(params) > 3:
@@ -574,10 +574,10 @@ class CommandsSync:
if config_data:
# We have to use a different function here if we're passing in a datastore
# NOTE: we took a copy above, so we don't do it here again
- envdata = command.cooker.databuilder._parse_recipe(config_data, fn, appendfiles, mc, layername)['']
+ envdata = command.cooker.databuilder._parse_recipe(config_data, fn, appendfiles, mc, layername)[cls]
else:
# Use the standard path
- envdata = command.cooker.databuilder.parseRecipe(fn, appendfiles, layername)
+ envdata = command.cooker.databuilder.parseRecipe(virtualfn, appendfiles, layername)
idx = command.remotedatastores.store(envdata)
return DataStoreConnectionHandle(idx)
parseRecipeFile.readonly = True
diff --git a/poky/bitbake/lib/bb/cooker.py b/poky/bitbake/lib/bb/cooker.py
index 599c7ddaa2..d658db9bd8 100644
--- a/poky/bitbake/lib/bb/cooker.py
+++ b/poky/bitbake/lib/bb/cooker.py
@@ -303,6 +303,10 @@ class BBCooker:
self.data_hash = self.databuilder.data_hash
self.extraconfigdata = {}
+ eventlog = self.data.getVar("BB_DEFAULT_EVENTLOG")
+ if not self.configuration.writeeventlog and eventlog:
+ self.setupEventLog(eventlog)
+
if consolelog:
self.data.setVar("BB_CONSOLELOG", consolelog)
@@ -345,7 +349,7 @@ class BBCooker:
sync=False,
upstream=upstream,
)
- self.hashserv.serve_as_process()
+ self.hashserv.serve_as_process(log_level=logging.WARNING)
for mc in self.databuilder.mcdata:
self.databuilder.mcorigdata[mc].setVar("BB_HASHSERVE", self.hashservaddr)
self.databuilder.mcdata[mc].setVar("BB_HASHSERVE", self.hashservaddr)
@@ -409,6 +413,18 @@ class BBCooker:
self._parsecache_set(False)
+ def setupEventLog(self, eventlog):
+ if self.eventlog and self.eventlog[0] != eventlog:
+ bb.event.unregister_UIHhandler(self.eventlog[1])
+ if not self.eventlog or self.eventlog[0] != eventlog:
+ # we log all events to a file if so directed
+ # register the log file writer as UI Handler
+ if not os.path.exists(os.path.dirname(eventlog)):
+ bb.utils.mkdirhier(os.path.dirname(eventlog))
+ writer = EventWriter(self, eventlog)
+ EventLogWriteHandler = namedtuple('EventLogWriteHandler', ['event'])
+ self.eventlog = (eventlog, bb.event.register_UIHhandler(EventLogWriteHandler(writer)))
+
def updateConfigOpts(self, options, environment, cmdline):
self.ui_cmdline = cmdline
clean = True
@@ -428,14 +444,7 @@ class BBCooker:
setattr(self.configuration, o, options[o])
if self.configuration.writeeventlog:
- if self.eventlog and self.eventlog[0] != self.configuration.writeeventlog:
- bb.event.unregister_UIHhandler(self.eventlog[1])
- if not self.eventlog or self.eventlog[0] != self.configuration.writeeventlog:
- # we log all events to a file if so directed
- # register the log file writer as UI Handler
- writer = EventWriter(self, self.configuration.writeeventlog)
- EventLogWriteHandler = namedtuple('EventLogWriteHandler', ['event'])
- self.eventlog = (self.configuration.writeeventlog, bb.event.register_UIHhandler(EventLogWriteHandler(writer)))
+ self.setupEventLog(self.configuration.writeeventlog)
bb.msg.loggerDefaultLogLevel = self.configuration.default_loglevel
bb.msg.loggerDefaultDomains = self.configuration.debug_domains
@@ -1548,7 +1557,13 @@ class BBCooker:
def getAllKeysWithFlags(self, flaglist):
+ def dummy_autorev(d):
+ return
+
dump = {}
+ # Horrible but for now we need to avoid any sideeffects of autorev being called
+ saved = bb.fetch2.get_autorev
+ bb.fetch2.get_autorev = dummy_autorev
for k in self.data.keys():
try:
expand = True
@@ -1568,6 +1583,7 @@ class BBCooker:
dump[k][d] = None
except Exception as e:
print(e)
+ bb.fetch2.get_autorev = saved
return dump
@@ -1787,7 +1803,7 @@ class CookerCollectFiles(object):
for ignored in ('SCCS', 'CVS', '.svn'):
if ignored in dirs:
dirs.remove(ignored)
- found += [os.path.join(dir, f) for f in files if (f.endswith(['.bb', '.bbappend']))]
+ found += [os.path.join(dir, f) for f in files if (f.endswith(('.bb', '.bbappend')))]
return found
diff --git a/poky/bitbake/lib/bb/cookerdata.py b/poky/bitbake/lib/bb/cookerdata.py
index 42b8d64685..0649e40995 100644
--- a/poky/bitbake/lib/bb/cookerdata.py
+++ b/poky/bitbake/lib/bb/cookerdata.py
@@ -503,8 +503,8 @@ class CookerDataBuilder(object):
if appends:
bb_data.setVar('__BBAPPEND', " ".join(appends))
- bb_data = bb.parse.handle(bbfile, bb_data)
- return bb_data
+
+ return bb.parse.handle(bbfile, bb_data)
def parseRecipeVariants(self, bbfile, appends, virtonly=False, mc=None, layername=None):
"""
@@ -516,8 +516,7 @@ class CookerDataBuilder(object):
(bbfile, virtual, mc) = bb.cache.virtualfn2realfn(bbfile)
bb_data = self.mcdata[mc].createCopy()
bb_data.setVar("__ONLYFINALISE", virtual or "default")
- datastores = self._parse_recipe(bb_data, bbfile, appends, mc, layername)
- return datastores
+ return self._parse_recipe(bb_data, bbfile, appends, mc, layername)
if mc is not None:
bb_data = self.mcdata[mc].createCopy()
@@ -543,5 +542,5 @@ class CookerDataBuilder(object):
"""
logger.debug("Parsing %s (full)" % virtualfn)
(fn, virtual, mc) = bb.cache.virtualfn2realfn(virtualfn)
- bb_data = self.parseRecipeVariants(virtualfn, appends, virtonly=True, layername=layername)
- return bb_data[virtual]
+ datastores = self.parseRecipeVariants(virtualfn, appends, virtonly=True, layername=layername)
+ return datastores[virtual]
diff --git a/poky/bitbake/lib/bb/fetch2/__init__.py b/poky/bitbake/lib/bb/fetch2/__init__.py
index ffb1a92b26..22a2f80107 100644
--- a/poky/bitbake/lib/bb/fetch2/__init__.py
+++ b/poky/bitbake/lib/bb/fetch2/__init__.py
@@ -872,6 +872,8 @@ FETCH_EXPORT_VARS = ['HOME', 'PATH',
'AWS_PROFILE',
'AWS_ACCESS_KEY_ID',
'AWS_SECRET_ACCESS_KEY',
+ 'AWS_ROLE_ARN',
+ 'AWS_WEB_IDENTITY_TOKEN_FILE',
'AWS_DEFAULT_REGION',
'GIT_CACHE_PATH',
'REMOTE_CONTAINERS_IPC',
@@ -1579,6 +1581,7 @@ class FetchMethod(object):
unpackdir = rootdir
if not unpack or not cmd:
+ urldata.unpack_tracer.unpack("file-copy", unpackdir)
# If file == dest, then avoid any copies, as we already put the file into dest!
dest = os.path.join(unpackdir, os.path.basename(file))
if file != dest and not (os.path.exists(dest) and os.path.samefile(file, dest)):
@@ -1593,6 +1596,8 @@ class FetchMethod(object):
destdir = urlpath.rsplit("/", 1)[0] + '/'
bb.utils.mkdirhier("%s/%s" % (unpackdir, destdir))
cmd = 'cp -fpPRH "%s" "%s"' % (file, destdir)
+ else:
+ urldata.unpack_tracer.unpack("archive-extract", unpackdir)
if not cmd:
return
@@ -1684,6 +1689,55 @@ class FetchMethod(object):
"""
return []
+
+class DummyUnpackTracer(object):
+ """
+ Abstract API definition for a class that traces unpacked source files back
+ to their respective upstream SRC_URI entries, for software composition
+ analysis, license compliance and detailed SBOM generation purposes.
+ User may load their own unpack tracer class (instead of the dummy
+ one) by setting the BB_UNPACK_TRACER_CLASS config parameter.
+ """
+ def start(self, unpackdir, urldata_dict, d):
+ """
+ Start tracing the core Fetch.unpack process, using an index to map
+ unpacked files to each SRC_URI entry.
+ This method is called by Fetch.unpack and it may receive nested calls by
+ gitsm and npmsw fetchers, that expand SRC_URI entries by adding implicit
+ URLs and by recursively calling Fetch.unpack from new (nested) Fetch
+ instances.
+ """
+ return
+ def start_url(self, url):
+ """Start tracing url unpack process.
+ This method is called by Fetch.unpack before the fetcher-specific unpack
+ method starts, and it may receive nested calls by gitsm and npmsw
+ fetchers.
+ """
+ return
+ def unpack(self, unpack_type, destdir):
+ """
+ Set unpack_type and destdir for current url.
+ This method is called by the fetcher-specific unpack method after url
+ tracing started.
+ """
+ return
+ def finish_url(self, url):
+ """Finish tracing url unpack process and update the file index.
+ This method is called by Fetch.unpack after the fetcher-specific unpack
+ method finished its job, and it may receive nested calls by gitsm
+ and npmsw fetchers.
+ """
+ return
+ def complete(self):
+ """
+ Finish tracing the Fetch.unpack process, and check if all nested
+ Fecth.unpack calls (if any) have been completed; if so, save collected
+ metadata.
+ """
+ return
+
+
class Fetch(object):
def __init__(self, urls, d, cache = True, localonly = False, connection_cache = None):
if localonly and cache:
@@ -1704,10 +1758,30 @@ class Fetch(object):
if key in urldata_cache:
self.ud = urldata_cache[key]
+ # the unpack_tracer object needs to be made available to possible nested
+ # Fetch instances (when those are created by gitsm and npmsw fetchers)
+ # so we set it as a global variable
+ global unpack_tracer
+ try:
+ unpack_tracer
+ except NameError:
+ class_path = d.getVar("BB_UNPACK_TRACER_CLASS")
+ if class_path:
+ # use user-defined unpack tracer class
+ import importlib
+ module_name, _, class_name = class_path.rpartition(".")
+ module = importlib.import_module(module_name)
+ class_ = getattr(module, class_name)
+ unpack_tracer = class_()
+ else:
+ # fall back to the dummy/abstract class
+ unpack_tracer = DummyUnpackTracer()
+
for url in urls:
if url not in self.ud:
try:
self.ud[url] = FetchData(url, d, localonly)
+ self.ud[url].unpack_tracer = unpack_tracer
except NonLocalMethod:
if localonly:
self.ud[url] = None
@@ -1883,6 +1957,8 @@ class Fetch(object):
if not urls:
urls = self.urls
+ unpack_tracer.start(root, self.ud, self.d)
+
for u in urls:
ud = self.ud[u]
ud.setup_localpath(self.d)
@@ -1890,11 +1966,15 @@ class Fetch(object):
if ud.lockfile:
lf = bb.utils.lockfile(ud.lockfile)
+ unpack_tracer.start_url(u)
ud.method.unpack(ud, root, self.d)
+ unpack_tracer.finish_url(u)
if ud.lockfile:
bb.utils.unlockfile(lf)
+ unpack_tracer.complete()
+
def clean(self, urls=None):
"""
Clean files that the fetcher gets or places
diff --git a/poky/bitbake/lib/bb/fetch2/crate.py b/poky/bitbake/lib/bb/fetch2/crate.py
index 3310ed0050..01d49435c3 100644
--- a/poky/bitbake/lib/bb/fetch2/crate.py
+++ b/poky/bitbake/lib/bb/fetch2/crate.py
@@ -101,8 +101,10 @@ class Crate(Wget):
bp = d.getVar('BP')
if bp == ud.parm.get('name'):
cmd = "tar -xz --no-same-owner -f %s" % thefile
+ ud.unpack_tracer.unpack("crate-extract", rootdir)
else:
cargo_bitbake = self._cargo_bitbake_path(rootdir)
+ ud.unpack_tracer.unpack("cargo-extract", cargo_bitbake)
cmd = "tar -xz --no-same-owner -f %s -C %s" % (thefile, cargo_bitbake)
diff --git a/poky/bitbake/lib/bb/fetch2/git.py b/poky/bitbake/lib/bb/fetch2/git.py
index 4385d0b37a..0deeb5cee1 100644
--- a/poky/bitbake/lib/bb/fetch2/git.py
+++ b/poky/bitbake/lib/bb/fetch2/git.py
@@ -48,10 +48,23 @@ Supported SRC_URI options are:
instead of branch.
The default is "0", set nobranch=1 if needed.
+- subpath
+ Limit the checkout to a specific subpath of the tree.
+ By default, checkout the whole tree, set subpath=<path> if needed
+
+- destsuffix
+ The name of the path in which to place the checkout.
+ By default, the path is git/, set destsuffix=<suffix> if needed
+
- usehead
For local git:// urls to use the current branch HEAD as the revision for use with
AUTOREV. Implies nobranch.
+- lfs
+ Enable the checkout to use LFS for large files. This will download all LFS files
+ in the download step, as the unpack step does not have network access.
+ The default is "1", set lfs=0 to skip.
+
"""
# Copyright (C) 2005 Richard Purdie
@@ -462,8 +475,8 @@ class Git(FetchMethod):
# Only do this if the unpack resulted in a .git/lfs directory being
# created; this only happens if at least one blob needed to be
# downloaded.
- if os.path.exists(os.path.join(tmpdir, "git", ".git", "lfs")):
- runfetchcmd("tar -cf - lfs | tar -xf - -C %s" % ud.clonedir, d, workdir="%s/git/.git" % tmpdir)
+ if os.path.exists(os.path.join(ud.destdir, ".git", "lfs")):
+ runfetchcmd("tar -cf - lfs | tar -xf - -C %s" % ud.clonedir, d, workdir="%s/.git" % ud.destdir)
def build_mirror_data(self, ud, d):
@@ -589,6 +602,8 @@ class Git(FetchMethod):
destdir = ud.destdir = os.path.join(destdir, destsuffix)
if os.path.exists(destdir):
bb.utils.prunedir(destdir)
+ if not ud.bareclone:
+ ud.unpack_tracer.unpack("git", destdir)
need_lfs = self._need_lfs(ud)
@@ -627,6 +642,8 @@ class Git(FetchMethod):
raise bb.fetch2.FetchError("Repository %s has LFS content, install git-lfs on host to download (or set lfs=0 to ignore it)" % (repourl))
elif not need_lfs:
bb.note("Repository %s has LFS content but it is not being fetched" % (repourl))
+ else:
+ runfetchcmd("%s lfs install" % ud.basecmd, d, workdir=destdir)
if not ud.nocheckout:
if subpath:
@@ -686,8 +703,11 @@ class Git(FetchMethod):
Check if the repository has 'lfs' (large file) content
"""
- # The bare clonedir doesn't use the remote names; it has the branch immediately.
- if wd == ud.clonedir:
+ if ud.nobranch:
+ # If no branch is specified, use the current git commit
+ refname = self._build_revision(ud, d, ud.names[0])
+ elif wd == ud.clonedir:
+ # The bare clonedir doesn't use the remote names; it has the branch immediately.
refname = ud.branches[ud.names[0]]
else:
refname = "origin/%s" % ud.branches[ud.names[0]]
diff --git a/poky/bitbake/lib/bb/fetch2/gitsm.py b/poky/bitbake/lib/bb/fetch2/gitsm.py
index a87361ccf3..f7f3af7212 100644
--- a/poky/bitbake/lib/bb/fetch2/gitsm.py
+++ b/poky/bitbake/lib/bb/fetch2/gitsm.py
@@ -218,6 +218,10 @@ class GitSM(Git):
try:
newfetch = Fetch([url], d, cache=False)
+ # modpath is needed by unpack tracer to calculate submodule
+ # checkout dir
+ new_ud = newfetch.ud[url]
+ new_ud.modpath = modpath
newfetch.unpack(root=os.path.dirname(os.path.join(repo_conf, 'modules', module)))
except Exception as e:
logger.error('gitsm: submodule unpack failed: %s %s' % (type(e).__name__, str(e)))
diff --git a/poky/bitbake/lib/bb/fetch2/hg.py b/poky/bitbake/lib/bb/fetch2/hg.py
index 063e13008a..cbff8c490c 100644
--- a/poky/bitbake/lib/bb/fetch2/hg.py
+++ b/poky/bitbake/lib/bb/fetch2/hg.py
@@ -242,6 +242,7 @@ class Hg(FetchMethod):
revflag = "-r %s" % ud.revision
subdir = ud.parm.get("destsuffix", ud.module)
codir = "%s/%s" % (destdir, subdir)
+ ud.unpack_tracer.unpack("hg", codir)
scmdata = ud.parm.get("scmdata", "")
if scmdata != "nokeep":
diff --git a/poky/bitbake/lib/bb/fetch2/npm.py b/poky/bitbake/lib/bb/fetch2/npm.py
index f83485ad85..15f3f19bc8 100644
--- a/poky/bitbake/lib/bb/fetch2/npm.py
+++ b/poky/bitbake/lib/bb/fetch2/npm.py
@@ -298,6 +298,7 @@ class Npm(FetchMethod):
destsuffix = ud.parm.get("destsuffix", "npm")
destdir = os.path.join(rootdir, destsuffix)
npm_unpack(ud.localpath, destdir, d)
+ ud.unpack_tracer.unpack("npm", destdir)
def clean(self, ud, d):
"""Clean any existing full or partial download"""
diff --git a/poky/bitbake/lib/bb/fetch2/npmsw.py b/poky/bitbake/lib/bb/fetch2/npmsw.py
index 4ff2c8ffc3..ff5f8dc755 100644
--- a/poky/bitbake/lib/bb/fetch2/npmsw.py
+++ b/poky/bitbake/lib/bb/fetch2/npmsw.py
@@ -191,7 +191,9 @@ class NpmShrinkWrap(FetchMethod):
else:
raise ParameterError("Unsupported dependency: %s" % name, ud.url)
+ # name is needed by unpack tracer for module mapping
ud.deps.append({
+ "name": name,
"url": url,
"localpath": localpath,
"extrapaths": extrapaths,
@@ -270,6 +272,7 @@ class NpmShrinkWrap(FetchMethod):
destsuffix = ud.parm.get("destsuffix")
if destsuffix:
destdir = os.path.join(rootdir, destsuffix)
+ ud.unpack_tracer.unpack("npm-shrinkwrap", destdir)
bb.utils.mkdirhier(destdir)
bb.utils.copyfile(ud.shrinkwrap_file,
diff --git a/poky/bitbake/lib/bb/runqueue.py b/poky/bitbake/lib/bb/runqueue.py
index 56147c50a8..02d7ff9768 100644
--- a/poky/bitbake/lib/bb/runqueue.py
+++ b/poky/bitbake/lib/bb/runqueue.py
@@ -157,7 +157,7 @@ class RunQueueScheduler(object):
(mc, fn, taskname, taskfn) = split_tid_mcfn(tid)
self.stamps[tid] = bb.parse.siggen.stampfile_mcfn(taskname, taskfn, extrainfo=False)
if tid in self.rq.runq_buildable:
- self.buildable.append(tid)
+ self.buildable.add(tid)
self.rev_prio_map = None
self.is_pressure_usable()
@@ -1021,6 +1021,7 @@ class RunQueueData:
for tid in list(runall_tids):
mark_active(tid, 1)
+ self.target_tids.append(tid)
if self.cooker.configuration.force:
invalidate_task(tid, False)
@@ -1318,6 +1319,16 @@ class RunQueue:
self.worker = {}
self.fakeworker = {}
+ @staticmethod
+ def send_pickled_data(worker, data, name):
+ msg = bytearray()
+ msg.extend(b"<" + name.encode() + b">")
+ pickled_data = pickle.dumps(data)
+ msg.extend(len(pickled_data).to_bytes(4, 'big'))
+ msg.extend(pickled_data)
+ msg.extend(b"</" + name.encode() + b">")
+ worker.stdin.write(msg)
+
def _start_worker(self, mc, fakeroot = False, rqexec = None):
logger.debug("Starting bitbake-worker")
magic = "decafbad"
@@ -1355,9 +1366,9 @@ class RunQueue:
"umask" : self.cfgData.getVar("BB_DEFAULT_UMASK"),
}
- worker.stdin.write(b"<cookerconfig>" + pickle.dumps(self.cooker.configuration) + b"</cookerconfig>")
- worker.stdin.write(b"<extraconfigdata>" + pickle.dumps(self.cooker.extraconfigdata) + b"</extraconfigdata>")
- worker.stdin.write(b"<workerdata>" + pickle.dumps(workerdata) + b"</workerdata>")
+ RunQueue.send_pickled_data(worker, self.cooker.configuration, "cookerconfig")
+ RunQueue.send_pickled_data(worker, self.cooker.extraconfigdata, "extraconfigdata")
+ RunQueue.send_pickled_data(worker, workerdata, "workerdata")
worker.stdin.flush()
return RunQueueWorker(worker, workerpipe)
@@ -1367,7 +1378,7 @@ class RunQueue:
return
logger.debug("Teardown for bitbake-worker")
try:
- worker.process.stdin.write(b"<quit></quit>")
+ RunQueue.send_pickled_data(worker.process, b"", "quit")
worker.process.stdin.flush()
worker.process.stdin.close()
except IOError:
@@ -1756,20 +1767,20 @@ class RunQueue:
for tid in invalidtasks:
(mc, fn, taskname, taskfn) = split_tid_mcfn(tid)
pn = self.rqdata.dataCaches[mc].pkg_fn[taskfn]
- h = self.rqdata.runtaskentries[tid].hash
+ h = self.rqdata.runtaskentries[tid].unihash
matches = bb.siggen.find_siginfo(pn, taskname, [], self.cooker.databuilder.mcdata[mc])
match = None
for m in matches:
if h in m:
match = m
if match is None:
- bb.fatal("Can't find a task we're supposed to have written out? (hash: %s)?" % h)
+ bb.fatal("Can't find a task we're supposed to have written out? (hash: %s tid: %s)?" % (h, tid))
matches = {k : v for k, v in iter(matches.items()) if h not in k}
if matches:
latestmatch = sorted(matches.keys(), key=lambda f: matches[f])[-1]
prevh = __find_sha256__.search(latestmatch).group(0)
output = bb.siggen.compare_sigfiles(latestmatch, match, recursecb)
- bb.plain("\nTask %s:%s couldn't be used from the cache because:\n We need hash %s, closest matching task was %s\n " % (pn, taskname, h, prevh) + '\n '.join(output))
+ bb.plain("\nTask %s:%s couldn't be used from the cache because:\n We need hash %s, most recent matching task was %s\n " % (pn, taskname, h, prevh) + '\n '.join(output))
class RunQueueExecute:
@@ -1851,11 +1862,6 @@ class RunQueueExecute:
self.tasks_notcovered = set()
self.scenequeue_notneeded = set()
- # We can't skip specified target tasks which aren't setscene tasks
- self.cantskip = set(self.rqdata.target_tids)
- self.cantskip.difference_update(self.rqdata.runq_setscene_tids)
- self.cantskip.intersection_update(self.rqdata.runtaskentries)
-
schedulers = self.get_schedulers()
for scheduler in schedulers:
if self.scheduler == scheduler.name:
@@ -1868,7 +1874,23 @@ class RunQueueExecute:
#if self.rqdata.runq_setscene_tids:
self.sqdata = SQData()
- build_scenequeue_data(self.sqdata, self.rqdata, self.rq, self.cooker, self.stampcache, self)
+ build_scenequeue_data(self.sqdata, self.rqdata, self)
+
+ update_scenequeue_data(self.sqdata.sq_revdeps, self.sqdata, self.rqdata, self.rq, self.cooker, self.stampcache, self, summary=True)
+
+ # Compute a list of 'stale' sstate tasks where the current hash does not match the one
+ # in any stamp files. Pass the list out to metadata as an event.
+ found = {}
+ for tid in self.rqdata.runq_setscene_tids:
+ (mc, fn, taskname, taskfn) = split_tid_mcfn(tid)
+ stamps = bb.build.find_stale_stamps(taskname, taskfn)
+ if stamps:
+ if mc not in found:
+ found[mc] = {}
+ found[mc][tid] = stamps
+ for mc in found:
+ event = bb.event.StaleSetSceneTasks(found[mc])
+ bb.event.fire(event, self.cooker.databuilder.mcdata[mc])
def runqueue_process_waitpid(self, task, status, fakerootlog=None):
@@ -1894,14 +1916,14 @@ class RunQueueExecute:
def finish_now(self):
for mc in self.rq.worker:
try:
- self.rq.worker[mc].process.stdin.write(b"<finishnow></finishnow>")
+ RunQueue.send_pickled_data(self.rq.worker[mc].process, b"", "finishnow")
self.rq.worker[mc].process.stdin.flush()
except IOError:
# worker must have died?
pass
for mc in self.rq.fakeworker:
try:
- self.rq.fakeworker[mc].process.stdin.write(b"<finishnow></finishnow>")
+ RunQueue.send_pickled_data(self.rq.fakeworker[mc].process, b"", "finishnow")
self.rq.fakeworker[mc].process.stdin.flush()
except IOError:
# worker must have died?
@@ -2196,10 +2218,10 @@ class RunQueueExecute:
if 'fakeroot' in taskdep and taskname in taskdep['fakeroot'] and not self.cooker.configuration.dry_run:
if not mc in self.rq.fakeworker:
self.rq.start_fakeworker(self, mc)
- self.rq.fakeworker[mc].process.stdin.write(b"<runtask>" + pickle.dumps(runtask) + b"</runtask>")
+ RunQueue.send_pickled_data(self.rq.fakeworker[mc].process, runtask, "runtask")
self.rq.fakeworker[mc].process.stdin.flush()
else:
- self.rq.worker[mc].process.stdin.write(b"<runtask>" + pickle.dumps(runtask) + b"</runtask>")
+ RunQueue.send_pickled_data(self.rq.worker[mc].process, runtask, "runtask")
self.rq.worker[mc].process.stdin.flush()
self.build_stamps[task] = bb.parse.siggen.stampfile_mcfn(taskname, taskfn, extrainfo=False)
@@ -2297,10 +2319,10 @@ class RunQueueExecute:
self.rq.state = runQueueFailed
self.stats.taskFailed()
return True
- self.rq.fakeworker[mc].process.stdin.write(b"<runtask>" + pickle.dumps(runtask) + b"</runtask>")
+ RunQueue.send_pickled_data(self.rq.fakeworker[mc].process, runtask, "runtask")
self.rq.fakeworker[mc].process.stdin.flush()
else:
- self.rq.worker[mc].process.stdin.write(b"<runtask>" + pickle.dumps(runtask) + b"</runtask>")
+ RunQueue.send_pickled_data(self.rq.worker[mc].process, runtask, "runtask")
self.rq.worker[mc].process.stdin.flush()
self.build_stamps[task] = bb.parse.siggen.stampfile_mcfn(taskname, taskfn, extrainfo=False)
@@ -2388,7 +2410,7 @@ class RunQueueExecute:
return
notcovered = set(self.scenequeue_notcovered)
- notcovered |= self.cantskip
+ notcovered |= self.sqdata.cantskip
for tid in self.scenequeue_notcovered:
notcovered |= self.sqdata.sq_covered_tasks[tid]
notcovered |= self.sqdata.unskippable.difference(self.rqdata.runq_setscene_tids)
@@ -2502,9 +2524,9 @@ class RunQueueExecute:
if changed:
for mc in self.rq.worker:
- self.rq.worker[mc].process.stdin.write(b"<newtaskhashes>" + pickle.dumps(bb.parse.siggen.get_taskhashes()) + b"</newtaskhashes>")
+ RunQueue.send_pickled_data(self.rq.worker[mc].process, bb.parse.siggen.get_taskhashes(), "newtaskhashes")
for mc in self.rq.fakeworker:
- self.rq.fakeworker[mc].process.stdin.write(b"<newtaskhashes>" + pickle.dumps(bb.parse.siggen.get_taskhashes()) + b"</newtaskhashes>")
+ RunQueue.send_pickled_data(self.rq.fakeworker[mc].process, bb.parse.siggen.get_taskhashes(), "newtaskhashes")
hashequiv_logger.debug(pprint.pformat("Tasks changed:\n%s" % (changed)))
@@ -2767,12 +2789,17 @@ class SQData(object):
# A list of normal tasks a setscene task covers
self.sq_covered_tasks = {}
-def build_scenequeue_data(sqdata, rqdata, rq, cooker, stampcache, sqrq):
+def build_scenequeue_data(sqdata, rqdata, sqrq):
sq_revdeps = {}
sq_revdeps_squash = {}
sq_collated_deps = {}
+ # We can't skip specified target tasks which aren't setscene tasks
+ sqdata.cantskip = set(rqdata.target_tids)
+ sqdata.cantskip.difference_update(rqdata.runq_setscene_tids)
+ sqdata.cantskip.intersection_update(rqdata.runtaskentries)
+
# We need to construct a dependency graph for the setscene functions. Intermediate
# dependencies between the setscene tasks only complicate the code. This code
# therefore aims to collapse the huge runqueue dependency tree into a smaller one
@@ -2841,7 +2868,7 @@ def build_scenequeue_data(sqdata, rqdata, rq, cooker, stampcache, sqrq):
for tid in rqdata.runtaskentries:
if not rqdata.runtaskentries[tid].revdeps:
sqdata.unskippable.add(tid)
- sqdata.unskippable |= sqrq.cantskip
+ sqdata.unskippable |= sqdata.cantskip
while new:
new = False
orig = sqdata.unskippable.copy()
@@ -2951,22 +2978,6 @@ def build_scenequeue_data(sqdata, rqdata, rq, cooker, stampcache, sqrq):
sqrq.sq_deferred[tid] = sqdata.hashes[h]
bb.debug(1, "Deferring %s after %s" % (tid, sqdata.hashes[h]))
- update_scenequeue_data(sqdata.sq_revdeps, sqdata, rqdata, rq, cooker, stampcache, sqrq, summary=True)
-
- # Compute a list of 'stale' sstate tasks where the current hash does not match the one
- # in any stamp files. Pass the list out to metadata as an event.
- found = {}
- for tid in rqdata.runq_setscene_tids:
- (mc, fn, taskname, taskfn) = split_tid_mcfn(tid)
- stamps = bb.build.find_stale_stamps(taskname, taskfn)
- if stamps:
- if mc not in found:
- found[mc] = {}
- found[mc][tid] = stamps
- for mc in found:
- event = bb.event.StaleSetSceneTasks(found[mc])
- bb.event.fire(event, cooker.databuilder.mcdata[mc])
-
def check_setscene_stamps(tid, rqdata, rq, stampcache, noexecstamp=False):
(mc, fn, taskname, taskfn) = split_tid_mcfn(tid)
diff --git a/poky/bitbake/lib/bb/tests/fetch.py b/poky/bitbake/lib/bb/tests/fetch.py
index eeb7a31471..c7a23407c1 100644
--- a/poky/bitbake/lib/bb/tests/fetch.py
+++ b/poky/bitbake/lib/bb/tests/fetch.py
@@ -2277,7 +2277,7 @@ class GitLfsTest(FetcherTest):
@skipIfNoGitLFS()
@skipIfNoNetwork()
- def test_real_git_lfs_repo_succeeds(self):
+ def test_real_git_lfs_repo_skips(self):
self.d.setVar('SRC_URI', "git://gitlab.com/gitlab-examples/lfs.git;protocol=https;branch=master;lfs=0")
f = self.get_real_git_lfs_file()
# This is the actual non-smudged placeholder file on the repo if git-lfs does not run
@@ -2290,24 +2290,41 @@ class GitLfsTest(FetcherTest):
with open(f) as fh:
self.assertEqual(lfs_file, fh.read())
+ @skipIfNoGitLFS()
def test_lfs_enabled(self):
import shutil
uri = 'git://%s;protocol=file;lfs=1;branch=master' % self.srcdir
self.d.setVar('SRC_URI', uri)
- # Careful: suppress initial attempt at downloading until
- # we know whether git-lfs is installed.
- fetcher, ud = self.fetch(uri=None, download=False)
- self.assertIsNotNone(ud.method._find_git_lfs)
+ # With git-lfs installed, test that we can fetch and unpack
+ fetcher, ud = self.fetch()
+ shutil.rmtree(self.gitdir, ignore_errors=True)
+ fetcher.unpack(self.d.getVar('WORKDIR'))
- # If git-lfs can be found, the unpack should be successful. Only
- # attempt this with the real live copy of git-lfs installed.
- if ud.method._find_git_lfs(self.d):
- fetcher.download()
- shutil.rmtree(self.gitdir, ignore_errors=True)
- fetcher.unpack(self.d.getVar('WORKDIR'))
+ @skipIfNoGitLFS()
+ def test_lfs_disabled(self):
+ import shutil
+
+ uri = 'git://%s;protocol=file;lfs=0;branch=master' % self.srcdir
+ self.d.setVar('SRC_URI', uri)
+ # Verify that the fetcher can survive even if the source
+ # repository has Git LFS usage configured.
+ fetcher, ud = self.fetch()
+ fetcher.unpack(self.d.getVar('WORKDIR'))
+
+ def test_lfs_enabled_not_installed(self):
+ import shutil
+
+ uri = 'git://%s;protocol=file;lfs=1;branch=master' % self.srcdir
+ self.d.setVar('SRC_URI', uri)
+
+ # Careful: suppress initial attempt at downloading
+ fetcher, ud = self.fetch(uri=None, download=False)
+
+ # Artificially assert that git-lfs is not installed, so
+ # we can verify a failure to unpack in it's absence.
old_find_git_lfs = ud.method._find_git_lfs
try:
# If git-lfs cannot be found, the unpack should throw an error
@@ -2319,29 +2336,21 @@ class GitLfsTest(FetcherTest):
finally:
ud.method._find_git_lfs = old_find_git_lfs
- def test_lfs_disabled(self):
+ def test_lfs_disabled_not_installed(self):
import shutil
uri = 'git://%s;protocol=file;lfs=0;branch=master' % self.srcdir
self.d.setVar('SRC_URI', uri)
- # In contrast to test_lfs_enabled(), allow the implicit download
- # done by self.fetch() to occur here. The point of this test case
- # is to verify that the fetcher can survive even if the source
- # repository has Git LFS usage configured.
- fetcher, ud = self.fetch()
- self.assertIsNotNone(ud.method._find_git_lfs)
+ # Careful: suppress initial attempt at downloading
+ fetcher, ud = self.fetch(uri=None, download=False)
+ # Artificially assert that git-lfs is not installed, so
+ # we can verify a failure to unpack in it's absence.
old_find_git_lfs = ud.method._find_git_lfs
try:
- # If git-lfs can be found, the unpack should be successful. A
- # live copy of git-lfs is not required for this case, so
- # unconditionally forge its presence.
- ud.method._find_git_lfs = lambda d: True
- shutil.rmtree(self.gitdir, ignore_errors=True)
- fetcher.unpack(self.d.getVar('WORKDIR'))
- # If git-lfs cannot be found, the unpack should be successful
-
+ # Even if git-lfs cannot be found, the unpack should be successful
+ fetcher.download()
ud.method._find_git_lfs = lambda d: False
shutil.rmtree(self.gitdir, ignore_errors=True)
fetcher.unpack(self.d.getVar('WORKDIR'))
@@ -3042,9 +3051,11 @@ class FetchPremirroronlyLocalTest(FetcherTest):
self.d.setVar("BB_FETCH_PREMIRRORONLY", "1")
self.d.setVar("BB_NO_NETWORK", "1")
self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n")
+ self.mirrorname = "git2_git.fake.repo.bitbake.tar.gz"
+ self.mirrorfile = os.path.join(self.mirrordir, self.mirrorname)
+ self.testfilename = "bitbake-fetch.test"
def make_git_repo(self):
- self.mirrorname = "git2_git.fake.repo.bitbake.tar.gz"
recipeurl = "git:/git.fake.repo/bitbake"
os.makedirs(self.gitdir)
self.git_init(cwd=self.gitdir)
@@ -3054,15 +3065,23 @@ class FetchPremirroronlyLocalTest(FetcherTest):
def git_new_commit(self):
import random
- testfilename = "bibake-fetch.test"
os.unlink(os.path.join(self.mirrordir, self.mirrorname))
- with open(os.path.join(self.gitdir, testfilename), "w") as testfile:
- testfile.write("Useless random data {}".format(random.random()))
- self.git("add {}".format(testfilename), self.gitdir)
- self.git("commit -a -m \"This random commit {}. I'm useless.\"".format(random.random()), self.gitdir)
+ branch = self.git("branch --show-current", self.gitdir).split()
+ with open(os.path.join(self.gitdir, self.testfilename), "w") as testfile:
+ testfile.write("File {} from branch {}; Useless random data {}".format(self.testfilename, branch, random.random()))
+ self.git("add {}".format(self.testfilename), self.gitdir)
+ self.git("commit -a -m \"This random commit {} in branch {}. I'm useless.\"".format(random.random(), branch), self.gitdir)
bb.process.run('tar -czvf {} .'.format(os.path.join(self.mirrordir, self.mirrorname)), cwd = self.gitdir)
return self.git("rev-parse HEAD", self.gitdir).strip()
+ def git_new_branch(self, name):
+ self.git_new_commit()
+ head = self.git("rev-parse HEAD", self.gitdir).strip()
+ self.git("checkout -b {}".format(name), self.gitdir)
+ newrev = self.git_new_commit()
+ self.git("checkout {}".format(head), self.gitdir)
+ return newrev
+
def test_mirror_commit_nonexistent(self):
self.make_git_repo()
self.d.setVar("SRCREV", "0"*40)
@@ -3083,6 +3102,59 @@ class FetchPremirroronlyLocalTest(FetcherTest):
with self.assertRaises(bb.fetch2.NetworkAccess):
fetcher.download()
+ def test_mirror_tarball_multiple_branches(self):
+ """
+ test if PREMIRRORS can handle multiple name/branches correctly
+ both branches have required revisions
+ """
+ self.make_git_repo()
+ branch1rev = self.git_new_branch("testbranch1")
+ branch2rev = self.git_new_branch("testbranch2")
+ self.recipe_url = "git://git.fake.repo/bitbake;branch=testbranch1,testbranch2;protocol=https;name=branch1,branch2"
+ self.d.setVar("SRCREV_branch1", branch1rev)
+ self.d.setVar("SRCREV_branch2", branch2rev)
+ fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
+ self.assertTrue(os.path.exists(self.mirrorfile), "Mirror file doesn't exist")
+ fetcher.download()
+ fetcher.unpack(os.path.join(self.tempdir, "unpacked"))
+ unpacked = os.path.join(self.tempdir, "unpacked", "git", self.testfilename)
+ self.assertTrue(os.path.exists(unpacked), "Repo has not been unpackaged properly!")
+ with open(unpacked, 'r') as f:
+ content = f.read()
+ ## We expect to see testbranch1 in the file, not master, not testbranch2
+ self.assertTrue(content.find("testbranch1") != -1, "Wrong branch has been checked out!")
+
+ def test_mirror_tarball_multiple_branches_nobranch(self):
+ """
+ test if PREMIRRORS can handle multiple name/branches correctly
+ Unbalanced name/branches raises ParameterError
+ """
+ self.make_git_repo()
+ branch1rev = self.git_new_branch("testbranch1")
+ branch2rev = self.git_new_branch("testbranch2")
+ self.recipe_url = "git://git.fake.repo/bitbake;branch=testbranch1;protocol=https;name=branch1,branch2"
+ self.d.setVar("SRCREV_branch1", branch1rev)
+ self.d.setVar("SRCREV_branch2", branch2rev)
+ with self.assertRaises(bb.fetch2.ParameterError):
+ fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
+
+ def test_mirror_tarball_multiple_branches_norev(self):
+ """
+ test if PREMIRRORS can handle multiple name/branches correctly
+ one of the branches specifies non existing SRCREV
+ """
+ self.make_git_repo()
+ branch1rev = self.git_new_branch("testbranch1")
+ branch2rev = self.git_new_branch("testbranch2")
+ self.recipe_url = "git://git.fake.repo/bitbake;branch=testbranch1,testbranch2;protocol=https;name=branch1,branch2"
+ self.d.setVar("SRCREV_branch1", branch1rev)
+ self.d.setVar("SRCREV_branch2", "0"*40)
+ fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
+ self.assertTrue(os.path.exists(self.mirrorfile), "Mirror file doesn't exist")
+ with self.assertRaises(bb.fetch2.NetworkAccess):
+ fetcher.download()
+
+
class FetchPremirroronlyNetworkTest(FetcherTest):
def setUp(self):
diff --git a/poky/bitbake/lib/bb/utils.py b/poky/bitbake/lib/bb/utils.py
index b401fa5ec7..61ffad92ce 100644
--- a/poky/bitbake/lib/bb/utils.py
+++ b/poky/bitbake/lib/bb/utils.py
@@ -50,7 +50,7 @@ def clean_context():
def get_context():
return _context
-
+
def set_context(ctx):
_context = ctx
@@ -212,8 +212,8 @@ def explode_dep_versions2(s, *, sort=True):
inversion = True
# This list is based on behavior and supported comparisons from deb, opkg and rpm.
#
- # Even though =<, <<, ==, !=, =>, and >> may not be supported,
- # we list each possibly valid item.
+ # Even though =<, <<, ==, !=, =>, and >> may not be supported,
+ # we list each possibly valid item.
# The build system is responsible for validation of what it supports.
if i.startswith(('<=', '=<', '<<', '==', '!=', '>=', '=>', '>>')):
lastcmp = i[0:2]
@@ -347,7 +347,7 @@ def _print_exception(t, value, tb, realfile, text, context):
exception = traceback.format_exception_only(t, value)
error.append('Error executing a python function in %s:\n' % realfile)
- # Strip 'us' from the stack (better_exec call) unless that was where the
+ # Strip 'us' from the stack (better_exec call) unless that was where the
# error came from
if tb.tb_next is not None:
tb = tb.tb_next
@@ -746,9 +746,9 @@ def prunedir(topdir, ionice=False):
# but thats possibly insane and suffixes is probably going to be small
#
def prune_suffix(var, suffixes, d):
- """
+ """
See if var ends with any of the suffixes listed and
- remove it if found
+ remove it if found
"""
for suffix in suffixes:
if suffix and var.endswith(suffix):
@@ -1001,9 +1001,9 @@ def umask(new_mask):
os.umask(current_mask)
def to_boolean(string, default=None):
- """
+ """
Check input string and return boolean value True/False/None
- depending upon the checks
+ depending upon the checks
"""
if not string:
return default
diff --git a/poky/bitbake/lib/codegen.py b/poky/bitbake/lib/codegen.py
index 6955a7ada5..018b283177 100644
--- a/poky/bitbake/lib/codegen.py
+++ b/poky/bitbake/lib/codegen.py
@@ -392,19 +392,7 @@ class SourceGenerator(NodeVisitor):
def visit_Name(self, node):
self.write(node.id)
- def visit_Str(self, node):
- self.write(repr(node.s))
-
- def visit_Bytes(self, node):
- self.write(repr(node.s))
-
- def visit_Num(self, node):
- self.write(repr(node.n))
-
def visit_Constant(self, node):
- # Python 3.8 deprecated visit_Num(), visit_Str(), visit_Bytes(),
- # visit_NameConstant() and visit_Ellipsis(). They can be removed once we
- # require 3.8+.
self.write(repr(node.value))
def visit_Tuple(self, node):
diff --git a/poky/bitbake/lib/hashserv/__init__.py b/poky/bitbake/lib/hashserv/__init__.py
index 9cb3fd57a5..552a33278f 100644
--- a/poky/bitbake/lib/hashserv/__init__.py
+++ b/poky/bitbake/lib/hashserv/__init__.py
@@ -6,150 +6,126 @@
import asyncio
from contextlib import closing
import re
-import sqlite3
import itertools
import json
+from collections import namedtuple
+from urllib.parse import urlparse
UNIX_PREFIX = "unix://"
+WS_PREFIX = "ws://"
+WSS_PREFIX = "wss://"
ADDR_TYPE_UNIX = 0
ADDR_TYPE_TCP = 1
+ADDR_TYPE_WS = 2
-# The Python async server defaults to a 64K receive buffer, so we hardcode our
-# maximum chunk size. It would be better if the client and server reported to
-# each other what the maximum chunk sizes were, but that will slow down the
-# connection setup with a round trip delay so I'd rather not do that unless it
-# is necessary
-DEFAULT_MAX_CHUNK = 32 * 1024
-
-UNIHASH_TABLE_DEFINITION = (
- ("method", "TEXT NOT NULL", "UNIQUE"),
- ("taskhash", "TEXT NOT NULL", "UNIQUE"),
- ("unihash", "TEXT NOT NULL", ""),
-)
-
-UNIHASH_TABLE_COLUMNS = tuple(name for name, _, _ in UNIHASH_TABLE_DEFINITION)
-
-OUTHASH_TABLE_DEFINITION = (
- ("method", "TEXT NOT NULL", "UNIQUE"),
- ("taskhash", "TEXT NOT NULL", "UNIQUE"),
- ("outhash", "TEXT NOT NULL", "UNIQUE"),
- ("created", "DATETIME", ""),
-
- # Optional fields
- ("owner", "TEXT", ""),
- ("PN", "TEXT", ""),
- ("PV", "TEXT", ""),
- ("PR", "TEXT", ""),
- ("task", "TEXT", ""),
- ("outhash_siginfo", "TEXT", ""),
-)
-
-OUTHASH_TABLE_COLUMNS = tuple(name for name, _, _ in OUTHASH_TABLE_DEFINITION)
-
-def _make_table(cursor, name, definition):
- cursor.execute('''
- CREATE TABLE IF NOT EXISTS {name} (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- {fields}
- UNIQUE({unique})
- )
- '''.format(
- name=name,
- fields=" ".join("%s %s," % (name, typ) for name, typ, _ in definition),
- unique=", ".join(name for name, _, flags in definition if "UNIQUE" in flags)
- ))
-
-
-def setup_database(database, sync=True):
- db = sqlite3.connect(database)
- db.row_factory = sqlite3.Row
-
- with closing(db.cursor()) as cursor:
- _make_table(cursor, "unihashes_v2", UNIHASH_TABLE_DEFINITION)
- _make_table(cursor, "outhashes_v2", OUTHASH_TABLE_DEFINITION)
-
- cursor.execute('PRAGMA journal_mode = WAL')
- cursor.execute('PRAGMA synchronous = %s' % ('NORMAL' if sync else 'OFF'))
-
- # Drop old indexes
- cursor.execute('DROP INDEX IF EXISTS taskhash_lookup')
- cursor.execute('DROP INDEX IF EXISTS outhash_lookup')
- cursor.execute('DROP INDEX IF EXISTS taskhash_lookup_v2')
- cursor.execute('DROP INDEX IF EXISTS outhash_lookup_v2')
-
- # TODO: Upgrade from tasks_v2?
- cursor.execute('DROP TABLE IF EXISTS tasks_v2')
-
- # Create new indexes
- cursor.execute('CREATE INDEX IF NOT EXISTS taskhash_lookup_v3 ON unihashes_v2 (method, taskhash)')
- cursor.execute('CREATE INDEX IF NOT EXISTS outhash_lookup_v3 ON outhashes_v2 (method, outhash)')
-
- return db
+User = namedtuple("User", ("username", "permissions"))
def parse_address(addr):
if addr.startswith(UNIX_PREFIX):
- return (ADDR_TYPE_UNIX, (addr[len(UNIX_PREFIX):],))
+ return (ADDR_TYPE_UNIX, (addr[len(UNIX_PREFIX) :],))
+ elif addr.startswith(WS_PREFIX) or addr.startswith(WSS_PREFIX):
+ return (ADDR_TYPE_WS, (addr,))
else:
- m = re.match(r'\[(?P<host>[^\]]*)\]:(?P<port>\d+)$', addr)
+ m = re.match(r"\[(?P<host>[^\]]*)\]:(?P<port>\d+)$", addr)
if m is not None:
- host = m.group('host')
- port = m.group('port')
+ host = m.group("host")
+ port = m.group("port")
else:
- host, port = addr.split(':')
+ host, port = addr.split(":")
return (ADDR_TYPE_TCP, (host, int(port)))
-def chunkify(msg, max_chunk):
- if len(msg) < max_chunk - 1:
- yield ''.join((msg, "\n"))
- else:
- yield ''.join((json.dumps({
- 'chunk-stream': None
- }), "\n"))
+def create_server(
+ addr,
+ dbname,
+ *,
+ sync=True,
+ upstream=None,
+ read_only=False,
+ db_username=None,
+ db_password=None,
+ anon_perms=None,
+ admin_username=None,
+ admin_password=None,
+):
+ def sqlite_engine():
+ from .sqlite import DatabaseEngine
+
+ return DatabaseEngine(dbname, sync)
- args = [iter(msg)] * (max_chunk - 1)
- for m in map(''.join, itertools.zip_longest(*args, fillvalue='')):
- yield ''.join(itertools.chain(m, "\n"))
- yield "\n"
+ def sqlalchemy_engine():
+ from .sqlalchemy import DatabaseEngine
+ return DatabaseEngine(dbname, db_username, db_password)
-def create_server(addr, dbname, *, sync=True, upstream=None, read_only=False):
from . import server
- db = setup_database(dbname, sync=sync)
- s = server.Server(db, upstream=upstream, read_only=read_only)
+
+ if "://" in dbname:
+ db_engine = sqlalchemy_engine()
+ else:
+ db_engine = sqlite_engine()
+
+ if anon_perms is None:
+ anon_perms = server.DEFAULT_ANON_PERMS
+
+ s = server.Server(
+ db_engine,
+ upstream=upstream,
+ read_only=read_only,
+ anon_perms=anon_perms,
+ admin_username=admin_username,
+ admin_password=admin_password,
+ )
(typ, a) = parse_address(addr)
if typ == ADDR_TYPE_UNIX:
s.start_unix_server(*a)
+ elif typ == ADDR_TYPE_WS:
+ url = urlparse(a[0])
+ s.start_websocket_server(url.hostname, url.port)
else:
s.start_tcp_server(*a)
return s
-def create_client(addr):
+def create_client(addr, username=None, password=None):
from . import client
- c = client.Client()
- (typ, a) = parse_address(addr)
- if typ == ADDR_TYPE_UNIX:
- c.connect_unix(*a)
- else:
- c.connect_tcp(*a)
+ c = client.Client(username, password)
+
+ try:
+ (typ, a) = parse_address(addr)
+ if typ == ADDR_TYPE_UNIX:
+ c.connect_unix(*a)
+ elif typ == ADDR_TYPE_WS:
+ c.connect_websocket(*a)
+ else:
+ c.connect_tcp(*a)
+ return c
+ except Exception as e:
+ c.close()
+ raise e
- return c
-async def create_async_client(addr):
+async def create_async_client(addr, username=None, password=None):
from . import client
- c = client.AsyncClient()
- (typ, a) = parse_address(addr)
- if typ == ADDR_TYPE_UNIX:
- await c.connect_unix(*a)
- else:
- await c.connect_tcp(*a)
+ c = client.AsyncClient(username, password)
+
+ try:
+ (typ, a) = parse_address(addr)
+ if typ == ADDR_TYPE_UNIX:
+ await c.connect_unix(*a)
+ elif typ == ADDR_TYPE_WS:
+ await c.connect_websocket(*a)
+ else:
+ await c.connect_tcp(*a)
- return c
+ return c
+ except Exception as e:
+ await c.close()
+ raise e
diff --git a/poky/bitbake/lib/hashserv/client.py b/poky/bitbake/lib/hashserv/client.py
index f676d267fa..35a97687fb 100644
--- a/poky/bitbake/lib/hashserv/client.py
+++ b/poky/bitbake/lib/hashserv/client.py
@@ -6,6 +6,7 @@
import logging
import socket
import bb.asyncrpc
+import json
from . import create_async_client
@@ -16,36 +17,47 @@ class AsyncClient(bb.asyncrpc.AsyncClient):
MODE_NORMAL = 0
MODE_GET_STREAM = 1
- def __init__(self):
- super().__init__('OEHASHEQUIV', '1.1', logger)
+ def __init__(self, username=None, password=None):
+ super().__init__("OEHASHEQUIV", "1.1", logger)
self.mode = self.MODE_NORMAL
+ self.username = username
+ self.password = password
+ self.saved_become_user = None
async def setup_connection(self):
await super().setup_connection()
cur_mode = self.mode
self.mode = self.MODE_NORMAL
await self._set_mode(cur_mode)
+ if self.username:
+ # Save off become user temporarily because auth() resets it
+ become = self.saved_become_user
+ await self.auth(self.username, self.password)
+
+ if become:
+ await self.become_user(become)
async def send_stream(self, msg):
async def proc():
- self.writer.write(("%s\n" % msg).encode("utf-8"))
- await self.writer.drain()
- l = await self.reader.readline()
- if not l:
- raise ConnectionError("Connection closed")
- return l.decode("utf-8").rstrip()
+ await self.socket.send(msg)
+ return await self.socket.recv()
return await self._send_wrapper(proc)
async def _set_mode(self, new_mode):
+ async def stream_to_normal():
+ await self.socket.send("END")
+ return await self.socket.recv()
+
if new_mode == self.MODE_NORMAL and self.mode == self.MODE_GET_STREAM:
- r = await self.send_stream("END")
+ r = await self._send_wrapper(stream_to_normal)
if r != "ok":
- raise ConnectionError("Bad response from server %r" % r)
+ self.check_invoke_error(r)
+ raise ConnectionError("Unable to transition to normal mode: Bad response from server %r" % r)
elif new_mode == self.MODE_GET_STREAM and self.mode == self.MODE_NORMAL:
- r = await self.send_message({"get-stream": None})
+ r = await self.invoke({"get-stream": None})
if r != "ok":
- raise ConnectionError("Bad response from server %r" % r)
+ raise ConnectionError("Unable to transition to stream mode: Bad response from server %r" % r)
elif new_mode != self.mode:
raise Exception(
"Undefined mode transition %r -> %r" % (self.mode, new_mode)
@@ -67,7 +79,7 @@ class AsyncClient(bb.asyncrpc.AsyncClient):
m["method"] = method
m["outhash"] = outhash
m["unihash"] = unihash
- return await self.send_message({"report": m})
+ return await self.invoke({"report": m})
async def report_unihash_equiv(self, taskhash, method, unihash, extra={}):
await self._set_mode(self.MODE_NORMAL)
@@ -75,46 +87,123 @@ class AsyncClient(bb.asyncrpc.AsyncClient):
m["taskhash"] = taskhash
m["method"] = method
m["unihash"] = unihash
- return await self.send_message({"report-equiv": m})
+ return await self.invoke({"report-equiv": m})
async def get_taskhash(self, method, taskhash, all_properties=False):
await self._set_mode(self.MODE_NORMAL)
- return await self.send_message(
+ return await self.invoke(
{"get": {"taskhash": taskhash, "method": method, "all": all_properties}}
)
async def get_outhash(self, method, outhash, taskhash, with_unihash=True):
await self._set_mode(self.MODE_NORMAL)
- return await self.send_message(
- {"get-outhash": {"outhash": outhash, "taskhash": taskhash, "method": method, "with_unihash": with_unihash}}
+ return await self.invoke(
+ {
+ "get-outhash": {
+ "outhash": outhash,
+ "taskhash": taskhash,
+ "method": method,
+ "with_unihash": with_unihash,
+ }
+ }
)
async def get_stats(self):
await self._set_mode(self.MODE_NORMAL)
- return await self.send_message({"get-stats": None})
+ return await self.invoke({"get-stats": None})
async def reset_stats(self):
await self._set_mode(self.MODE_NORMAL)
- return await self.send_message({"reset-stats": None})
+ return await self.invoke({"reset-stats": None})
async def backfill_wait(self):
await self._set_mode(self.MODE_NORMAL)
- return (await self.send_message({"backfill-wait": None}))["tasks"]
+ return (await self.invoke({"backfill-wait": None}))["tasks"]
async def remove(self, where):
await self._set_mode(self.MODE_NORMAL)
- return await self.send_message({"remove": {"where": where}})
+ return await self.invoke({"remove": {"where": where}})
async def clean_unused(self, max_age):
await self._set_mode(self.MODE_NORMAL)
- return await self.send_message({"clean-unused": {"max_age_seconds": max_age}})
+ return await self.invoke({"clean-unused": {"max_age_seconds": max_age}})
+
+ async def auth(self, username, token):
+ await self._set_mode(self.MODE_NORMAL)
+ result = await self.invoke({"auth": {"username": username, "token": token}})
+ self.username = username
+ self.password = token
+ self.saved_become_user = None
+ return result
+
+ async def refresh_token(self, username=None):
+ await self._set_mode(self.MODE_NORMAL)
+ m = {}
+ if username:
+ m["username"] = username
+ result = await self.invoke({"refresh-token": m})
+ if (
+ self.username
+ and not self.saved_become_user
+ and result["username"] == self.username
+ ):
+ self.password = result["token"]
+ return result
+
+ async def set_user_perms(self, username, permissions):
+ await self._set_mode(self.MODE_NORMAL)
+ return await self.invoke(
+ {"set-user-perms": {"username": username, "permissions": permissions}}
+ )
+
+ async def get_user(self, username=None):
+ await self._set_mode(self.MODE_NORMAL)
+ m = {}
+ if username:
+ m["username"] = username
+ return await self.invoke({"get-user": m})
+
+ async def get_all_users(self):
+ await self._set_mode(self.MODE_NORMAL)
+ return (await self.invoke({"get-all-users": {}}))["users"]
+
+ async def new_user(self, username, permissions):
+ await self._set_mode(self.MODE_NORMAL)
+ return await self.invoke(
+ {"new-user": {"username": username, "permissions": permissions}}
+ )
+
+ async def delete_user(self, username):
+ await self._set_mode(self.MODE_NORMAL)
+ return await self.invoke({"delete-user": {"username": username}})
+
+ async def become_user(self, username):
+ await self._set_mode(self.MODE_NORMAL)
+ result = await self.invoke({"become-user": {"username": username}})
+ if username == self.username:
+ self.saved_become_user = None
+ else:
+ self.saved_become_user = username
+ return result
+
+ async def get_db_usage(self):
+ await self._set_mode(self.MODE_NORMAL)
+ return (await self.invoke({"get-db-usage": {}}))["usage"]
+
+ async def get_db_query_columns(self):
+ await self._set_mode(self.MODE_NORMAL)
+ return (await self.invoke({"get-db-query-columns": {}}))["columns"]
class Client(bb.asyncrpc.Client):
- def __init__(self):
+ def __init__(self, username=None, password=None):
+ self.username = username
+ self.password = password
+
super().__init__()
self._add_methods(
"connect_tcp",
+ "connect_websocket",
"get_unihash",
"report_unihash",
"report_unihash_equiv",
@@ -125,7 +214,17 @@ class Client(bb.asyncrpc.Client):
"backfill_wait",
"remove",
"clean_unused",
+ "auth",
+ "refresh_token",
+ "set_user_perms",
+ "get_user",
+ "get_all_users",
+ "new_user",
+ "delete_user",
+ "become_user",
+ "get_db_usage",
+ "get_db_query_columns",
)
def _get_async_client(self):
- return AsyncClient()
+ return AsyncClient(self.username, self.password)
diff --git a/poky/bitbake/lib/hashserv/server.py b/poky/bitbake/lib/hashserv/server.py
index 45bf476bfe..a86507830e 100644
--- a/poky/bitbake/lib/hashserv/server.py
+++ b/poky/bitbake/lib/hashserv/server.py
@@ -3,18 +3,51 @@
# SPDX-License-Identifier: GPL-2.0-only
#
-from contextlib import closing, contextmanager
from datetime import datetime, timedelta
-import enum
import asyncio
import logging
import math
import time
-from . import create_async_client, UNIHASH_TABLE_COLUMNS, OUTHASH_TABLE_COLUMNS
+import os
+import base64
+import hashlib
+from . import create_async_client
import bb.asyncrpc
+logger = logging.getLogger("hashserv.server")
-logger = logging.getLogger('hashserv.server')
+
+# This permission only exists to match nothing
+NONE_PERM = "@none"
+
+READ_PERM = "@read"
+REPORT_PERM = "@report"
+DB_ADMIN_PERM = "@db-admin"
+USER_ADMIN_PERM = "@user-admin"
+ALL_PERM = "@all"
+
+ALL_PERMISSIONS = {
+ READ_PERM,
+ REPORT_PERM,
+ DB_ADMIN_PERM,
+ USER_ADMIN_PERM,
+ ALL_PERM,
+}
+
+DEFAULT_ANON_PERMS = (
+ READ_PERM,
+ REPORT_PERM,
+ DB_ADMIN_PERM,
+)
+
+TOKEN_ALGORITHM = "sha256"
+
+# 48 bytes of random data will result in 64 characters when base64
+# encoded. This number also ensures that the base64 encoding won't have any
+# trailing '=' characters.
+TOKEN_SIZE = 48
+
+SALT_SIZE = 8
class Measurement(object):
@@ -104,244 +137,267 @@ class Stats(object):
return math.sqrt(self.s / (self.num - 1))
def todict(self):
- return {k: getattr(self, k) for k in ('num', 'total_time', 'max_time', 'average', 'stdev')}
-
-
-@enum.unique
-class Resolve(enum.Enum):
- FAIL = enum.auto()
- IGNORE = enum.auto()
- REPLACE = enum.auto()
-
-
-def insert_table(cursor, table, data, on_conflict):
- resolve = {
- Resolve.FAIL: "",
- Resolve.IGNORE: " OR IGNORE",
- Resolve.REPLACE: " OR REPLACE",
- }[on_conflict]
-
- keys = sorted(data.keys())
- query = 'INSERT{resolve} INTO {table} ({fields}) VALUES({values})'.format(
- resolve=resolve,
- table=table,
- fields=", ".join(keys),
- values=", ".join(":" + k for k in keys),
- )
- prevrowid = cursor.lastrowid
- cursor.execute(query, data)
- logging.debug(
- "Inserting %r into %s, %s",
- data,
- table,
- on_conflict
- )
- return (cursor.lastrowid, cursor.lastrowid != prevrowid)
-
-def insert_unihash(cursor, data, on_conflict):
- return insert_table(cursor, "unihashes_v2", data, on_conflict)
-
-def insert_outhash(cursor, data, on_conflict):
- return insert_table(cursor, "outhashes_v2", data, on_conflict)
-
-async def copy_unihash_from_upstream(client, db, method, taskhash):
- d = await client.get_taskhash(method, taskhash)
- if d is not None:
- with closing(db.cursor()) as cursor:
- insert_unihash(
- cursor,
- {k: v for k, v in d.items() if k in UNIHASH_TABLE_COLUMNS},
- Resolve.IGNORE,
- )
- db.commit()
- return d
+ return {
+ k: getattr(self, k)
+ for k in ("num", "total_time", "max_time", "average", "stdev")
+ }
-class ServerCursor(object):
- def __init__(self, db, cursor, upstream):
- self.db = db
- self.cursor = cursor
- self.upstream = upstream
+token_refresh_semaphore = asyncio.Lock()
+
+
+async def new_token():
+ # Prevent malicious users from using this API to deduce the entropy
+ # pool on the server and thus be able to guess a token. *All* token
+ # refresh requests lock the same global semaphore and then sleep for a
+ # short time. The effectively rate limits the total number of requests
+ # than can be made across all clients to 10/second, which should be enough
+ # since you have to be an authenticated users to make the request in the
+ # first place
+ async with token_refresh_semaphore:
+ await asyncio.sleep(0.1)
+ raw = os.getrandom(TOKEN_SIZE, os.GRND_NONBLOCK)
+
+ return base64.b64encode(raw, b"._").decode("utf-8")
+
+
+def new_salt():
+ return os.getrandom(SALT_SIZE, os.GRND_NONBLOCK).hex()
+
+
+def hash_token(algo, salt, token):
+ h = hashlib.new(algo)
+ h.update(salt.encode("utf-8"))
+ h.update(token.encode("utf-8"))
+ return ":".join([algo, salt, h.hexdigest()])
+
+
+def permissions(*permissions, allow_anon=True, allow_self_service=False):
+ """
+ Function decorator that can be used to decorate an RPC function call and
+ check that the current users permissions match the require permissions.
+
+ If allow_anon is True, the user will also be allowed to make the RPC call
+ if the anonymous user permissions match the permissions.
+
+ If allow_self_service is True, and the "username" property in the request
+ is the currently logged in user, or not specified, the user will also be
+ allowed to make the request. This allows users to access normal privileged
+ API, as long as they are only modifying their own user properties (e.g.
+ users can be allowed to reset their own token without @user-admin
+ permissions, but not the token for any other user.
+ """
+
+ def wrapper(func):
+ async def wrap(self, request):
+ if allow_self_service and self.user is not None:
+ username = request.get("username", self.user.username)
+ if username == self.user.username:
+ request["username"] = self.user.username
+ return await func(self, request)
+
+ if not self.user_has_permissions(*permissions, allow_anon=allow_anon):
+ if not self.user:
+ username = "Anonymous user"
+ user_perms = self.anon_perms
+ else:
+ username = self.user.username
+ user_perms = self.user.permissions
+
+ self.logger.info(
+ "User %s with permissions %r denied from calling %s. Missing permissions(s) %r",
+ username,
+ ", ".join(user_perms),
+ func.__name__,
+ ", ".join(permissions),
+ )
+ raise bb.asyncrpc.InvokeError(
+ f"{username} is not allowed to access permissions(s) {', '.join(permissions)}"
+ )
+
+ return await func(self, request)
+
+ return wrap
+
+ return wrapper
class ServerClient(bb.asyncrpc.AsyncServerConnection):
- def __init__(self, reader, writer, db, request_stats, backfill_queue, upstream, read_only):
- super().__init__(reader, writer, 'OEHASHEQUIV', logger)
- self.db = db
+ def __init__(
+ self,
+ socket,
+ db_engine,
+ request_stats,
+ backfill_queue,
+ upstream,
+ read_only,
+ anon_perms,
+ ):
+ super().__init__(socket, "OEHASHEQUIV", logger)
+ self.db_engine = db_engine
self.request_stats = request_stats
self.max_chunk = bb.asyncrpc.DEFAULT_MAX_CHUNK
self.backfill_queue = backfill_queue
self.upstream = upstream
+ self.read_only = read_only
+ self.user = None
+ self.anon_perms = anon_perms
- self.handlers.update({
- 'get': self.handle_get,
- 'get-outhash': self.handle_get_outhash,
- 'get-stream': self.handle_get_stream,
- 'get-stats': self.handle_get_stats,
- })
+ self.handlers.update(
+ {
+ "get": self.handle_get,
+ "get-outhash": self.handle_get_outhash,
+ "get-stream": self.handle_get_stream,
+ "get-stats": self.handle_get_stats,
+ "get-db-usage": self.handle_get_db_usage,
+ "get-db-query-columns": self.handle_get_db_query_columns,
+ # Not always read-only, but internally checks if the server is
+ # read-only
+ "report": self.handle_report,
+ "auth": self.handle_auth,
+ "get-user": self.handle_get_user,
+ "get-all-users": self.handle_get_all_users,
+ "become-user": self.handle_become_user,
+ }
+ )
if not read_only:
- self.handlers.update({
- 'report': self.handle_report,
- 'report-equiv': self.handle_equivreport,
- 'reset-stats': self.handle_reset_stats,
- 'backfill-wait': self.handle_backfill_wait,
- 'remove': self.handle_remove,
- 'clean-unused': self.handle_clean_unused,
- })
+ self.handlers.update(
+ {
+ "report-equiv": self.handle_equivreport,
+ "reset-stats": self.handle_reset_stats,
+ "backfill-wait": self.handle_backfill_wait,
+ "remove": self.handle_remove,
+ "clean-unused": self.handle_clean_unused,
+ "refresh-token": self.handle_refresh_token,
+ "set-user-perms": self.handle_set_perms,
+ "new-user": self.handle_new_user,
+ "delete-user": self.handle_delete_user,
+ }
+ )
+
+ def raise_no_user_error(self, username):
+ raise bb.asyncrpc.InvokeError(f"No user named '{username}' exists")
+
+ def user_has_permissions(self, *permissions, allow_anon=True):
+ permissions = set(permissions)
+ if allow_anon:
+ if ALL_PERM in self.anon_perms:
+ return True
+
+ if not permissions - self.anon_perms:
+ return True
+
+ if self.user is None:
+ return False
+
+ if ALL_PERM in self.user.permissions:
+ return True
+
+ if not permissions - self.user.permissions:
+ return True
+
+ return False
def validate_proto_version(self):
- return (self.proto_version > (1, 0) and self.proto_version <= (1, 1))
+ return self.proto_version > (1, 0) and self.proto_version <= (1, 1)
async def process_requests(self):
- if self.upstream is not None:
- self.upstream_client = await create_async_client(self.upstream)
- else:
- self.upstream_client = None
-
- await super().process_requests()
+ async with self.db_engine.connect(self.logger) as db:
+ self.db = db
+ if self.upstream is not None:
+ self.upstream_client = await create_async_client(self.upstream)
+ else:
+ self.upstream_client = None
- if self.upstream_client is not None:
- await self.upstream_client.close()
+ try:
+ await super().process_requests()
+ finally:
+ if self.upstream_client is not None:
+ await self.upstream_client.close()
async def dispatch_message(self, msg):
for k in self.handlers.keys():
if k in msg:
- logger.debug('Handling %s' % k)
- if 'stream' in k:
- await self.handlers[k](msg[k])
+ self.logger.debug("Handling %s" % k)
+ if "stream" in k:
+ return await self.handlers[k](msg[k])
else:
- with self.request_stats.start_sample() as self.request_sample, \
- self.request_sample.measure():
- await self.handlers[k](msg[k])
- return
+ with self.request_stats.start_sample() as self.request_sample, self.request_sample.measure():
+ return await self.handlers[k](msg[k])
raise bb.asyncrpc.ClientError("Unrecognized command %r" % msg)
+ @permissions(READ_PERM)
async def handle_get(self, request):
- method = request['method']
- taskhash = request['taskhash']
- fetch_all = request.get('all', False)
-
- with closing(self.db.cursor()) as cursor:
- d = await self.get_unihash(cursor, method, taskhash, fetch_all)
+ method = request["method"]
+ taskhash = request["taskhash"]
+ fetch_all = request.get("all", False)
- self.write_message(d)
+ return await self.get_unihash(method, taskhash, fetch_all)
- async def get_unihash(self, cursor, method, taskhash, fetch_all=False):
+ async def get_unihash(self, method, taskhash, fetch_all=False):
d = None
if fetch_all:
- cursor.execute(
- '''
- SELECT *, unihashes_v2.unihash AS unihash FROM outhashes_v2
- INNER JOIN unihashes_v2 ON unihashes_v2.method=outhashes_v2.method AND unihashes_v2.taskhash=outhashes_v2.taskhash
- WHERE outhashes_v2.method=:method AND outhashes_v2.taskhash=:taskhash
- ORDER BY outhashes_v2.created ASC
- LIMIT 1
- ''',
- {
- 'method': method,
- 'taskhash': taskhash,
- }
-
- )
- row = cursor.fetchone()
-
+ row = await self.db.get_unihash_by_taskhash_full(method, taskhash)
if row is not None:
d = {k: row[k] for k in row.keys()}
elif self.upstream_client is not None:
d = await self.upstream_client.get_taskhash(method, taskhash, True)
- self.update_unified(cursor, d)
- self.db.commit()
+ await self.update_unified(d)
else:
- row = self.query_equivalent(cursor, method, taskhash)
+ row = await self.db.get_equivalent(method, taskhash)
if row is not None:
d = {k: row[k] for k in row.keys()}
elif self.upstream_client is not None:
d = await self.upstream_client.get_taskhash(method, taskhash)
- d = {k: v for k, v in d.items() if k in UNIHASH_TABLE_COLUMNS}
- insert_unihash(cursor, d, Resolve.IGNORE)
- self.db.commit()
+ await self.db.insert_unihash(d["method"], d["taskhash"], d["unihash"])
return d
+ @permissions(READ_PERM)
async def handle_get_outhash(self, request):
- method = request['method']
- outhash = request['outhash']
- taskhash = request['taskhash']
+ method = request["method"]
+ outhash = request["outhash"]
+ taskhash = request["taskhash"]
with_unihash = request.get("with_unihash", True)
- with closing(self.db.cursor()) as cursor:
- d = await self.get_outhash(cursor, method, outhash, taskhash, with_unihash)
+ return await self.get_outhash(method, outhash, taskhash, with_unihash)
- self.write_message(d)
-
- async def get_outhash(self, cursor, method, outhash, taskhash, with_unihash=True):
+ async def get_outhash(self, method, outhash, taskhash, with_unihash=True):
d = None
if with_unihash:
- cursor.execute(
- '''
- SELECT *, unihashes_v2.unihash AS unihash FROM outhashes_v2
- INNER JOIN unihashes_v2 ON unihashes_v2.method=outhashes_v2.method AND unihashes_v2.taskhash=outhashes_v2.taskhash
- WHERE outhashes_v2.method=:method AND outhashes_v2.outhash=:outhash
- ORDER BY outhashes_v2.created ASC
- LIMIT 1
- ''',
- {
- 'method': method,
- 'outhash': outhash,
- }
- )
+ row = await self.db.get_unihash_by_outhash(method, outhash)
else:
- cursor.execute(
- """
- SELECT * FROM outhashes_v2
- WHERE outhashes_v2.method=:method AND outhashes_v2.outhash=:outhash
- ORDER BY outhashes_v2.created ASC
- LIMIT 1
- """,
- {
- 'method': method,
- 'outhash': outhash,
- }
- )
- row = cursor.fetchone()
+ row = await self.db.get_outhash(method, outhash)
if row is not None:
d = {k: row[k] for k in row.keys()}
elif self.upstream_client is not None:
d = await self.upstream_client.get_outhash(method, outhash, taskhash)
- self.update_unified(cursor, d)
- self.db.commit()
+ await self.update_unified(d)
return d
- def update_unified(self, cursor, data):
+ async def update_unified(self, data):
if data is None:
return
- insert_unihash(
- cursor,
- {k: v for k, v in data.items() if k in UNIHASH_TABLE_COLUMNS},
- Resolve.IGNORE
- )
- insert_outhash(
- cursor,
- {k: v for k, v in data.items() if k in OUTHASH_TABLE_COLUMNS},
- Resolve.IGNORE
- )
+ await self.db.insert_unihash(data["method"], data["taskhash"], data["unihash"])
+ await self.db.insert_outhash(data)
+ @permissions(READ_PERM)
async def handle_get_stream(self, request):
- self.write_message('ok')
+ await self.socket.send_message("ok")
while True:
upstream = None
- l = await self.reader.readline()
+ l = await self.socket.recv()
if not l:
- return
+ break
try:
# This inner loop is very sensitive and must be as fast as
@@ -352,272 +408,438 @@ class ServerClient(bb.asyncrpc.AsyncServerConnection):
request_measure = self.request_sample.measure()
request_measure.start()
- l = l.decode('utf-8').rstrip()
- if l == 'END':
- self.writer.write('ok\n'.encode('utf-8'))
- return
+ if l == "END":
+ break
(method, taskhash) = l.split()
- #logger.debug('Looking up %s %s' % (method, taskhash))
- cursor = self.db.cursor()
- try:
- row = self.query_equivalent(cursor, method, taskhash)
- finally:
- cursor.close()
+ # self.logger.debug('Looking up %s %s' % (method, taskhash))
+ row = await self.db.get_equivalent(method, taskhash)
if row is not None:
- msg = ('%s\n' % row['unihash']).encode('utf-8')
- #logger.debug('Found equivalent task %s -> %s', (row['taskhash'], row['unihash']))
+ msg = row["unihash"]
+ # self.logger.debug('Found equivalent task %s -> %s', (row['taskhash'], row['unihash']))
elif self.upstream_client is not None:
upstream = await self.upstream_client.get_unihash(method, taskhash)
if upstream:
- msg = ("%s\n" % upstream).encode("utf-8")
+ msg = upstream
else:
- msg = "\n".encode("utf-8")
+ msg = ""
else:
- msg = '\n'.encode('utf-8')
+ msg = ""
- self.writer.write(msg)
+ await self.socket.send(msg)
finally:
request_measure.end()
self.request_sample.end()
- await self.writer.drain()
-
# Post to the backfill queue after writing the result to minimize
# the turn around time on a request
if upstream is not None:
await self.backfill_queue.put((method, taskhash))
- async def handle_report(self, data):
- with closing(self.db.cursor()) as cursor:
- outhash_data = {
- 'method': data['method'],
- 'outhash': data['outhash'],
- 'taskhash': data['taskhash'],
- 'created': datetime.now()
- }
-
- for k in ('owner', 'PN', 'PV', 'PR', 'task', 'outhash_siginfo'):
- if k in data:
- outhash_data[k] = data[k]
-
- # Insert the new entry, unless it already exists
- (rowid, inserted) = insert_outhash(cursor, outhash_data, Resolve.IGNORE)
-
- if inserted:
- # If this row is new, check if it is equivalent to another
- # output hash
- cursor.execute(
- '''
- SELECT outhashes_v2.taskhash AS taskhash, unihashes_v2.unihash AS unihash FROM outhashes_v2
- INNER JOIN unihashes_v2 ON unihashes_v2.method=outhashes_v2.method AND unihashes_v2.taskhash=outhashes_v2.taskhash
- -- Select any matching output hash except the one we just inserted
- WHERE outhashes_v2.method=:method AND outhashes_v2.outhash=:outhash AND outhashes_v2.taskhash!=:taskhash
- -- Pick the oldest hash
- ORDER BY outhashes_v2.created ASC
- LIMIT 1
- ''',
- {
- 'method': data['method'],
- 'outhash': data['outhash'],
- 'taskhash': data['taskhash'],
- }
- )
- row = cursor.fetchone()
+ await self.socket.send("ok")
+ return self.NO_RESPONSE
- if row is not None:
- # A matching output hash was found. Set our taskhash to the
- # same unihash since they are equivalent
- unihash = row['unihash']
- resolve = Resolve.IGNORE
- else:
- # No matching output hash was found. This is probably the
- # first outhash to be added.
- unihash = data['unihash']
- resolve = Resolve.IGNORE
-
- # Query upstream to see if it has a unihash we can use
- if self.upstream_client is not None:
- upstream_data = await self.upstream_client.get_outhash(data['method'], data['outhash'], data['taskhash'])
- if upstream_data is not None:
- unihash = upstream_data['unihash']
-
-
- insert_unihash(
- cursor,
- {
- 'method': data['method'],
- 'taskhash': data['taskhash'],
- 'unihash': unihash,
- },
- resolve
- )
+ async def report_readonly(self, data):
+ method = data["method"]
+ outhash = data["outhash"]
+ taskhash = data["taskhash"]
- unihash_data = await self.get_unihash(cursor, data['method'], data['taskhash'])
- if unihash_data is not None:
- unihash = unihash_data['unihash']
- else:
- unihash = data['unihash']
+ info = await self.get_outhash(method, outhash, taskhash)
+ if info:
+ unihash = info["unihash"]
+ else:
+ unihash = data["unihash"]
- self.db.commit()
+ return {
+ "taskhash": taskhash,
+ "method": method,
+ "unihash": unihash,
+ }
- d = {
- 'taskhash': data['taskhash'],
- 'method': data['method'],
- 'unihash': unihash,
- }
+ # Since this can be called either read only or to report, the check to
+ # report is made inside the function
+ @permissions(READ_PERM)
+ async def handle_report(self, data):
+ if self.read_only or not self.user_has_permissions(REPORT_PERM):
+ return await self.report_readonly(data)
+
+ outhash_data = {
+ "method": data["method"],
+ "outhash": data["outhash"],
+ "taskhash": data["taskhash"],
+ "created": datetime.now(),
+ }
- self.write_message(d)
+ for k in ("owner", "PN", "PV", "PR", "task", "outhash_siginfo"):
+ if k in data:
+ outhash_data[k] = data[k]
- async def handle_equivreport(self, data):
- with closing(self.db.cursor()) as cursor:
- insert_data = {
- 'method': data['method'],
- 'taskhash': data['taskhash'],
- 'unihash': data['unihash'],
- }
- insert_unihash(cursor, insert_data, Resolve.IGNORE)
- self.db.commit()
+ if self.user:
+ outhash_data["owner"] = self.user.username
- # Fetch the unihash that will be reported for the taskhash. If the
- # unihash matches, it means this row was inserted (or the mapping
- # was already valid)
- row = self.query_equivalent(cursor, data['method'], data['taskhash'])
+ # Insert the new entry, unless it already exists
+ if await self.db.insert_outhash(outhash_data):
+ # If this row is new, check if it is equivalent to another
+ # output hash
+ row = await self.db.get_equivalent_for_outhash(
+ data["method"], data["outhash"], data["taskhash"]
+ )
- if row['unihash'] == data['unihash']:
- logger.info('Adding taskhash equivalence for %s with unihash %s',
- data['taskhash'], row['unihash'])
+ if row is not None:
+ # A matching output hash was found. Set our taskhash to the
+ # same unihash since they are equivalent
+ unihash = row["unihash"]
+ else:
+ # No matching output hash was found. This is probably the
+ # first outhash to be added.
+ unihash = data["unihash"]
+
+ # Query upstream to see if it has a unihash we can use
+ if self.upstream_client is not None:
+ upstream_data = await self.upstream_client.get_outhash(
+ data["method"], data["outhash"], data["taskhash"]
+ )
+ if upstream_data is not None:
+ unihash = upstream_data["unihash"]
+
+ await self.db.insert_unihash(data["method"], data["taskhash"], unihash)
+
+ unihash_data = await self.get_unihash(data["method"], data["taskhash"])
+ if unihash_data is not None:
+ unihash = unihash_data["unihash"]
+ else:
+ unihash = data["unihash"]
- d = {k: row[k] for k in ('taskhash', 'method', 'unihash')}
+ return {
+ "taskhash": data["taskhash"],
+ "method": data["method"],
+ "unihash": unihash,
+ }
- self.write_message(d)
+ @permissions(READ_PERM, REPORT_PERM)
+ async def handle_equivreport(self, data):
+ await self.db.insert_unihash(data["method"], data["taskhash"], data["unihash"])
+
+ # Fetch the unihash that will be reported for the taskhash. If the
+ # unihash matches, it means this row was inserted (or the mapping
+ # was already valid)
+ row = await self.db.get_equivalent(data["method"], data["taskhash"])
+
+ if row["unihash"] == data["unihash"]:
+ self.logger.info(
+ "Adding taskhash equivalence for %s with unihash %s",
+ data["taskhash"],
+ row["unihash"],
+ )
+ return {k: row[k] for k in ("taskhash", "method", "unihash")}
+ @permissions(READ_PERM)
async def handle_get_stats(self, request):
- d = {
- 'requests': self.request_stats.todict(),
+ return {
+ "requests": self.request_stats.todict(),
}
- self.write_message(d)
-
+ @permissions(DB_ADMIN_PERM)
async def handle_reset_stats(self, request):
d = {
- 'requests': self.request_stats.todict(),
+ "requests": self.request_stats.todict(),
}
self.request_stats.reset()
- self.write_message(d)
+ return d
+ @permissions(READ_PERM)
async def handle_backfill_wait(self, request):
d = {
- 'tasks': self.backfill_queue.qsize(),
+ "tasks": self.backfill_queue.qsize(),
}
await self.backfill_queue.join()
- self.write_message(d)
+ return d
+ @permissions(DB_ADMIN_PERM)
async def handle_remove(self, request):
condition = request["where"]
if not isinstance(condition, dict):
raise TypeError("Bad condition type %s" % type(condition))
- def do_remove(columns, table_name, cursor):
- nonlocal condition
- where = {}
- for c in columns:
- if c in condition and condition[c] is not None:
- where[c] = condition[c]
+ return {"count": await self.db.remove(condition)}
- if where:
- query = ('DELETE FROM %s WHERE ' % table_name) + ' AND '.join("%s=:%s" % (k, k) for k in where.keys())
- cursor.execute(query, where)
- return cursor.rowcount
+ @permissions(DB_ADMIN_PERM)
+ async def handle_clean_unused(self, request):
+ max_age = request["max_age_seconds"]
+ oldest = datetime.now() - timedelta(seconds=-max_age)
+ return {"count": await self.db.clean_unused(oldest)}
- return 0
+ @permissions(DB_ADMIN_PERM)
+ async def handle_get_db_usage(self, request):
+ return {"usage": await self.db.get_usage()}
- count = 0
- with closing(self.db.cursor()) as cursor:
- count += do_remove(OUTHASH_TABLE_COLUMNS, "outhashes_v2", cursor)
- count += do_remove(UNIHASH_TABLE_COLUMNS, "unihashes_v2", cursor)
- self.db.commit()
+ @permissions(DB_ADMIN_PERM)
+ async def handle_get_db_query_columns(self, request):
+ return {"columns": await self.db.get_query_columns()}
- self.write_message({"count": count})
+ # The authentication API is always allowed
+ async def handle_auth(self, request):
+ username = str(request["username"])
+ token = str(request["token"])
- async def handle_clean_unused(self, request):
- max_age = request["max_age_seconds"]
- with closing(self.db.cursor()) as cursor:
- cursor.execute(
- """
- DELETE FROM outhashes_v2 WHERE created<:oldest AND NOT EXISTS (
- SELECT unihashes_v2.id FROM unihashes_v2 WHERE unihashes_v2.method=outhashes_v2.method AND unihashes_v2.taskhash=outhashes_v2.taskhash LIMIT 1
- )
- """,
+ async def fail_auth():
+ nonlocal username
+ # Rate limit bad login attempts
+ await asyncio.sleep(1)
+ raise bb.asyncrpc.InvokeError(f"Unable to authenticate as {username}")
+
+ user, db_token = await self.db.lookup_user_token(username)
+
+ if not user or not db_token:
+ await fail_auth()
+
+ try:
+ algo, salt, _ = db_token.split(":")
+ except ValueError:
+ await fail_auth()
+
+ if hash_token(algo, salt, token) != db_token:
+ await fail_auth()
+
+ self.user = user
+
+ self.logger.info("Authenticated as %s", username)
+
+ return {
+ "result": True,
+ "username": self.user.username,
+ "permissions": sorted(list(self.user.permissions)),
+ }
+
+ @permissions(USER_ADMIN_PERM, allow_self_service=True, allow_anon=False)
+ async def handle_refresh_token(self, request):
+ username = str(request["username"])
+
+ token = await new_token()
+
+ updated = await self.db.set_user_token(
+ username,
+ hash_token(TOKEN_ALGORITHM, new_salt(), token),
+ )
+ if not updated:
+ self.raise_no_user_error(username)
+
+ return {"username": username, "token": token}
+
+ def get_perm_arg(self, arg):
+ if not isinstance(arg, list):
+ raise bb.asyncrpc.InvokeError("Unexpected type for permissions")
+
+ arg = set(arg)
+ try:
+ arg.remove(NONE_PERM)
+ except KeyError:
+ pass
+
+ unknown_perms = arg - ALL_PERMISSIONS
+ if unknown_perms:
+ raise bb.asyncrpc.InvokeError(
+ "Unknown permissions %s" % ", ".join(sorted(list(unknown_perms)))
+ )
+
+ return sorted(list(arg))
+
+ def return_perms(self, permissions):
+ if ALL_PERM in permissions:
+ return sorted(list(ALL_PERMISSIONS))
+ return sorted(list(permissions))
+
+ @permissions(USER_ADMIN_PERM, allow_anon=False)
+ async def handle_set_perms(self, request):
+ username = str(request["username"])
+ permissions = self.get_perm_arg(request["permissions"])
+
+ if not await self.db.set_user_perms(username, permissions):
+ self.raise_no_user_error(username)
+
+ return {
+ "username": username,
+ "permissions": self.return_perms(permissions),
+ }
+
+ @permissions(USER_ADMIN_PERM, allow_self_service=True, allow_anon=False)
+ async def handle_get_user(self, request):
+ username = str(request["username"])
+
+ user = await self.db.lookup_user(username)
+ if user is None:
+ return None
+
+ return {
+ "username": user.username,
+ "permissions": self.return_perms(user.permissions),
+ }
+
+ @permissions(USER_ADMIN_PERM, allow_anon=False)
+ async def handle_get_all_users(self, request):
+ users = await self.db.get_all_users()
+ return {
+ "users": [
{
- "oldest": datetime.now() - timedelta(seconds=-max_age)
+ "username": u.username,
+ "permissions": self.return_perms(u.permissions),
}
- )
- count = cursor.rowcount
+ for u in users
+ ]
+ }
- self.write_message({"count": count})
+ @permissions(USER_ADMIN_PERM, allow_anon=False)
+ async def handle_new_user(self, request):
+ username = str(request["username"])
+ permissions = self.get_perm_arg(request["permissions"])
- def query_equivalent(self, cursor, method, taskhash):
- # This is part of the inner loop and must be as fast as possible
- cursor.execute(
- 'SELECT taskhash, method, unihash FROM unihashes_v2 WHERE method=:method AND taskhash=:taskhash',
- {
- 'method': method,
- 'taskhash': taskhash,
- }
+ token = await new_token()
+
+ inserted = await self.db.new_user(
+ username,
+ permissions,
+ hash_token(TOKEN_ALGORITHM, new_salt(), token),
)
- return cursor.fetchone()
+ if not inserted:
+ raise bb.asyncrpc.InvokeError(f"Cannot create new user '{username}'")
+
+ return {
+ "username": username,
+ "permissions": self.return_perms(permissions),
+ "token": token,
+ }
+
+ @permissions(USER_ADMIN_PERM, allow_self_service=True, allow_anon=False)
+ async def handle_delete_user(self, request):
+ username = str(request["username"])
+
+ if not await self.db.delete_user(username):
+ self.raise_no_user_error(username)
+
+ return {"username": username}
+
+ @permissions(USER_ADMIN_PERM, allow_anon=False)
+ async def handle_become_user(self, request):
+ username = str(request["username"])
+
+ user = await self.db.lookup_user(username)
+ if user is None:
+ raise bb.asyncrpc.InvokeError(f"User {username} doesn't exist")
+
+ self.user = user
+
+ self.logger.info("Became user %s", username)
+
+ return {
+ "username": self.user.username,
+ "permissions": self.return_perms(self.user.permissions),
+ }
class Server(bb.asyncrpc.AsyncServer):
- def __init__(self, db, upstream=None, read_only=False):
+ def __init__(
+ self,
+ db_engine,
+ upstream=None,
+ read_only=False,
+ anon_perms=DEFAULT_ANON_PERMS,
+ admin_username=None,
+ admin_password=None,
+ ):
if upstream and read_only:
- raise bb.asyncrpc.ServerError("Read-only hashserv cannot pull from an upstream server")
+ raise bb.asyncrpc.ServerError(
+ "Read-only hashserv cannot pull from an upstream server"
+ )
+
+ disallowed_perms = set(anon_perms) - set(
+ [NONE_PERM, READ_PERM, REPORT_PERM, DB_ADMIN_PERM]
+ )
+
+ if disallowed_perms:
+ raise bb.asyncrpc.ServerError(
+ f"Permission(s) {' '.join(disallowed_perms)} are not allowed for anonymous users"
+ )
super().__init__(logger)
self.request_stats = Stats()
- self.db = db
+ self.db_engine = db_engine
self.upstream = upstream
self.read_only = read_only
+ self.backfill_queue = None
+ self.anon_perms = set(anon_perms)
+ self.admin_username = admin_username
+ self.admin_password = admin_password
- def accept_client(self, reader, writer):
- return ServerClient(reader, writer, self.db, self.request_stats, self.backfill_queue, self.upstream, self.read_only)
+ self.logger.info(
+ "Anonymous user permissions are: %s", ", ".join(self.anon_perms)
+ )
- @contextmanager
- def _backfill_worker(self):
- async def backfill_worker_task():
- client = await create_async_client(self.upstream)
- try:
- while True:
- item = await self.backfill_queue.get()
- if item is None:
- self.backfill_queue.task_done()
- break
- method, taskhash = item
- await copy_unihash_from_upstream(client, self.db, method, taskhash)
+ def accept_client(self, socket):
+ return ServerClient(
+ socket,
+ self.db_engine,
+ self.request_stats,
+ self.backfill_queue,
+ self.upstream,
+ self.read_only,
+ self.anon_perms,
+ )
+
+ async def create_admin_user(self):
+ admin_permissions = (ALL_PERM,)
+ async with self.db_engine.connect(self.logger) as db:
+ added = await db.new_user(
+ self.admin_username,
+ admin_permissions,
+ hash_token(TOKEN_ALGORITHM, new_salt(), self.admin_password),
+ )
+ if added:
+ self.logger.info("Created admin user '%s'", self.admin_username)
+ else:
+ await db.set_user_perms(
+ self.admin_username,
+ admin_permissions,
+ )
+ await db.set_user_token(
+ self.admin_username,
+ hash_token(TOKEN_ALGORITHM, new_salt(), self.admin_password),
+ )
+ self.logger.info("Admin user '%s' updated", self.admin_username)
+
+ async def backfill_worker_task(self):
+ async with await create_async_client(
+ self.upstream
+ ) as client, self.db_engine.connect(self.logger) as db:
+ while True:
+ item = await self.backfill_queue.get()
+ if item is None:
self.backfill_queue.task_done()
- finally:
- await client.close()
+ break
- async def join_worker(worker):
- await self.backfill_queue.put(None)
- await worker
+ method, taskhash = item
+ d = await client.get_taskhash(method, taskhash)
+ if d is not None:
+ await db.insert_unihash(d["method"], d["taskhash"], d["unihash"])
+ self.backfill_queue.task_done()
- if self.upstream is not None:
- worker = asyncio.ensure_future(backfill_worker_task())
- try:
- yield
- finally:
- self.loop.run_until_complete(join_worker(worker))
- else:
- yield
+ def start(self):
+ tasks = super().start()
+ if self.upstream:
+ self.backfill_queue = asyncio.Queue()
+ tasks += [self.backfill_worker_task()]
+
+ self.loop.run_until_complete(self.db_engine.create())
- def run_loop_forever(self):
- self.backfill_queue = asyncio.Queue()
+ if self.admin_username:
+ self.loop.run_until_complete(self.create_admin_user())
- with self._backfill_worker():
- super().run_loop_forever()
+ return tasks
+
+ async def stop(self):
+ if self.backfill_queue is not None:
+ await self.backfill_queue.put(None)
+ await super().stop()
diff --git a/poky/bitbake/lib/hashserv/sqlalchemy.py b/poky/bitbake/lib/hashserv/sqlalchemy.py
new file mode 100644
index 0000000000..cee04bffb0
--- /dev/null
+++ b/poky/bitbake/lib/hashserv/sqlalchemy.py
@@ -0,0 +1,427 @@
+#! /usr/bin/env python3
+#
+# Copyright (C) 2023 Garmin Ltd.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+import logging
+from datetime import datetime
+from . import User
+
+from sqlalchemy.ext.asyncio import create_async_engine
+from sqlalchemy.pool import NullPool
+from sqlalchemy import (
+ MetaData,
+ Column,
+ Table,
+ Text,
+ Integer,
+ UniqueConstraint,
+ DateTime,
+ Index,
+ select,
+ insert,
+ exists,
+ literal,
+ and_,
+ delete,
+ update,
+ func,
+)
+import sqlalchemy.engine
+from sqlalchemy.orm import declarative_base
+from sqlalchemy.exc import IntegrityError
+
+Base = declarative_base()
+
+
+class UnihashesV2(Base):
+ __tablename__ = "unihashes_v2"
+ id = Column(Integer, primary_key=True, autoincrement=True)
+ method = Column(Text, nullable=False)
+ taskhash = Column(Text, nullable=False)
+ unihash = Column(Text, nullable=False)
+
+ __table_args__ = (
+ UniqueConstraint("method", "taskhash"),
+ Index("taskhash_lookup_v3", "method", "taskhash"),
+ )
+
+
+class OuthashesV2(Base):
+ __tablename__ = "outhashes_v2"
+ id = Column(Integer, primary_key=True, autoincrement=True)
+ method = Column(Text, nullable=False)
+ taskhash = Column(Text, nullable=False)
+ outhash = Column(Text, nullable=False)
+ created = Column(DateTime)
+ owner = Column(Text)
+ PN = Column(Text)
+ PV = Column(Text)
+ PR = Column(Text)
+ task = Column(Text)
+ outhash_siginfo = Column(Text)
+
+ __table_args__ = (
+ UniqueConstraint("method", "taskhash", "outhash"),
+ Index("outhash_lookup_v3", "method", "outhash"),
+ )
+
+
+class Users(Base):
+ __tablename__ = "users"
+ id = Column(Integer, primary_key=True, autoincrement=True)
+ username = Column(Text, nullable=False)
+ token = Column(Text, nullable=False)
+ permissions = Column(Text)
+
+ __table_args__ = (UniqueConstraint("username"),)
+
+
+class DatabaseEngine(object):
+ def __init__(self, url, username=None, password=None):
+ self.logger = logging.getLogger("hashserv.sqlalchemy")
+ self.url = sqlalchemy.engine.make_url(url)
+
+ if username is not None:
+ self.url = self.url.set(username=username)
+
+ if password is not None:
+ self.url = self.url.set(password=password)
+
+ async def create(self):
+ self.logger.info("Using database %s", self.url)
+ self.engine = create_async_engine(self.url, poolclass=NullPool)
+
+ async with self.engine.begin() as conn:
+ # Create tables
+ self.logger.info("Creating tables...")
+ await conn.run_sync(Base.metadata.create_all)
+
+ def connect(self, logger):
+ return Database(self.engine, logger)
+
+
+def map_row(row):
+ if row is None:
+ return None
+ return dict(**row._mapping)
+
+
+def map_user(row):
+ if row is None:
+ return None
+ return User(
+ username=row.username,
+ permissions=set(row.permissions.split()),
+ )
+
+
+class Database(object):
+ def __init__(self, engine, logger):
+ self.engine = engine
+ self.db = None
+ self.logger = logger
+
+ async def __aenter__(self):
+ self.db = await self.engine.connect()
+ return self
+
+ async def __aexit__(self, exc_type, exc_value, traceback):
+ await self.close()
+
+ async def close(self):
+ await self.db.close()
+ self.db = None
+
+ async def get_unihash_by_taskhash_full(self, method, taskhash):
+ statement = (
+ select(
+ OuthashesV2,
+ UnihashesV2.unihash.label("unihash"),
+ )
+ .join(
+ UnihashesV2,
+ and_(
+ UnihashesV2.method == OuthashesV2.method,
+ UnihashesV2.taskhash == OuthashesV2.taskhash,
+ ),
+ )
+ .where(
+ OuthashesV2.method == method,
+ OuthashesV2.taskhash == taskhash,
+ )
+ .order_by(
+ OuthashesV2.created.asc(),
+ )
+ .limit(1)
+ )
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return map_row(result.first())
+
+ async def get_unihash_by_outhash(self, method, outhash):
+ statement = (
+ select(OuthashesV2, UnihashesV2.unihash.label("unihash"))
+ .join(
+ UnihashesV2,
+ and_(
+ UnihashesV2.method == OuthashesV2.method,
+ UnihashesV2.taskhash == OuthashesV2.taskhash,
+ ),
+ )
+ .where(
+ OuthashesV2.method == method,
+ OuthashesV2.outhash == outhash,
+ )
+ .order_by(
+ OuthashesV2.created.asc(),
+ )
+ .limit(1)
+ )
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return map_row(result.first())
+
+ async def get_outhash(self, method, outhash):
+ statement = (
+ select(OuthashesV2)
+ .where(
+ OuthashesV2.method == method,
+ OuthashesV2.outhash == outhash,
+ )
+ .order_by(
+ OuthashesV2.created.asc(),
+ )
+ .limit(1)
+ )
+
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return map_row(result.first())
+
+ async def get_equivalent_for_outhash(self, method, outhash, taskhash):
+ statement = (
+ select(
+ OuthashesV2.taskhash.label("taskhash"),
+ UnihashesV2.unihash.label("unihash"),
+ )
+ .join(
+ UnihashesV2,
+ and_(
+ UnihashesV2.method == OuthashesV2.method,
+ UnihashesV2.taskhash == OuthashesV2.taskhash,
+ ),
+ )
+ .where(
+ OuthashesV2.method == method,
+ OuthashesV2.outhash == outhash,
+ OuthashesV2.taskhash != taskhash,
+ )
+ .order_by(
+ OuthashesV2.created.asc(),
+ )
+ .limit(1)
+ )
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return map_row(result.first())
+
+ async def get_equivalent(self, method, taskhash):
+ statement = select(
+ UnihashesV2.unihash,
+ UnihashesV2.method,
+ UnihashesV2.taskhash,
+ ).where(
+ UnihashesV2.method == method,
+ UnihashesV2.taskhash == taskhash,
+ )
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return map_row(result.first())
+
+ async def remove(self, condition):
+ async def do_remove(table):
+ where = {}
+ for c in table.__table__.columns:
+ if c.key in condition and condition[c.key] is not None:
+ where[c] = condition[c.key]
+
+ if where:
+ statement = delete(table).where(*[(k == v) for k, v in where.items()])
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return result.rowcount
+
+ return 0
+
+ count = 0
+ count += await do_remove(UnihashesV2)
+ count += await do_remove(OuthashesV2)
+
+ return count
+
+ async def clean_unused(self, oldest):
+ statement = delete(OuthashesV2).where(
+ OuthashesV2.created < oldest,
+ ~(
+ select(UnihashesV2.id)
+ .where(
+ UnihashesV2.method == OuthashesV2.method,
+ UnihashesV2.taskhash == OuthashesV2.taskhash,
+ )
+ .limit(1)
+ .exists()
+ ),
+ )
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return result.rowcount
+
+ async def insert_unihash(self, method, taskhash, unihash):
+ statement = insert(UnihashesV2).values(
+ method=method,
+ taskhash=taskhash,
+ unihash=unihash,
+ )
+ self.logger.debug("%s", statement)
+ try:
+ async with self.db.begin():
+ await self.db.execute(statement)
+ return True
+ except IntegrityError:
+ self.logger.debug(
+ "%s, %s, %s already in unihash database", method, taskhash, unihash
+ )
+ return False
+
+ async def insert_outhash(self, data):
+ outhash_columns = set(c.key for c in OuthashesV2.__table__.columns)
+
+ data = {k: v for k, v in data.items() if k in outhash_columns}
+
+ if "created" in data and not isinstance(data["created"], datetime):
+ data["created"] = datetime.fromisoformat(data["created"])
+
+ statement = insert(OuthashesV2).values(**data)
+ self.logger.debug("%s", statement)
+ try:
+ async with self.db.begin():
+ await self.db.execute(statement)
+ return True
+ except IntegrityError:
+ self.logger.debug(
+ "%s, %s already in outhash database", data["method"], data["outhash"]
+ )
+ return False
+
+ async def _get_user(self, username):
+ statement = select(
+ Users.username,
+ Users.permissions,
+ Users.token,
+ ).where(
+ Users.username == username,
+ )
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return result.first()
+
+ async def lookup_user_token(self, username):
+ row = await self._get_user(username)
+ if not row:
+ return None, None
+ return map_user(row), row.token
+
+ async def lookup_user(self, username):
+ return map_user(await self._get_user(username))
+
+ async def set_user_token(self, username, token):
+ statement = (
+ update(Users)
+ .where(
+ Users.username == username,
+ )
+ .values(
+ token=token,
+ )
+ )
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return result.rowcount != 0
+
+ async def set_user_perms(self, username, permissions):
+ statement = (
+ update(Users)
+ .where(Users.username == username)
+ .values(permissions=" ".join(permissions))
+ )
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return result.rowcount != 0
+
+ async def get_all_users(self):
+ statement = select(
+ Users.username,
+ Users.permissions,
+ )
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return [map_user(row) for row in result]
+
+ async def new_user(self, username, permissions, token):
+ statement = insert(Users).values(
+ username=username,
+ permissions=" ".join(permissions),
+ token=token,
+ )
+ self.logger.debug("%s", statement)
+ try:
+ async with self.db.begin():
+ await self.db.execute(statement)
+ return True
+ except IntegrityError as e:
+ self.logger.debug("Cannot create new user %s: %s", username, e)
+ return False
+
+ async def delete_user(self, username):
+ statement = delete(Users).where(Users.username == username)
+ self.logger.debug("%s", statement)
+ async with self.db.begin():
+ result = await self.db.execute(statement)
+ return result.rowcount != 0
+
+ async def get_usage(self):
+ usage = {}
+ async with self.db.begin() as session:
+ for name, table in Base.metadata.tables.items():
+ statement = select(func.count()).select_from(table)
+ self.logger.debug("%s", statement)
+ result = await self.db.execute(statement)
+ usage[name] = {
+ "rows": result.scalar(),
+ }
+
+ return usage
+
+ async def get_query_columns(self):
+ columns = set()
+ for table in (UnihashesV2, OuthashesV2):
+ for c in table.__table__.columns:
+ if not isinstance(c.type, Text):
+ continue
+ columns.add(c.key)
+
+ return list(columns)
diff --git a/poky/bitbake/lib/hashserv/sqlite.py b/poky/bitbake/lib/hashserv/sqlite.py
new file mode 100644
index 0000000000..f65036be93
--- /dev/null
+++ b/poky/bitbake/lib/hashserv/sqlite.py
@@ -0,0 +1,408 @@
+#! /usr/bin/env python3
+#
+# Copyright (C) 2023 Garmin Ltd.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+import sqlite3
+import logging
+from contextlib import closing
+from . import User
+
+logger = logging.getLogger("hashserv.sqlite")
+
+UNIHASH_TABLE_DEFINITION = (
+ ("method", "TEXT NOT NULL", "UNIQUE"),
+ ("taskhash", "TEXT NOT NULL", "UNIQUE"),
+ ("unihash", "TEXT NOT NULL", ""),
+)
+
+UNIHASH_TABLE_COLUMNS = tuple(name for name, _, _ in UNIHASH_TABLE_DEFINITION)
+
+OUTHASH_TABLE_DEFINITION = (
+ ("method", "TEXT NOT NULL", "UNIQUE"),
+ ("taskhash", "TEXT NOT NULL", "UNIQUE"),
+ ("outhash", "TEXT NOT NULL", "UNIQUE"),
+ ("created", "DATETIME", ""),
+ # Optional fields
+ ("owner", "TEXT", ""),
+ ("PN", "TEXT", ""),
+ ("PV", "TEXT", ""),
+ ("PR", "TEXT", ""),
+ ("task", "TEXT", ""),
+ ("outhash_siginfo", "TEXT", ""),
+)
+
+OUTHASH_TABLE_COLUMNS = tuple(name for name, _, _ in OUTHASH_TABLE_DEFINITION)
+
+USERS_TABLE_DEFINITION = (
+ ("username", "TEXT NOT NULL", "UNIQUE"),
+ ("token", "TEXT NOT NULL", ""),
+ ("permissions", "TEXT NOT NULL", ""),
+)
+
+USERS_TABLE_COLUMNS = tuple(name for name, _, _ in USERS_TABLE_DEFINITION)
+
+
+def _make_table(cursor, name, definition):
+ cursor.execute(
+ """
+ CREATE TABLE IF NOT EXISTS {name} (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ {fields}
+ UNIQUE({unique})
+ )
+ """.format(
+ name=name,
+ fields=" ".join("%s %s," % (name, typ) for name, typ, _ in definition),
+ unique=", ".join(
+ name for name, _, flags in definition if "UNIQUE" in flags
+ ),
+ )
+ )
+
+
+def map_user(row):
+ if row is None:
+ return None
+ return User(
+ username=row["username"],
+ permissions=set(row["permissions"].split()),
+ )
+
+
+class DatabaseEngine(object):
+ def __init__(self, dbname, sync):
+ self.dbname = dbname
+ self.logger = logger
+ self.sync = sync
+
+ async def create(self):
+ db = sqlite3.connect(self.dbname)
+ db.row_factory = sqlite3.Row
+
+ with closing(db.cursor()) as cursor:
+ _make_table(cursor, "unihashes_v2", UNIHASH_TABLE_DEFINITION)
+ _make_table(cursor, "outhashes_v2", OUTHASH_TABLE_DEFINITION)
+ _make_table(cursor, "users", USERS_TABLE_DEFINITION)
+
+ cursor.execute("PRAGMA journal_mode = WAL")
+ cursor.execute(
+ "PRAGMA synchronous = %s" % ("NORMAL" if self.sync else "OFF")
+ )
+
+ # Drop old indexes
+ cursor.execute("DROP INDEX IF EXISTS taskhash_lookup")
+ cursor.execute("DROP INDEX IF EXISTS outhash_lookup")
+ cursor.execute("DROP INDEX IF EXISTS taskhash_lookup_v2")
+ cursor.execute("DROP INDEX IF EXISTS outhash_lookup_v2")
+
+ # TODO: Upgrade from tasks_v2?
+ cursor.execute("DROP TABLE IF EXISTS tasks_v2")
+
+ # Create new indexes
+ cursor.execute(
+ "CREATE INDEX IF NOT EXISTS taskhash_lookup_v3 ON unihashes_v2 (method, taskhash)"
+ )
+ cursor.execute(
+ "CREATE INDEX IF NOT EXISTS outhash_lookup_v3 ON outhashes_v2 (method, outhash)"
+ )
+
+ def connect(self, logger):
+ return Database(logger, self.dbname)
+
+
+class Database(object):
+ def __init__(self, logger, dbname, sync=True):
+ self.dbname = dbname
+ self.logger = logger
+
+ self.db = sqlite3.connect(self.dbname)
+ self.db.row_factory = sqlite3.Row
+
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute("SELECT sqlite_version()")
+
+ version = []
+ for v in cursor.fetchone()[0].split("."):
+ try:
+ version.append(int(v))
+ except ValueError:
+ version.append(v)
+
+ self.sqlite_version = tuple(version)
+
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(self, exc_type, exc_value, traceback):
+ await self.close()
+
+ async def close(self):
+ self.db.close()
+
+ async def get_unihash_by_taskhash_full(self, method, taskhash):
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute(
+ """
+ SELECT *, unihashes_v2.unihash AS unihash FROM outhashes_v2
+ INNER JOIN unihashes_v2 ON unihashes_v2.method=outhashes_v2.method AND unihashes_v2.taskhash=outhashes_v2.taskhash
+ WHERE outhashes_v2.method=:method AND outhashes_v2.taskhash=:taskhash
+ ORDER BY outhashes_v2.created ASC
+ LIMIT 1
+ """,
+ {
+ "method": method,
+ "taskhash": taskhash,
+ },
+ )
+ return cursor.fetchone()
+
+ async def get_unihash_by_outhash(self, method, outhash):
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute(
+ """
+ SELECT *, unihashes_v2.unihash AS unihash FROM outhashes_v2
+ INNER JOIN unihashes_v2 ON unihashes_v2.method=outhashes_v2.method AND unihashes_v2.taskhash=outhashes_v2.taskhash
+ WHERE outhashes_v2.method=:method AND outhashes_v2.outhash=:outhash
+ ORDER BY outhashes_v2.created ASC
+ LIMIT 1
+ """,
+ {
+ "method": method,
+ "outhash": outhash,
+ },
+ )
+ return cursor.fetchone()
+
+ async def get_outhash(self, method, outhash):
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute(
+ """
+ SELECT * FROM outhashes_v2
+ WHERE outhashes_v2.method=:method AND outhashes_v2.outhash=:outhash
+ ORDER BY outhashes_v2.created ASC
+ LIMIT 1
+ """,
+ {
+ "method": method,
+ "outhash": outhash,
+ },
+ )
+ return cursor.fetchone()
+
+ async def get_equivalent_for_outhash(self, method, outhash, taskhash):
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute(
+ """
+ SELECT outhashes_v2.taskhash AS taskhash, unihashes_v2.unihash AS unihash FROM outhashes_v2
+ INNER JOIN unihashes_v2 ON unihashes_v2.method=outhashes_v2.method AND unihashes_v2.taskhash=outhashes_v2.taskhash
+ -- Select any matching output hash except the one we just inserted
+ WHERE outhashes_v2.method=:method AND outhashes_v2.outhash=:outhash AND outhashes_v2.taskhash!=:taskhash
+ -- Pick the oldest hash
+ ORDER BY outhashes_v2.created ASC
+ LIMIT 1
+ """,
+ {
+ "method": method,
+ "outhash": outhash,
+ "taskhash": taskhash,
+ },
+ )
+ return cursor.fetchone()
+
+ async def get_equivalent(self, method, taskhash):
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute(
+ "SELECT taskhash, method, unihash FROM unihashes_v2 WHERE method=:method AND taskhash=:taskhash",
+ {
+ "method": method,
+ "taskhash": taskhash,
+ },
+ )
+ return cursor.fetchone()
+
+ async def remove(self, condition):
+ def do_remove(columns, table_name, cursor):
+ where = {}
+ for c in columns:
+ if c in condition and condition[c] is not None:
+ where[c] = condition[c]
+
+ if where:
+ query = ("DELETE FROM %s WHERE " % table_name) + " AND ".join(
+ "%s=:%s" % (k, k) for k in where.keys()
+ )
+ cursor.execute(query, where)
+ return cursor.rowcount
+
+ return 0
+
+ count = 0
+ with closing(self.db.cursor()) as cursor:
+ count += do_remove(OUTHASH_TABLE_COLUMNS, "outhashes_v2", cursor)
+ count += do_remove(UNIHASH_TABLE_COLUMNS, "unihashes_v2", cursor)
+ self.db.commit()
+
+ return count
+
+ async def clean_unused(self, oldest):
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute(
+ """
+ DELETE FROM outhashes_v2 WHERE created<:oldest AND NOT EXISTS (
+ SELECT unihashes_v2.id FROM unihashes_v2 WHERE unihashes_v2.method=outhashes_v2.method AND unihashes_v2.taskhash=outhashes_v2.taskhash LIMIT 1
+ )
+ """,
+ {
+ "oldest": oldest,
+ },
+ )
+ self.db.commit()
+ return cursor.rowcount
+
+ async def insert_unihash(self, method, taskhash, unihash):
+ with closing(self.db.cursor()) as cursor:
+ prevrowid = cursor.lastrowid
+ cursor.execute(
+ """
+ INSERT OR IGNORE INTO unihashes_v2 (method, taskhash, unihash) VALUES(:method, :taskhash, :unihash)
+ """,
+ {
+ "method": method,
+ "taskhash": taskhash,
+ "unihash": unihash,
+ },
+ )
+ self.db.commit()
+ return cursor.lastrowid != prevrowid
+
+ async def insert_outhash(self, data):
+ data = {k: v for k, v in data.items() if k in OUTHASH_TABLE_COLUMNS}
+ keys = sorted(data.keys())
+ query = "INSERT OR IGNORE INTO outhashes_v2 ({fields}) VALUES({values})".format(
+ fields=", ".join(keys),
+ values=", ".join(":" + k for k in keys),
+ )
+ with closing(self.db.cursor()) as cursor:
+ prevrowid = cursor.lastrowid
+ cursor.execute(query, data)
+ self.db.commit()
+ return cursor.lastrowid != prevrowid
+
+ def _get_user(self, username):
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute(
+ """
+ SELECT username, permissions, token FROM users WHERE username=:username
+ """,
+ {
+ "username": username,
+ },
+ )
+ return cursor.fetchone()
+
+ async def lookup_user_token(self, username):
+ row = self._get_user(username)
+ if row is None:
+ return None, None
+ return map_user(row), row["token"]
+
+ async def lookup_user(self, username):
+ return map_user(self._get_user(username))
+
+ async def set_user_token(self, username, token):
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute(
+ """
+ UPDATE users SET token=:token WHERE username=:username
+ """,
+ {
+ "username": username,
+ "token": token,
+ },
+ )
+ self.db.commit()
+ return cursor.rowcount != 0
+
+ async def set_user_perms(self, username, permissions):
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute(
+ """
+ UPDATE users SET permissions=:permissions WHERE username=:username
+ """,
+ {
+ "username": username,
+ "permissions": " ".join(permissions),
+ },
+ )
+ self.db.commit()
+ return cursor.rowcount != 0
+
+ async def get_all_users(self):
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute("SELECT username, permissions FROM users")
+ return [map_user(r) for r in cursor.fetchall()]
+
+ async def new_user(self, username, permissions, token):
+ with closing(self.db.cursor()) as cursor:
+ try:
+ cursor.execute(
+ """
+ INSERT INTO users (username, token, permissions) VALUES (:username, :token, :permissions)
+ """,
+ {
+ "username": username,
+ "token": token,
+ "permissions": " ".join(permissions),
+ },
+ )
+ self.db.commit()
+ return True
+ except sqlite3.IntegrityError:
+ return False
+
+ async def delete_user(self, username):
+ with closing(self.db.cursor()) as cursor:
+ cursor.execute(
+ """
+ DELETE FROM users WHERE username=:username
+ """,
+ {
+ "username": username,
+ },
+ )
+ self.db.commit()
+ return cursor.rowcount != 0
+
+ async def get_usage(self):
+ usage = {}
+ with closing(self.db.cursor()) as cursor:
+ if self.sqlite_version >= (3, 33):
+ table_name = "sqlite_schema"
+ else:
+ table_name = "sqlite_master"
+
+ cursor.execute(
+ f"""
+ SELECT name FROM {table_name} WHERE type = 'table' AND name NOT LIKE 'sqlite_%'
+ """
+ )
+ for row in cursor.fetchall():
+ cursor.execute(
+ """
+ SELECT COUNT() FROM %s
+ """
+ % row["name"],
+ )
+ usage[row["name"]] = {
+ "rows": cursor.fetchone()[0],
+ }
+ return usage
+
+ async def get_query_columns(self):
+ columns = set()
+ for name, typ, _ in UNIHASH_TABLE_DEFINITION + OUTHASH_TABLE_DEFINITION:
+ if typ.startswith("TEXT"):
+ columns.add(name)
+ return list(columns)
diff --git a/poky/bitbake/lib/hashserv/tests.py b/poky/bitbake/lib/hashserv/tests.py
index f343c586b5..a9e6fdf9ff 100644
--- a/poky/bitbake/lib/hashserv/tests.py
+++ b/poky/bitbake/lib/hashserv/tests.py
@@ -6,6 +6,8 @@
#
from . import create_server, create_client
+from .server import DEFAULT_ANON_PERMS, ALL_PERMISSIONS
+from bb.asyncrpc import InvokeError
import hashlib
import logging
import multiprocessing
@@ -17,6 +19,14 @@ import unittest
import socket
import time
import signal
+import subprocess
+import json
+import re
+from pathlib import Path
+
+
+THIS_DIR = Path(__file__).parent
+BIN_DIR = THIS_DIR.parent.parent / "bin"
def server_prefunc(server, idx):
logging.basicConfig(level=logging.DEBUG, filename='bbhashserv-%d.log' % idx, filemode='w',
@@ -29,11 +39,12 @@ class HashEquivalenceTestSetup(object):
METHOD = 'TestMethod'
server_index = 0
+ client_index = 0
- def start_server(self, dbpath=None, upstream=None, read_only=False, prefunc=server_prefunc):
+ def start_server(self, dbpath=None, upstream=None, read_only=False, prefunc=server_prefunc, anon_perms=DEFAULT_ANON_PERMS, admin_username=None, admin_password=None):
self.server_index += 1
if dbpath is None:
- dbpath = os.path.join(self.temp_dir.name, "db%d.sqlite" % self.server_index)
+ dbpath = self.make_dbpath()
def cleanup_server(server):
if server.process.exitcode is not None:
@@ -45,19 +56,41 @@ class HashEquivalenceTestSetup(object):
server = create_server(self.get_server_addr(self.server_index),
dbpath,
upstream=upstream,
- read_only=read_only)
+ read_only=read_only,
+ anon_perms=anon_perms,
+ admin_username=admin_username,
+ admin_password=admin_password)
server.dbpath = dbpath
server.serve_as_process(prefunc=prefunc, args=(self.server_index,))
self.addCleanup(cleanup_server, server)
+ return server
+
+ def make_dbpath(self):
+ return os.path.join(self.temp_dir.name, "db%d.sqlite" % self.server_index)
+
+ def start_client(self, server_address, username=None, password=None):
def cleanup_client(client):
client.close()
- client = create_client(server.address)
+ client = create_client(server_address, username=username, password=password)
self.addCleanup(cleanup_client, client)
- return (client, server)
+ return client
+
+ def start_test_server(self):
+ self.server = self.start_server()
+ return self.server.address
+
+ def start_auth_server(self):
+ auth_server = self.start_server(self.server.dbpath, anon_perms=[], admin_username="admin", admin_password="password")
+ self.auth_server_address = auth_server.address
+ self.admin_client = self.start_client(auth_server.address, username="admin", password="password")
+ return self.admin_client
+
+ def auth_client(self, user):
+ return self.start_client(self.auth_server_address, user["username"], user["token"])
def setUp(self):
if sys.version_info < (3, 5, 0):
@@ -66,26 +99,83 @@ class HashEquivalenceTestSetup(object):
self.temp_dir = tempfile.TemporaryDirectory(prefix='bb-hashserv')
self.addCleanup(self.temp_dir.cleanup)
- (self.client, self.server) = self.start_server()
+ self.server_address = self.start_test_server()
+
+ self.client = self.start_client(self.server_address)
def assertClientGetHash(self, client, taskhash, unihash):
result = client.get_unihash(self.METHOD, taskhash)
self.assertEqual(result, unihash)
+ def assertUserPerms(self, user, permissions):
+ with self.auth_client(user) as client:
+ info = client.get_user()
+ self.assertEqual(info, {
+ "username": user["username"],
+ "permissions": permissions,
+ })
-class HashEquivalenceCommonTests(object):
- def test_create_hash(self):
+ def assertUserCanAuth(self, user):
+ with self.start_client(self.auth_server_address) as client:
+ client.auth(user["username"], user["token"])
+
+ def assertUserCannotAuth(self, user):
+ with self.start_client(self.auth_server_address) as client, self.assertRaises(InvokeError):
+ client.auth(user["username"], user["token"])
+
+ def create_test_hash(self, client):
# Simple test that hashes can be created
taskhash = '35788efcb8dfb0a02659d81cf2bfd695fb30faf9'
outhash = '2765d4a5884be49b28601445c2760c5f21e7e5c0ee2b7e3fce98fd7e5970796f'
unihash = 'f46d3fbb439bd9b921095da657a4de906510d2cd'
- self.assertClientGetHash(self.client, taskhash, None)
+ self.assertClientGetHash(client, taskhash, None)
- result = self.client.report_unihash(taskhash, self.METHOD, outhash, unihash)
+ result = client.report_unihash(taskhash, self.METHOD, outhash, unihash)
self.assertEqual(result['unihash'], unihash, 'Server returned bad unihash')
return taskhash, outhash, unihash
+ def run_hashclient(self, args, **kwargs):
+ try:
+ p = subprocess.run(
+ [BIN_DIR / "bitbake-hashclient"] + args,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ encoding="utf-8",
+ **kwargs
+ )
+ except subprocess.CalledProcessError as e:
+ print(e.output)
+ raise e
+
+ print(p.stdout)
+ return p
+
+
+class HashEquivalenceCommonTests(object):
+ def auth_perms(self, *permissions):
+ self.client_index += 1
+ user = self.create_user(f"user-{self.client_index}", permissions)
+ return self.auth_client(user)
+
+ def create_user(self, username, permissions, *, client=None):
+ def remove_user(username):
+ try:
+ self.admin_client.delete_user(username)
+ except bb.asyncrpc.InvokeError:
+ pass
+
+ if client is None:
+ client = self.admin_client
+
+ user = client.new_user(username, permissions)
+ self.addCleanup(remove_user, username)
+
+ return user
+
+ def test_create_hash(self):
+ return self.create_test_hash(self.client)
+
def test_create_equivalent(self):
# Tests that a second reported task with the same outhash will be
# assigned the same unihash
@@ -127,7 +217,7 @@ class HashEquivalenceCommonTests(object):
self.assertClientGetHash(self.client, taskhash, unihash)
def test_remove_taskhash(self):
- taskhash, outhash, unihash = self.test_create_hash()
+ taskhash, outhash, unihash = self.create_test_hash(self.client)
result = self.client.remove({"taskhash": taskhash})
self.assertGreater(result["count"], 0)
self.assertClientGetHash(self.client, taskhash, None)
@@ -136,13 +226,13 @@ class HashEquivalenceCommonTests(object):
self.assertIsNone(result_outhash)
def test_remove_unihash(self):
- taskhash, outhash, unihash = self.test_create_hash()
+ taskhash, outhash, unihash = self.create_test_hash(self.client)
result = self.client.remove({"unihash": unihash})
self.assertGreater(result["count"], 0)
self.assertClientGetHash(self.client, taskhash, None)
def test_remove_outhash(self):
- taskhash, outhash, unihash = self.test_create_hash()
+ taskhash, outhash, unihash = self.create_test_hash(self.client)
result = self.client.remove({"outhash": outhash})
self.assertGreater(result["count"], 0)
@@ -150,7 +240,7 @@ class HashEquivalenceCommonTests(object):
self.assertIsNone(result_outhash)
def test_remove_method(self):
- taskhash, outhash, unihash = self.test_create_hash()
+ taskhash, outhash, unihash = self.create_test_hash(self.client)
result = self.client.remove({"method": self.METHOD})
self.assertGreater(result["count"], 0)
self.assertClientGetHash(self.client, taskhash, None)
@@ -159,7 +249,7 @@ class HashEquivalenceCommonTests(object):
self.assertIsNone(result_outhash)
def test_clean_unused(self):
- taskhash, outhash, unihash = self.test_create_hash()
+ taskhash, outhash, unihash = self.create_test_hash(self.client)
# Clean the database, which should not remove anything because all hashes an in-use
result = self.client.clean_unused(0)
@@ -206,7 +296,7 @@ class HashEquivalenceCommonTests(object):
def test_stress(self):
def query_server(failures):
- client = Client(self.server.address)
+ client = Client(self.server_address)
try:
for i in range(1000):
taskhash = hashlib.sha256()
@@ -245,8 +335,10 @@ class HashEquivalenceCommonTests(object):
# the side client. It also verifies that the results are pulled into
# the downstream database by checking that the downstream and side servers
# match after the downstream is done waiting for all backfill tasks
- (down_client, down_server) = self.start_server(upstream=self.server.address)
- (side_client, side_server) = self.start_server(dbpath=down_server.dbpath)
+ down_server = self.start_server(upstream=self.server_address)
+ down_client = self.start_client(down_server.address)
+ side_server = self.start_server(dbpath=down_server.dbpath)
+ side_client = self.start_client(side_server.address)
def check_hash(taskhash, unihash, old_sidehash):
nonlocal down_client
@@ -351,14 +443,18 @@ class HashEquivalenceCommonTests(object):
self.assertEqual(result['method'], self.METHOD)
def test_ro_server(self):
- (ro_client, ro_server) = self.start_server(dbpath=self.server.dbpath, read_only=True)
+ rw_server = self.start_server()
+ rw_client = self.start_client(rw_server.address)
+
+ ro_server = self.start_server(dbpath=rw_server.dbpath, read_only=True)
+ ro_client = self.start_client(ro_server.address)
# Report a hash via the read-write server
taskhash = '35788efcb8dfb0a02659d81cf2bfd695fb30faf9'
outhash = '2765d4a5884be49b28601445c2760c5f21e7e5c0ee2b7e3fce98fd7e5970796f'
unihash = 'f46d3fbb439bd9b921095da657a4de906510d2cd'
- result = self.client.report_unihash(taskhash, self.METHOD, outhash, unihash)
+ result = rw_client.report_unihash(taskhash, self.METHOD, outhash, unihash)
self.assertEqual(result['unihash'], unihash, 'Server returned bad unihash')
# Check the hash via the read-only server
@@ -369,11 +465,11 @@ class HashEquivalenceCommonTests(object):
outhash2 = '3c979c3db45c569f51ab7626a4651074be3a9d11a84b1db076f5b14f7d39db44'
unihash2 = '90e9bc1d1f094c51824adca7f8ea79a048d68824'
- with self.assertRaises(ConnectionError):
- ro_client.report_unihash(taskhash2, self.METHOD, outhash2, unihash2)
+ result = ro_client.report_unihash(taskhash2, self.METHOD, outhash2, unihash2)
+ self.assertEqual(result['unihash'], unihash2)
# Ensure that the database was not modified
- self.assertClientGetHash(self.client, taskhash2, None)
+ self.assertClientGetHash(rw_client, taskhash2, None)
def test_slow_server_start(self):
@@ -393,7 +489,7 @@ class HashEquivalenceCommonTests(object):
old_signal = signal.signal(signal.SIGTERM, do_nothing)
self.addCleanup(signal.signal, signal.SIGTERM, old_signal)
- _, server = self.start_server(prefunc=prefunc)
+ server = self.start_server(prefunc=prefunc)
server.process.terminate()
time.sleep(30)
event.set()
@@ -453,6 +549,524 @@ class HashEquivalenceCommonTests(object):
# shares a taskhash with Task 2
self.assertClientGetHash(self.client, taskhash2, unihash2)
+ def test_auth_read_perms(self):
+ admin_client = self.start_auth_server()
+
+ # Create hashes with non-authenticated server
+ taskhash, outhash, unihash = self.create_test_hash(self.client)
+
+ # Validate hash can be retrieved using authenticated client
+ with self.auth_perms("@read") as client:
+ self.assertClientGetHash(client, taskhash, unihash)
+
+ with self.auth_perms() as client, self.assertRaises(InvokeError):
+ self.assertClientGetHash(client, taskhash, unihash)
+
+ def test_auth_report_perms(self):
+ admin_client = self.start_auth_server()
+
+ # Without read permission, the user is completely denied
+ with self.auth_perms() as client, self.assertRaises(InvokeError):
+ self.create_test_hash(client)
+
+ # Read permission allows the call to succeed, but it doesn't record
+ # anythin in the database
+ with self.auth_perms("@read") as client:
+ taskhash, outhash, unihash = self.create_test_hash(client)
+ self.assertClientGetHash(client, taskhash, None)
+
+ # Report permission alone is insufficient
+ with self.auth_perms("@report") as client, self.assertRaises(InvokeError):
+ self.create_test_hash(client)
+
+ # Read and report permission actually modify the database
+ with self.auth_perms("@read", "@report") as client:
+ taskhash, outhash, unihash = self.create_test_hash(client)
+ self.assertClientGetHash(client, taskhash, unihash)
+
+ def test_auth_no_token_refresh_from_anon_user(self):
+ self.start_auth_server()
+
+ with self.start_client(self.auth_server_address) as client, self.assertRaises(InvokeError):
+ client.refresh_token()
+
+ def test_auth_self_token_refresh(self):
+ admin_client = self.start_auth_server()
+
+ # Create a new user with no permissions
+ user = self.create_user("test-user", [])
+
+ with self.auth_client(user) as client:
+ new_user = client.refresh_token()
+
+ self.assertEqual(user["username"], new_user["username"])
+ self.assertNotEqual(user["token"], new_user["token"])
+ self.assertUserCanAuth(new_user)
+ self.assertUserCannotAuth(user)
+
+ # Explicitly specifying with your own username is fine also
+ with self.auth_client(new_user) as client:
+ new_user2 = client.refresh_token(user["username"])
+
+ self.assertEqual(user["username"], new_user2["username"])
+ self.assertNotEqual(user["token"], new_user2["token"])
+ self.assertUserCanAuth(new_user2)
+ self.assertUserCannotAuth(new_user)
+ self.assertUserCannotAuth(user)
+
+ def test_auth_token_refresh(self):
+ admin_client = self.start_auth_server()
+
+ user = self.create_user("test-user", [])
+
+ with self.auth_perms() as client, self.assertRaises(InvokeError):
+ client.refresh_token(user["username"])
+
+ with self.auth_perms("@user-admin") as client:
+ new_user = client.refresh_token(user["username"])
+
+ self.assertEqual(user["username"], new_user["username"])
+ self.assertNotEqual(user["token"], new_user["token"])
+ self.assertUserCanAuth(new_user)
+ self.assertUserCannotAuth(user)
+
+ def test_auth_self_get_user(self):
+ admin_client = self.start_auth_server()
+
+ user = self.create_user("test-user", [])
+ user_info = user.copy()
+ del user_info["token"]
+
+ with self.auth_client(user) as client:
+ info = client.get_user()
+ self.assertEqual(info, user_info)
+
+ # Explicitly asking for your own username is fine also
+ info = client.get_user(user["username"])
+ self.assertEqual(info, user_info)
+
+ def test_auth_get_user(self):
+ admin_client = self.start_auth_server()
+
+ user = self.create_user("test-user", [])
+ user_info = user.copy()
+ del user_info["token"]
+
+ with self.auth_perms() as client, self.assertRaises(InvokeError):
+ client.get_user(user["username"])
+
+ with self.auth_perms("@user-admin") as client:
+ info = client.get_user(user["username"])
+ self.assertEqual(info, user_info)
+
+ info = client.get_user("nonexist-user")
+ self.assertIsNone(info)
+
+ def test_auth_reconnect(self):
+ admin_client = self.start_auth_server()
+
+ user = self.create_user("test-user", [])
+ user_info = user.copy()
+ del user_info["token"]
+
+ with self.auth_client(user) as client:
+ info = client.get_user()
+ self.assertEqual(info, user_info)
+
+ client.disconnect()
+
+ info = client.get_user()
+ self.assertEqual(info, user_info)
+
+ def test_auth_delete_user(self):
+ admin_client = self.start_auth_server()
+
+ user = self.create_user("test-user", [])
+
+ # self service
+ with self.auth_client(user) as client:
+ client.delete_user(user["username"])
+
+ self.assertIsNone(admin_client.get_user(user["username"]))
+ user = self.create_user("test-user", [])
+
+ with self.auth_perms() as client, self.assertRaises(InvokeError):
+ client.delete_user(user["username"])
+
+ with self.auth_perms("@user-admin") as client:
+ client.delete_user(user["username"])
+
+ # User doesn't exist, so even though the permission is correct, it's an
+ # error
+ with self.auth_perms("@user-admin") as client, self.assertRaises(InvokeError):
+ client.delete_user(user["username"])
+
+ def test_auth_set_user_perms(self):
+ admin_client = self.start_auth_server()
+
+ user = self.create_user("test-user", [])
+
+ self.assertUserPerms(user, [])
+
+ # No self service to change permissions
+ with self.auth_client(user) as client, self.assertRaises(InvokeError):
+ client.set_user_perms(user["username"], ["@all"])
+ self.assertUserPerms(user, [])
+
+ with self.auth_perms() as client, self.assertRaises(InvokeError):
+ client.set_user_perms(user["username"], ["@all"])
+ self.assertUserPerms(user, [])
+
+ with self.auth_perms("@user-admin") as client:
+ client.set_user_perms(user["username"], ["@all"])
+ self.assertUserPerms(user, sorted(list(ALL_PERMISSIONS)))
+
+ # Bad permissions
+ with self.auth_perms("@user-admin") as client, self.assertRaises(InvokeError):
+ client.set_user_perms(user["username"], ["@this-is-not-a-permission"])
+ self.assertUserPerms(user, sorted(list(ALL_PERMISSIONS)))
+
+ def test_auth_get_all_users(self):
+ admin_client = self.start_auth_server()
+
+ user = self.create_user("test-user", [])
+
+ with self.auth_client(user) as client, self.assertRaises(InvokeError):
+ client.get_all_users()
+
+ # Give the test user the correct permission
+ admin_client.set_user_perms(user["username"], ["@user-admin"])
+
+ with self.auth_client(user) as client:
+ all_users = client.get_all_users()
+
+ # Convert to a dictionary for easier comparison
+ all_users = {u["username"]: u for u in all_users}
+
+ self.assertEqual(all_users,
+ {
+ "admin": {
+ "username": "admin",
+ "permissions": sorted(list(ALL_PERMISSIONS)),
+ },
+ "test-user": {
+ "username": "test-user",
+ "permissions": ["@user-admin"],
+ }
+ }
+ )
+
+ def test_auth_new_user(self):
+ self.start_auth_server()
+
+ permissions = ["@read", "@report", "@db-admin", "@user-admin"]
+ permissions.sort()
+
+ with self.auth_perms() as client, self.assertRaises(InvokeError):
+ self.create_user("test-user", permissions, client=client)
+
+ with self.auth_perms("@user-admin") as client:
+ user = self.create_user("test-user", permissions, client=client)
+ self.assertIn("token", user)
+ self.assertEqual(user["username"], "test-user")
+ self.assertEqual(user["permissions"], permissions)
+
+ def test_auth_become_user(self):
+ admin_client = self.start_auth_server()
+
+ user = self.create_user("test-user", ["@read", "@report"])
+ user_info = user.copy()
+ del user_info["token"]
+
+ with self.auth_perms() as client, self.assertRaises(InvokeError):
+ client.become_user(user["username"])
+
+ with self.auth_perms("@user-admin") as client:
+ become = client.become_user(user["username"])
+ self.assertEqual(become, user_info)
+
+ info = client.get_user()
+ self.assertEqual(info, user_info)
+
+ # Verify become user is preserved across disconnect
+ client.disconnect()
+
+ info = client.get_user()
+ self.assertEqual(info, user_info)
+
+ # test-user doesn't have become_user permissions, so this should
+ # not work
+ with self.assertRaises(InvokeError):
+ client.become_user(user["username"])
+
+ # No self-service of become
+ with self.auth_client(user) as client, self.assertRaises(InvokeError):
+ client.become_user(user["username"])
+
+ # Give test user permissions to become
+ admin_client.set_user_perms(user["username"], ["@user-admin"])
+
+ # It's possible to become yourself (effectively a noop)
+ with self.auth_perms("@user-admin") as client:
+ become = client.become_user(client.username)
+
+ def test_get_db_usage(self):
+ usage = self.client.get_db_usage()
+
+ self.assertTrue(isinstance(usage, dict))
+ for name in usage.keys():
+ self.assertTrue(isinstance(usage[name], dict))
+ self.assertIn("rows", usage[name])
+ self.assertTrue(isinstance(usage[name]["rows"], int))
+
+ def test_get_db_query_columns(self):
+ columns = self.client.get_db_query_columns()
+
+ self.assertTrue(isinstance(columns, list))
+ self.assertTrue(len(columns) > 0)
+
+ for col in columns:
+ self.client.remove({col: ""})
+
+ def test_auth_is_owner(self):
+ admin_client = self.start_auth_server()
+
+ user = self.create_user("test-user", ["@read", "@report"])
+ with self.auth_client(user) as client:
+ taskhash, outhash, unihash = self.create_test_hash(client)
+ data = client.get_taskhash(self.METHOD, taskhash, True)
+ self.assertEqual(data["owner"], user["username"])
+
+
+class TestHashEquivalenceClient(HashEquivalenceTestSetup, unittest.TestCase):
+ def get_server_addr(self, server_idx):
+ return "unix://" + os.path.join(self.temp_dir.name, 'sock%d' % server_idx)
+
+ def test_stats(self):
+ p = self.run_hashclient(["--address", self.server_address, "stats"], check=True)
+ json.loads(p.stdout)
+
+ def test_stress(self):
+ self.run_hashclient(["--address", self.server_address, "stress"], check=True)
+
+ def test_remove_taskhash(self):
+ taskhash, outhash, unihash = self.create_test_hash(self.client)
+ self.run_hashclient([
+ "--address", self.server_address,
+ "remove",
+ "--where", "taskhash", taskhash,
+ ], check=True)
+ self.assertClientGetHash(self.client, taskhash, None)
+
+ result_outhash = self.client.get_outhash(self.METHOD, outhash, taskhash)
+ self.assertIsNone(result_outhash)
+
+ def test_remove_unihash(self):
+ taskhash, outhash, unihash = self.create_test_hash(self.client)
+ self.run_hashclient([
+ "--address", self.server_address,
+ "remove",
+ "--where", "unihash", unihash,
+ ], check=True)
+ self.assertClientGetHash(self.client, taskhash, None)
+
+ def test_remove_outhash(self):
+ taskhash, outhash, unihash = self.create_test_hash(self.client)
+ self.run_hashclient([
+ "--address", self.server_address,
+ "remove",
+ "--where", "outhash", outhash,
+ ], check=True)
+
+ result_outhash = self.client.get_outhash(self.METHOD, outhash, taskhash)
+ self.assertIsNone(result_outhash)
+
+ def test_remove_method(self):
+ taskhash, outhash, unihash = self.create_test_hash(self.client)
+ self.run_hashclient([
+ "--address", self.server_address,
+ "remove",
+ "--where", "method", self.METHOD,
+ ], check=True)
+ self.assertClientGetHash(self.client, taskhash, None)
+
+ result_outhash = self.client.get_outhash(self.METHOD, outhash, taskhash)
+ self.assertIsNone(result_outhash)
+
+ def test_clean_unused(self):
+ taskhash, outhash, unihash = self.create_test_hash(self.client)
+
+ # Clean the database, which should not remove anything because all hashes an in-use
+ self.run_hashclient([
+ "--address", self.server_address,
+ "clean-unused", "0",
+ ], check=True)
+ self.assertClientGetHash(self.client, taskhash, unihash)
+
+ # Remove the unihash. The row in the outhash table should still be present
+ self.run_hashclient([
+ "--address", self.server_address,
+ "remove",
+ "--where", "unihash", unihash,
+ ], check=True)
+ result_outhash = self.client.get_outhash(self.METHOD, outhash, taskhash, False)
+ self.assertIsNotNone(result_outhash)
+
+ # Now clean with no minimum age which will remove the outhash
+ self.run_hashclient([
+ "--address", self.server_address,
+ "clean-unused", "0",
+ ], check=True)
+ result_outhash = self.client.get_outhash(self.METHOD, outhash, taskhash, False)
+ self.assertIsNone(result_outhash)
+
+ def test_refresh_token(self):
+ admin_client = self.start_auth_server()
+
+ user = admin_client.new_user("test-user", ["@read", "@report"])
+
+ p = self.run_hashclient([
+ "--address", self.auth_server_address,
+ "--login", user["username"],
+ "--password", user["token"],
+ "refresh-token"
+ ], check=True)
+
+ new_token = None
+ for l in p.stdout.splitlines():
+ l = l.rstrip()
+ m = re.match(r'Token: +(.*)$', l)
+ if m is not None:
+ new_token = m.group(1)
+
+ self.assertTrue(new_token)
+
+ print("New token is %r" % new_token)
+
+ self.run_hashclient([
+ "--address", self.auth_server_address,
+ "--login", user["username"],
+ "--password", new_token,
+ "get-user"
+ ], check=True)
+
+ def test_set_user_perms(self):
+ admin_client = self.start_auth_server()
+
+ user = admin_client.new_user("test-user", ["@read"])
+
+ self.run_hashclient([
+ "--address", self.auth_server_address,
+ "--login", admin_client.username,
+ "--password", admin_client.password,
+ "set-user-perms",
+ "-u", user["username"],
+ "@read", "@report",
+ ], check=True)
+
+ new_user = admin_client.get_user(user["username"])
+
+ self.assertEqual(set(new_user["permissions"]), {"@read", "@report"})
+
+ def test_get_user(self):
+ admin_client = self.start_auth_server()
+
+ user = admin_client.new_user("test-user", ["@read"])
+
+ p = self.run_hashclient([
+ "--address", self.auth_server_address,
+ "--login", admin_client.username,
+ "--password", admin_client.password,
+ "get-user",
+ "-u", user["username"],
+ ], check=True)
+
+ self.assertIn("Username:", p.stdout)
+ self.assertIn("Permissions:", p.stdout)
+
+ p = self.run_hashclient([
+ "--address", self.auth_server_address,
+ "--login", user["username"],
+ "--password", user["token"],
+ "get-user",
+ ], check=True)
+
+ self.assertIn("Username:", p.stdout)
+ self.assertIn("Permissions:", p.stdout)
+
+ def test_get_all_users(self):
+ admin_client = self.start_auth_server()
+
+ admin_client.new_user("test-user1", ["@read"])
+ admin_client.new_user("test-user2", ["@read"])
+
+ p = self.run_hashclient([
+ "--address", self.auth_server_address,
+ "--login", admin_client.username,
+ "--password", admin_client.password,
+ "get-all-users",
+ ], check=True)
+
+ self.assertIn("admin", p.stdout)
+ self.assertIn("test-user1", p.stdout)
+ self.assertIn("test-user2", p.stdout)
+
+ def test_new_user(self):
+ admin_client = self.start_auth_server()
+
+ p = self.run_hashclient([
+ "--address", self.auth_server_address,
+ "--login", admin_client.username,
+ "--password", admin_client.password,
+ "new-user",
+ "-u", "test-user",
+ "@read", "@report",
+ ], check=True)
+
+ new_token = None
+ for l in p.stdout.splitlines():
+ l = l.rstrip()
+ m = re.match(r'Token: +(.*)$', l)
+ if m is not None:
+ new_token = m.group(1)
+
+ self.assertTrue(new_token)
+
+ user = {
+ "username": "test-user",
+ "token": new_token,
+ }
+
+ self.assertUserPerms(user, ["@read", "@report"])
+
+ def test_delete_user(self):
+ admin_client = self.start_auth_server()
+
+ user = admin_client.new_user("test-user", ["@read"])
+
+ p = self.run_hashclient([
+ "--address", self.auth_server_address,
+ "--login", admin_client.username,
+ "--password", admin_client.password,
+ "delete-user",
+ "-u", user["username"],
+ ], check=True)
+
+ self.assertIsNone(admin_client.get_user(user["username"]))
+
+ def test_get_db_usage(self):
+ p = self.run_hashclient([
+ "--address", self.server_address,
+ "get-db-usage",
+ ], check=True)
+
+ def test_get_db_query_columns(self):
+ p = self.run_hashclient([
+ "--address", self.server_address,
+ "get-db-query-columns",
+ ], check=True)
+
+
class TestHashEquivalenceUnixServer(HashEquivalenceTestSetup, HashEquivalenceCommonTests, unittest.TestCase):
def get_server_addr(self, server_idx):
return "unix://" + os.path.join(self.temp_dir.name, 'sock%d' % server_idx)
@@ -483,3 +1097,77 @@ class TestHashEquivalenceTCPServer(HashEquivalenceTestSetup, HashEquivalenceComm
# If IPv6 is enabled, it should be safe to use localhost directly, in general
# case it is more reliable to resolve the IP address explicitly.
return socket.gethostbyname("localhost") + ":0"
+
+
+class TestHashEquivalenceWebsocketServer(HashEquivalenceTestSetup, HashEquivalenceCommonTests, unittest.TestCase):
+ def setUp(self):
+ try:
+ import websockets
+ except ImportError as e:
+ self.skipTest(str(e))
+
+ super().setUp()
+
+ def get_server_addr(self, server_idx):
+ # Some hosts cause asyncio module to misbehave, when IPv6 is not enabled.
+ # If IPv6 is enabled, it should be safe to use localhost directly, in general
+ # case it is more reliable to resolve the IP address explicitly.
+ host = socket.gethostbyname("localhost")
+ return "ws://%s:0" % host
+
+
+class TestHashEquivalenceWebsocketsSQLAlchemyServer(TestHashEquivalenceWebsocketServer):
+ def setUp(self):
+ try:
+ import sqlalchemy
+ import aiosqlite
+ except ImportError as e:
+ self.skipTest(str(e))
+
+ super().setUp()
+
+ def make_dbpath(self):
+ return "sqlite+aiosqlite:///%s" % os.path.join(self.temp_dir.name, "db%d.sqlite" % self.server_index)
+
+
+class TestHashEquivalenceExternalServer(HashEquivalenceTestSetup, HashEquivalenceCommonTests, unittest.TestCase):
+ def get_env(self, name):
+ v = os.environ.get(name)
+ if not v:
+ self.skipTest(f'{name} not defined to test an external server')
+ return v
+
+ def start_test_server(self):
+ return self.get_env('BB_TEST_HASHSERV')
+
+ def start_server(self, *args, **kwargs):
+ self.skipTest('Cannot start local server when testing external servers')
+
+ def start_auth_server(self):
+
+ self.auth_server_address = self.server_address
+ self.admin_client = self.start_client(
+ self.server_address,
+ username=self.get_env('BB_TEST_HASHSERV_USERNAME'),
+ password=self.get_env('BB_TEST_HASHSERV_PASSWORD'),
+ )
+ return self.admin_client
+
+ def setUp(self):
+ super().setUp()
+ if "BB_TEST_HASHSERV_USERNAME" in os.environ:
+ self.client = self.start_client(
+ self.server_address,
+ username=os.environ["BB_TEST_HASHSERV_USERNAME"],
+ password=os.environ["BB_TEST_HASHSERV_PASSWORD"],
+ )
+ self.client.remove({"method": self.METHOD})
+
+ def tearDown(self):
+ self.client.remove({"method": self.METHOD})
+ super().tearDown()
+
+
+ def test_auth_get_all_users(self):
+ self.skipTest("Cannot test all users with external server")
+
diff --git a/poky/bitbake/lib/prserv/client.py b/poky/bitbake/lib/prserv/client.py
index 69ab7a4ac9..6b81356fac 100644
--- a/poky/bitbake/lib/prserv/client.py
+++ b/poky/bitbake/lib/prserv/client.py
@@ -14,28 +14,28 @@ class PRAsyncClient(bb.asyncrpc.AsyncClient):
super().__init__('PRSERVICE', '1.0', logger)
async def getPR(self, version, pkgarch, checksum):
- response = await self.send_message(
+ response = await self.invoke(
{'get-pr': {'version': version, 'pkgarch': pkgarch, 'checksum': checksum}}
)
if response:
return response['value']
async def importone(self, version, pkgarch, checksum, value):
- response = await self.send_message(
+ response = await self.invoke(
{'import-one': {'version': version, 'pkgarch': pkgarch, 'checksum': checksum, 'value': value}}
)
if response:
return response['value']
async def export(self, version, pkgarch, checksum, colinfo):
- response = await self.send_message(
+ response = await self.invoke(
{'export': {'version': version, 'pkgarch': pkgarch, 'checksum': checksum, 'colinfo': colinfo}}
)
if response:
return (response['metainfo'], response['datainfo'])
async def is_readonly(self):
- response = await self.send_message(
+ response = await self.invoke(
{'is-readonly': {}}
)
if response:
diff --git a/poky/bitbake/lib/prserv/serv.py b/poky/bitbake/lib/prserv/serv.py
index c686b2065c..62d3b5a01c 100644
--- a/poky/bitbake/lib/prserv/serv.py
+++ b/poky/bitbake/lib/prserv/serv.py
@@ -20,8 +20,8 @@ PIDPREFIX = "/tmp/PRServer_%s_%s.pid"
singleton = None
class PRServerClient(bb.asyncrpc.AsyncServerConnection):
- def __init__(self, reader, writer, table, read_only):
- super().__init__(reader, writer, 'PRSERVICE', logger)
+ def __init__(self, socket, table, read_only):
+ super().__init__(socket, 'PRSERVICE', logger)
self.handlers.update({
'get-pr': self.handle_get_pr,
'import-one': self.handle_import_one,
@@ -36,12 +36,12 @@ class PRServerClient(bb.asyncrpc.AsyncServerConnection):
async def dispatch_message(self, msg):
try:
- await super().dispatch_message(msg)
+ return await super().dispatch_message(msg)
except:
self.table.sync()
raise
-
- self.table.sync_if_dirty()
+ else:
+ self.table.sync_if_dirty()
async def handle_get_pr(self, request):
version = request['version']
@@ -57,7 +57,7 @@ class PRServerClient(bb.asyncrpc.AsyncServerConnection):
except sqlite3.Error as exc:
logger.error(str(exc))
- self.write_message(response)
+ return response
async def handle_import_one(self, request):
response = None
@@ -71,7 +71,7 @@ class PRServerClient(bb.asyncrpc.AsyncServerConnection):
if value is not None:
response = {'value': value}
- self.write_message(response)
+ return response
async def handle_export(self, request):
version = request['version']
@@ -85,12 +85,10 @@ class PRServerClient(bb.asyncrpc.AsyncServerConnection):
logger.error(str(exc))
metainfo = datainfo = None
- response = {'metainfo': metainfo, 'datainfo': datainfo}
- self.write_message(response)
+ return {'metainfo': metainfo, 'datainfo': datainfo}
async def handle_is_readonly(self, request):
- response = {'readonly': self.read_only}
- self.write_message(response)
+ return {'readonly': self.read_only}
class PRServer(bb.asyncrpc.AsyncServer):
def __init__(self, dbfile, read_only=False):
@@ -99,20 +97,23 @@ class PRServer(bb.asyncrpc.AsyncServer):
self.table = None
self.read_only = read_only
- def accept_client(self, reader, writer):
- return PRServerClient(reader, writer, self.table, self.read_only)
+ def accept_client(self, socket):
+ return PRServerClient(socket, self.table, self.read_only)
- def _serve_forever(self):
+ def start(self):
+ tasks = super().start()
self.db = prserv.db.PRData(self.dbfile, read_only=self.read_only)
self.table = self.db["PRMAIN"]
logger.info("Started PRServer with DBfile: %s, Address: %s, PID: %s" %
(self.dbfile, self.address, str(os.getpid())))
- super()._serve_forever()
+ return tasks
+ async def stop(self):
self.table.sync_if_dirty()
self.db.disconnect()
+ await super().stop()
def signal_handler(self):
super().signal_handler()
@@ -129,7 +130,7 @@ class PRServSingleton(object):
def start(self):
self.prserv = PRServer(self.dbfile)
self.prserv.start_tcp_server(socket.gethostbyname(self.host), self.port)
- self.process = self.prserv.serve_as_process()
+ self.process = self.prserv.serve_as_process(log_level=logging.WARNING)
if not self.prserv.address:
raise PRServiceConfigError
@@ -344,9 +345,9 @@ def auto_shutdown():
def ping(host, port):
from . import client
- conn = client.PRClient()
- conn.connect_tcp(host, port)
- return conn.ping()
+ with client.PRClient() as conn:
+ conn.connect_tcp(host, port)
+ return conn.ping()
def connect(host, port):
from . import client
diff --git a/poky/bitbake/lib/toaster/orm/models.py b/poky/bitbake/lib/toaster/orm/models.py
index 0d503a5142..1098ad3fd1 100644
--- a/poky/bitbake/lib/toaster/orm/models.py
+++ b/poky/bitbake/lib/toaster/orm/models.py
@@ -1389,9 +1389,6 @@ class Machine(models.Model):
return "Machine " + self.name + "(" + self.description + ")"
-
-
-
class BitbakeVersion(models.Model):
name = models.CharField(max_length=32, unique = True)
@@ -1853,6 +1850,8 @@ def signal_runbuilds():
os.kill(int(pidf.read()), SIGUSR1)
except FileNotFoundError:
logger.info("Stopping existing runbuilds: no current process found")
+ except ProcessLookupError:
+ logger.warning("Stopping existing runbuilds: process lookup not found")
class Distro(models.Model):
search_allowed_fields = ["name", "description", "layer_version__layer__name"]
diff --git a/poky/bitbake/lib/toaster/pytest.ini b/poky/bitbake/lib/toaster/pytest.ini
new file mode 100644
index 0000000000..f07076b7ea
--- /dev/null
+++ b/poky/bitbake/lib/toaster/pytest.ini
@@ -0,0 +1,19 @@
+# -- FILE: pytest.ini (or tox.ini)
+[pytest]
+DJANGO_SETTINGS_MODULE = toastermain.settings_test
+
+python_files = db/test_*.py commands/test_*.py views/test_*.py browser/test_*.py functional/test_*.py
+
+# --create-db - force re creation of the test database
+# https://pytest-django.readthedocs.io/en/latest/database.html#create-db-force-re-creation-of-the-test-database
+
+# --html=report.html --self-contained-html
+# https://docs.pytest.org/en/latest/usage.html#creating-html-reports
+# https://pytest-html.readthedocs.io/en/latest/user_guide.html#creating-a-self-contained-report
+addopts = --create-db --html="Toaster Tests Report.html" --self-contained-html
+
+# Define environment variables using pytest-env
+# A pytest plugin that enables you to set environment variables in the pytest.ini file.
+# https://pypi.org/project/pytest-env/
+env =
+ TOASTER_BUILDSERVER=1
diff --git a/poky/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py b/poky/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py
index 9a4e27a3bc..e0ac43768e 100644
--- a/poky/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py
+++ b/poky/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py
@@ -33,7 +33,13 @@ def create_selenium_driver(cls,browser='chrome'):
browser = env_browser
if browser == 'chrome':
- return webdriver.Chrome()
+ options = webdriver.ChromeOptions()
+ options.add_argument('headless')
+ options.add_argument('--disable-infobars')
+ options.add_argument('--disable-dev-shm-usage')
+ options.add_argument('--no-sandbox')
+ options.add_argument('--remote-debugging-port=9222')
+ return webdriver.Chrome(options=options)
elif browser == 'firefox':
return webdriver.Firefox()
elif browser == 'marionette':
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_all_builds_page.py b/poky/bitbake/lib/toaster/tests/browser/test_all_builds_page.py
index d4312bb35b..4e9b9fd760 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_all_builds_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_all_builds_page.py
@@ -7,13 +7,16 @@
# SPDX-License-Identifier: GPL-2.0-only
#
-import re, time
+import re
+import time
from django.urls import reverse
+from selenium.webdriver.support.select import Select
from django.utils import timezone
+from bldcontrol.models import BuildRequest
from tests.browser.selenium_helpers import SeleniumTestCase
-from orm.models import BitbakeVersion, Release, Project, Build, Target
+from orm.models import BitbakeVersion, Layer, Layer_Version, Recipe, Release, Project, Build, Target, Task
from selenium.webdriver.common.by import By
@@ -102,6 +105,66 @@ class TestAllBuildsPage(SeleniumTestCase):
return found_row
+ def _get_create_builds(self, **kwargs):
+ """ Create a build and return the build object """
+ build1 = Build.objects.create(**self.project1_build_success)
+ build2 = Build.objects.create(**self.project1_build_failure)
+
+ # add some targets to these builds so they have recipe links
+ # (and so we can find the row in the ToasterTable corresponding to
+ # a particular build)
+ Target.objects.create(build=build1, target='foo')
+ Target.objects.create(build=build2, target='bar')
+
+ if kwargs:
+ # Create kwargs.get('success') builds with success status with target
+ # and kwargs.get('failure') builds with failure status with target
+ for i in range(kwargs.get('success', 0)):
+ now = timezone.now()
+ self.project1_build_success['started_on'] = now
+ self.project1_build_success[
+ 'completed_on'] = now - timezone.timedelta(days=i)
+ build = Build.objects.create(**self.project1_build_success)
+ Target.objects.create(build=build,
+ target=f'{i}_success_recipe',
+ task=f'{i}_success_task')
+
+ self._set_buildRequest_and_task_on_build(build)
+ for i in range(kwargs.get('failure', 0)):
+ now = timezone.now()
+ self.project1_build_failure['started_on'] = now
+ self.project1_build_failure[
+ 'completed_on'] = now - timezone.timedelta(days=i)
+ build = Build.objects.create(**self.project1_build_failure)
+ Target.objects.create(build=build,
+ target=f'{i}_fail_recipe',
+ task=f'{i}_fail_task')
+ self._set_buildRequest_and_task_on_build(build)
+ return build1, build2
+
+ def _create_recipe(self):
+ """ Add a recipe to the database and return it """
+ layer = Layer.objects.create()
+ layer_version = Layer_Version.objects.create(layer=layer)
+ return Recipe.objects.create(name='recipe_foo', layer_version=layer_version)
+
+ def _set_buildRequest_and_task_on_build(self, build):
+ """ Set buildRequest and task on build """
+ build.recipes_parsed = 1
+ build.save()
+ buildRequest = BuildRequest.objects.create(
+ build=build,
+ project=self.project1,
+ state=BuildRequest.REQ_COMPLETED)
+ build.build_request = buildRequest
+ recipe = self._create_recipe()
+ task = Task.objects.create(build=build,
+ recipe=recipe,
+ task_name='task',
+ outcome=Task.OUTCOME_SUCCESS)
+ task.save()
+ build.save()
+
def test_show_tasks_with_suffix(self):
""" Task should be shown as suffix on build name """
build = Build.objects.create(**self.project1_build_success)
@@ -128,7 +191,8 @@ class TestAllBuildsPage(SeleniumTestCase):
but should be shown for other builds
"""
build1 = Build.objects.create(**self.project1_build_success)
- default_build = Build.objects.create(**self.default_project_build_success)
+ default_build = Build.objects.create(
+ **self.default_project_build_success)
url = reverse('all-builds')
self.get(url)
@@ -146,7 +210,6 @@ class TestAllBuildsPage(SeleniumTestCase):
self.assertEqual(len(run_again_button), 0,
'should not see a rebuild button for cli builds')
-
def test_tooltips_on_project_name(self):
"""
Test tooltips shown next to project name in the main table
@@ -188,14 +251,7 @@ class TestAllBuildsPage(SeleniumTestCase):
recent builds area; failed builds should not have links on the time column,
or in the recent builds area
"""
- build1 = Build.objects.create(**self.project1_build_success)
- build2 = Build.objects.create(**self.project1_build_failure)
-
- # add some targets to these builds so they have recipe links
- # (and so we can find the row in the ToasterTable corresponding to
- # a particular build)
- Target.objects.create(build=build1, target='foo')
- Target.objects.create(build=build2, target='bar')
+ build1, build2 = self._get_create_builds()
url = reverse('all-builds')
self.get(url)
@@ -223,3 +279,185 @@ class TestAllBuildsPage(SeleniumTestCase):
links = build2_row.find_elements(By.CSS_SELECTOR, 'td.time a')
msg = 'should not be a link on the build time for a failed build'
self.assertEquals(len(links), 0, msg)
+
+ def test_builds_table_search_box(self):
+ """ Test the search box in the builds table on the all builds page """
+ self._get_create_builds()
+
+ url = reverse('all-builds')
+ self.get(url)
+
+ # Check search box is present and works
+ self.wait_until_present('#allbuildstable tbody tr')
+ search_box = self.find('#search-input-allbuildstable')
+ self.assertTrue(search_box.is_displayed())
+
+ # Check that we can search for a build by recipe name
+ search_box.send_keys('foo')
+ search_btn = self.find('#search-submit-allbuildstable')
+ search_btn.click()
+ self.wait_until_present('#allbuildstable tbody tr')
+ rows = self.find_all('#allbuildstable tbody tr')
+ self.assertTrue(len(rows) >= 1)
+
+ def test_filtering_on_failure_tasks_column(self):
+ """ Test the filtering on failure tasks column in the builds table on the all builds page """
+ self._get_create_builds(success=10, failure=10)
+
+ url = reverse('all-builds')
+ self.get(url)
+
+ # Check filtering on failure tasks column
+ self.wait_until_present('#allbuildstable tbody tr')
+ failed_tasks_filter = self.find('#failed_tasks_filter')
+ failed_tasks_filter.click()
+ # Check popup is visible
+ time.sleep(1)
+ self.wait_until_present('#filter-modal-allbuildstable')
+ self.assertTrue(
+ self.find('#filter-modal-allbuildstable').is_displayed())
+ # Check that we can filter by failure tasks
+ build_without_failure_tasks = self.find(
+ '#failed_tasks_filter\\:without_failed_tasks')
+ build_without_failure_tasks.click()
+ # click on apply button
+ self.find('#filter-modal-allbuildstable .btn-primary').click()
+ self.wait_until_present('#allbuildstable tbody tr')
+ # Check if filter is applied, by checking if failed_tasks_filter has btn-primary class
+ self.assertTrue(self.find('#failed_tasks_filter').get_attribute(
+ 'class').find('btn-primary') != -1)
+
+ def test_filtering_on_completedOn_column(self):
+ """ Test the filtering on completed_on column in the builds table on the all builds page """
+ self._get_create_builds(success=10, failure=10)
+
+ url = reverse('all-builds')
+ self.get(url)
+
+ # Check filtering on failure tasks column
+ self.wait_until_present('#allbuildstable tbody tr')
+ completed_on_filter = self.find('#completed_on_filter')
+ completed_on_filter.click()
+ # Check popup is visible
+ time.sleep(1)
+ self.wait_until_present('#filter-modal-allbuildstable')
+ self.assertTrue(
+ self.find('#filter-modal-allbuildstable').is_displayed())
+ # Check that we can filter by failure tasks
+ build_without_failure_tasks = self.find(
+ '#completed_on_filter\\:date_range')
+ build_without_failure_tasks.click()
+ # click on apply button
+ self.find('#filter-modal-allbuildstable .btn-primary').click()
+ self.wait_until_present('#allbuildstable tbody tr')
+ # Check if filter is applied, by checking if completed_on_filter has btn-primary class
+ self.assertTrue(self.find('#completed_on_filter').get_attribute(
+ 'class').find('btn-primary') != -1)
+
+ # Filter by date range
+ self.find('#completed_on_filter').click()
+ self.wait_until_present('#filter-modal-allbuildstable')
+ date_ranges = self.driver.find_elements(
+ By.XPATH, '//input[@class="form-control hasDatepicker"]')
+ today = timezone.now()
+ yestersday = today - timezone.timedelta(days=1)
+ time.sleep(1)
+ date_ranges[0].send_keys(yestersday.strftime('%Y-%m-%d'))
+ date_ranges[1].send_keys(today.strftime('%Y-%m-%d'))
+ self.find('#filter-modal-allbuildstable .btn-primary').click()
+ self.wait_until_present('#allbuildstable tbody tr')
+ self.assertTrue(self.find('#completed_on_filter').get_attribute(
+ 'class').find('btn-primary') != -1)
+ # Check if filter is applied, number of builds displayed should be 6
+ time.sleep(1)
+ self.assertTrue(len(self.find_all('#allbuildstable tbody tr')) == 6)
+
+ def test_builds_table_editColumn(self):
+ """ Test the edit column feature in the builds table on the all builds page """
+ self._get_create_builds(success=10, failure=10)
+
+ def test_edit_column(check_box_id):
+ # Check that we can hide/show table column
+ check_box = self.find(f'#{check_box_id}')
+ th_class = str(check_box_id).replace('checkbox-', '')
+ if check_box.is_selected():
+ # check if column is visible in table
+ self.assertTrue(
+ self.find(
+ f'#allbuildstable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table"
+ )
+ check_box.click()
+ # check if column is hidden in table
+ self.assertFalse(
+ self.find(
+ f'#allbuildstable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table"
+ )
+ else:
+ # check if column is hidden in table
+ self.assertFalse(
+ self.find(
+ f'#allbuildstable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table"
+ )
+ check_box.click()
+ # check if column is visible in table
+ self.assertTrue(
+ self.find(
+ f'#allbuildstable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table"
+ )
+ url = reverse('all-builds')
+ self.get(url)
+ self.wait_until_present('#allbuildstable tbody tr')
+
+ # Check edit column
+ edit_column = self.find('#edit-columns-button')
+ self.assertTrue(edit_column.is_displayed())
+ edit_column.click()
+ # Check dropdown is visible
+ self.wait_until_visible('ul.dropdown-menu.editcol')
+
+ # Check that we can hide the edit column
+ test_edit_column('checkbox-errors_no')
+ test_edit_column('checkbox-failed_tasks')
+ test_edit_column('checkbox-image_files')
+ test_edit_column('checkbox-project')
+ test_edit_column('checkbox-started_on')
+ test_edit_column('checkbox-time')
+ test_edit_column('checkbox-warnings_no')
+
+ def test_builds_table_show_rows(self):
+ """ Test the show rows feature in the builds table on the all builds page """
+ self._get_create_builds(success=100, failure=100)
+
+ def test_show_rows(row_to_show, show_row_link):
+ # Check that we can show rows == row_to_show
+ show_row_link.select_by_value(str(row_to_show))
+ self.wait_until_present('#allbuildstable tbody tr')
+ time.sleep(1)
+ self.assertTrue(
+ len(self.find_all('#allbuildstable tbody tr')) == row_to_show
+ )
+
+ url = reverse('all-builds')
+ self.get(url)
+ self.wait_until_present('#allbuildstable tbody tr')
+
+ show_rows = self.driver.find_elements(
+ By.XPATH,
+ '//select[@class="form-control pagesize-allbuildstable"]'
+ )
+ # Check show rows
+ for show_row_link in show_rows:
+ show_row_link = Select(show_row_link)
+ test_show_rows(10, show_row_link)
+ test_show_rows(25, show_row_link)
+ test_show_rows(50, show_row_link)
+ test_show_rows(100, show_row_link)
+ test_show_rows(150, show_row_link)
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_all_projects_page.py b/poky/bitbake/lib/toaster/tests/browser/test_all_projects_page.py
index 3389d32366..a880dbcc68 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_all_projects_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_all_projects_page.py
@@ -8,9 +8,11 @@
#
import re
+import time
from django.urls import reverse
from django.utils import timezone
+from selenium.webdriver.support.select import Select
from tests.browser.selenium_helpers import SeleniumTestCase
from orm.models import BitbakeVersion, Release, Project, Build
@@ -37,6 +39,17 @@ class TestAllProjectsPage(SeleniumTestCase):
self.release = None
+ def _create_projects(self, nb_project=10):
+ projects = []
+ for i in range(1, nb_project + 1):
+ projects.append(
+ Project(
+ name='test project {}'.format(i),
+ release=self.release,
+ )
+ )
+ Project.objects.bulk_create(projects)
+
def _add_build_to_default_project(self):
""" Add a build to the default project (not used in all tests) """
now = timezone.now()
@@ -205,3 +218,116 @@ class TestAllProjectsPage(SeleniumTestCase):
expected_url = reverse('project', args=(self.project.id,))
msg = 'link on project name should point to configuration but was %s' % link_url
self.assertTrue(link_url.endswith(expected_url), msg)
+
+ def test_allProject_table_search_box(self):
+ """ Test the search box in the all project table on the all projects page """
+ self._create_projects()
+
+ url = reverse('all-projects')
+ self.get(url)
+
+ # Chseck search box is present and works
+ self.wait_until_present('#projectstable tbody tr')
+ search_box = self.find('#search-input-projectstable')
+ self.assertTrue(search_box.is_displayed())
+
+ # Check that we can search for a project by project name
+ search_box.send_keys('test project 10')
+ search_btn = self.find('#search-submit-projectstable')
+ search_btn.click()
+ self.wait_until_present('#projectstable tbody tr')
+ time.sleep(1)
+ rows = self.find_all('#projectstable tbody tr')
+ self.assertTrue(len(rows) == 1)
+
+ def test_allProject_table_editColumn(self):
+ """ Test the edit column feature in the projects table on the all projects page """
+ self._create_projects()
+
+ def test_edit_column(check_box_id):
+ # Check that we can hide/show table column
+ check_box = self.find(f'#{check_box_id}')
+ th_class = str(check_box_id).replace('checkbox-', '')
+ if check_box.is_selected():
+ # check if column is visible in table
+ self.assertTrue(
+ self.find(
+ f'#projectstable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table"
+ )
+ check_box.click()
+ # check if column is hidden in table
+ self.assertFalse(
+ self.find(
+ f'#projectstable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table"
+ )
+ else:
+ # check if column is hidden in table
+ self.assertFalse(
+ self.find(
+ f'#projectstable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table"
+ )
+ check_box.click()
+ # check if column is visible in table
+ self.assertTrue(
+ self.find(
+ f'#projectstable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table"
+ )
+ url = reverse('all-projects')
+ self.get(url)
+ self.wait_until_present('#projectstable tbody tr')
+
+ # Check edit column
+ edit_column = self.find('#edit-columns-button')
+ self.assertTrue(edit_column.is_displayed())
+ edit_column.click()
+ # Check dropdown is visible
+ self.wait_until_visible('ul.dropdown-menu.editcol')
+
+ # Check that we can hide the edit column
+ test_edit_column('checkbox-errors')
+ test_edit_column('checkbox-image_files')
+ test_edit_column('checkbox-last_build_outcome')
+ test_edit_column('checkbox-recipe_name')
+ test_edit_column('checkbox-warnings')
+
+ def test_allProject_table_show_rows(self):
+ """ Test the show rows feature in the projects table on the all projects page """
+ self._create_projects(nb_project=200)
+
+ def test_show_rows(row_to_show, show_row_link):
+ # Check that we can show rows == row_to_show
+ show_row_link.select_by_value(str(row_to_show))
+ self.wait_until_present('#projectstable tbody tr')
+ sleep_time = 1
+ if row_to_show == 150:
+ # wait more time for 150 rows
+ sleep_time = 2
+ time.sleep(sleep_time)
+ self.assertTrue(
+ len(self.find_all('#projectstable tbody tr')) == row_to_show
+ )
+
+ url = reverse('all-projects')
+ self.get(url)
+ self.wait_until_present('#projectstable tbody tr')
+
+ show_rows = self.driver.find_elements(
+ By.XPATH,
+ '//select[@class="form-control pagesize-projectstable"]'
+ )
+ # Check show rows
+ for show_row_link in show_rows:
+ show_row_link = Select(show_row_link)
+ test_show_rows(10, show_row_link)
+ test_show_rows(25, show_row_link)
+ test_show_rows(50, show_row_link)
+ test_show_rows(100, show_row_link)
+ test_show_rows(150, show_row_link)
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_delete_project.py b/poky/bitbake/lib/toaster/tests/browser/test_delete_project.py
new file mode 100644
index 0000000000..1941777ccc
--- /dev/null
+++ b/poky/bitbake/lib/toaster/tests/browser/test_delete_project.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+# BitBake Toaster UI tests implementation
+#
+# Copyright (C) 2023 Savoir-faire Linux Inc
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+import pytest
+from django.urls import reverse
+from selenium.webdriver.support.ui import Select
+from tests.browser.selenium_helpers import SeleniumTestCase
+from orm.models import BitbakeVersion, Project, Release
+from selenium.webdriver.common.by import By
+
+class TestDeleteProject(SeleniumTestCase):
+
+ def setUp(self):
+ bitbake, _ = BitbakeVersion.objects.get_or_create(
+ name="master",
+ giturl="git://master",
+ branch="master",
+ dirpath="master")
+
+ self.release, _ = Release.objects.get_or_create(
+ name="master",
+ description="Yocto Project master",
+ branch_name="master",
+ helptext="latest",
+ bitbake_version=bitbake)
+
+ Release.objects.get_or_create(
+ name="foo",
+ description="Yocto Project foo",
+ branch_name="foo",
+ helptext="latest",
+ bitbake_version=bitbake)
+
+ @pytest.mark.django_db
+ def test_delete_project(self):
+ """ Test delete a project
+ - Check delete modal is visible
+ - Check delete modal has right text
+ - Confirm delete
+ - Check project is deleted
+ """
+ project_name = "project_to_delete"
+ url = reverse('newproject')
+ self.get(url)
+ self.enter_text('#new-project-name', project_name)
+ select = Select(self.find('#projectversion'))
+ select.select_by_value(str(self.release.pk))
+ self.click("#create-project-button")
+ # We should get redirected to the new project's page with the
+ # notification at the top
+ element = self.wait_until_visible('#project-created-notification')
+ self.assertTrue(project_name in element.text,
+ "New project name not in new project notification")
+ self.assertTrue(Project.objects.filter(name=project_name).count(),
+ "New project not found in database")
+
+ # Delete project
+ delete_project_link = self.driver.find_element(
+ By.XPATH, '//a[@href="#delete-project-modal"]')
+ delete_project_link.click()
+
+ # Check delete modal is visible
+ self.wait_until_visible('#delete-project-modal')
+
+ # Check delete modal has right text
+ modal_header_text = self.find('#delete-project-modal .modal-header').text
+ self.assertTrue(
+ "Are you sure you want to delete this project?" in modal_header_text,
+ "Delete project modal header text is wrong")
+
+ modal_body_text = self.find('#delete-project-modal .modal-body').text
+ self.assertTrue(
+ "Cancel its builds currently in progress" in modal_body_text,
+ "Modal body doesn't contain: Cancel its builds currently in progress")
+ self.assertTrue(
+ "Remove its configuration information" in modal_body_text,
+ "Modal body doesn't contain: Remove its configuration information")
+ self.assertTrue(
+ "Remove its imported layers" in modal_body_text,
+ "Modal body doesn't contain: Remove its imported layers")
+ self.assertTrue(
+ "Remove its custom images" in modal_body_text,
+ "Modal body doesn't contain: Remove its custom images")
+ self.assertTrue(
+ "Remove all its build information" in modal_body_text,
+ "Modal body doesn't contain: Remove all its build information")
+
+ # Confirm delete
+ delete_btn = self.find('#delete-project-confirmed')
+ delete_btn.click()
+
+ # Check project is deleted
+ self.wait_until_visible('#change-notification')
+ delete_notification = self.find('#change-notification-msg')
+ self.assertTrue("You have deleted 1 project:" in delete_notification.text)
+ self.assertTrue(project_name in delete_notification.text)
+ self.assertFalse(Project.objects.filter(name=project_name).exists(),
+ "Project not deleted from database")
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_landing_page.py b/poky/bitbake/lib/toaster/tests/browser/test_landing_page.py
index 8bb64b9f3e..7ec52a4b40 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_landing_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_landing_page.py
@@ -10,8 +10,9 @@
from django.urls import reverse
from django.utils import timezone
from tests.browser.selenium_helpers import SeleniumTestCase
+from selenium.webdriver.common.by import By
-from orm.models import Project, Build
+from orm.models import Layer, Layer_Version, Project, Build
class TestLandingPage(SeleniumTestCase):
""" Tests for redirects on the landing page """
@@ -29,6 +30,124 @@ class TestLandingPage(SeleniumTestCase):
self.project.is_default = True
self.project.save()
+ def test_icon_info_visible_and_clickable(self):
+ """ Test that the information icon is visible and clickable """
+ self.get(reverse('landing'))
+ info_sign = self.find('#toaster-version-info-sign')
+
+ # check that the info sign is visible
+ self.assertTrue(info_sign.is_displayed())
+
+ # check that the info sign is clickable
+ # and info modal is appearing when clicking on the info sign
+ info_sign.click() # click on the info sign make attribute 'aria-describedby' visible
+ info_model_id = info_sign.get_attribute('aria-describedby')
+ info_modal = self.find(f'#{info_model_id}')
+ self.assertTrue(info_modal.is_displayed())
+ self.assertTrue("Toaster version information" in info_modal.text)
+
+ def test_documentation_link_displayed(self):
+ """ Test that the documentation link is displayed """
+ self.get(reverse('landing'))
+ documentation_link = self.find('#navbar-docs > a')
+
+ # check that the documentation link is visible
+ self.assertTrue(documentation_link.is_displayed())
+
+ # check browser open new tab toaster manual when clicking on the documentation link
+ self.assertEqual(documentation_link.get_attribute('target') , '_blank')
+ self.assertEqual(
+ documentation_link.get_attribute('href'),
+ 'http://docs.yoctoproject.org/toaster-manual/index.html#toaster-user-manual')
+ self.assertTrue("Documentation" in documentation_link.text)
+
+ def test_openembedded_jumbotron_link_visible_and_clickable(self):
+ """ Test OpenEmbedded link jumbotron is visible and clickable: """
+ self.get(reverse('landing'))
+ jumbotron = self.find('.jumbotron')
+
+ # check OpenEmbedded
+ openembedded = jumbotron.find_element(By.LINK_TEXT, 'OpenEmbedded')
+ self.assertTrue(openembedded.is_displayed())
+ openembedded.click()
+ self.assertTrue("openembedded.org" in self.driver.current_url)
+
+ def test_bitbake_jumbotron_link_visible_and_clickable(self):
+ """ Test BitBake link jumbotron is visible and clickable: """
+ self.get(reverse('landing'))
+ jumbotron = self.find('.jumbotron')
+
+ # check BitBake
+ bitbake = jumbotron.find_element(By.LINK_TEXT, 'BitBake')
+ self.assertTrue(bitbake.is_displayed())
+ bitbake.click()
+ self.assertTrue("docs.yoctoproject.org/bitbake.html" in self.driver.current_url)
+
+ def test_yoctoproject_jumbotron_link_visible_and_clickable(self):
+ """ Test Yocto Project link jumbotron is visible and clickable: """
+ self.get(reverse('landing'))
+ jumbotron = self.find('.jumbotron')
+
+ # check Yocto Project
+ yoctoproject = jumbotron.find_element(By.LINK_TEXT, 'Yocto Project')
+ self.assertTrue(yoctoproject.is_displayed())
+ yoctoproject.click()
+ self.assertTrue("yoctoproject.org" in self.driver.current_url)
+
+ def test_link_setup_using_toaster_visible_and_clickable(self):
+ """ Test big magenta button setting up and using toaster link in jumbotron
+ if visible and clickable
+ """
+ self.get(reverse('landing'))
+ jumbotron = self.find('.jumbotron')
+
+ # check Big magenta button
+ big_magenta_button = jumbotron.find_element(By.LINK_TEXT,
+ 'Toaster is ready to capture your command line builds'
+ )
+ self.assertTrue(big_magenta_button.is_displayed())
+ big_magenta_button.click()
+ self.assertTrue("docs.yoctoproject.org/toaster-manual/setup-and-use.html#setting-up-and-using-toaster" in self.driver.current_url)
+
+ def test_link_create_new_project_in_jumbotron_visible_and_clickable(self):
+ """ Test big blue button create new project jumbotron if visible and clickable """
+ # Create a layer and a layer version to make visible the big blue button
+ layer = Layer.objects.create(name='bar')
+ Layer_Version.objects.create(layer=layer)
+
+ self.get(reverse('landing'))
+ jumbotron = self.find('.jumbotron')
+
+ # check Big Blue button
+ big_blue_button = jumbotron.find_element(By.LINK_TEXT,
+ 'Create your first Toaster project to run manage builds'
+ )
+ self.assertTrue(big_blue_button.is_displayed())
+ big_blue_button.click()
+ self.assertTrue("toastergui/newproject/" in self.driver.current_url)
+
+ def test_toaster_manual_link_visible_and_clickable(self):
+ """ Test Read the Toaster manual link jumbotron is visible and clickable: """
+ self.get(reverse('landing'))
+ jumbotron = self.find('.jumbotron')
+
+ # check Read the Toaster manual
+ toaster_manual = jumbotron.find_element(By.LINK_TEXT, 'Read the Toaster manual')
+ self.assertTrue(toaster_manual.is_displayed())
+ toaster_manual.click()
+ self.assertTrue("https://docs.yoctoproject.org/toaster-manual/index.html#toaster-user-manual" in self.driver.current_url)
+
+ def test_contrib_to_toaster_link_visible_and_clickable(self):
+ """ Test Contribute to Toaster link jumbotron is visible and clickable: """
+ self.get(reverse('landing'))
+ jumbotron = self.find('.jumbotron')
+
+ # check Contribute to Toaster
+ contribute_to_toaster = jumbotron.find_element(By.LINK_TEXT, 'Contribute to Toaster')
+ self.assertTrue(contribute_to_toaster.is_displayed())
+ contribute_to_toaster.click()
+ self.assertTrue("wiki.yoctoproject.org/wiki/contribute_to_toaster" in str(self.driver.current_url).lower())
+
def test_only_default_project(self):
"""
No projects except default
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py b/poky/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py
index 71bdd2aafd..cb7b915bf0 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py
@@ -97,6 +97,8 @@ class TestLayerDetailsPage(SeleniumTestCase):
"Expecting any of \"%s\"but got \"%s\"" %
(self.initial_values, value))
+ # Make sure the input visible beofre sending keys
+ self.wait_until_visible("#layer-git input[type=text]")
inputs.send_keys("-edited")
# Save the new values
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py b/poky/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py
index a34a092884..949a94768a 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py
@@ -54,6 +54,7 @@ class TestMostRecentBuildsStates(SeleniumTestCase):
build.outcome = Build.IN_PROGRESS
build.recipes_to_parse = recipes_to_parse
build.recipes_parsed = 0
+ build.save()
build_request.state = BuildRequest.REQ_INPROGRESS
build_request.save()
@@ -100,7 +101,7 @@ class TestMostRecentBuildsStates(SeleniumTestCase):
'Tasks starting', 'build should show "tasks starting" status')
# first task finished; check tasks progress bar
- task1.order = 1
+ task1.outcome = Task.OUTCOME_SUCCESS
task1.save()
self.get(url)
@@ -117,7 +118,7 @@ class TestMostRecentBuildsStates(SeleniumTestCase):
element = Wait(self.driver).until(task_bar_updated, msg)
# last task finished; check tasks progress bar updates
- task2.order = 2
+ task2.outcome = Task.OUTCOME_SUCCESS
task2.save()
self.get(url)
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py b/poky/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py
index 6361f40347..34d1bd45c7 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py
@@ -48,8 +48,12 @@ class TestNewCustomImagePage(SeleniumTestCase):
self.recipe = Recipe.objects.create(
name='core-image-minimal',
layer_version=layer_version,
+ file_path='/tmp/core-image-minimal.bb',
is_image=True
)
+ # create a tmp file for the recipe
+ with open(self.recipe.file_path, 'w') as f:
+ f.write('foo')
# another project with a custom image already in it
project2 = Project.objects.create(name='whoop', release=release)
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_sample.py b/poky/bitbake/lib/toaster/tests/browser/test_sample.py
index b0067c21cd..73973778e4 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_sample.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_sample.py
@@ -27,3 +27,12 @@ class TestSample(SeleniumTestCase):
self.get(url)
brand_link = self.find('.toaster-navbar-brand a.brand')
self.assertEqual(brand_link.text.strip(), 'Toaster')
+
+ def test_no_builds_message(self):
+ """ Test that a message is shown when there are no builds """
+ url = reverse('all-builds')
+ self.get(url)
+ div_msg = self.find('#empty-state-allbuildstable .alert-info')
+
+ msg = 'Sorry - no data found'
+ self.assertEqual(div_msg.text, msg)
diff --git a/poky/bitbake/lib/toaster/tests/builds/buildtest.py b/poky/bitbake/lib/toaster/tests/builds/buildtest.py
index 13b51fb0d8..53cd7a9ffa 100644
--- a/poky/bitbake/lib/toaster/tests/builds/buildtest.py
+++ b/poky/bitbake/lib/toaster/tests/builds/buildtest.py
@@ -116,6 +116,15 @@ class BuildTest(unittest.TestCase):
project = Project.objects.create_project(name=BuildTest.PROJECT_NAME,
release=release)
+ passthrough_variable_names = ["SSTATE_DIR", "DL_DIR"]
+ for variable_name in passthrough_variable_names:
+ current_variable = os.environ.get(variable_name)
+ if current_variable:
+ ProjectVariable.objects.get_or_create(
+ name=variable_name,
+ value=current_variable,
+ project=project)
+
if os.environ.get("TOASTER_TEST_USE_SSTATE_MIRROR"):
ProjectVariable.objects.get_or_create(
name="SSTATE_MIRRORS",
diff --git a/poky/bitbake/lib/toaster/tests/functional/functional_helpers.py b/poky/bitbake/lib/toaster/tests/functional/functional_helpers.py
index c3191f664a..b80d403bec 100644
--- a/poky/bitbake/lib/toaster/tests/functional/functional_helpers.py
+++ b/poky/bitbake/lib/toaster/tests/functional/functional_helpers.py
@@ -15,8 +15,6 @@ import time
import re
from tests.browser.selenium_helpers_base import SeleniumTestCaseBase
-from tests.builds.buildtest import load_build_environment
-from bldcontrol.models import BuildEnvironment
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
@@ -33,10 +31,6 @@ class SeleniumFunctionalTestCase(SeleniumTestCaseBase):
raise RuntimeError("Please initialise django with the tests settings: " \
"DJANGO_SETTINGS_MODULE='toastermain.settings_test'")
- if BuildEnvironment.objects.count() == 0:
- BuildEnvironment.objects.create(betype=BuildEnvironment.TYPE_LOCAL)
- load_build_environment()
-
# start toaster
cmd = "bash -c 'source toaster start'"
p = subprocess.Popen(
diff --git a/poky/bitbake/lib/toaster/tests/functional/test_create_new_project.py b/poky/bitbake/lib/toaster/tests/functional/test_create_new_project.py
new file mode 100644
index 0000000000..dc7d1fc20b
--- /dev/null
+++ b/poky/bitbake/lib/toaster/tests/functional/test_create_new_project.py
@@ -0,0 +1,177 @@
+#! /usr/bin/env python3
+# BitBake Toaster UI tests implementation
+#
+# Copyright (C) 2023 Savoir-faire Linux
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+import re
+import pytest
+from django.urls import reverse
+from selenium.webdriver.support.select import Select
+from tests.functional.functional_helpers import SeleniumFunctionalTestCase
+from orm.models import Project
+from selenium.webdriver.common.by import By
+
+
+@pytest.mark.django_db
+class TestCreateNewProject(SeleniumFunctionalTestCase):
+
+ def _create_test_new_project(
+ self,
+ project_name,
+ release,
+ release_title,
+ merge_toaster_settings,
+ ):
+ """ Create/Test new project using:
+ - Project Name: Any string
+ - Release: Any string
+ - Merge Toaster settings: True or False
+ """
+ self.get(reverse('newproject'))
+ self.driver.find_element(By.ID,
+ "new-project-name").send_keys(project_name)
+
+ select = Select(self.find('#projectversion'))
+ select.select_by_value(release)
+
+ # check merge toaster settings
+ checkbox = self.find('.checkbox-mergeattr')
+ if merge_toaster_settings:
+ if not checkbox.is_selected():
+ checkbox.click()
+ else:
+ if checkbox.is_selected():
+ checkbox.click()
+
+ self.driver.find_element(By.ID, "create-project-button").click()
+
+ element = self.wait_until_visible('#project-created-notification')
+ self.assertTrue(
+ self.element_exists('#project-created-notification'),
+ f"Project:{project_name} creation notification not shown"
+ )
+ self.assertTrue(
+ project_name in element.text,
+ f"New project name:{project_name} not in new project notification"
+ )
+ self.assertTrue(
+ Project.objects.filter(name=project_name).count(),
+ f"New project:{project_name} not found in database"
+ )
+
+ # check release
+ self.assertTrue(re.search(
+ release_title,
+ self.driver.find_element(By.XPATH,
+ "//span[@id='project-release-title']"
+ ).text),
+ 'The project release is not defined')
+
+ def test_create_new_project_master(self):
+ """ Test create new project using:
+ - Project Name: Any string
+ - Release: Yocto Project master (option value: 3)
+ - Merge Toaster settings: False
+ """
+ release = '3'
+ release_title = 'Yocto Project master'
+ project_name = 'projectmaster'
+ self._create_test_new_project(
+ project_name,
+ release,
+ release_title,
+ False,
+ )
+
+ def test_create_new_project_kirkstone(self):
+ """ Test create new project using:
+ - Project Name: Any string
+ - Release: Yocto Project 4.0 "Kirkstone" (option value: 1)
+ - Merge Toaster settings: True
+ """
+ release = '1'
+ release_title = 'Yocto Project 4.0 "Kirkstone"'
+ project_name = 'projectkirkstone'
+ self._create_test_new_project(
+ project_name,
+ release,
+ release_title,
+ True,
+ )
+
+ def test_create_new_project_dunfell(self):
+ """ Test create new project using:
+ - Project Name: Any string
+ - Release: Yocto Project 3.1 "Dunfell" (option value: 5)
+ - Merge Toaster settings: False
+ """
+ release = '5'
+ release_title = 'Yocto Project 3.1 "Dunfell"'
+ project_name = 'projectdunfull'
+ self._create_test_new_project(
+ project_name,
+ release,
+ release_title,
+ False,
+ )
+
+ def test_create_new_project_local(self):
+ """ Test create new project using:
+ - Project Name: Any string
+ - Release: Local Yocto Project (option value: 2)
+ - Merge Toaster settings: True
+ """
+ release = '2'
+ release_title = 'Local Yocto Project'
+ project_name = 'projectlocal'
+ self._create_test_new_project(
+ project_name,
+ release,
+ release_title,
+ True,
+ )
+
+ def test_create_new_project_without_name(self):
+ """ Test create new project without project name """
+ self.get(reverse('newproject'))
+
+ select = Select(self.find('#projectversion'))
+ select.select_by_value(str(3))
+
+ # Check input name has required attribute
+ input_name = self.driver.find_element(By.ID, "new-project-name")
+ self.assertIsNotNone(input_name.get_attribute('required'),
+ 'Input name has not required attribute')
+
+ # Check create button is disabled
+ create_btn = self.driver.find_element(By.ID, "create-project-button")
+ self.assertIsNotNone(create_btn.get_attribute('disabled'),
+ 'Create button is not disabled')
+
+ def test_import_new_project(self):
+ """ Test import new project using:
+ - Project Name: Any string
+ - Project type: select (Import command line project)
+ - Import existing project directory: Wrong Path
+ """
+ project_name = 'projectimport'
+ self.get(reverse('newproject'))
+ self.driver.find_element(By.ID,
+ "new-project-name").send_keys(project_name)
+ # select import project
+ self.find('#type-import').click()
+
+ # set wrong path
+ wrong_path = '/wrongpath'
+ self.driver.find_element(By.ID,
+ "import-project-dir").send_keys(wrong_path)
+ self.driver.find_element(By.ID, "create-project-button").click()
+
+ # check error message
+ self.assertTrue(self.element_exists('.alert-danger'),
+ 'Allert message not shown')
+ self.assertTrue(wrong_path in self.find('.alert-danger').text,
+ "Wrong path not in alert message")
diff --git a/poky/bitbake/lib/toaster/tests/functional/test_functional_basic.py b/poky/bitbake/lib/toaster/tests/functional/test_functional_basic.py
index 067ad99a9c..f558cce884 100644
--- a/poky/bitbake/lib/toaster/tests/functional/test_functional_basic.py
+++ b/poky/bitbake/lib/toaster/tests/functional/test_functional_basic.py
@@ -7,21 +7,26 @@
# SPDX-License-Identifier: GPL-2.0-only
#
-import re
+import re, time
+from django.urls import reverse
+import pytest
from tests.functional.functional_helpers import SeleniumFunctionalTestCase
from orm.models import Project
from selenium.webdriver.common.by import By
+
+@pytest.mark.order("last")
class FuntionalTestBasic(SeleniumFunctionalTestCase):
# testcase (1514)
+ @pytest.mark.django_db
def test_create_slenium_project(self):
project_name = 'selenium-project'
- self.get('')
- self.driver.find_element(By.LINK_TEXT, "To start building, create your first Toaster project").click()
+ self.get(reverse('newproject'))
self.driver.find_element(By.ID, "new-project-name").send_keys(project_name)
self.driver.find_element(By.ID, 'projectversion').click()
self.driver.find_element(By.ID, "create-project-button").click()
+ time.sleep(2)
element = self.wait_until_visible('#project-created-notification')
self.assertTrue(self.element_exists('#project-created-notification'),'Project creation notification not shown')
self.assertTrue(project_name in element.text,
@@ -31,15 +36,18 @@ class FuntionalTestBasic(SeleniumFunctionalTestCase):
# testcase (1515)
def test_verify_left_bar_menu(self):
- self.get('')
+ self.get(reverse('all-projects'))
self.wait_until_visible('#projectstable')
self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
+ time.sleep(2)
self.assertTrue(self.element_exists('#config-nav'),'Configuration Tab does not exist')
project_URL=self.get_URL()
self.driver.find_element(By.XPATH, '//a[@href="'+project_URL+'"]').click()
+ time.sleep(2)
try:
self.driver.find_element(By.XPATH, "//*[@id='config-nav']/ul/li/a[@href="+'"'+project_URL+'customimages/"'+"]").click()
+ time.sleep(2)
self.assertTrue(re.search("Custom images",self.driver.find_element(By.XPATH, "//div[@class='col-md-10']").text),'Custom images information is not loading properly')
except:
self.fail(msg='No Custom images tab available')
@@ -78,14 +86,16 @@ class FuntionalTestBasic(SeleniumFunctionalTestCase):
def test_review_configuration_information(self):
self.get('')
self.driver.find_element(By.XPATH, "//div[@id='global-nav']/ul/li/a[@href="+'"'+'/toastergui/projects/'+'"'+"]").click()
+ time.sleep(2)
self.wait_until_visible('#projectstable')
self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
project_URL=self.get_URL()
-
+ time.sleep(2)
try:
self.assertTrue(self.element_exists('#machine-section'),'Machine section for the project configuration page does not exist')
self.assertTrue(re.search("qemux86",self.driver.find_element(By.XPATH, "//span[@id='project-machine-name']").text),'The machine type is not assigned')
self.driver.find_element(By.XPATH, "//span[@id='change-machine-toggle']").click()
+ time.sleep(2)
self.wait_until_visible('#select-machine-form')
self.wait_until_visible('#cancel-machine-change')
self.driver.find_element(By.XPATH, "//form[@id='select-machine-form']/a[@id='cancel-machine-change']").click()
@@ -123,13 +133,16 @@ class FuntionalTestBasic(SeleniumFunctionalTestCase):
def test_verify_machine_information(self):
self.get('')
self.driver.find_element(By.XPATH, "//div[@id='global-nav']/ul/li/a[@href="+'"'+'/toastergui/projects/'+'"'+"]").click()
+ time.sleep(2)
self.wait_until_visible('#projectstable')
self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
+ time.sleep(2)
try:
self.assertTrue(self.element_exists('#machine-section'),'Machine section for the project configuration page does not exist')
self.assertTrue(re.search("qemux86",self.driver.find_element(By.ID, "project-machine-name").text),'The machine type is not assigned')
self.driver.find_element(By.ID, "change-machine-toggle").click()
+ time.sleep(2)
self.wait_until_visible('#select-machine-form')
self.wait_until_visible('#cancel-machine-change')
self.driver.find_element(By.ID, "cancel-machine-change").click()
@@ -140,14 +153,15 @@ class FuntionalTestBasic(SeleniumFunctionalTestCase):
def test_verify_most_built_recipes_information(self):
self.get('')
self.driver.find_element(By.XPATH, "//div[@id='global-nav']/ul/li/a[@href="+'"'+'/toastergui/projects/'+'"'+"]").click()
-
+ time.sleep(2)
self.wait_until_visible('#projectstable')
self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
project_URL=self.get_URL()
-
+ time.sleep(2)
try:
self.assertTrue(re.search("You haven't built any recipes yet",self.driver.find_element(By.ID, "no-most-built").text),'Default message of no builds is not present')
self.driver.find_element(By.XPATH, "//div[@id='no-most-built']/p/a[@href="+'"'+project_URL+'images/"'+"]").click()
+ time.sleep(2)
self.assertTrue(re.search("Compatible image recipes",self.driver.find_element(By.XPATH, "//div[@class='col-md-10']").text),'The Choose a recipe to build link is not working properly')
except:
self.fail(msg='No Most built information in project detail page')
@@ -156,8 +170,10 @@ class FuntionalTestBasic(SeleniumFunctionalTestCase):
def test_verify_project_release_information(self):
self.get('')
self.driver.find_element(By.XPATH, "//div[@id='global-nav']/ul/li/a[@href="+'"'+'/toastergui/projects/'+'"'+"]").click()
+ time.sleep(2)
self.wait_until_visible('#projectstable')
self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
+ time.sleep(2)
try:
self.assertTrue(re.search("Yocto Project master",self.driver.find_element(By.ID, "project-release-title").text),'The project release is not defined')
@@ -171,12 +187,12 @@ class FuntionalTestBasic(SeleniumFunctionalTestCase):
self.wait_until_visible('#projectstable')
self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
project_URL=self.get_URL()
-
+ time.sleep(2)
try:
self.driver.find_element(By.XPATH, "//div[@id='layer-container']")
self.assertTrue(re.search("3",self.driver.find_element(By.ID, "project-layers-count").text),'There should be 3 layers listed in the layer count')
layer_list = self.driver.find_element(By.ID, "layers-in-project-list")
- layers = layer_list.find_element(By.TAG_NAME, "li")
+ layers = layer_list.find_elements(By.TAG_NAME, "li")
for layer in layers:
if re.match ("openembedded-core",layer.text):
@@ -199,10 +215,11 @@ class FuntionalTestBasic(SeleniumFunctionalTestCase):
def test_verify_project_detail_links(self):
self.get('')
self.driver.find_element(By.XPATH, "//div[@id='global-nav']/ul/li/a[@href="+'"'+'/toastergui/projects/'+'"'+"]").click()
+ time.sleep(2)
self.wait_until_visible('#projectstable')
self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
project_URL=self.get_URL()
-
+ time.sleep(2)
self.driver.find_element(By.XPATH, "//div[@id='project-topbar']/ul[@class='nav nav-tabs']/li[@id='topbar-configuration-tab']/a[@href="+'"'+project_URL+'"'+"]").click()
self.assertTrue(re.search("Configuration",self.driver.find_element(By.XPATH, "//div[@id='project-topbar']/ul[@class='nav nav-tabs']/li[@id='topbar-configuration-tab']/a[@href="+'"'+project_URL+'"'+"]").text), 'Configuration tab in project topbar is misspelled')
diff --git a/poky/bitbake/lib/toaster/tests/functional/test_project_page.py b/poky/bitbake/lib/toaster/tests/functional/test_project_page.py
new file mode 100644
index 0000000000..3edf967a2c
--- /dev/null
+++ b/poky/bitbake/lib/toaster/tests/functional/test_project_page.py
@@ -0,0 +1,247 @@
+#! /usr/bin/env python3 #
+# BitBake Toaster UI tests implementation
+#
+# Copyright (C) 2023 Savoir-faire Linux
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+import pytest
+from django.urls import reverse
+from selenium.webdriver.support.select import Select
+from tests.functional.functional_helpers import SeleniumFunctionalTestCase
+from selenium.webdriver.common.by import By
+
+
+@pytest.mark.django_db
+class TestProjectPage(SeleniumFunctionalTestCase):
+
+ def setUp(self):
+ super().setUp()
+ release = '3'
+ project_name = 'projectmaster'
+ self._create_test_new_project(
+ project_name,
+ release,
+ False,
+ )
+
+ def _create_test_new_project(
+ self,
+ project_name,
+ release,
+ merge_toaster_settings,
+ ):
+ """ Create/Test new project using:
+ - Project Name: Any string
+ - Release: Any string
+ - Merge Toaster settings: True or False
+ """
+ self.get(reverse('newproject'))
+ self.driver.find_element(By.ID,
+ "new-project-name").send_keys(project_name)
+
+ select = Select(self.find('#projectversion'))
+ select.select_by_value(release)
+
+ # check merge toaster settings
+ checkbox = self.find('.checkbox-mergeattr')
+ if merge_toaster_settings:
+ if not checkbox.is_selected():
+ checkbox.click()
+ else:
+ if checkbox.is_selected():
+ checkbox.click()
+
+ self.driver.find_element(By.ID, "create-project-button").click()
+
+ def test_page_header_on_project_page(self):
+ """ Check page header in project page:
+ - AT LEFT -> Logo of Yocto project, displayed, clickable
+ - "Toaster"+" Information icon", displayed, clickable
+ - "Server Icon" + "All builds", displayed, clickable
+ - "Directory Icon" + "All projects", displayed, clickable
+ - "Book Icon" + "Documentation", displayed, clickable
+ - AT RIGHT -> button "New project", displayed, clickable
+ """
+ # navigate to the project page
+ url = reverse("project", args=(1,))
+ self.get(url)
+
+ # check page header
+ # AT LEFT -> Logo of Yocto project
+ logo = self.driver.find_element(
+ By.XPATH,
+ "//div[@class='toaster-navbar-brand']",
+ )
+ logo_img = logo.find_element(By.TAG_NAME, 'img')
+ self.assertTrue(logo_img.is_displayed(),
+ 'Logo of Yocto project not found')
+ self.assertTrue(
+ '/static/img/logo.png' in str(logo_img.get_attribute('src')),
+ 'Logo of Yocto project not found'
+ )
+ # "Toaster"+" Information icon", clickable
+ toaster = self.driver.find_element(
+ By.XPATH,
+ "//div[@class='toaster-navbar-brand']//a[@class='brand']",
+ )
+ self.assertTrue(toaster.is_displayed(), 'Toaster not found')
+ self.assertTrue(toaster.text == 'Toaster')
+ info_sign = self.find('.glyphicon-info-sign')
+ self.assertTrue(info_sign.is_displayed())
+
+ # "Server Icon" + "All builds"
+ all_builds = self.find('#navbar-all-builds')
+ all_builds_link = all_builds.find_element(By.TAG_NAME, 'a')
+ self.assertTrue("All builds" in all_builds_link.text)
+ self.assertTrue(
+ '/toastergui/builds/' in str(all_builds_link.get_attribute('href'))
+ )
+ server_icon = all_builds.find_element(By.TAG_NAME, 'i')
+ self.assertTrue(
+ server_icon.get_attribute('class') == 'glyphicon glyphicon-tasks'
+ )
+ self.assertTrue(server_icon.is_displayed())
+
+ # "Directory Icon" + "All projects"
+ all_projects = self.find('#navbar-all-projects')
+ all_projects_link = all_projects.find_element(By.TAG_NAME, 'a')
+ self.assertTrue("All projects" in all_projects_link.text)
+ self.assertTrue(
+ '/toastergui/projects/' in str(all_projects_link.get_attribute(
+ 'href'))
+ )
+ dir_icon = all_projects.find_element(By.TAG_NAME, 'i')
+ self.assertTrue(
+ dir_icon.get_attribute('class') == 'icon-folder-open'
+ )
+ self.assertTrue(dir_icon.is_displayed())
+
+ # "Book Icon" + "Documentation"
+ toaster_docs_link = self.find('#navbar-docs')
+ toaster_docs_link_link = toaster_docs_link.find_element(By.TAG_NAME,
+ 'a')
+ self.assertTrue("Documentation" in toaster_docs_link_link.text)
+ self.assertTrue(
+ toaster_docs_link_link.get_attribute('href') == 'http://docs.yoctoproject.org/toaster-manual/index.html#toaster-user-manual'
+ )
+ book_icon = toaster_docs_link.find_element(By.TAG_NAME, 'i')
+ self.assertTrue(
+ book_icon.get_attribute('class') == 'glyphicon glyphicon-book'
+ )
+ self.assertTrue(book_icon.is_displayed())
+
+ # AT RIGHT -> button "New project"
+ new_project_button = self.find('#new-project-button')
+ self.assertTrue(new_project_button.is_displayed())
+ self.assertTrue(new_project_button.text == 'New project')
+ new_project_button.click()
+ self.assertTrue(
+ '/toastergui/newproject/' in str(self.driver.current_url)
+ )
+
+ def test_edit_project_name(self):
+ """ Test edit project name:
+ - Click on "Edit" icon button
+ - Change project name
+ - Click on "Save" button
+ - Check project name is changed
+ """
+ # navigate to the project page
+ url = reverse("project", args=(1,))
+ self.get(url)
+
+ # click on "Edit" icon button
+ self.wait_until_visible('#project-name-container')
+ edit_button = self.find('#project-change-form-toggle')
+ edit_button.click()
+ project_name_input = self.find('#project-name-change-input')
+ self.assertTrue(project_name_input.is_displayed())
+ project_name_input.clear()
+ project_name_input.send_keys('New Name')
+ self.find('#project-name-change-btn').click()
+
+ # check project name is changed
+ self.wait_until_visible('#project-name-container')
+ self.assertTrue(
+ 'New Name' in str(self.find('#project-name-container').text)
+ )
+
+ def test_project_page_tabs(self):
+ """ Test project tabs:
+ - "configuration" tab
+ - "Builds" tab
+ - "Import layers" tab
+ - "New custom image" tab
+ Check search box used to build recipes
+ """
+ # navigate to the project page
+ url = reverse("project", args=(1,))
+ self.get(url)
+
+ # check "configuration" tab
+ self.wait_until_visible('#topbar-configuration-tab')
+ config_tab = self.find('#topbar-configuration-tab')
+ self.assertTrue(config_tab.get_attribute('class') == 'active')
+ self.assertTrue('Configuration' in config_tab.text)
+ config_tab_link = config_tab.find_element(By.TAG_NAME, 'a')
+ self.assertTrue(
+ f"/toastergui/project/1" in str(config_tab_link.get_attribute(
+ 'href'))
+ )
+
+ def get_tabs():
+ # tabs links list
+ return self.driver.find_elements(
+ By.XPATH,
+ '//div[@id="project-topbar"]//li'
+ )
+
+ def check_tab_link(tab_index, tab_name, url):
+ tab = get_tabs()[tab_index]
+ tab_link = tab.find_element(By.TAG_NAME, 'a')
+ self.assertTrue(url in tab_link.get_attribute('href'))
+ self.assertTrue(tab_name in tab_link.text)
+ self.assertTrue(tab.get_attribute('class') == 'active')
+
+ # check "Builds" tab
+ builds_tab = get_tabs()[1]
+ builds_tab.find_element(By.TAG_NAME, 'a').click()
+ check_tab_link(
+ 1,
+ 'Builds',
+ f"/toastergui/project/1/builds"
+ )
+
+ # check "Import layers" tab
+ import_layers_tab = get_tabs()[2]
+ import_layers_tab.find_element(By.TAG_NAME, 'a').click()
+ check_tab_link(
+ 2,
+ 'Import layer',
+ f"/toastergui/project/1/importlayer"
+ )
+
+ # check "New custom image" tab
+ new_custom_image_tab = get_tabs()[3]
+ new_custom_image_tab.find_element(By.TAG_NAME, 'a').click()
+ check_tab_link(
+ 3,
+ 'New custom image',
+ f"/toastergui/project/1/newcustomimage"
+ )
+
+ # check search box can be use to build recipes
+ search_box = self.find('#build-input')
+ search_box.send_keys('core-image-minimal')
+ self.find('#build-button').click()
+ self.wait_until_visible('#latest-builds')
+ lastest_builds = self.driver.find_elements(
+ By.XPATH,
+ '//div[@id="latest-builds"]',
+ )
+ last_build = lastest_builds[0]
+ self.assertTrue(
+ 'core-image-minimal' in str(last_build.text)
+ )
diff --git a/poky/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py b/poky/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py
new file mode 100644
index 0000000000..23012d7865
--- /dev/null
+++ b/poky/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py
@@ -0,0 +1,578 @@
+#! /usr/bin/env python3 #
+# BitBake Toaster UI tests implementation
+#
+# Copyright (C) 2023 Savoir-faire Linux
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+from time import sleep
+import pytest
+from django.utils import timezone
+from django.urls import reverse
+from selenium.webdriver import Keys
+from selenium.webdriver.support.select import Select
+from selenium.common.exceptions import NoSuchElementException
+from orm.models import Build, Project, Target
+from tests.functional.functional_helpers import SeleniumFunctionalTestCase
+from selenium.webdriver.common.by import By
+
+
+@pytest.mark.django_db
+class TestProjectConfigTab(SeleniumFunctionalTestCase):
+
+ def setUp(self):
+ self.recipe = None
+ super().setUp()
+ release = '3'
+ project_name = 'projectmaster'
+ self._create_test_new_project(
+ project_name,
+ release,
+ False,
+ )
+
+ def _create_test_new_project(
+ self,
+ project_name,
+ release,
+ merge_toaster_settings,
+ ):
+ """ Create/Test new project using:
+ - Project Name: Any string
+ - Release: Any string
+ - Merge Toaster settings: True or False
+ """
+ self.get(reverse('newproject'))
+ self.driver.find_element(By.ID,
+ "new-project-name").send_keys(project_name)
+
+ select = Select(self.find('#projectversion'))
+ select.select_by_value(release)
+
+ # check merge toaster settings
+ checkbox = self.find('.checkbox-mergeattr')
+ if merge_toaster_settings:
+ if not checkbox.is_selected():
+ checkbox.click()
+ else:
+ if checkbox.is_selected():
+ checkbox.click()
+
+ self.driver.find_element(By.ID, "create-project-button").click()
+
+ @classmethod
+ def _wait_until_build(cls, state):
+ while True:
+ try:
+ last_build_state = cls.driver.find_element(
+ By.XPATH,
+ '//*[@id="latest-builds"]/div[1]//div[@class="build-state"]',
+ )
+ build_state = last_build_state.get_attribute(
+ 'data-build-state')
+ state_text = state.lower().split()
+ if any(x in str(build_state).lower() for x in state_text):
+ break
+ except NoSuchElementException:
+ continue
+ sleep(1)
+
+ def _create_builds(self):
+ # check search box can be use to build recipes
+ search_box = self.find('#build-input')
+ search_box.send_keys('core-image-minimal')
+ self.find('#build-button').click()
+ sleep(1)
+ self.wait_until_visible('#latest-builds')
+ # loop until reach the parsing state
+ self._wait_until_build('parsing starting cloning')
+ lastest_builds = self.driver.find_elements(
+ By.XPATH,
+ '//div[@id="latest-builds"]/div',
+ )
+ last_build = lastest_builds[0]
+ self.assertTrue(
+ 'core-image-minimal' in str(last_build.text)
+ )
+ cancel_button = last_build.find_element(
+ By.XPATH,
+ '//span[@class="cancel-build-btn pull-right alert-link"]',
+ )
+ cancel_button.click()
+ sleep(1)
+ self._wait_until_build('cancelled')
+
+ def _get_tabs(self):
+ # tabs links list
+ return self.driver.find_elements(
+ By.XPATH,
+ '//div[@id="project-topbar"]//li'
+ )
+
+ def _get_config_nav_item(self, index):
+ config_nav = self.find('#config-nav')
+ return config_nav.find_elements(By.TAG_NAME, 'li')[index]
+
+ def _get_create_builds(self, **kwargs):
+ """ Create a build and return the build object """
+ # parameters for builds to associate with the projects
+ now = timezone.now()
+ release = '3'
+ project_name = 'projectmaster'
+ self._create_test_new_project(
+ project_name+"2",
+ release,
+ False,
+ )
+
+ self.project1_build_success = {
+ 'project': Project.objects.get(id=1),
+ 'started_on': now,
+ 'completed_on': now,
+ 'outcome': Build.SUCCEEDED
+ }
+
+ self.project1_build_failure = {
+ 'project': Project.objects.get(id=1),
+ 'started_on': now,
+ 'completed_on': now,
+ 'outcome': Build.FAILED
+ }
+ build1 = Build.objects.create(**self.project1_build_success)
+ build2 = Build.objects.create(**self.project1_build_failure)
+
+ # add some targets to these builds so they have recipe links
+ # (and so we can find the row in the ToasterTable corresponding to
+ # a particular build)
+ Target.objects.create(build=build1, target='foo')
+ Target.objects.create(build=build2, target='bar')
+
+ if kwargs:
+ # Create kwargs.get('success') builds with success status with target
+ # and kwargs.get('failure') builds with failure status with target
+ for i in range(kwargs.get('success', 0)):
+ now = timezone.now()
+ self.project1_build_success['started_on'] = now
+ self.project1_build_success[
+ 'completed_on'] = now - timezone.timedelta(days=i)
+ build = Build.objects.create(**self.project1_build_success)
+ Target.objects.create(build=build,
+ target=f'{i}_success_recipe',
+ task=f'{i}_success_task')
+
+ for i in range(kwargs.get('failure', 0)):
+ now = timezone.now()
+ self.project1_build_failure['started_on'] = now
+ self.project1_build_failure[
+ 'completed_on'] = now - timezone.timedelta(days=i)
+ build = Build.objects.create(**self.project1_build_failure)
+ Target.objects.create(build=build,
+ target=f'{i}_fail_recipe',
+ task=f'{i}_fail_task')
+ return build1, build2
+
+ def test_project_config_nav(self):
+ """ Test project config tab navigation:
+ - Check if the menu is displayed and contains the right elements:
+ - Configuration
+ - COMPATIBLE METADATA
+ - Custom images
+ - Image recipes
+ - Software recipes
+ - Machines
+ - Layers
+ - Distro
+ - EXTRA CONFIGURATION
+ - Bitbake variables
+ - Actions
+ - Delete project
+ """
+ # navigate to the project page
+ url = reverse("project", args=(1,))
+ self.get(url)
+
+ # check if the menu is displayed
+ self.wait_until_visible('#config-nav')
+
+ def _get_config_nav_item(index):
+ config_nav = self.find('#config-nav')
+ return config_nav.find_elements(By.TAG_NAME, 'li')[index]
+
+ def check_config_nav_item(index, item_name, url):
+ item = _get_config_nav_item(index)
+ self.assertTrue(item_name in item.text)
+ self.assertTrue(item.get_attribute('class') == 'active')
+ self.assertTrue(url in self.driver.current_url)
+
+ # check if the menu contains the right elements
+ # COMPATIBLE METADATA
+ compatible_metadata = _get_config_nav_item(1)
+ self.assertTrue(
+ "compatible metadata" in compatible_metadata.text.lower()
+ )
+ # EXTRA CONFIGURATION
+ extra_configuration = _get_config_nav_item(8)
+ self.assertTrue(
+ "extra configuration" in extra_configuration.text.lower()
+ )
+ # Actions
+ actions = _get_config_nav_item(10)
+ self.assertTrue("actions" in str(actions.text).lower())
+
+ conf_nav_list = [
+ [0, 'Configuration', f"/toastergui/project/1"], # config
+ [2, 'Custom images', f"/toastergui/project/1/customimages"], # custom images
+ [3, 'Image recipes', f"/toastergui/project/1/images"], # image recipes
+ [4, 'Software recipes', f"/toastergui/project/1/softwarerecipes"], # software recipes
+ [5, 'Machines', f"/toastergui/project/1/machines"], # machines
+ [6, 'Layers', f"/toastergui/project/1/layers"], # layers
+ [7, 'Distro', f"/toastergui/project/1/distro"], # distro
+ [9, 'BitBake variables', f"/toastergui/project/1/configuration"], # bitbake variables
+ ]
+ for index, item_name, url in conf_nav_list:
+ item = _get_config_nav_item(index)
+ if item.get_attribute('class') != 'active':
+ item.click()
+ check_config_nav_item(index, item_name, url)
+
+ def test_project_config_tab_right_section(self):
+ """ Test project config tab right section contains five blocks:
+ - Machine:
+ - check 'Machine' is displayed
+ - check can change Machine
+ - Distro:
+ - check 'Distro' is displayed
+ - check can change Distro
+ - Most built recipes:
+ - check 'Most built recipes' is displayed
+ - check can select a recipe and build it
+ - Project release:
+ - check 'Project release' is displayed
+ - check project has right release displayed
+ - Layers:
+ - check can add a layer if exists
+ - check at least three layers are displayed
+ - openembedded-core
+ - meta-poky
+ - meta-yocto-bsp
+ """
+ # navigate to the project page
+ url = reverse("project", args=(1,))
+ self.get(url)
+
+ # check if the menu is displayed
+ self.wait_until_visible('#project-page')
+ block_l = self.driver.find_element(
+ By.XPATH, '//*[@id="project-page"]/div[2]')
+ machine = self.find('#machine-section')
+ distro = self.find('#distro-section')
+ most_built_recipes = self.driver.find_element(
+ By.XPATH, '//*[@id="project-page"]/div[1]/div[3]')
+ project_release = self.driver.find_element(
+ By.XPATH, '//*[@id="project-page"]/div[1]/div[4]')
+ layers = block_l.find_element(By.ID, 'layer-container')
+
+ def check_machine_distro(self, item_name, new_item_name, block):
+ title = block.find_element(By.TAG_NAME, 'h3')
+ self.assertTrue(item_name.capitalize() in title.text)
+ edit_btn = block.find_element(By.ID, f'change-{item_name}-toggle')
+ edit_btn.click()
+ sleep(1)
+ name_input = block.find_element(By.ID, f'{item_name}-change-input')
+ name_input.clear()
+ name_input.send_keys(new_item_name)
+ change_btn = block.find_element(By.ID, f'{item_name}-change-btn')
+ change_btn.click()
+ sleep(1)
+ project_name = block.find_element(By.ID, f'project-{item_name}-name')
+ self.assertTrue(new_item_name in project_name.text)
+ # check change notificaiton is displayed
+ change_notification = self.find('#change-notification')
+ self.assertTrue(
+ f'You have changed the {item_name} to: {new_item_name}' in change_notification.text
+ )
+
+ # Machine
+ check_machine_distro(self, 'machine', 'qemux86-64', machine)
+ # Distro
+ check_machine_distro(self, 'distro', 'poky-altcfg', distro)
+
+ # Project release
+ title = project_release.find_element(By.TAG_NAME, 'h3')
+ self.assertTrue("Project release" in title.text)
+ self.assertTrue(
+ "Yocto Project master" in self.find('#project-release-title').text
+ )
+
+ # Layers
+ title = layers.find_element(By.TAG_NAME, 'h3')
+ self.assertTrue("Layers" in title.text)
+ # check at least three layers are displayed
+ # openembedded-core
+ # meta-poky
+ # meta-yocto-bsp
+ layers_list = layers.find_element(By.ID, 'layers-in-project-list')
+ layers_list_items = layers_list.find_elements(By.TAG_NAME, 'li')
+ self.assertTrue(len(layers_list_items) == 3)
+ # check can add a layer if exists
+ add_layer_input = layers.find_element(By.ID, 'layer-add-input')
+ add_layer_input.send_keys('meta-oe')
+ self.wait_until_visible('#layer-container > form > div > span > div')
+ dropdown_item = self.driver.find_element(
+ By.XPATH,
+ '//*[@id="layer-container"]/form/div/span/div'
+ )
+ dropdown_item.click()
+ add_layer_btn = layers.find_element(By.ID, 'add-layer-btn')
+ add_layer_btn.click()
+ sleep(1)
+ # check layer is added
+ layers_list_items = layers_list.find_elements(By.TAG_NAME, 'li')
+ self.assertTrue(len(layers_list_items) == 4)
+
+ # Most built recipes
+ title = most_built_recipes.find_element(By.TAG_NAME, 'h3')
+ self.assertTrue("Most built recipes" in title.text)
+ # Create a new builds 5
+ self._create_builds()
+
+ # Refresh the page
+ self.get(url)
+
+ sleep(1) # wait for page to load
+ self.wait_until_visible('#project-page')
+ # check can select a recipe and build it
+ most_built_recipes = self.driver.find_element(
+ By.XPATH, '//*[@id="project-page"]/div[1]/div[3]')
+ recipe_list = most_built_recipes.find_element(By.ID, 'freq-build-list')
+ recipe_list_items = recipe_list.find_elements(By.TAG_NAME, 'li')
+ self.assertTrue(
+ len(recipe_list_items) > 0,
+ msg="No recipes found in the most built recipes list",
+ )
+ checkbox = recipe_list_items[0].find_element(By.TAG_NAME, 'input')
+ checkbox.click()
+ build_btn = self.find('#freq-build-btn')
+ build_btn.click()
+ sleep(1) # wait for page to load
+ self.wait_until_visible('#latest-builds')
+ self._wait_until_build('parsing starting cloning queueing')
+ lastest_builds = self.driver.find_elements(
+ By.XPATH,
+ '//div[@id="latest-builds"]/div'
+ )
+ last_build = lastest_builds[0]
+ cancel_button = last_build.find_element(
+ By.XPATH,
+ '//span[@class="cancel-build-btn pull-right alert-link"]',
+ )
+ cancel_button.click()
+ self.assertTrue(len(lastest_builds) == 2)
+
+ def test_project_page_tab_importlayer(self):
+ """ Test project page tab import layer """
+ # navigate to the project page
+ url = reverse("project", args=(1,))
+ self.get(url)
+
+ # navigate to "Import layers" tab
+ import_layers_tab = self._get_tabs()[2]
+ import_layers_tab.find_element(By.TAG_NAME, 'a').click()
+ self.wait_until_visible('#layer-git-repo-url')
+
+ # Check git repo radio button
+ git_repo_radio = self.find('#git-repo-radio')
+ git_repo_radio.click()
+
+ # Set git repo url
+ input_repo_url = self.find('#layer-git-repo-url')
+ input_repo_url.send_keys('git://git.yoctoproject.org/meta-fake')
+ # Blur the input to trigger the validation
+ input_repo_url.send_keys(Keys.TAB)
+
+ # Check name is set
+ input_layer_name = self.find('#import-layer-name')
+ self.assertTrue(input_layer_name.get_attribute('value') == 'meta-fake')
+
+ # Set branch
+ input_branch = self.find('#layer-git-ref')
+ input_branch.send_keys('master')
+
+ # Import layer
+ self.find('#import-and-add-btn').click()
+
+ # Check layer is added
+ self.wait_until_visible('#layer-container')
+ block_l = self.driver.find_element(
+ By.XPATH, '//*[@id="project-page"]/div[2]')
+ layers = block_l.find_element(By.ID, 'layer-container')
+ layers_list = layers.find_element(By.ID, 'layers-in-project-list')
+ layers_list_items = layers_list.find_elements(By.TAG_NAME, 'li')
+ self.assertTrue(
+ 'meta-fake' in str(layers_list_items[-1].text)
+ )
+
+ def test_project_page_custom_image_no_image(self):
+ """ Test project page tab "New custom image" when no custom image """
+ # navigate to the project page
+ url = reverse("project", args=(1,))
+ self.get(url)
+
+ # navigate to "Custom image" tab
+ custom_image_section = self._get_config_nav_item(2)
+ custom_image_section.click()
+ self.wait_until_visible('#empty-state-customimagestable')
+
+ # Check message when no custom image
+ self.assertTrue(
+ "You have not created any custom images yet." in str(
+ self.find('#empty-state-customimagestable').text
+ )
+ )
+ div_empty_msg = self.find('#empty-state-customimagestable')
+ link_create_custom_image = div_empty_msg.find_element(
+ By.TAG_NAME, 'a')
+ self.assertTrue(
+ f"/toastergui/project/1/newcustomimage" in str(
+ link_create_custom_image.get_attribute('href')
+ )
+ )
+ self.assertTrue(
+ "Create your first custom image" in str(
+ link_create_custom_image.text
+ )
+ )
+
+ def test_project_page_image_recipe(self):
+ """ Test project page section images
+ - Check image recipes are displayed
+ - Check search input
+ - Check image recipe build button works
+ - Check image recipe table features(show/hide column, pagination)
+ """
+ # navigate to the project page
+ url = reverse("project", args=(1,))
+ self.get(url)
+ self.wait_until_visible('#config-nav')
+
+ # navigate to "Images section"
+ images_section = self._get_config_nav_item(3)
+ images_section.click()
+ self.wait_until_visible('#imagerecipestable')
+ rows = self.find_all('#imagerecipestable tbody tr')
+ self.assertTrue(len(rows) > 0)
+
+ # Test search input
+ self.wait_until_visible('#search-input-imagerecipestable')
+ recipe_input = self.find('#search-input-imagerecipestable')
+ recipe_input.send_keys('core-image-minimal')
+ self.find('#search-submit-imagerecipestable').click()
+ self.wait_until_visible('#imagerecipestable tbody tr')
+ rows = self.find_all('#imagerecipestable tbody tr')
+ self.assertTrue(len(rows) > 0)
+
+ # Test build button
+ image_to_build = rows[0]
+ build_btn = image_to_build.find_element(
+ By.XPATH,
+ '//td[@class="add-del-layers"]'
+ )
+ build_btn.click()
+ self._wait_until_build('parsing starting cloning')
+ lastest_builds = self.driver.find_elements(
+ By.XPATH,
+ '//div[@id="latest-builds"]/div'
+ )
+ self.assertTrue(len(lastest_builds) > 0)
+
+ def test_image_recipe_editColumn(self):
+ """ Test the edit column feature in image recipe table on project page """
+ self._get_create_builds(success=10, failure=10)
+
+ def test_edit_column(check_box_id):
+ # Check that we can hide/show table column
+ check_box = self.find(f'#{check_box_id}')
+ th_class = str(check_box_id).replace('checkbox-', '')
+ if check_box.is_selected():
+ # check if column is visible in table
+ self.assertTrue(
+ self.find(
+ f'#imagerecipestable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table"
+ )
+ check_box.click()
+ # check if column is hidden in table
+ self.assertFalse(
+ self.find(
+ f'#imagerecipestable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table"
+ )
+ else:
+ # check if column is hidden in table
+ self.assertFalse(
+ self.find(
+ f'#imagerecipestable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table"
+ )
+ check_box.click()
+ # check if column is visible in table
+ self.assertTrue(
+ self.find(
+ f'#imagerecipestable thead th.{th_class}'
+ ).is_displayed(),
+ f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table"
+ )
+
+ url = reverse('projectimagerecipes', args=(1,))
+ self.get(url)
+ self.wait_until_present('#imagerecipestable tbody tr')
+
+ # Check edit column
+ edit_column = self.find('#edit-columns-button')
+ self.assertTrue(edit_column.is_displayed())
+ edit_column.click()
+ # Check dropdown is visible
+ self.wait_until_visible('ul.dropdown-menu.editcol')
+
+ # Check that we can hide the edit column
+ test_edit_column('checkbox-get_description_or_summary')
+ test_edit_column('checkbox-layer_version__get_vcs_reference')
+ test_edit_column('checkbox-layer_version__layer__name')
+ test_edit_column('checkbox-license')
+ test_edit_column('checkbox-recipe-file')
+ test_edit_column('checkbox-section')
+ test_edit_column('checkbox-version')
+
+ def test_image_recipe_show_rows(self):
+ """ Test the show rows feature in image recipe table on project page """
+ self._get_create_builds(success=100, failure=100)
+
+ def test_show_rows(row_to_show, show_row_link):
+ # Check that we can show rows == row_to_show
+ show_row_link.select_by_value(str(row_to_show))
+ self.wait_until_present('#imagerecipestable tbody tr')
+ sleep(1)
+ self.assertTrue(
+ len(self.find_all('#imagerecipestable tbody tr')) == row_to_show
+ )
+
+ url = reverse('projectimagerecipes', args=(2,))
+ self.get(url)
+ self.wait_until_present('#imagerecipestable tbody tr')
+
+ show_rows = self.driver.find_elements(
+ By.XPATH,
+ '//select[@class="form-control pagesize-imagerecipestable"]'
+ )
+ # Check show rows
+ for show_row_link in show_rows:
+ show_row_link = Select(show_row_link)
+ test_show_rows(10, show_row_link)
+ test_show_rows(25, show_row_link)
+ test_show_rows(50, show_row_link)
+ test_show_rows(100, show_row_link)
+ test_show_rows(150, show_row_link)
diff --git a/poky/bitbake/lib/toaster/tests/toaster-tests-requirements.txt b/poky/bitbake/lib/toaster/tests/toaster-tests-requirements.txt
index f30ac0706c..71cc083436 100644
--- a/poky/bitbake/lib/toaster/tests/toaster-tests-requirements.txt
+++ b/poky/bitbake/lib/toaster/tests/toaster-tests-requirements.txt
@@ -1 +1,7 @@
selenium>=4.13.0
+pytest==7.4.2
+pytest-django==4.5.2
+pytest-env==1.1.0
+pytest-html==4.0.2
+pytest-metadata==3.0.0
+pytest-order==1.1.0
diff --git a/poky/bitbake/lib/toaster/tests/views/test_views.py b/poky/bitbake/lib/toaster/tests/views/test_views.py
index f962e76287..349881ebf6 100644
--- a/poky/bitbake/lib/toaster/tests/views/test_views.py
+++ b/poky/bitbake/lib/toaster/tests/views/test_views.py
@@ -9,6 +9,7 @@
"""Test cases for Toaster GUI and ReST."""
+import pytest
from django.test import TestCase
from django.test.client import RequestFactory
from django.urls import reverse
@@ -33,6 +34,7 @@ PROJECT_NAME2 = "test project 2"
CLI_BUILDS_PROJECT_NAME = 'Command line builds'
+@pytest.mark.order(1)
class ViewTests(TestCase):
"""Tests to verify view APIs."""
@@ -41,7 +43,15 @@ class ViewTests(TestCase):
def setUp(self):
self.project = Project.objects.first()
+
self.recipe1 = Recipe.objects.get(pk=2)
+ # create a file and to recipe1 file_path
+ file_path = f"/tmp/{self.recipe1.name.strip().replace(' ', '-')}.bb"
+ with open(file_path, 'w') as f:
+ f.write('foo')
+ self.recipe1.file_path = file_path
+ self.recipe1.save()
+
self.customr = CustomImageRecipe.objects.first()
self.cust_package = CustomImagePackage.objects.first()
self.package = Package.objects.first()
diff --git a/poky/bitbake/lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml b/poky/bitbake/lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml
index 4517ed1765..df106934b2 100644
--- a/poky/bitbake/lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml
+++ b/poky/bitbake/lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml
@@ -6,10 +6,22 @@
<field type="CharField" name="dirpath">b</field>
<field type="CharField" name="branch">a</field>
</object>
+ <object pk="1" model="orm.distro">
+ <field type="DateTimeField" name="up_date"><None></None></field>
+ <field to="orm.layer_version" name="layer_version" rel="ManyToOneRel">1</field>
+ <field type="CharField" name="name">poky_distro1</field>
+ <field type="CharField" name="description">poky_distro1 description</field>
+ </object>
+ <object pk="2" model="orm.distro">
+ <field type="DateTimeField" name="up_date"><None></None></field>
+ <field to="orm.layer_version" name="layer_version" rel="ManyToOneRel">2</field>
+ <field type="CharField" name="name">poky_distro2</field>
+ <field type="CharField" name="description">poky_distro2 description</field>
+ </object>
<object pk="1" model="orm.release">
- <field type="CharField" name="name">master</field>
+ <field type="CharField" name="name">foo_master</field>
<field type="CharField" name="description">master project</field>
- <field to="orm.bitbake_version" name="bitbake_version">1</field>
+ <field to="orm.bitbakeversion" name="bitbake_version">1</field>
</object>
<object pk="1" model="orm.project">
<field type="CharField" name="name">a test project</field>
diff --git a/poky/bitbake/lib/toaster/toastergui/static/js/bootstrap.js b/poky/bitbake/lib/toaster/toastergui/static/js/bootstrap-3.4.1.js
index d47d640feb..170bd608f7 100644
--- a/poky/bitbake/lib/toaster/toastergui/static/js/bootstrap.js
+++ b/poky/bitbake/lib/toaster/toastergui/static/js/bootstrap-3.4.1.js
@@ -1,6 +1,6 @@
/*!
- * Bootstrap v3.3.6 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
+ * Bootstrap v3.4.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under the MIT license
*/
@@ -11,16 +11,16 @@ if (typeof jQuery === 'undefined') {
+function ($) {
'use strict';
var version = $.fn.jquery.split(' ')[0].split('.')
- if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) {
- throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')
+ if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
+ throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
}
}(jQuery);
/* ========================================================================
- * Bootstrap: transition.js v3.3.6
- * http://getbootstrap.com/javascript/#transitions
+ * Bootstrap: transition.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#transitions
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@@ -28,7 +28,7 @@ if (typeof jQuery === 'undefined') {
+function ($) {
'use strict';
- // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+ // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/)
// ============================================================
function transitionEnd() {
@@ -50,7 +50,7 @@ if (typeof jQuery === 'undefined') {
return false // explicit for ie8 ( ._.)
}
- // http://blog.alexmaccaw.com/css-transitions
+ // https://blog.alexmaccaw.com/css-transitions
$.fn.emulateTransitionEnd = function (duration) {
var called = false
var $el = this
@@ -77,10 +77,10 @@ if (typeof jQuery === 'undefined') {
}(jQuery);
/* ========================================================================
- * Bootstrap: alert.js v3.3.6
- * http://getbootstrap.com/javascript/#alerts
+ * Bootstrap: alert.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#alerts
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@@ -96,7 +96,7 @@ if (typeof jQuery === 'undefined') {
$(el).on('click', dismiss, this.close)
}
- Alert.VERSION = '3.3.6'
+ Alert.VERSION = '3.4.1'
Alert.TRANSITION_DURATION = 150
@@ -109,7 +109,8 @@ if (typeof jQuery === 'undefined') {
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
}
- var $parent = $(selector)
+ selector = selector === '#' ? [] : selector
+ var $parent = $(document).find(selector)
if (e) e.preventDefault()
@@ -172,10 +173,10 @@ if (typeof jQuery === 'undefined') {
}(jQuery);
/* ========================================================================
- * Bootstrap: button.js v3.3.6
- * http://getbootstrap.com/javascript/#buttons
+ * Bootstrap: button.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#buttons
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@@ -192,7 +193,7 @@ if (typeof jQuery === 'undefined') {
this.isLoading = false
}
- Button.VERSION = '3.3.6'
+ Button.VERSION = '3.4.1'
Button.DEFAULTS = {
loadingText: 'loading...'
@@ -214,10 +215,10 @@ if (typeof jQuery === 'undefined') {
if (state == 'loadingText') {
this.isLoading = true
- $el.addClass(d).attr(d, d)
+ $el.addClass(d).attr(d, d).prop(d, true)
} else if (this.isLoading) {
this.isLoading = false
- $el.removeClass(d).removeAttr(d)
+ $el.removeClass(d).removeAttr(d).prop(d, false)
}
}, this), 0)
}
@@ -281,10 +282,15 @@ if (typeof jQuery === 'undefined') {
$(document)
.on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
- var $btn = $(e.target)
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+ var $btn = $(e.target).closest('.btn')
Plugin.call($btn, 'toggle')
- if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
+ if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
+ // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
+ e.preventDefault()
+ // The target component still receive the focus
+ if ($btn.is('input,button')) $btn.trigger('focus')
+ else $btn.find('input:visible,button:visible').first().trigger('focus')
+ }
})
.on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
$(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
@@ -293,10 +299,10 @@ if (typeof jQuery === 'undefined') {
}(jQuery);
/* ========================================================================
- * Bootstrap: carousel.js v3.3.6
- * http://getbootstrap.com/javascript/#carousel
+ * Bootstrap: carousel.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#carousel
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@@ -324,7 +330,7 @@ if (typeof jQuery === 'undefined') {
.on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
}
- Carousel.VERSION = '3.3.6'
+ Carousel.VERSION = '3.4.1'
Carousel.TRANSITION_DURATION = 600
@@ -438,7 +444,9 @@ if (typeof jQuery === 'undefined') {
var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
if ($.support.transition && this.$element.hasClass('slide')) {
$next.addClass(type)
- $next[0].offsetWidth // force reflow
+ if (typeof $next === 'object' && $next.length) {
+ $next[0].offsetWidth // force reflow
+ }
$active.addClass(direction)
$next.addClass(direction)
$active
@@ -500,10 +508,17 @@ if (typeof jQuery === 'undefined') {
// =================
var clickHandler = function (e) {
- var href
var $this = $(this)
- var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+ var href = $this.attr('href')
+ if (href) {
+ href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+ }
+
+ var target = $this.attr('data-target') || href
+ var $target = $(document).find(target)
+
if (!$target.hasClass('carousel')) return
+
var options = $.extend({}, $target.data(), $this.data())
var slideIndex = $this.attr('data-slide-to')
if (slideIndex) options.interval = false
@@ -531,13 +546,14 @@ if (typeof jQuery === 'undefined') {
}(jQuery);
/* ========================================================================
- * Bootstrap: collapse.js v3.3.6
- * http://getbootstrap.com/javascript/#collapse
+ * Bootstrap: collapse.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#collapse
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+/* jshint latedef: false */
+function ($) {
'use strict';
@@ -561,7 +577,7 @@ if (typeof jQuery === 'undefined') {
if (this.options.toggle) this.toggle()
}
- Collapse.VERSION = '3.3.6'
+ Collapse.VERSION = '3.4.1'
Collapse.TRANSITION_DURATION = 350
@@ -668,7 +684,7 @@ if (typeof jQuery === 'undefined') {
}
Collapse.prototype.getParent = function () {
- return $(this.options.parent)
+ return $(document).find(this.options.parent)
.find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
.each($.proxy(function (i, element) {
var $element = $(element)
@@ -691,7 +707,7 @@ if (typeof jQuery === 'undefined') {
var target = $trigger.attr('data-target')
|| (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
- return $(target)
+ return $(document).find(target)
}
@@ -743,10 +759,10 @@ if (typeof jQuery === 'undefined') {
}(jQuery);
/* ========================================================================
- * Bootstrap: dropdown.js v3.3.6
- * http://getbootstrap.com/javascript/#dropdowns
+ * Bootstrap: dropdown.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#dropdowns
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@@ -763,7 +779,7 @@ if (typeof jQuery === 'undefined') {
$(element).on('click.bs.dropdown', this.toggle)
}
- Dropdown.VERSION = '3.3.6'
+ Dropdown.VERSION = '3.4.1'
function getParent($this) {
var selector = $this.attr('data-target')
@@ -773,7 +789,7 @@ if (typeof jQuery === 'undefined') {
selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
}
- var $parent = selector && $(selector)
+ var $parent = selector !== '#' ? $(document).find(selector) : null
return $parent && $parent.length ? $parent : $this.parent()
}
@@ -909,10 +925,10 @@ if (typeof jQuery === 'undefined') {
}(jQuery);
/* ========================================================================
- * Bootstrap: modal.js v3.3.6
- * http://getbootstrap.com/javascript/#modals
+ * Bootstrap: modal.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#modals
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@@ -924,15 +940,16 @@ if (typeof jQuery === 'undefined') {
// ======================
var Modal = function (element, options) {
- this.options = options
- this.$body = $(document.body)
- this.$element = $(element)
- this.$dialog = this.$element.find('.modal-dialog')
- this.$backdrop = null
- this.isShown = null
- this.originalBodyPad = null
- this.scrollbarWidth = 0
+ this.options = options
+ this.$body = $(document.body)
+ this.$element = $(element)
+ this.$dialog = this.$element.find('.modal-dialog')
+ this.$backdrop = null
+ this.isShown = null
+ this.originalBodyPad = null
+ this.scrollbarWidth = 0
this.ignoreBackdropClick = false
+ this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom'
if (this.options.remote) {
this.$element
@@ -943,7 +960,7 @@ if (typeof jQuery === 'undefined') {
}
}
- Modal.VERSION = '3.3.6'
+ Modal.VERSION = '3.4.1'
Modal.TRANSITION_DURATION = 300
Modal.BACKDROP_TRANSITION_DURATION = 150
@@ -960,7 +977,7 @@ if (typeof jQuery === 'undefined') {
Modal.prototype.show = function (_relatedTarget) {
var that = this
- var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
this.$element.trigger(e)
@@ -1050,7 +1067,9 @@ if (typeof jQuery === 'undefined') {
$(document)
.off('focusin.bs.modal') // guard against infinite focus loop
.on('focusin.bs.modal', $.proxy(function (e) {
- if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+ if (document !== e.target &&
+ this.$element[0] !== e.target &&
+ !this.$element.has(e.target).length) {
this.$element.trigger('focus')
}
}, this))
@@ -1152,7 +1171,7 @@ if (typeof jQuery === 'undefined') {
var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
this.$element.css({
- paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
})
}
@@ -1177,11 +1196,26 @@ if (typeof jQuery === 'undefined') {
Modal.prototype.setScrollbar = function () {
var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
this.originalBodyPad = document.body.style.paddingRight || ''
- if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
+ var scrollbarWidth = this.scrollbarWidth
+ if (this.bodyIsOverflowing) {
+ this.$body.css('padding-right', bodyPad + scrollbarWidth)
+ $(this.fixedContent).each(function (index, element) {
+ var actualPadding = element.style.paddingRight
+ var calculatedPadding = $(element).css('padding-right')
+ $(element)
+ .data('padding-right', actualPadding)
+ .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px')
+ })
+ }
}
Modal.prototype.resetScrollbar = function () {
this.$body.css('padding-right', this.originalBodyPad)
+ $(this.fixedContent).each(function (index, element) {
+ var padding = $(element).data('padding-right')
+ $(element).removeData('padding-right')
+ element.style.paddingRight = padding ? padding : ''
+ })
}
Modal.prototype.measureScrollbar = function () { // thx walsh
@@ -1199,8 +1233,8 @@ if (typeof jQuery === 'undefined') {
function Plugin(option, _relatedTarget) {
return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.modal')
+ var $this = $(this)
+ var data = $this.data('bs.modal')
var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
@@ -1211,7 +1245,7 @@ if (typeof jQuery === 'undefined') {
var old = $.fn.modal
- $.fn.modal = Plugin
+ $.fn.modal = Plugin
$.fn.modal.Constructor = Modal
@@ -1228,10 +1262,13 @@ if (typeof jQuery === 'undefined') {
// ==============
$(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
- var $this = $(this)
- var href = $this.attr('href')
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
- var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+ var $this = $(this)
+ var href = $this.attr('href')
+ var target = $this.attr('data-target') ||
+ (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+
+ var $target = $(document).find(target)
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
if ($this.is('a')) e.preventDefault()
@@ -1247,18 +1284,148 @@ if (typeof jQuery === 'undefined') {
}(jQuery);
/* ========================================================================
- * Bootstrap: tooltip.js v3.3.6
- * http://getbootstrap.com/javascript/#tooltip
+ * Bootstrap: tooltip.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#tooltip
* Inspired by the original jQuery.tipsy by Jason Frame
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
-
+function ($) {
'use strict';
+ var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']
+
+ var uriAttrs = [
+ 'background',
+ 'cite',
+ 'href',
+ 'itemtype',
+ 'longdesc',
+ 'poster',
+ 'src',
+ 'xlink:href'
+ ]
+
+ var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
+
+ var DefaultWhitelist = {
+ // Global attributes allowed on any supplied element below.
+ '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
+ a: ['target', 'href', 'title', 'rel'],
+ area: [],
+ b: [],
+ br: [],
+ col: [],
+ code: [],
+ div: [],
+ em: [],
+ hr: [],
+ h1: [],
+ h2: [],
+ h3: [],
+ h4: [],
+ h5: [],
+ h6: [],
+ i: [],
+ img: ['src', 'alt', 'title', 'width', 'height'],
+ li: [],
+ ol: [],
+ p: [],
+ pre: [],
+ s: [],
+ small: [],
+ span: [],
+ sub: [],
+ sup: [],
+ strong: [],
+ u: [],
+ ul: []
+ }
+
+ /**
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
+ *
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+ */
+ var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi
+
+ /**
+ * A pattern that matches safe data URLs. Only matches image, video and audio types.
+ *
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+ */
+ var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i
+
+ function allowedAttribute(attr, allowedAttributeList) {
+ var attrName = attr.nodeName.toLowerCase()
+
+ if ($.inArray(attrName, allowedAttributeList) !== -1) {
+ if ($.inArray(attrName, uriAttrs) !== -1) {
+ return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))
+ }
+
+ return true
+ }
+
+ var regExp = $(allowedAttributeList).filter(function (index, value) {
+ return value instanceof RegExp
+ })
+
+ // Check if a regular expression validates the attribute.
+ for (var i = 0, l = regExp.length; i < l; i++) {
+ if (attrName.match(regExp[i])) {
+ return true
+ }
+ }
+
+ return false
+ }
+
+ function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
+ if (unsafeHtml.length === 0) {
+ return unsafeHtml
+ }
+
+ if (sanitizeFn && typeof sanitizeFn === 'function') {
+ return sanitizeFn(unsafeHtml)
+ }
+
+ // IE 8 and below don't support createHTMLDocument
+ if (!document.implementation || !document.implementation.createHTMLDocument) {
+ return unsafeHtml
+ }
+
+ var createdDocument = document.implementation.createHTMLDocument('sanitization')
+ createdDocument.body.innerHTML = unsafeHtml
+
+ var whitelistKeys = $.map(whiteList, function (el, i) { return i })
+ var elements = $(createdDocument.body).find('*')
+
+ for (var i = 0, len = elements.length; i < len; i++) {
+ var el = elements[i]
+ var elName = el.nodeName.toLowerCase()
+
+ if ($.inArray(elName, whitelistKeys) === -1) {
+ el.parentNode.removeChild(el)
+
+ continue
+ }
+
+ var attributeList = $.map(el.attributes, function (el) { return el })
+ var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])
+
+ for (var j = 0, len2 = attributeList.length; j < len2; j++) {
+ if (!allowedAttribute(attributeList[j], whitelistedAttributes)) {
+ el.removeAttribute(attributeList[j].nodeName)
+ }
+ }
+ }
+
+ return createdDocument.body.innerHTML
+ }
+
// TOOLTIP PUBLIC CLASS DEFINITION
// ===============================
@@ -1274,7 +1441,7 @@ if (typeof jQuery === 'undefined') {
this.init('tooltip', element, options)
}
- Tooltip.VERSION = '3.3.6'
+ Tooltip.VERSION = '3.4.1'
Tooltip.TRANSITION_DURATION = 150
@@ -1291,7 +1458,10 @@ if (typeof jQuery === 'undefined') {
viewport: {
selector: 'body',
padding: 0
- }
+ },
+ sanitize : true,
+ sanitizeFn : null,
+ whiteList : DefaultWhitelist
}
Tooltip.prototype.init = function (type, element, options) {
@@ -1299,7 +1469,7 @@ if (typeof jQuery === 'undefined') {
this.type = type
this.$element = $(element)
this.options = this.getOptions(options)
- this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
+ this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
this.inState = { click: false, hover: false, focus: false }
if (this.$element[0] instanceof document.constructor && !this.options.selector) {
@@ -1332,7 +1502,15 @@ if (typeof jQuery === 'undefined') {
}
Tooltip.prototype.getOptions = function (options) {
- options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+ var dataAttributes = this.$element.data()
+
+ for (var dataAttr in dataAttributes) {
+ if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) {
+ delete dataAttributes[dataAttr]
+ }
+ }
+
+ options = $.extend({}, this.getDefaults(), dataAttributes, options)
if (options.delay && typeof options.delay == 'number') {
options.delay = {
@@ -1341,6 +1519,10 @@ if (typeof jQuery === 'undefined') {
}
}
+ if (options.sanitize) {
+ options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn)
+ }
+
return options
}
@@ -1452,7 +1634,7 @@ if (typeof jQuery === 'undefined') {
.addClass(placement)
.data('bs.' + this.type, this)
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+ this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element)
this.$element.trigger('inserted.bs.' + this.type)
var pos = this.getPosition()
@@ -1554,7 +1736,16 @@ if (typeof jQuery === 'undefined') {
var $tip = this.tip()
var title = this.getTitle()
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+ if (this.options.html) {
+ if (this.options.sanitize) {
+ title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn)
+ }
+
+ $tip.find('.tooltip-inner').html(title)
+ } else {
+ $tip.find('.tooltip-inner').text(title)
+ }
+
$tip.removeClass('fade in top bottom left right')
}
@@ -1565,9 +1756,11 @@ if (typeof jQuery === 'undefined') {
function complete() {
if (that.hoverState != 'in') $tip.detach()
- that.$element
- .removeAttr('aria-describedby')
- .trigger('hidden.bs.' + that.type)
+ if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
+ that.$element
+ .removeAttr('aria-describedby')
+ .trigger('hidden.bs.' + that.type)
+ }
callback && callback()
}
@@ -1610,7 +1803,10 @@ if (typeof jQuery === 'undefined') {
// width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
}
- var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
+ var isSvg = window.SVGElement && el instanceof window.SVGElement
+ // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
+ // See https://github.com/twbs/bootstrap/issues/20280
+ var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
@@ -1726,9 +1922,13 @@ if (typeof jQuery === 'undefined') {
that.$tip = null
that.$arrow = null
that.$viewport = null
+ that.$element = null
})
}
+ Tooltip.prototype.sanitizeHtml = function (unsafeHtml) {
+ return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn)
+ }
// TOOLTIP PLUGIN DEFINITION
// =========================
@@ -1762,10 +1962,10 @@ if (typeof jQuery === 'undefined') {
}(jQuery);
/* ========================================================================
- * Bootstrap: popover.js v3.3.6
- * http://getbootstrap.com/javascript/#popovers
+ * Bootstrap: popover.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#popovers
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@@ -1782,7 +1982,7 @@ if (typeof jQuery === 'undefined') {
if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
- Popover.VERSION = '3.3.6'
+ Popover.VERSION = '3.4.1'
Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
placement: 'right',
@@ -1808,10 +2008,25 @@ if (typeof jQuery === 'undefined') {
var title = this.getTitle()
var content = this.getContent()
- $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
- $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
- this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
- ](content)
+ if (this.options.html) {
+ var typeContent = typeof content
+
+ if (this.options.sanitize) {
+ title = this.sanitizeHtml(title)
+
+ if (typeContent === 'string') {
+ content = this.sanitizeHtml(content)
+ }
+ }
+
+ $tip.find('.popover-title').html(title)
+ $tip.find('.popover-content').children().detach().end()[
+ typeContent === 'string' ? 'html' : 'append'
+ ](content)
+ } else {
+ $tip.find('.popover-title').text(title)
+ $tip.find('.popover-content').children().detach().end().text(content)
+ }
$tip.removeClass('fade top bottom left right in')
@@ -1830,8 +2045,8 @@ if (typeof jQuery === 'undefined') {
return $e.attr('data-content')
|| (typeof o.content == 'function' ?
- o.content.call($e[0]) :
- o.content)
+ o.content.call($e[0]) :
+ o.content)
}
Popover.prototype.arrow = function () {
@@ -1871,10 +2086,10 @@ if (typeof jQuery === 'undefined') {
}(jQuery);
/* ========================================================================
- * Bootstrap: scrollspy.js v3.3.6
- * http://getbootstrap.com/javascript/#scrollspy
+ * Bootstrap: scrollspy.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#scrollspy
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@@ -1900,7 +2115,7 @@ if (typeof jQuery === 'undefined') {
this.process()
}
- ScrollSpy.VERSION = '3.3.6'
+ ScrollSpy.VERSION = '3.4.1'
ScrollSpy.DEFAULTS = {
offset: 10
@@ -2044,10 +2259,10 @@ if (typeof jQuery === 'undefined') {
}(jQuery);
/* ========================================================================
- * Bootstrap: tab.js v3.3.6
- * http://getbootstrap.com/javascript/#tabs
+ * Bootstrap: tab.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#tabs
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@@ -2064,7 +2279,7 @@ if (typeof jQuery === 'undefined') {
// jscs:enable requireDollarBeforejQueryAssignment
}
- Tab.VERSION = '3.3.6'
+ Tab.VERSION = '3.4.1'
Tab.TRANSITION_DURATION = 150
@@ -2093,7 +2308,7 @@ if (typeof jQuery === 'undefined') {
if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
- var $target = $(selector)
+ var $target = $(document).find(selector)
this.activate($this.closest('li'), $ul)
this.activate($target, $target.parent(), function () {
@@ -2118,15 +2333,15 @@ if (typeof jQuery === 'undefined') {
$active
.removeClass('active')
.find('> .dropdown-menu > .active')
- .removeClass('active')
+ .removeClass('active')
.end()
.find('[data-toggle="tab"]')
- .attr('aria-expanded', false)
+ .attr('aria-expanded', false)
element
.addClass('active')
.find('[data-toggle="tab"]')
- .attr('aria-expanded', true)
+ .attr('aria-expanded', true)
if (transition) {
element[0].offsetWidth // reflow for transition
@@ -2138,10 +2353,10 @@ if (typeof jQuery === 'undefined') {
if (element.parent('.dropdown-menu').length) {
element
.closest('li.dropdown')
- .addClass('active')
+ .addClass('active')
.end()
.find('[data-toggle="tab"]')
- .attr('aria-expanded', true)
+ .attr('aria-expanded', true)
}
callback && callback()
@@ -2200,10 +2415,10 @@ if (typeof jQuery === 'undefined') {
}(jQuery);
/* ========================================================================
- * Bootstrap: affix.js v3.3.6
- * http://getbootstrap.com/javascript/#affix
+ * Bootstrap: affix.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#affix
* ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
+ * Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
@@ -2217,7 +2432,9 @@ if (typeof jQuery === 'undefined') {
var Affix = function (element, options) {
this.options = $.extend({}, Affix.DEFAULTS, options)
- this.$target = $(this.options.target)
+ var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target)
+
+ this.$target = target
.on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
.on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
@@ -2229,7 +2446,7 @@ if (typeof jQuery === 'undefined') {
this.checkPosition()
}
- Affix.VERSION = '3.3.6'
+ Affix.VERSION = '3.4.1'
Affix.RESET = 'affix affix-top affix-bottom'
diff --git a/poky/bitbake/lib/toaster/toastergui/static/js/bootstrap-3.4.1.min.js b/poky/bitbake/lib/toaster/toastergui/static/js/bootstrap-3.4.1.min.js
new file mode 100644
index 0000000000..eb0a8b410f
--- /dev/null
+++ b/poky/bitbake/lib/toaster/toastergui/static/js/bootstrap-3.4.1.min.js
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.4.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(t){"use strict";var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||3<e[0])throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(),function(n){"use strict";n.fn.emulateTransitionEnd=function(t){var e=!1,i=this;n(this).one("bsTransitionEnd",function(){e=!0});return setTimeout(function(){e||n(i).trigger(n.support.transition.end)},t),this},n(function(){n.support.transition=function o(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var i in e)if(t.style[i]!==undefined)return{end:e[i]};return!1}(),n.support.transition&&(n.event.special.bsTransitionEnd={bindType:n.support.transition.end,delegateType:n.support.transition.end,handle:function(t){if(n(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}})})}(jQuery),function(s){"use strict";var e='[data-dismiss="alert"]',a=function(t){s(t).on("click",e,this.close)};a.VERSION="3.4.1",a.TRANSITION_DURATION=150,a.prototype.close=function(t){var e=s(this),i=e.attr("data-target");i||(i=(i=e.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),i="#"===i?[]:i;var o=s(document).find(i);function n(){o.detach().trigger("closed.bs.alert").remove()}t&&t.preventDefault(),o.length||(o=e.closest(".alert")),o.trigger(t=s.Event("close.bs.alert")),t.isDefaultPrevented()||(o.removeClass("in"),s.support.transition&&o.hasClass("fade")?o.one("bsTransitionEnd",n).emulateTransitionEnd(a.TRANSITION_DURATION):n())};var t=s.fn.alert;s.fn.alert=function o(i){return this.each(function(){var t=s(this),e=t.data("bs.alert");e||t.data("bs.alert",e=new a(this)),"string"==typeof i&&e[i].call(t)})},s.fn.alert.Constructor=a,s.fn.alert.noConflict=function(){return s.fn.alert=t,this},s(document).on("click.bs.alert.data-api",e,a.prototype.close)}(jQuery),function(s){"use strict";var n=function(t,e){this.$element=s(t),this.options=s.extend({},n.DEFAULTS,e),this.isLoading=!1};function i(o){return this.each(function(){var t=s(this),e=t.data("bs.button"),i="object"==typeof o&&o;e||t.data("bs.button",e=new n(this,i)),"toggle"==o?e.toggle():o&&e.setState(o)})}n.VERSION="3.4.1",n.DEFAULTS={loadingText:"loading..."},n.prototype.setState=function(t){var e="disabled",i=this.$element,o=i.is("input")?"val":"html",n=i.data();t+="Text",null==n.resetText&&i.data("resetText",i[o]()),setTimeout(s.proxy(function(){i[o](null==n[t]?this.options[t]:n[t]),"loadingText"==t?(this.isLoading=!0,i.addClass(e).attr(e,e).prop(e,!0)):this.isLoading&&(this.isLoading=!1,i.removeClass(e).removeAttr(e).prop(e,!1))},this),0)},n.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var i=this.$element.find("input");"radio"==i.prop("type")?(i.prop("checked")&&(t=!1),e.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==i.prop("type")&&(i.prop("checked")!==this.$element.hasClass("active")&&(t=!1),this.$element.toggleClass("active")),i.prop("checked",this.$element.hasClass("active")),t&&i.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var t=s.fn.button;s.fn.button=i,s.fn.button.Constructor=n,s.fn.button.noConflict=function(){return s.fn.button=t,this},s(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(t){var e=s(t.target).closest(".btn");i.call(e,"toggle"),s(t.target).is('input[type="radio"], input[type="checkbox"]')||(t.preventDefault(),e.is("input,button")?e.trigger("focus"):e.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(t){s(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))})}(jQuery),function(p){"use strict";var c=function(t,e){this.$element=p(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=e,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",p.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",p.proxy(this.pause,this)).on("mouseleave.bs.carousel",p.proxy(this.cycle,this))};function r(n){return this.each(function(){var t=p(this),e=t.data("bs.carousel"),i=p.extend({},c.DEFAULTS,t.data(),"object"==typeof n&&n),o="string"==typeof n?n:i.slide;e||t.data("bs.carousel",e=new c(this,i)),"number"==typeof n?e.to(n):o?e[o]():i.interval&&e.pause().cycle()})}c.VERSION="3.4.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(t){if(!/input|textarea/i.test(t.target.tagName)){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()}},c.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(p.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},c.prototype.getItemForDirection=function(t,e){var i=this.getItemIndex(e);if(("prev"==t&&0===i||"next"==t&&i==this.$items.length-1)&&!this.options.wrap)return e;var o=(i+("prev"==t?-1:1))%this.$items.length;return this.$items.eq(o)},c.prototype.to=function(t){var e=this,i=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(t>this.$items.length-1||t<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(i<t?"next":"prev",this.$items.eq(t))},c.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&p.support.transition&&(this.$element.trigger(p.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(t,e){var i=this.$element.find(".item.active"),o=e||this.getItemForDirection(t,i),n=this.interval,s="next"==t?"left":"right",a=this;if(o.hasClass("active"))return this.sliding=!1;var r=o[0],l=p.Event("slide.bs.carousel",{relatedTarget:r,direction:s});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,n&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var h=p(this.$indicators.children()[this.getItemIndex(o)]);h&&h.addClass("active")}var d=p.Event("slid.bs.carousel",{relatedTarget:r,direction:s});return p.support.transition&&this.$element.hasClass("slide")?(o.addClass(t),"object"==typeof o&&o.length&&o[0].offsetWidth,i.addClass(s),o.addClass(s),i.one("bsTransitionEnd",function(){o.removeClass([t,s].join(" ")).addClass("active"),i.removeClass(["active",s].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger(d)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(i.removeClass("active"),o.addClass("active"),this.sliding=!1,this.$element.trigger(d)),n&&this.cycle(),this}};var t=p.fn.carousel;p.fn.carousel=r,p.fn.carousel.Constructor=c,p.fn.carousel.noConflict=function(){return p.fn.carousel=t,this};var e=function(t){var e=p(this),i=e.attr("href");i&&(i=i.replace(/.*(?=#[^\s]+$)/,""));var o=e.attr("data-target")||i,n=p(document).find(o);if(n.hasClass("carousel")){var s=p.extend({},n.data(),e.data()),a=e.attr("data-slide-to");a&&(s.interval=!1),r.call(n,s),a&&n.data("bs.carousel").to(a),t.preventDefault()}};p(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),p(window).on("load",function(){p('[data-ride="carousel"]').each(function(){var t=p(this);r.call(t,t.data())})})}(jQuery),function(a){"use strict";var r=function(t,e){this.$element=a(t),this.options=a.extend({},r.DEFAULTS,e),this.$trigger=a('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};function n(t){var e,i=t.attr("data-target")||(e=t.attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"");return a(document).find(i)}function l(o){return this.each(function(){var t=a(this),e=t.data("bs.collapse"),i=a.extend({},r.DEFAULTS,t.data(),"object"==typeof o&&o);!e&&i.toggle&&/show|hide/.test(o)&&(i.toggle=!1),e||t.data("bs.collapse",e=new r(this,i)),"string"==typeof o&&e[o]()})}r.VERSION="3.4.1",r.TRANSITION_DURATION=350,r.DEFAULTS={toggle:!0},r.prototype.dimension=function(){return this.$element.hasClass("width")?"width":"height"},r.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var t,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(t=e.data("bs.collapse"))&&t.transitioning)){var i=a.Event("show.bs.collapse");if(this.$element.trigger(i),!i.isDefaultPrevented()){e&&e.length&&(l.call(e,"hide"),t||e.data("bs.collapse",null));var o=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[o](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var n=function(){this.$element.removeClass("collapsing").addClass("collapse in")[o](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return n.call(this);var s=a.camelCase(["scroll",o].join("-"));this.$element.one("bsTransitionEnd",a.proxy(n,this)).emulateTransitionEnd(r.TRANSITION_DURATION)[o](this.$element[0][s])}}}},r.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var t=a.Event("hide.bs.collapse");if(this.$element.trigger(t),!t.isDefaultPrevented()){var e=this.dimension();this.$element[e](this.$element[e]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var i=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!a.support.transition)return i.call(this);this.$element[e](0).one("bsTransitionEnd",a.proxy(i,this)).emulateTransitionEnd(r.TRANSITION_DURATION)}}},r.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},r.prototype.getParent=function(){return a(document).find(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(t,e){var i=a(e);this.addAriaAndCollapsedClass(n(i),i)},this)).end()},r.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass("in");t.attr("aria-expanded",i),e.toggleClass("collapsed",!i).attr("aria-expanded",i)};var t=a.fn.collapse;a.fn.collapse=l,a.fn.collapse.Constructor=r,a.fn.collapse.noConflict=function(){return a.fn.collapse=t,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(t){var e=a(this);e.attr("data-target")||t.preventDefault();var i=n(e),o=i.data("bs.collapse")?"toggle":e.data();l.call(i,o)})}(jQuery),function(a){"use strict";var r='[data-toggle="dropdown"]',o=function(t){a(t).on("click.bs.dropdown",this.toggle)};function l(t){var e=t.attr("data-target");e||(e=(e=t.attr("href"))&&/#[A-Za-z]/.test(e)&&e.replace(/.*(?=#[^\s]*$)/,""));var i="#"!==e?a(document).find(e):null;return i&&i.length?i:t.parent()}function s(o){o&&3===o.which||(a(".dropdown-backdrop").remove(),a(r).each(function(){var t=a(this),e=l(t),i={relatedTarget:this};e.hasClass("open")&&(o&&"click"==o.type&&/input|textarea/i.test(o.target.tagName)&&a.contains(e[0],o.target)||(e.trigger(o=a.Event("hide.bs.dropdown",i)),o.isDefaultPrevented()||(t.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",i)))))}))}o.VERSION="3.4.1",o.prototype.toggle=function(t){var e=a(this);if(!e.is(".disabled, :disabled")){var i=l(e),o=i.hasClass("open");if(s(),!o){"ontouchstart"in document.documentElement&&!i.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",s);var n={relatedTarget:this};if(i.trigger(t=a.Event("show.bs.dropdown",n)),t.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),i.toggleClass("open").trigger(a.Event("shown.bs.dropdown",n))}return!1}},o.prototype.keydown=function(t){if(/(38|40|27|32)/.test(t.which)&&!/input|textarea/i.test(t.target.tagName)){var e=a(this);if(t.preventDefault(),t.stopPropagation(),!e.is(".disabled, :disabled")){var i=l(e),o=i.hasClass("open");if(!o&&27!=t.which||o&&27==t.which)return 27==t.which&&i.find(r).trigger("focus"),e.trigger("click");var n=i.find(".dropdown-menu li:not(.disabled):visible a");if(n.length){var s=n.index(t.target);38==t.which&&0<s&&s--,40==t.which&&s<n.length-1&&s++,~s||(s=0),n.eq(s).trigger("focus")}}}};var t=a.fn.dropdown;a.fn.dropdown=function e(i){return this.each(function(){var t=a(this),e=t.data("bs.dropdown");e||t.data("bs.dropdown",e=new o(this)),"string"==typeof i&&e[i].call(t)})},a.fn.dropdown.Constructor=o,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=t,this},a(document).on("click.bs.dropdown.data-api",s).on("click.bs.dropdown.data-api",".dropdown form",function(t){t.stopPropagation()}).on("click.bs.dropdown.data-api",r,o.prototype.toggle).on("keydown.bs.dropdown.data-api",r,o.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",o.prototype.keydown)}(jQuery),function(a){"use strict";var s=function(t,e){this.options=e,this.$body=a(document.body),this.$element=a(t),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.fixedContent=".navbar-fixed-top, .navbar-fixed-bottom",this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};function r(o,n){return this.each(function(){var t=a(this),e=t.data("bs.modal"),i=a.extend({},s.DEFAULTS,t.data(),"object"==typeof o&&o);e||t.data("bs.modal",e=new s(this,i)),"string"==typeof o?e[o](n):i.show&&e.show(n)})}s.VERSION="3.4.1",s.TRANSITION_DURATION=300,s.BACKDROP_TRANSITION_DURATION=150,s.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},s.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},s.prototype.show=function(i){var o=this,t=a.Event("show.bs.modal",{relatedTarget:i});this.$element.trigger(t),this.isShown||t.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){o.$element.one("mouseup.dismiss.bs.modal",function(t){a(t.target).is(o.$element)&&(o.ignoreBackdropClick=!0)})}),this.backdrop(function(){var t=a.support.transition&&o.$element.hasClass("fade");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),o.adjustDialog(),t&&o.$element[0].offsetWidth,o.$element.addClass("in"),o.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:i});t?o.$dialog.one("bsTransitionEnd",function(){o.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(s.TRANSITION_DURATION):o.$element.trigger("focus").trigger(e)}))},s.prototype.hide=function(t){t&&t.preventDefault(),t=a.Event("hide.bs.modal"),this.$element.trigger(t),this.isShown&&!t.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(s.TRANSITION_DURATION):this.hideModal())},s.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(t){document===t.target||this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},s.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},s.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},s.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$body.removeClass("modal-open"),t.resetAdjustments(),t.resetScrollbar(),t.$element.trigger("hidden.bs.modal")})},s.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},s.prototype.backdrop=function(t){var e=this,i=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var o=a.support.transition&&i;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+i).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(t){this.ignoreBackdropClick?this.ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide())},this)),o&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!t)return;o?this.$backdrop.one("bsTransitionEnd",t).emulateTransitionEnd(s.BACKDROP_TRANSITION_DURATION):t()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var n=function(){e.removeBackdrop(),t&&t()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",n).emulateTransitionEnd(s.BACKDROP_TRANSITION_DURATION):n()}else t&&t()},s.prototype.handleUpdate=function(){this.adjustDialog()},s.prototype.adjustDialog=function(){var t=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},s.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},s.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth<t,this.scrollbarWidth=this.measureScrollbar()},s.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"";var n=this.scrollbarWidth;this.bodyIsOverflowing&&(this.$body.css("padding-right",t+n),a(this.fixedContent).each(function(t,e){var i=e.style.paddingRight,o=a(e).css("padding-right");a(e).data("padding-right",i).css("padding-right",parseFloat(o)+n+"px")}))},s.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad),a(this.fixedContent).each(function(t,e){var i=a(e).data("padding-right");a(e).removeData("padding-right"),e.style.paddingRight=i||""})},s.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var t=a.fn.modal;a.fn.modal=r,a.fn.modal.Constructor=s,a.fn.modal.noConflict=function(){return a.fn.modal=t,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(t){var e=a(this),i=e.attr("href"),o=e.attr("data-target")||i&&i.replace(/.*(?=#[^\s]+$)/,""),n=a(document).find(o),s=n.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(i)&&i},n.data(),e.data());e.is("a")&&t.preventDefault(),n.one("show.bs.modal",function(t){t.isDefaultPrevented()||n.one("hidden.bs.modal",function(){e.is(":visible")&&e.trigger("focus")})}),r.call(n,s,this)})}(jQuery),function(g){"use strict";var o=["sanitize","whiteList","sanitizeFn"],a=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],t={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},r=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,l=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function u(t,e){var i=t.nodeName.toLowerCase();if(-1!==g.inArray(i,e))return-1===g.inArray(i,a)||Boolean(t.nodeValue.match(r)||t.nodeValue.match(l));for(var o=g(e).filter(function(t,e){return e instanceof RegExp}),n=0,s=o.length;n<s;n++)if(i.match(o[n]))return!0;return!1}function n(t,e,i){if(0===t.length)return t;if(i&&"function"==typeof i)return i(t);if(!document.implementation||!document.implementation.createHTMLDocument)return t;var o=document.implementation.createHTMLDocument("sanitization");o.body.innerHTML=t;for(var n=g.map(e,function(t,e){return e}),s=g(o.body).find("*"),a=0,r=s.length;a<r;a++){var l=s[a],h=l.nodeName.toLowerCase();if(-1!==g.inArray(h,n))for(var d=g.map(l.attributes,function(t){return t}),p=[].concat(e["*"]||[],e[h]||[]),c=0,f=d.length;c<f;c++)u(d[c],p)||l.removeAttribute(d[c].nodeName);else l.parentNode.removeChild(l)}return o.body.innerHTML}var m=function(t,e){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",t,e)};m.VERSION="3.4.1",m.TRANSITION_DURATION=150,m.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:t},m.prototype.init=function(t,e,i){if(this.enabled=!0,this.type=t,this.$element=g(e),this.options=this.getOptions(i),this.$viewport=this.options.viewport&&g(document).find(g.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var o=this.options.trigger.split(" "),n=o.length;n--;){var s=o[n];if("click"==s)this.$element.on("click."+this.type,this.options.selector,g.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",r="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,g.proxy(this.enter,this)),this.$element.on(r+"."+this.type,this.options.selector,g.proxy(this.leave,this))}}this.options.selector?this._options=g.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},m.prototype.getDefaults=function(){return m.DEFAULTS},m.prototype.getOptions=function(t){var e=this.$element.data();for(var i in e)e.hasOwnProperty(i)&&-1!==g.inArray(i,o)&&delete e[i];return(t=g.extend({},this.getDefaults(),e,t)).delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t.sanitize&&(t.template=n(t.template,t.whiteList,t.sanitizeFn)),t},m.prototype.getDelegateOptions=function(){var i={},o=this.getDefaults();return this._options&&g.each(this._options,function(t,e){o[t]!=e&&(i[t]=e)}),i},m.prototype.enter=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusin"==t.type?"focus":"hover"]=!0),e.tip().hasClass("in")||"in"==e.hoverState)e.hoverState="in";else{if(clearTimeout(e.timeout),e.hoverState="in",!e.options.delay||!e.options.delay.show)return e.show();e.timeout=setTimeout(function(){"in"==e.hoverState&&e.show()},e.options.delay.show)}},m.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},m.prototype.leave=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusout"==t.type?"focus":"hover"]=!1),!e.isInStateTrue()){if(clearTimeout(e.timeout),e.hoverState="out",!e.options.delay||!e.options.delay.hide)return e.hide();e.timeout=setTimeout(function(){"out"==e.hoverState&&e.hide()},e.options.delay.hide)}},m.prototype.show=function(){var t=g.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var e=g.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!e)return;var i=this,o=this.tip(),n=this.getUID(this.type);this.setContent(),o.attr("id",n),this.$element.attr("aria-describedby",n),this.options.animation&&o.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,o[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,r=a.test(s);r&&(s=s.replace(a,"")||"top"),o.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?o.appendTo(g(document).find(this.options.container)):o.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var l=this.getPosition(),h=o[0].offsetWidth,d=o[0].offsetHeight;if(r){var p=s,c=this.getPosition(this.$viewport);s="bottom"==s&&l.bottom+d>c.bottom?"top":"top"==s&&l.top-d<c.top?"bottom":"right"==s&&l.right+h>c.width?"left":"left"==s&&l.left-h<c.left?"right":s,o.removeClass(p).addClass(s)}var f=this.getCalculatedOffset(s,l,h,d);this.applyPlacement(f,s);var u=function(){var t=i.hoverState;i.$element.trigger("shown.bs."+i.type),i.hoverState=null,"out"==t&&i.leave(i)};g.support.transition&&this.$tip.hasClass("fade")?o.one("bsTransitionEnd",u).emulateTransitionEnd(m.TRANSITION_DURATION):u()}},m.prototype.applyPlacement=function(t,e){var i=this.tip(),o=i[0].offsetWidth,n=i[0].offsetHeight,s=parseInt(i.css("margin-top"),10),a=parseInt(i.css("margin-left"),10);isNaN(s)&&(s=0),isNaN(a)&&(a=0),t.top+=s,t.left+=a,g.offset.setOffset(i[0],g.extend({using:function(t){i.css({top:Math.round(t.top),left:Math.round(t.left)})}},t),0),i.addClass("in");var r=i[0].offsetWidth,l=i[0].offsetHeight;"top"==e&&l!=n&&(t.top=t.top+n-l);var h=this.getViewportAdjustedDelta(e,t,r,l);h.left?t.left+=h.left:t.top+=h.top;var d=/top|bottom/.test(e),p=d?2*h.left-o+r:2*h.top-n+l,c=d?"offsetWidth":"offsetHeight";i.offset(t),this.replaceArrow(p,i[0][c],d)},m.prototype.replaceArrow=function(t,e,i){this.arrow().css(i?"left":"top",50*(1-t/e)+"%").css(i?"top":"left","")},m.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();this.options.html?(this.options.sanitize&&(e=n(e,this.options.whiteList,this.options.sanitizeFn)),t.find(".tooltip-inner").html(e)):t.find(".tooltip-inner").text(e),t.removeClass("fade in top bottom left right")},m.prototype.hide=function(t){var e=this,i=g(this.$tip),o=g.Event("hide.bs."+this.type);function n(){"in"!=e.hoverState&&i.detach(),e.$element&&e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),t&&t()}if(this.$element.trigger(o),!o.isDefaultPrevented())return i.removeClass("in"),g.support.transition&&i.hasClass("fade")?i.one("bsTransitionEnd",n).emulateTransitionEnd(m.TRANSITION_DURATION):n(),this.hoverState=null,this},m.prototype.fixTitle=function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").attr("title","")},m.prototype.hasContent=function(){return this.getTitle()},m.prototype.getPosition=function(t){var e=(t=t||this.$element)[0],i="BODY"==e.tagName,o=e.getBoundingClientRect();null==o.width&&(o=g.extend({},o,{width:o.right-o.left,height:o.bottom-o.top}));var n=window.SVGElement&&e instanceof window.SVGElement,s=i?{top:0,left:0}:n?null:t.offset(),a={scroll:i?document.documentElement.scrollTop||document.body.scrollTop:t.scrollTop()},r=i?{width:g(window).width(),height:g(window).height()}:null;return g.extend({},o,a,r,s)},m.prototype.getCalculatedOffset=function(t,e,i,o){return"bottom"==t?{top:e.top+e.height,left:e.left+e.width/2-i/2}:"top"==t?{top:e.top-o,left:e.left+e.width/2-i/2}:"left"==t?{top:e.top+e.height/2-o/2,left:e.left-i}:{top:e.top+e.height/2-o/2,left:e.left+e.width}},m.prototype.getViewportAdjustedDelta=function(t,e,i,o){var n={top:0,left:0};if(!this.$viewport)return n;var s=this.options.viewport&&this.options.viewport.padding||0,a=this.getPosition(this.$viewport);if(/right|left/.test(t)){var r=e.top-s-a.scroll,l=e.top+s-a.scroll+o;r<a.top?n.top=a.top-r:l>a.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;h<a.left?n.left=a.left-h:d>a.right&&(n.left=a.left+a.width-d)}return n},m.prototype.getTitle=function(){var t=this.$element,e=this.options;return t.attr("data-original-title")||("function"==typeof e.title?e.title.call(t[0]):e.title)},m.prototype.getUID=function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},m.prototype.tip=function(){if(!this.$tip&&(this.$tip=g(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},m.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},m.prototype.enable=function(){this.enabled=!0},m.prototype.disable=function(){this.enabled=!1},m.prototype.toggleEnabled=function(){this.enabled=!this.enabled},m.prototype.toggle=function(t){var e=this;t&&((e=g(t.currentTarget).data("bs."+this.type))||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e))),t?(e.inState.click=!e.inState.click,e.isInStateTrue()?e.enter(e):e.leave(e)):e.tip().hasClass("in")?e.leave(e):e.enter(e)},m.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})},m.prototype.sanitizeHtml=function(t){return n(t,this.options.whiteList,this.options.sanitizeFn)};var e=g.fn.tooltip;g.fn.tooltip=function i(o){return this.each(function(){var t=g(this),e=t.data("bs.tooltip"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.tooltip",e=new m(this,i)),"string"==typeof o&&e[o]())})},g.fn.tooltip.Constructor=m,g.fn.tooltip.noConflict=function(){return g.fn.tooltip=e,this}}(jQuery),function(n){"use strict";var s=function(t,e){this.init("popover",t,e)};if(!n.fn.tooltip)throw new Error("Popover requires tooltip.js");s.VERSION="3.4.1",s.DEFAULTS=n.extend({},n.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),((s.prototype=n.extend({},n.fn.tooltip.Constructor.prototype)).constructor=s).prototype.getDefaults=function(){return s.DEFAULTS},s.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();if(this.options.html){var o=typeof i;this.options.sanitize&&(e=this.sanitizeHtml(e),"string"===o&&(i=this.sanitizeHtml(i))),t.find(".popover-title").html(e),t.find(".popover-content").children().detach().end()["string"===o?"html":"append"](i)}else t.find(".popover-title").text(e),t.find(".popover-content").children().detach().end().text(i);t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},s.prototype.hasContent=function(){return this.getTitle()||this.getContent()},s.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},s.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var t=n.fn.popover;n.fn.popover=function e(o){return this.each(function(){var t=n(this),e=t.data("bs.popover"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.popover",e=new s(this,i)),"string"==typeof o&&e[o]())})},n.fn.popover.Constructor=s,n.fn.popover.noConflict=function(){return n.fn.popover=t,this}}(jQuery),function(s){"use strict";function n(t,e){this.$body=s(document.body),this.$scrollElement=s(t).is(document.body)?s(window):s(t),this.options=s.extend({},n.DEFAULTS,e),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",s.proxy(this.process,this)),this.refresh(),this.process()}function e(o){return this.each(function(){var t=s(this),e=t.data("bs.scrollspy"),i="object"==typeof o&&o;e||t.data("bs.scrollspy",e=new n(this,i)),"string"==typeof o&&e[o]()})}n.VERSION="3.4.1",n.DEFAULTS={offset:10},n.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},n.prototype.refresh=function(){var t=this,o="offset",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),s.isWindow(this.$scrollElement[0])||(o="position",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=s(this),e=t.data("target")||t.attr("href"),i=/^#./.test(e)&&s(e);return i&&i.length&&i.is(":visible")&&[[i[o]().top+n,e]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},n.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),o<=e)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e<n[0])return this.activeTarget=null,this.clear();for(t=n.length;t--;)a!=s[t]&&e>=n[t]&&(n[t+1]===undefined||e<n[t+1])&&this.activate(s[t])},n.prototype.activate=function(t){this.activeTarget=t,this.clear();var e=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',i=s(e).parents("li").addClass("active");i.parent(".dropdown-menu").length&&(i=i.closest("li.dropdown").addClass("active")),i.trigger("activate.bs.scrollspy")},n.prototype.clear=function(){s(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var t=s.fn.scrollspy;s.fn.scrollspy=e,s.fn.scrollspy.Constructor=n,s.fn.scrollspy.noConflict=function(){return s.fn.scrollspy=t,this},s(window).on("load.bs.scrollspy.data-api",function(){s('[data-spy="scroll"]').each(function(){var t=s(this);e.call(t,t.data())})})}(jQuery),function(r){"use strict";var a=function(t){this.element=r(t)};function e(i){return this.each(function(){var t=r(this),e=t.data("bs.tab");e||t.data("bs.tab",e=new a(this)),"string"==typeof i&&e[i]()})}a.VERSION="3.4.1",a.TRANSITION_DURATION=150,a.prototype.show=function(){var t=this.element,e=t.closest("ul:not(.dropdown-menu)"),i=t.data("target");if(i||(i=(i=t.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),!t.parent("li").hasClass("active")){var o=e.find(".active:last a"),n=r.Event("hide.bs.tab",{relatedTarget:t[0]}),s=r.Event("show.bs.tab",{relatedTarget:o[0]});if(o.trigger(n),t.trigger(s),!s.isDefaultPrevented()&&!n.isDefaultPrevented()){var a=r(document).find(i);this.activate(t.closest("li"),e),this.activate(a,a.parent(),function(){o.trigger({type:"hidden.bs.tab",relatedTarget:t[0]}),t.trigger({type:"shown.bs.tab",relatedTarget:o[0]})})}}},a.prototype.activate=function(t,e,i){var o=e.find("> .active"),n=i&&r.support.transition&&(o.length&&o.hasClass("fade")||!!e.find("> .fade").length);function s(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),n?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&n?o.one("bsTransitionEnd",s).emulateTransitionEnd(a.TRANSITION_DURATION):s(),o.removeClass("in")};var t=r.fn.tab;r.fn.tab=e,r.fn.tab.Constructor=a,r.fn.tab.noConflict=function(){return r.fn.tab=t,this};var i=function(t){t.preventDefault(),e.call(r(this),"show")};r(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(l){"use strict";var h=function(t,e){this.options=l.extend({},h.DEFAULTS,e);var i=this.options.target===h.DEFAULTS.target?l(this.options.target):l(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",l.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",l.proxy(this.checkPositionWithEventLoop,this)),this.$element=l(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function i(o){return this.each(function(){var t=l(this),e=t.data("bs.affix"),i="object"==typeof o&&o;e||t.data("bs.affix",e=new h(this,i)),"string"==typeof o&&e[o]()})}h.VERSION="3.4.1",h.RESET="affix affix-top affix-bottom",h.DEFAULTS={offset:0,target:window},h.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return n<i&&"top";if("bottom"==this.affixed)return null!=i?!(n+this.unpin<=s.top)&&"bottom":!(n+a<=t-o)&&"bottom";var r=null==this.affixed,l=r?n:s.top;return null!=i&&n<=i?"top":null!=o&&t-o<=l+(r?a:e)&&"bottom"},h.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(h.RESET).addClass("affix");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},h.prototype.checkPositionWithEventLoop=function(){setTimeout(l.proxy(this.checkPosition,this),1)},h.prototype.checkPosition=function(){if(this.$element.is(":visible")){var t=this.$element.height(),e=this.options.offset,i=e.top,o=e.bottom,n=Math.max(l(document).height(),l(document.body).height());"object"!=typeof e&&(o=i=e),"function"==typeof i&&(i=e.top(this.$element)),"function"==typeof o&&(o=e.bottom(this.$element));var s=this.getState(n,t,i,o);if(this.affixed!=s){null!=this.unpin&&this.$element.css("top","");var a="affix"+(s?"-"+s:""),r=l.Event(a+".bs.affix");if(this.$element.trigger(r),r.isDefaultPrevented())return;this.affixed=s,this.unpin="bottom"==s?this.getPinnedOffset():null,this.$element.removeClass(h.RESET).addClass(a).trigger(a.replace("affix","affixed")+".bs.affix")}"bottom"==s&&this.$element.offset({top:n-t-o})}};var t=l.fn.affix;l.fn.affix=i,l.fn.affix.Constructor=h,l.fn.affix.noConflict=function(){return l.fn.affix=t,this},l(window).on("load",function(){l('[data-spy="affix"]').each(function(){var t=l(this),e=t.data();e.offset=e.offset||{},null!=e.offsetBottom&&(e.offset.bottom=e.offsetBottom),null!=e.offsetTop&&(e.offset.top=e.offsetTop),i.call(t,e)})})}(jQuery); \ No newline at end of file
diff --git a/poky/bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js b/poky/bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js
deleted file mode 100644
index c4a924160d..0000000000
--- a/poky/bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Bootstrap v3.3.6 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under the MIT license
- */
-if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),
-d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file
diff --git a/poky/bitbake/lib/toaster/toastergui/static/js/jquery-3.7.1.min.js b/poky/bitbake/lib/toaster/toastergui/static/js/jquery-3.7.1.min.js
new file mode 100644
index 0000000000..7f37b5d991
--- /dev/null
+++ b/poky/bitbake/lib/toaster/toastergui/static/js/jquery-3.7.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function p(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+"").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",t="(?:\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",p="\\["+ge+"*("+t+")(?:"+ge+"*([*^$|!~]?=)"+ge+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+t+"))|)"+ge+"*\\]",g=":("+t+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+p+")*)|.*)\\)|)",v=new RegExp(ge+"+","g"),y=new RegExp("^"+ge+"*,"+ge+"*"),m=new RegExp("^"+ge+"*([>+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="<a id='"+S+"' href='' disabled='disabled'></a><select id='"+S+"-\r\\' disabled='disabled'><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(v," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(d,e,t,h,g){var v="nth"!==d.slice(0,3),y="last"!==d.slice(-4),m="of-type"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?"nextSibling":"previousSibling",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u="only"===d&&!s&&"nextSibling"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,"$1"));return s[S]?F(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||"")||I.error("unsupported lang: "+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,"input")&&!!e.checked||fe(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,"input")&&"button"===e.type||fe(e,"button")},text:function(e){var t;return fe(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve," ")}),a=a.slice(n.length)),b.filter)!(r=D[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&"parentNode"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Z(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!=w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[J(K(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ve,"$1"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+" "];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&Y(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split("").sort(l).join("")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement("fieldset"))}),ce.find=I,ce.expr[":"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&ce(e);if(!b.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,"parentNode")},parentsUntil:function(e,t,n){return d(e,"parentNode",n)},next:function(e){return A(e,"nextSibling")},prev:function(e){return A(e,"previousSibling")},nextAll:function(e){return d(e,"nextSibling")},prevAll:function(e){return d(e,"previousSibling")},nextUntil:function(e,t,n){return d(e,"nextSibling",n)},prevUntil:function(e,t,n){return d(e,"previousSibling",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,"template")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\x20\t\r\n\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},ce.extend({Deferred:function(e){var o=[["notify","progress",ce.Callbacks("memory"),ce.Callbacks("memory"),2],["resolve","done",ce.Callbacks("once memory"),ce.Callbacks("once memory"),0,"resolved"],["reject","fail",ce.Callbacks("once memory"),ce.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener("DOMContentLoaded",P),ie.removeEventListener("load",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)["catch"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,"complete"===C.readyState||"loading"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener("DOMContentLoaded",P),ie.addEventListener("load",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,"ms-").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(U,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=z.get(o),1===o.nodeType&&!_.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks("once memory").add(function(){_.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ce.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=_.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Y=new RegExp("^(?:([+-])=|)("+G+")([a-z%]*)$","i"),Q=["Top","Right","Bottom","Left"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&K(e)&&"none"===ce.css(e,"display")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?"":"px"),c=e.nodeType&&(ce.cssNumber[t]||"px"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ne={};function re(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=_.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ne[s]=u)))):"none"!==n&&(l[c]="none",_.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="<textarea>x</textarea>",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="<option></option>",le.option=!!xe.lastChild;var ke={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],"globalEval",!t||_.get(t[n],"globalEval"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,"<select multiple='multiple'>","</select>"]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement("div")),s=(Te.exec(o)||["",""])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),"script"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||"")&&n.push(o)}return f}var De=/^([^.]*)(?:\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Le(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(D)||[""]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(D)||[""]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=ce.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,"events")||Object.create(null))[u.type]||[],c=ce.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=ce.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<ce(i,this).index(l):ce.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,"input")&&_.get(t,"click")||fe(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},ce.event.addProp),ce.each({focus:"focusin",blur:"focusout"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,"handle"),n=ce.event.fix(e);n.type="focusin"===e.type?"focus":"blur",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\s*(?:[^=]|=\s*.checked.)/i,Me=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=v(d);if(h||1<f&&"string"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,"script"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||"")&&!_.access(u,"globalEval")&&ce.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):m(u.textContent.replace(Me,""),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,"script")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,"script")).length&&Ee(a,!f&&Se(e,"script")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(Se(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Oe.test(e)&&!ke[(Te.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp("^("+G+")(?!px)[a-z%]+$","i"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ve=new RegExp(Q.join("|"),"i");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,"$1")||void 0),""!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+"":a}function Ye(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",J.appendChild(u).appendChild(l);var e=ie.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement("div"),l=C.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",le.clearCloneStyle="content-box"===l.style.backgroundClip,ce.extend(le,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=C.createElement("table"),t=C.createElement("tr"),n=C.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="box-sizing:content-box;border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",J.appendChild(e).appendChild(t).appendChild(n),r=ie.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,J.removeChild(e)),a}}))}();var Qe=["Webkit","Moz","ms"],Je=C.createElement("div").style,Ke={};function Ze(e){var t=ce.cssProps[e]||Ke[e];return t||(e in Je?e:Ke[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Qe.length;while(n--)if((e=Qe[n]+t)in Je)return e}(e)||e)}var et=/^(none|table(?!-c[ea]).+)/,tt={position:"absolute",visibility:"hidden",display:"block"},nt={letterSpacing:"0",fontWeight:"400"};function rt(e,t,n){var r=Y.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function it(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0,l=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=ce.css(e,n+Q[a],!0,i)),r?("content"===n&&(u-=ce.css(e,"padding"+Q[a],!0,i)),"margin"!==n&&(u-=ce.css(e,"border"+Q[a]+"Width",!0,i))):(u+=ce.css(e,"padding"+Q[a],!0,i),"padding"!==n?u+=ce.css(e,"border"+Q[a]+"Width",!0,i):s+=ce.css(e,"border"+Q[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function ot(e,t,n){var r=Xe(e),i=(!le.boxSizingReliable()||n)&&"border-box"===ce.css(e,"boxSizing",!1,r),o=i,a=Ge(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(_e.test(a)){if(!n)return a;a="auto"}return(!le.boxSizingReliable()&&i||!le.reliableTrDimensions()&&fe(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===ce.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===ce.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+it(e,t,n||(i?"border":"content"),o,r,a)+"px"}function at(e,t,n,r,i){return new at.prototype.init(e,t,n,r,i)}ce.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ge(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=F(t),u=ze.test(t),l=e.style;if(u||(t=Ze(s)),a=ce.cssHooks[t]||ce.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=Y.exec(n))&&i[1]&&(n=te(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(ce.cssNumber[s]?"":"px")),le.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=F(t);return ze.test(t)||(t=Ze(s)),(a=ce.cssHooks[t]||ce.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ge(e,t,r)),"normal"===i&&t in nt&&(i=nt[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),ce.each(["height","width"],function(e,u){ce.cssHooks[u]={get:function(e,t,n){if(t)return!et.test(ce.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ot(e,u,n):Ue(e,tt,function(){return ot(e,u,n)})},set:function(e,t,n){var r,i=Xe(e),o=!le.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===ce.css(e,"boxSizing",!1,i),s=n?it(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-it(e,u,"border",!1,i)-.5)),s&&(r=Y.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=ce.css(e,u)),rt(0,t,s)}}}),ce.cssHooks.marginLeft=Ye(le.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Ge(e,"marginLeft"))||e.getBoundingClientRect().left-Ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),ce.each({margin:"",padding:"",border:"Width"},function(i,o){ce.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+Q[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(ce.cssHooks[i+o].set=rt)}),ce.fn.extend({css:function(e,t){return M(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Xe(e),i=t.length;a<i;a++)o[t[a]]=ce.css(e,t[a],!1,r);return o}return void 0!==n?ce.style(e,t,n):ce.css(e,t)},e,t,1<arguments.length)}}),((ce.Tween=at).prototype={constructor:at,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?"":"px")},cur:function(){var e=at.propHooks[this.prop];return e&&e.get?e.get(this):at.propHooks._default.get(this)},run:function(e){var t,n=at.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):at.propHooks._default.set(this),this}}).init.prototype=at.prototype,(at.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||!ce.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=at.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},ce.fx=at.prototype.init,ce.fx.step={};var st,ut,lt,ct,ft=/^(?:toggle|show|hide)$/,pt=/queueHooks$/;function dt(){ut&&(!1===C.hidden&&ie.requestAnimationFrame?ie.requestAnimationFrame(dt):ie.setTimeout(dt,ce.fx.interval),ce.fx.tick())}function ht(){return ie.setTimeout(function(){st=void 0}),st=Date.now()}function gt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=Q[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function vt(e,t,n){for(var r,i=(yt.tweeners[t]||[]).concat(yt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function yt(o,e,t){var n,a,r=0,i=yt.prefilters.length,s=ce.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=st||ht(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:ce.extend({},e),opts:ce.extend(!0,{specialEasing:{},easing:ce.easing._default},t),originalProperties:e,originalOptions:t,startTime:st||ht(),duration:t.duration,tweens:[],createTween:function(e,t){var n=ce.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=F(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=ce.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=yt.prefilters[r].call(l,o,c,l.opts))return v(n.stop)&&(ce._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return ce.map(c,vt,l),v(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),ce.fx.timer(ce.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}ce.Animation=ce.extend(yt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return te(n.elem,e,Y.exec(t),n),n}]},tweener:function(e,t){v(e)?(t=e,e=["*"]):e=e.match(D);for(var n,r=0,i=e.length;r<i;r++)n=e[r],yt.tweeners[n]=yt.tweeners[n]||[],yt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ee(e),v=_.get(e,"fxshow");for(r in n.queue||(null==(a=ce._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,ce.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ft.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||ce.style(e,r)}if((u=!ce.isEmptyObject(t))||!ce.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=_.get(e,"display")),"none"===(c=ce.css(e,"display"))&&(l?c=l:(re([e],!0),l=e.style.display||l,c=ce.css(e,"display"),re([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===ce.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=_.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&re([e],!0),p.done(function(){for(r in g||re([e]),_.remove(e,"fxshow"),d)ce.style(e,r,d[r])})),u=vt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?yt.prefilters.unshift(e):yt.prefilters.push(e)}}),ce.speed=function(e,t,n){var r=e&&"object"==typeof e?ce.extend({},e):{complete:n||!n&&t||v(e)&&e,duration:e,easing:n&&t||t&&!v(t)&&t};return ce.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in ce.fx.speeds?r.duration=ce.fx.speeds[r.duration]:r.duration=ce.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){v(r.old)&&r.old.call(this),r.queue&&ce.dequeue(this,r.queue)},r},ce.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ee).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=ce.isEmptyObject(t),o=ce.speed(e,n,r),a=function(){var e=yt(this,ce.extend({},t),o);(i||_.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=ce.timers,r=_.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&pt.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||ce.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=_.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=ce.timers,o=n?n.length:0;for(t.finish=!0,ce.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),ce.each(["toggle","show","hide"],function(e,r){var i=ce.fn[r];ce.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(gt(r,!0),e,t,n)}}),ce.each({slideDown:gt("show"),slideUp:gt("hide"),slideToggle:gt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){ce.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),ce.timers=[],ce.fx.tick=function(){var e,t=0,n=ce.timers;for(st=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||ce.fx.stop(),st=void 0},ce.fx.timer=function(e){ce.timers.push(e),ce.fx.start()},ce.fx.interval=13,ce.fx.start=function(){ut||(ut=!0,dt())},ce.fx.stop=function(){ut=null},ce.fx.speeds={slow:600,fast:200,_default:400},ce.fn.delay=function(r,e){return r=ce.fx&&ce.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=ie.setTimeout(e,r);t.stop=function(){ie.clearTimeout(n)}})},lt=C.createElement("input"),ct=C.createElement("select").appendChild(C.createElement("option")),lt.type="checkbox",le.checkOn=""!==lt.value,le.optSelected=ct.selected,(lt=C.createElement("input")).value="t",lt.type="radio",le.radioValue="t"===lt.value;var mt,xt=ce.expr.attrHandle;ce.fn.extend({attr:function(e,t){return M(this,ce.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(i=ce.attrHooks[t.toLowerCase()]||(ce.expr.match.bool.test(t)?mt:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=ce.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!le.radioValue&&"radio"===t&&fe(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(D);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),mt={set:function(e,t,n){return!1===t?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\w+/g),function(e,t){var a=xt[t]||ce.find.attr;xt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=xt[o],xt[o]=r,r=null!=a(e,t,n)?o:null,xt[o]=i),r}});var bt=/^(?:input|select|textarea|button)$/i,wt=/^(?:a|area)$/i;function Tt(e){return(e.match(D)||[]).join(" ")}function Ct(e){return e.getAttribute&&e.getAttribute("class")||""}function kt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(D)||[]}ce.fn.extend({prop:function(e,t){return M(this,ce.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,"tabindex");return t?parseInt(t,10):bt.test(e.nodeName)||wt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),le.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ce.propFix[this.toLowerCase()]=this}),ce.fn.extend({addClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).addClass(t.call(this,e,Ct(this)))}):(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++)i=e[o],n.indexOf(" "+i+" ")<0&&(n+=i+" ");a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this},removeClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).removeClass(t.call(this,e,Ct(this)))}):arguments.length?(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++){i=e[o];while(-1<n.indexOf(" "+i+" "))n=n.replace(" "+i+" "," ")}a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this:this.attr("class","")},toggleClass:function(t,n){var e,r,i,o,a=typeof t,s="string"===a||Array.isArray(t);return v(t)?this.each(function(e){ce(this).toggleClass(t.call(this,e,Ct(this),n),n)}):"boolean"==typeof n&&s?n?this.addClass(t):this.removeClass(t):(e=kt(t),this.each(function(){if(s)for(o=ce(this),i=0;i<e.length;i++)r=e[i],o.hasClass(r)?o.removeClass(r):o.addClass(r);else void 0!==t&&"boolean"!==a||((r=Ct(this))&&_.set(this,"__className__",r),this.setAttribute&&this.setAttribute("class",r||!1===t?"":_.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+Tt(Ct(n))+" ").indexOf(t))return!0;return!1}});var St=/\r/g;ce.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=v(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,ce(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=ce.map(t,function(e){return null==e?"":e+""})),(r=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=ce.valHooks[t.type]||ce.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(St,""):null==e?"":e:void 0}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,"value");return null!=t?t:Tt(ce.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!fe(n.parentNode,"optgroup"))){if(t=ce(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=ce.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<ce.inArray(ce.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each(["radio","checkbox"],function(){ce.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<ce.inArray(ce(e).val(),t)}},le.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Et=ie.location,jt={guid:Date.now()},At=/\?/;ce.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new ie.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||ce.error("Invalid XML: "+(n?ce.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Dt=/^(?:focusinfocus|focusoutblur)$/,Nt=function(e){e.stopPropagation()};ce.extend(ce.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||C],d=ue.call(e,"type")?e.type:e,h=ue.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||C,3!==n.nodeType&&8!==n.nodeType&&!Dt.test(d+ce.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[ce.expando]?e:new ce.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:ce.makeArray(t,[e]),c=ce.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!y(n)){for(s=c.delegateType||d,Dt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||C)&&p.push(a.defaultView||a.parentWindow||ie)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(_.get(o,"events")||Object.create(null))[e.type]&&_.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&$(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!$(n)||u&&v(n[d])&&!y(n)&&((a=n[u])&&(n[u]=null),ce.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Nt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Nt),ce.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}});var qt=/\[\]$/,Lt=/\r?\n/g,Ht=/^(?:submit|button|image|reset|file)$/i,Ot=/^(?:input|select|textarea|keygen)/i;function Pt(n,e,r,i){var t;if(Array.isArray(e))ce.each(e,function(e,t){r||qt.test(n)?i(n,t):Pt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==x(e))i(n,e);else for(t in e)Pt(n+"["+t+"]",e[t],r,i)}ce.param=function(e,t){var n,r=[],i=function(e,t){var n=v(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Pt(n,e[n],t,i);return r.join("&")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,"elements");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(":disabled")&&Ot.test(this.nodeName)&&!Ht.test(e)&&(this.checked||!we.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:Array.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,"\r\n")}}):{name:t.name,value:n.replace(Lt,"\r\n")}}).get()}});var Mt=/%20/g,Rt=/#.*$/,It=/([?&])_=[^&]*/,Wt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ft=/^(?:GET|HEAD)$/,$t=/^\/\//,Bt={},_t={},zt="*/".concat("*"),Xt=C.createElement("a");function Ut(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(D)||[];if(v(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Vt(t,i,o,a){var s={},u=t===_t;function l(e){var r;return s[e]=!0,ce.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Gt(e,t){var n,r,i=ce.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&ce.extend(!0,e,r),e}Xt.href=Et.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Gt(Gt(e,ce.ajaxSettings),t):Gt(ce.ajaxSettings,e)},ajaxPrefilter:Ut(Bt),ajaxTransport:Ut(_t),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=ce.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?ce(y):ce.event,x=ce.Deferred(),b=ce.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Wt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace($t,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(D)||[""],null==v.crossDomain){r=C.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Xt.protocol+"//"+Xt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=ce.param(v.data,v.traditional)),Vt(Bt,v,t,T),h)return T;for(i in(g=ce.event&&v.global)&&0==ce.active++&&ce.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ft.test(v.type),f=v.url.replace(Rt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Mt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(At.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(It,"$1"),o=(At.test(f)?"&":"?")+"_="+jt.guid+++o),v.url=f+o),v.ifModified&&(ce.lastModified[f]&&T.setRequestHeader("If-Modified-Since",ce.lastModified[f]),ce.etag[f]&&T.setRequestHeader("If-None-Match",ce.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+zt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Vt(_t,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=ie.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&ie.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<ce.inArray("script",v.dataTypes)&&ce.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(ce.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(ce.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--ce.active||ce.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return ce.get(e,t,n,"json")},getScript:function(e,t){return ce.get(e,void 0,t,"script")}}),ce.each(["get","post"],function(e,i){ce[i]=function(e,t,n,r){return v(t)&&(r=r||n,n=t,t=void 0),ce.ajax(ce.extend({url:e,type:i,dataType:r,data:t,success:n},ce.isPlainObject(e)&&e))}}),ce.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),ce._evalUrl=function(e,t,n){return ce.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){ce.globalEval(e,t,n)}})},ce.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return v(n)?this.each(function(e){ce(this).wrapInner(n.call(this,e))}):this.each(function(){var e=ce(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=v(t);return this.each(function(e){ce(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){ce(this).replaceWith(this.childNodes)}),this}}),ce.expr.pseudos.hidden=function(e){return!ce.expr.pseudos.visible(e)},ce.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},ce.ajaxSettings.xhr=function(){try{return new ie.XMLHttpRequest}catch(e){}};var Yt={0:200,1223:204},Qt=ce.ajaxSettings.xhr();le.cors=!!Qt&&"withCredentials"in Qt,le.ajax=Qt=!!Qt,ce.ajaxTransport(function(i){var o,a;if(le.cors||Qt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Yt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&ie.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),ce.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),ce.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),ce.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=ce("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=Tt(e.slice(s)),e=e.slice(0,s)),v(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&ce.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?ce("<div>").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var en=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;ce.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),v(e))return r=ae.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(ae.call(arguments)))}).guid=e.guid=e.guid||ce.guid++,i},ce.holdReady=function(e){e?ce.readyWait++:ce.ready(!0)},ce.isArray=Array.isArray,ce.parseJSON=JSON.parse,ce.nodeName=fe,ce.isFunction=v,ce.isWindow=y,ce.camelCase=F,ce.type=x,ce.now=Date.now,ce.isNumeric=function(e){var t=ce.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},ce.trim=function(e){return null==e?"":(e+"").replace(en,"$1")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return ce});var tn=ie.jQuery,nn=ie.$;return ce.noConflict=function(e){return ie.$===ce&&(ie.$=nn),e&&ie.jQuery===ce&&(ie.jQuery=tn),ce},"undefined"==typeof e&&(ie.jQuery=ie.$=ce),ce});
diff --git a/poky/bitbake/lib/toaster/toastergui/static/js/jquery-3.7.1.min.map b/poky/bitbake/lib/toaster/toastergui/static/js/jquery-3.7.1.min.map
new file mode 100644
index 0000000000..db38af5893
--- /dev/null
+++ b/poky/bitbake/lib/toaster/toastergui/static/js/jquery-3.7.1.min.map
@@ -0,0 +1 @@
+{"version":3,"sources":["jquery-3.7.1.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","rhtmlSuffix","jQuery","selector","context","fn","init","isArrayLike","length","nodeName","elem","name","toLowerCase","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","textContent","documentElement","nodeValue","makeArray","results","inArray","isXMLDoc","namespace","namespaceURI","docElem","ownerDocument","test","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","pop","whitespace","rtrimCSS","RegExp","contains","a","b","bup","compareDocumentPosition","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","escapeSelector","sel","preferredDoc","pushNative","Expr","outermostContext","sortInput","hasDuplicate","documentIsHTML","rbuggyQSA","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","booleans","identifier","attributes","pseudos","rwhitespace","rcomma","rleadingCombinator","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","unloadHandler","setDocument","inDisabledFieldset","addCombinator","disabled","dir","next","childNodes","e","els","find","seed","m","nid","match","groups","newSelector","newContext","exec","getElementById","id","getElementsByTagName","getElementsByClassName","testContext","scope","tokenize","toSelector","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","key","cacheLength","shift","markFunction","assert","el","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","subWindow","webkitMatchesSelector","msMatchesSelector","defaultView","top","addEventListener","getById","getElementsByName","disconnectedMatch","cssHas","querySelector","filter","attrId","getAttributeNode","tag","className","input","innerHTML","compare","sortDetached","expr","elements","matchesSelector","attr","attrHandle","uniqueSort","duplicates","sortStable","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","expectedNodeName","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","outerCache","nodeIndex","start","parent","useCache","diff","firstChild","lastChild","pseudo","args","setFilters","idx","matched","not","matcher","compile","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","err","safeActiveElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","nextSibling","header","button","_matchIndexes","lt","gt","nth","radio","checkbox","file","password","image","submit","reset","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","matcherOut","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","filters","unique","getText","isXML","selectors","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","cur","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","list","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","handler","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","rejectWith","getErrorHook","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","asyncError","console","warn","message","stack","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","attrs","dequeue","startLength","hooks","_queueHooks","unshift","stop","setter","clearQueue","tmp","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","defaultValue","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","rhtml","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","on","types","one","origFn","event","off","leverageNative","isSetup","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","isImmediatePropagationStopped","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","Event","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","Date","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","focusMappedHandler","documentMode","simulate","attaches","dataHolder","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","rcustomProp","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","isCustomProp","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","marginDelta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","aspectRatio","borderImageSlice","columnCount","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeMiterlimit","strokeOpacity","origName","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classNames","curValue","finalValue","removeClass","toggleClass","stateVal","isValidValue","hasClass","rreturn","valHooks","optionSet","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","triggerHandler","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","rtrim","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.7.1.min.js"} \ No newline at end of file
diff --git a/poky/bitbake/lib/toaster/toastergui/static/js/libtoaster.js b/poky/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
index f2c45c833e..d4ac31234c 100644
--- a/poky/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
+++ b/poky/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
@@ -657,7 +657,7 @@ $(document).ready(function() {
hljs.initHighlightingOnLoad();
// Prevent invalid links from jumping page scroll
- $('a[href=#]').click(function() {
+ $('a[href="#"]').click(function() {
return false;
});
diff --git a/poky/bitbake/lib/toaster/toastergui/static/js/projectpage.js b/poky/bitbake/lib/toaster/toastergui/static/js/projectpage.js
index 506471e091..a3c95810a7 100644
--- a/poky/bitbake/lib/toaster/toastergui/static/js/projectpage.js
+++ b/poky/bitbake/lib/toaster/toastergui/static/js/projectpage.js
@@ -61,7 +61,7 @@ function projectPageInit(ctx) {
distroChangeInput.val(urlParams.setDistro);
distroChangeBtn.click();
} else {
- updateDistroName(prjInfo.distro.name);
+ updateDistroName(prjInfo.distro?.name);
}
/* Now we're really ready show the page */
diff --git a/poky/bitbake/lib/toaster/toastergui/templates/base.html b/poky/bitbake/lib/toaster/toastergui/templates/base.html
index 2b3054936a..041448d180 100644
--- a/poky/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/poky/bitbake/lib/toaster/toastergui/templates/base.html
@@ -14,11 +14,11 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
- <script src="{% static 'js/jquery-2.0.3.min.js' %}">
+ <script src="{% static 'js/jquery-3.7.1.min.js' %}">
</script>
<script src="{% static 'js/jquery.cookie.js' %}">
</script>
- <script src="{% static 'js/bootstrap.min.js' %}">
+ <script src="{% static 'js/bootstrap-3.4.1.min.js' %}">
</script>
<script src="{% static 'js/typeahead.jquery.js' %}">
</script>
@@ -94,7 +94,7 @@
</a>
<a class="brand" href="/">Toaster</a>
{% if DEBUG %}
- <span class="glyphicon glyphicon-info-sign" title="<strong>Toaster version information</strong>" data-content="<dl><dt>Git branch</dt><dd>{{TOASTER_BRANCH}}</dd><dt>Git revision</dt><dd>{{TOASTER_REVISION}}</dd></dl>"></i>
+ <span id="toaster-version-info-sign" class="glyphicon glyphicon-info-sign" title="<strong>Toaster version information</strong>" data-content="<dl><dt>Git branch</dt><dd>{{TOASTER_BRANCH}}</dd><dt>Git revision</dt><dd>{{TOASTER_REVISION}}</dd></dl>"></i>
{% endif %}
</div>
</div>
diff --git a/poky/bitbake/lib/toaster/toastergui/templates/base_specific.html b/poky/bitbake/lib/toaster/toastergui/templates/base_specific.html
index e377cadd73..425f7ed73d 100644
--- a/poky/bitbake/lib/toaster/toastergui/templates/base_specific.html
+++ b/poky/bitbake/lib/toaster/toastergui/templates/base_specific.html
@@ -14,11 +14,11 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
- <script src="{% static 'js/jquery-2.0.3.min.js' %}">
+ <script src="{% static 'js/jquery-3.7.1.min.js' %}">
</script>
<script src="{% static 'js/jquery.cookie.js' %}">
</script>
- <script src="{% static 'js/bootstrap.min.js' %}">
+ <script src="{% static 'js/bootstrap-3.4.1.min.js' %}">
</script>
<script src="{% static 'js/typeahead.jquery.js' %}">
</script>
diff --git a/poky/bitbake/lib/toaster/toastergui/templates/js-unit-tests.html b/poky/bitbake/lib/toaster/toastergui/templates/js-unit-tests.html
index ca248962f0..41553c4f9d 100644
--- a/poky/bitbake/lib/toaster/toastergui/templates/js-unit-tests.html
+++ b/poky/bitbake/lib/toaster/toastergui/templates/js-unit-tests.html
@@ -11,7 +11,7 @@
<script src="{% static 'js/layerDepsModal.js' %}"></script>
<script src="{% static 'js/projectpage.js' %}"></script>
-<script src="{% static 'js/bootstrap.min.js' %}"></script>
+<script src="{% static 'js/bootstrap-3.4.1.min.js' %}"></script>
<script src="{% static 'js/filtersnippet.js' %}"></script>
<script src="{% static 'js/importlayer.js' %}"></script>
<script src="{% static 'js/highlight.pack.js' %}"></script>
diff --git a/poky/bitbake/lib/toaster/toastergui/templates/landing.html b/poky/bitbake/lib/toaster/toastergui/templates/landing.html
index 08b40fb2f2..22bbed695a 100644
--- a/poky/bitbake/lib/toaster/toastergui/templates/landing.html
+++ b/poky/bitbake/lib/toaster/toastergui/templates/landing.html
@@ -12,7 +12,7 @@
<div class="col-md-6">
<h1>This is Toaster</h1>
- <p>A web interface to <a href="https://www.openembedded.org">OpenEmbedded</a> and <a href="https://www.yoctoproject.org/tools-resources/projects/bitbake">BitBake</a>, the <a href="https://www.yoctoproject.org">Yocto Project</a> build system.</p>
+ <p>A web interface to <a href="https://www.openembedded.org">OpenEmbedded</a> and <a href="https://docs.yoctoproject.org/bitbake.html">BitBake</a>, the <a href="https://www.yoctoproject.org">Yocto Project</a> build system.</p>
<p class="top-air">
<a class="btn btn-info btn-lg" href="http://docs.yoctoproject.org/toaster-manual/setup-and-use.html#setting-up-and-using-toaster">
diff --git a/poky/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/poky/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index 98d9fac822..9fc7dfaee4 100644
--- a/poky/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/poky/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -63,7 +63,7 @@
<%/if%>
</div>
- <div data-build-state="<%:state%>">
+ <div class="build-state" data-build-state="<%:state%>">
<%if state == 'Cloning'%>
<%include tmpl='#cloning-repos-build-template'/%>
<%else state == 'Parsing'%>
diff --git a/poky/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html b/poky/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
index a5d5893571..2493954deb 100644
--- a/poky/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
+++ b/poky/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
@@ -18,7 +18,7 @@
</ul>
<div class="tab-content">
<div class="tab-pane active" id="dependencies">
- {% ifequal runtime_deps|length 0 %}
+ {% if runtime_deps|length == 0 %}
<div class="alert alert-info">
<strong>{{package.fullpackagespec}}</strong> has no runtime dependencies.
</div>
@@ -54,8 +54,8 @@
{% endfor %}
</tbody>
</table>
- {% endifequal %}
- {% ifnotequal other_deps|length 0 %}
+ {% endif %}
+ {% if other_deps|length != 0 %}
<h3>Other runtime relationships</h3>
<table class="table table-bordered table-hover">
<thead>
@@ -93,7 +93,7 @@
{% endfor %}
</tbody>
</table>
- {% endifnotequal %}
+ {% endif %}
</div> <!-- tab-pane -->
</div> <!-- tab-content -->
{% endblock tabcontent %}
diff --git a/poky/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html b/poky/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
index 95e56ded26..1f5ed6d913 100644
--- a/poky/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
+++ b/poky/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
@@ -14,7 +14,7 @@
{% include "package_included_tabs.html" with active_tab="dependencies" %}
<div class="tab-content">
<div class="tab-pane active" id="dependencies">
- {% ifnotequal runtime_deps|length 0 %}
+ {% if runtime_deps|length != 0 %}
<table class="table table-bordered table-hover">
<thead>
<tr>
@@ -48,9 +48,9 @@
<div class="alert alert-info">
<strong>{{package.fullpackagespec}}</strong> has no runtime dependencies.
</div>
- {% endifnotequal %}
+ {% endif %}
- {% ifnotequal other_deps|length 0 %}
+ {% if other_deps|length != 0 %}
<h3>Other runtime relationships</h3>
<table class="table table-bordered table-hover">
<thead>
@@ -103,7 +103,7 @@
{% endfor %}
</tbody>
</table>
- {% endifnotequal %}
+ {% endif %}
</div> <!-- end tab-pane -->
</div> <!-- end tab content -->
{% endwith %}
diff --git a/poky/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html b/poky/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html
index fb310c7fc7..dae4549e21 100644
--- a/poky/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html
+++ b/poky/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html
@@ -15,7 +15,7 @@
<div class="tab-content">
<div class="tab-pane active" id="brought-in-by">
- {% ifequal reverse_count 0 %}
+ {% if reverse_count == 0 %}
<div class="alert alert-info">
<strong>{{package.fullpackagespec}}</strong> has no reverse runtime dependencies.
</div>
@@ -43,7 +43,7 @@
{% endfor %}
</tbody>
</table>
- {% endifequal %}
+ {% endif %}
</div> <!-- end tab-pane -->
</div> <!-- end tab content -->
{% endwith %}
diff --git a/poky/bitbake/lib/toaster/toastergui/templates/recipe.html b/poky/bitbake/lib/toaster/toastergui/templates/recipe.html
index 3f76e656fe..4b5301b548 100644
--- a/poky/bitbake/lib/toaster/toastergui/templates/recipe.html
+++ b/poky/bitbake/lib/toaster/toastergui/templates/recipe.html
@@ -186,9 +186,9 @@
<i class="icon-question-sign get-help hover-help" title="{{task.get_outcome_help}}"></i>
</td>
<td>
- {% ifnotequal task.sstate_result task.SSTATE_NA %}
+ {% if task.sstate_result != task.SSTATE_NA %}
{{task.get_sstate_result_display}}
- {% endifnotequal %}
+ {% endif %}
</td>
</tr>
diff --git a/poky/bitbake/lib/toaster/toastergui/templates/target.html b/poky/bitbake/lib/toaster/toastergui/templates/target.html
index 1924a0dad7..d5f60e77a8 100644
--- a/poky/bitbake/lib/toaster/toastergui/templates/target.html
+++ b/poky/bitbake/lib/toaster/toastergui/templates/target.html
@@ -8,11 +8,11 @@
{% block nav-target %}
{% for t in build.get_sorted_target_list %}
- {% ifequal target.pk t.pk %}
+ {% if target.pk == t.pk %}
<li class="active"><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li>
{% else %}
<li><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li>
- {% endifequal %}
+ {% endif %}
{% endfor %}
{% endblock %}
diff --git a/poky/bitbake/lib/toaster/toastermain/logs.py b/poky/bitbake/lib/toaster/toastermain/logs.py
index f9953982b7..62d871963a 100644
--- a/poky/bitbake/lib/toaster/toastermain/logs.py
+++ b/poky/bitbake/lib/toaster/toastermain/logs.py
@@ -1,13 +1,13 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
+import os
import logging
import json
from pathlib import Path
from django.http import HttpRequest
-BASE_DIR = Path(__file__).resolve(strict=True).parent.parent
-
+BUILDDIR = Path(os.environ.get('BUILDDIR', '/tmp'))
def log_api_request(request, response, view, logger_name='api'):
"""Helper function for LogAPIMixin"""
@@ -38,8 +38,13 @@ def log_view_mixin(view):
request = kwargs.get('request')
response = view(*args, **kwargs)
+ view_name = 'unknown'
+ if hasattr(request, 'resolver_match'):
+ if hasattr(request.resolver_match, 'view_name'):
+ view_name = request.resolver_match.view_name
+
log_api_request(
- request, response, request.resolver_match.view_name, 'toaster')
+ request, response, view_name, 'toaster')
return response
return log_view_request
@@ -103,7 +108,7 @@ LOGGING_SETTINGS = {
'file_django': {
'level': 'INFO',
'class': 'logging.handlers.TimedRotatingFileHandler',
- 'filename': BASE_DIR / 'logs/django.log',
+ 'filename': BUILDDIR / 'toaster_logs/django.log',
'when': 'D', # interval type
'interval': 1, # defaults to 1
'backupCount': 10, # how many files to keep
@@ -112,7 +117,7 @@ LOGGING_SETTINGS = {
'file_api': {
'level': 'INFO',
'class': 'logging.handlers.TimedRotatingFileHandler',
- 'filename': BASE_DIR / 'logs/api.log',
+ 'filename': BUILDDIR / 'toaster_logs/api.log',
'when': 'D',
'interval': 1,
'backupCount': 10,
@@ -121,7 +126,7 @@ LOGGING_SETTINGS = {
'file_toaster': {
'level': 'INFO',
'class': 'logging.handlers.TimedRotatingFileHandler',
- 'filename': BASE_DIR / 'logs/toaster.log',
+ 'filename': BUILDDIR / 'toaster_logs/web.log',
'when': 'D',
'interval': 1,
'backupCount': 10,
diff --git a/poky/bitbake/lib/toaster/toastermain/settings.py b/poky/bitbake/lib/toaster/toastermain/settings.py
index b083cf5885..3c12359366 100644
--- a/poky/bitbake/lib/toaster/toastermain/settings.py
+++ b/poky/bitbake/lib/toaster/toastermain/settings.py
@@ -108,10 +108,6 @@ SITE_ID = 1
# to load the internationalization machinery.
USE_I18N = True
-# If you set this to False, Django will not format dates, numbers and
-# calendars according to the current locale.
-USE_L10N = True
-
# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True
@@ -152,6 +148,8 @@ STATICFILES_FINDERS = (
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'NOT_SUITABLE_FOR_HOSTED_DEPLOYMENT'
+TMPDIR = os.environ.get('TOASTER_DJANGO_TMPDIR', '/tmp')
+
class InvalidString(str):
def __mod__(self, other):
from django.template.base import TemplateSyntaxError
@@ -218,7 +216,7 @@ CACHES = {
# },
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
- 'LOCATION': '/tmp/toaster_cache_%d' % os.getuid(),
+ 'LOCATION': '%s/toaster_cache_%d' % (TMPDIR, os.getuid()),
'TIMEOUT': 1,
}
}
@@ -316,12 +314,12 @@ for t in os.walk(os.path.dirname(currentdir)):
LOGGING = LOGGING_SETTINGS
# Build paths inside the project like this: BASE_DIR / 'subdir'.
-BASE_DIR = Path(__file__).resolve(strict=True).parent.parent
+BUILDDIR = os.environ.get("BUILDDIR", TMPDIR)
# LOG VIEWER
# https://pypi.org/project/django-log-viewer/
LOG_VIEWER_FILES_PATTERN = '*.log*'
-LOG_VIEWER_FILES_DIR = os.path.join(BASE_DIR, 'logs')
+LOG_VIEWER_FILES_DIR = os.path.join(BUILDDIR, "toaster_logs/")
LOG_VIEWER_PAGE_LENGTH = 25 # total log lines per-page
LOG_VIEWER_MAX_READ_LINES = 100000 # total log lines will be read
LOG_VIEWER_PATTERNS = ['INFO', 'DEBUG', 'WARNING', 'ERROR', 'CRITICAL']
@@ -329,7 +327,6 @@ LOG_VIEWER_PATTERNS = ['INFO', 'DEBUG', 'WARNING', 'ERROR', 'CRITICAL']
# Optionally you can set the next variables in order to customize the admin:
LOG_VIEWER_FILE_LIST_TITLE = "Logs list"
-
if DEBUG and SQL_DEBUG:
LOGGING['loggers']['django.db.backends'] = {
'level': 'DEBUG',
diff --git a/poky/bitbake/lib/toaster/toastermain/settings_test.py b/poky/bitbake/lib/toaster/toastermain/settings_test.py
index 6538d9e453..74def2d240 100644
--- a/poky/bitbake/lib/toaster/toastermain/settings_test.py
+++ b/poky/bitbake/lib/toaster/toastermain/settings_test.py
@@ -19,10 +19,10 @@ TEMPLATE_DEBUG = DEBUG
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': '/tmp/toaster-test-db.sqlite',
+ 'NAME': '%s/toaster-test-db.sqlite' % TMPDIR,
'TEST': {
'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': '/tmp/toaster-test-db.sqlite',
+ 'NAME': '%s/toaster-test-db.sqlite' % TMPDIR,
}
}
}
diff --git a/poky/bitbake/lib/toaster/tox.ini b/poky/bitbake/lib/toaster/tox.ini
new file mode 100644
index 0000000000..1516a527ae
--- /dev/null
+++ b/poky/bitbake/lib/toaster/tox.ini
@@ -0,0 +1,24 @@
+[tox]
+envlist = py38, py39, py310, py311, py312
+skipsdist = True
+toxworkdir = {env:TOX_WORKDIR:.tox}
+passenv = *
+
+[testenv]
+passenv =
+ SSTATE_DIR
+ DL_DIR
+ TOASTER_DJANGO_TMPDIR
+setenv =
+ DJANGO_SETTINGS_MODULE=toastermain.settings_test
+ TOASTER_BUILDSERVER=1
+ BUILDDIR = {env:BUILDDIR}
+ EVENTREPLAY_DIR = {env:EVENTREPLAY_DIR:BUILDDIR}
+commands =
+ python3 {toxinidir}/manage.py test tests.db tests.commands tests.builds tests.browser tests.functional tests.views
+deps =
+ -r {toxinidir}/../../toaster-requirements.txt
+ -r {toxinidir}/tests/toaster-tests-requirements.txt
+
+[testenv:chrome]
+commands={[testenv]commands} --splinter-webdriver=chrome \ No newline at end of file
diff --git a/poky/bitbake/toaster-requirements.txt b/poky/bitbake/toaster-requirements.txt
index c1f433f9ec..d8e48b7f3a 100644
--- a/poky/bitbake/toaster-requirements.txt
+++ b/poky/bitbake/toaster-requirements.txt
@@ -1,3 +1,4 @@
Django>4.2,<4.3
beautifulsoup4>=4.4.0
pytz
+django-log-viewer==1.1.7
diff --git a/poky/documentation/brief-yoctoprojectqs/index.rst b/poky/documentation/brief-yoctoprojectqs/index.rst
index 0ccffccc60..df8d75edc2 100644
--- a/poky/documentation/brief-yoctoprojectqs/index.rst
+++ b/poky/documentation/brief-yoctoprojectqs/index.rst
@@ -254,7 +254,7 @@ an entire Linux distribution, including the toolchain, from source.
BB_SIGNATURE_HANDLER = "OEEquivHash"
BB_HASHSERVE = "auto"
BB_HASHSERVE_UPSTREAM = "hashserv.yocto.io:8687"
- SSTATE_MIRRORS ?= "file://.* https://sstate.yoctoproject.org/all/PATH;downloadfilename=PATH"
+ SSTATE_MIRRORS ?= "file://.* http://cdn.jsdelivr.net/yocto/sstate/all/PATH;downloadfilename=PATH"
#. **Start the Build:** Continue with the following command to build an OS
image for the target, which is ``core-image-sato`` in this example:
diff --git a/poky/documentation/bsp-guide/bsp.rst b/poky/documentation/bsp-guide/bsp.rst
index c78fbeb68f..f92b1177b7 100644
--- a/poky/documentation/bsp-guide/bsp.rst
+++ b/poky/documentation/bsp-guide/bsp.rst
@@ -64,8 +64,8 @@ Here is an example that clones the Raspberry Pi BSP layer::
In addition to BSP layers, the ``meta-yocto-bsp`` layer is part of the
shipped ``poky`` repository. The ``meta-yocto-bsp`` layer maintains
-several "reference" BSPs including the ARM-based Beaglebone, MIPS-based
-EdgeRouter, and generic versions of both 32-bit and 64-bit IA machines.
+several "reference" BSPs including the ARM-based Beaglebone and generic
+versions of both 32-bit and 64-bit IA machines.
For information on typical BSP development workflow, see the
:ref:`bsp-guide/bsp:developing a board support package (bsp)`
@@ -764,29 +764,13 @@ workflow.
.. note::
- - There are four hardware reference BSPs in the Yocto
+ - There are three hardware reference BSPs in the Yocto
Project release, located in the ``poky/meta-yocto-bsp``
BSP layer:
- Texas Instruments Beaglebone (``beaglebone-yocto``)
- - Ubiquiti Networks EdgeRouter Lite (``edgerouter``)
-
- - Two general IA platforms (``genericx86`` and ``genericx86-64``)
-
- - There are three core Intel BSPs in the Yocto Project
- release, in the ``meta-intel`` layer:
-
- - ``intel-core2-32``, which is a BSP optimized for the Core2
- family of CPUs as well as all CPUs prior to the Silvermont
- core.
-
- - ``intel-corei7-64``, which is a BSP optimized for Nehalem
- and later Core and Xeon CPUs as well as Silvermont and later
- Atom CPUs, such as the Baytrail SoCs.
-
- - ``intel-quark``, which is a BSP optimized for the Intel
- Galileo gen1 & gen2 development boards.
+ - Two generic IA platforms (``genericx86`` and ``genericx86-64``)
When you set up a layer for a new BSP, you should follow a standard
layout. This layout is described in the ":ref:`bsp-guide/bsp:example filesystem layout`"
@@ -1194,7 +1178,7 @@ Use these steps to create a BSP layer:
- *Create a Kernel Recipe:* Create a kernel recipe in
``recipes-kernel/linux`` by either using a kernel append file or a
- new custom kernel recipe file (e.g. ``yocto-linux_4.12.bb``). The BSP
+ new custom kernel recipe file (e.g. ``linux-yocto_4.12.bb``). The BSP
layers mentioned in the previous step also contain different kernel
examples. See the ":ref:`kernel-dev/common:modifying an existing recipe`"
section in the Yocto Project Linux Kernel Development Manual for
@@ -1250,21 +1234,18 @@ There are one or more machine configuration files in the
For example, the machine configuration file for the `BeagleBone and
BeagleBone Black development boards <https://beagleboard.org/bone>`__ is
-located in the layer ``poky/meta-yocto-bsp/conf/machine`` and is named
-``beaglebone-yocto.conf``::
+located in :yocto_git:`poky/meta-yocto-bsp/conf/machine/beaglebone-yocto.conf
+</poky/tree/meta-yocto-bsp/conf/machine/beaglebone-yocto.conf>`::
#@TYPE: Machine
#@NAME: Beaglebone-yocto machine
#@DESCRIPTION: Reference machine configuration for http://beagleboard.org/bone and http://beagleboard.org/black boards
PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xorg"
- XSERVER ?= "xserver-xorg \
- xf86-video-modesetting \
- "
MACHINE_EXTRA_RRECOMMENDS = "kernel-modules kernel-devicetree"
- EXTRA_IMAGEDEPENDS += "u-boot"
+ EXTRA_IMAGEDEPENDS += "virtual/bootloader"
DEFAULTTUNE ?= "cortexa8hf-neon"
include conf/machine/include/arm/armv7a/tune-cortexa8.inc
@@ -1272,19 +1253,20 @@ located in the layer ``poky/meta-yocto-bsp/conf/machine`` and is named
IMAGE_FSTYPES += "tar.bz2 jffs2 wic wic.bmap"
EXTRA_IMAGECMD:jffs2 = "-lnp "
WKS_FILE ?= "beaglebone-yocto.wks"
- IMAGE_INSTALL:append = " kernel-devicetree kernel-image-zimage"
- do_image_wic[depends] += "mtools-native:do_populate_sysroot dosfstools-native:do_populate_sysroot"
+ MACHINE_ESSENTIAL_EXTRA_RDEPENDS += "kernel-image kernel-devicetree"
+ do_image_wic[depends] += "mtools-native:do_populate_sysroot dosfstools-native:do_populate_sysroot virtual/bootloader:do_deploy"
- SERIAL_CONSOLES ?= "115200;ttyS0 115200;ttyO0"
- SERIAL_CONSOLES_CHECK = "${SERIAL_CONSOLES}"
+ SERIAL_CONSOLES ?= "115200;ttyS0 115200;ttyO0 115200;ttyAMA0"
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
- PREFERRED_VERSION_linux-yocto ?= "5.0%"
+ PREFERRED_VERSION_linux-yocto ?= "6.1%"
KERNEL_IMAGETYPE = "zImage"
KERNEL_DEVICETREE = "am335x-bone.dtb am335x-boneblack.dtb am335x-bonegreen.dtb"
KERNEL_EXTRA_ARGS += "LOADADDR=${UBOOT_ENTRYPOINT}"
+ PREFERRED_PROVIDER_virtual/bootloader ?= "u-boot"
+
SPL_BINARY = "MLO"
UBOOT_SUFFIX = "img"
UBOOT_MACHINE = "am335x_evm_defconfig"
@@ -1293,7 +1275,24 @@ located in the layer ``poky/meta-yocto-bsp/conf/machine`` and is named
MACHINE_FEATURES = "usbgadget usbhost vfat alsa"
- IMAGE_BOOT_FILES ?= "u-boot.${UBOOT_SUFFIX} MLO zImage am335x-bone.dtb am335x-boneblack.dtb am335x-bonegreen.dtb"
+ IMAGE_BOOT_FILES ?= "u-boot.${UBOOT_SUFFIX} ${SPL_BINARY} ${KERNEL_IMAGETYPE} ${KERNEL_DEVICETREE}"
+
+ # support runqemu
+ EXTRA_IMAGEDEPENDS += "qemu-native qemu-helper-native"
+ IMAGE_CLASSES += "qemuboot"
+ QB_DEFAULT_FSTYPE = "wic"
+ QB_FSINFO = "wic:no-kernel-in-fs"
+ QB_KERNEL_ROOT = "/dev/vda2"
+ QB_SYSTEM_NAME = "qemu-system-arm"
+ QB_MACHINE = "-machine virt"
+ QB_CPU = "-cpu cortex-a15"
+ QB_KERNEL_CMDLINE_APPEND = "console=ttyAMA0 systemd.mask=systemd-networkd"
+ QB_OPT_APPEND = "-device virtio-rng-device"
+ QB_TAP_OPT = "-netdev tap,id=net0,ifname=@TAP@,script=no,downscript=no"
+ QB_NETWORK_DEVICE = "-device virtio-net-device,netdev=net0,mac=@MAC@"
+ QB_ROOTFS_OPT = "-drive id=disk0,file=@ROOTFS@,if=none,format=raw -device virtio-blk-device,drive=disk0"
+ QB_SERIAL_OPT = ""
+ QB_TCPSERIAL_OPT = "-device virtio-serial-device -chardev socket,id=virtcon,port=@PORT@,host=127.0.0.1 -device virtconsole,chardev=virtcon"
The variables used to configure the machine define machine-specific properties; for
example, machine-dependent packages, machine tunings, the type of kernel
@@ -1313,11 +1312,6 @@ Project Reference Manual.
"virtual/xserver" is "xserver-xorg", available in
``poky/meta/recipes-graphics/xorg-xserver``.
-- :term:`XSERVER`: The packages that
- should be installed to provide an X server and drivers for the
- machine. In this example, the "xserver-xorg" and
- "xf86-video-modesetting" are installed.
-
- :term:`MACHINE_EXTRA_RRECOMMENDS`:
A list of machine-dependent packages not essential for booting the
image. Thus, the build does not fail if the packages do not exist.
@@ -1335,12 +1329,15 @@ Project Reference Manual.
needed in the root filesystem. In this case, the U-Boot recipe must
be built for the image.
+ At the end of the file, we also use this setings to implement
+ ``runqemu`` support on the host machine.
+
- :term:`DEFAULTTUNE`: Machines
use tunings to optimize machine, CPU, and application performance.
These features, which are collectively known as "tuning features",
- are set in the :term:`OpenEmbedded-Core (OE-Core)` layer (e.g.
- ``poky/meta/conf/machine/include``). In this example, the default
- tuning file is ``cortexa8hf-neon``.
+ are set in the :term:`OpenEmbedded-Core (OE-Core)` layer. In this
+ example, the default tuning file is :oe_git:`tune-cortexa8
+ </openembedded-core/tree/meta/conf/machine/include/arm/armv7a/tune-cortexa8.inc>`.
.. note::
@@ -1360,13 +1357,7 @@ Project Reference Manual.
- :term:`WKS_FILE`: The location of
the :ref:`Wic kickstart <ref-manual/kickstart:openembedded kickstart (\`\`.wks\`\`) reference>` file used
- by the OpenEmbedded build system to create a partitioned image
- (image.wic).
-
-- :term:`IMAGE_INSTALL`:
- Specifies packages to install into an image through the
- :ref:`ref-classes-image` class. Recipes
- use the :term:`IMAGE_INSTALL` variable.
+ by the OpenEmbedded build system to create a partitioned image.
- ``do_image_wic[depends]``: A task that is constructed during the
build. In this example, the task depends on specific tools in order
@@ -1384,7 +1375,7 @@ Project Reference Manual.
- :term:`PREFERRED_VERSION_linux-yocto <PREFERRED_VERSION>`:
Defines the version of the recipe used to build the kernel, which is
- "5.0" in this case.
+ "6.1" in this case.
- :term:`KERNEL_IMAGETYPE`:
The type of kernel to build for the device. In this case, the
@@ -1449,39 +1440,35 @@ The kernel recipe used to build the kernel image for the BeagleBone
device was established in the machine configuration::
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
- PREFERRED_VERSION_linux-yocto ?= "5.0%"
+ PREFERRED_VERSION_linux-yocto ?= "6.1%"
The ``meta-yocto-bsp/recipes-kernel/linux`` directory in the layer contains
metadata used to build the kernel. In this case, a kernel append file
-(i.e. ``linux-yocto_5.0.bbappend``) is used to override an established
-kernel recipe (i.e. ``linux-yocto_5.0.bb``), which is located in
+(i.e. ``linux-yocto_6.1.bbappend``) is used to override an established
+kernel recipe (i.e. ``linux-yocto_6.1.bb``), which is located in
:yocto_git:`/poky/tree/meta/recipes-kernel/linux`.
Following is the contents of the append file::
- KBRANCH:genericx86 = "v5.0/standard/base"
- KBRANCH:genericx86-64 = "v5.0/standard/base"
- KBRANCH:edgerouter = "v5.0/standard/edgerouter"
- KBRANCH:beaglebone-yocto = "v5.0/standard/beaglebone"
+ KBRANCH:genericx86 = "v6.1/standard/base"
+ KBRANCH:genericx86-64 = "v6.1/standard/base"
+ KBRANCH:beaglebone-yocto = "v6.1/standard/beaglebone"
KMACHINE:genericx86 ?= "common-pc"
KMACHINE:genericx86-64 ?= "common-pc-64"
KMACHINE:beaglebone-yocto ?= "beaglebone"
- SRCREV_machine:genericx86 ?= "3df4aae6074e94e794e27fe7f17451d9353cdf3d"
- SRCREV_machine:genericx86-64 ?= "3df4aae6074e94e794e27fe7f17451d9353cdf3d"
- SRCREV_machine:edgerouter ?= "3df4aae6074e94e794e27fe7f17451d9353cdf3d"
- SRCREV_machine:beaglebone-yocto ?= "3df4aae6074e94e794e27fe7f17451d9353cdf3d"
+ SRCREV_machine:genericx86 ?= "6ec439b4b456ce929c4c07fe457b5d6a4b468e86"
+ SRCREV_machine:genericx86-64 ?= "6ec439b4b456ce929c4c07fe457b5d6a4b468e86"
+ SRCREV_machine:beaglebone-yocto ?= "423e1996694b61fbfc8ec3bf062fc6461d64fde1"
COMPATIBLE_MACHINE:genericx86 = "genericx86"
COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64"
- COMPATIBLE_MACHINE:edgerouter = "edgerouter"
COMPATIBLE_MACHINE:beaglebone-yocto = "beaglebone-yocto"
- LINUX_VERSION:genericx86 = "5.0.3"
- LINUX_VERSION:genericx86-64 = "5.0.3"
- LINUX_VERSION:edgerouter = "5.0.3"
- LINUX_VERSION:beaglebone-yocto = "5.0.3"
+ LINUX_VERSION:genericx86 = "6.1.30"
+ LINUX_VERSION:genericx86-64 = "6.1.30"
+ LINUX_VERSION:beaglebone-yocto = "6.1.20"
This particular append file works for all the machines that are
part of the ``meta-yocto-bsp`` layer. The relevant statements are
diff --git a/poky/documentation/contributor-guide/submit-changes.rst b/poky/documentation/contributor-guide/submit-changes.rst
index cda2d12d25..53daaf901a 100644
--- a/poky/documentation/contributor-guide/submit-changes.rst
+++ b/poky/documentation/contributor-guide/submit-changes.rst
@@ -279,6 +279,46 @@ Here is the general procedure on how to create patches to be sent through email:
If necessary, rework your commits as described in
":ref:`contributor-guide/submit-changes:taking patch review into account`".
+Validating Patches with Patchtest
+=================================
+
+``patchtest`` is available in ``openembedded-core`` as a tool for making
+sure that your patches are well-formatted and contain important info for
+maintenance purposes, such as ``Signed-off-by`` and ``Upstream-Status``
+tags. Currently, it only supports testing patches for
+``openembedded-core`` branches. To setup, perform the following::
+
+ pip install -r meta/lib/patchtest/requirements.txt
+ source oe-init-build-env
+ bitbake-layers add-layer ../meta-selftest
+
+Once these steps are complete and you have generated your patch files,
+you can run ``patchtest`` like so::
+
+ patchtest --patch <patch_name>
+
+Alternatively, if you want ``patchtest`` to iterate over and test
+multiple patches stored in a directory, you can use::
+
+ patchtest --directory <directory_name>
+
+By default, ``patchtest`` uses its own modules' file paths to determine what
+repository and test suite to check patches against. If you wish to test
+patches against a repository other than ``openembedded-core`` and/or use
+a different set of tests, you can use the ``--repodir`` and ``--testdir``
+flags::
+
+ patchtest --patch <patch_name> --repodir <path/to/repo> --testdir <path/to/testdir>
+
+Finally, note that ``patchtest`` is designed to test patches in a standalone
+way, so if your patches are meant to apply on top of changes made by
+previous patches in a series, it is possible that ``patchtest`` will report
+false failures regarding the "merge on head" test.
+
+Using ``patchtest`` in this manner provides a final check for the overall
+quality of your changes before they are submitted for review by the
+maintainers.
+
Sending the Patches via Email
=============================
diff --git a/poky/documentation/dev-manual/index.rst b/poky/documentation/dev-manual/index.rst
index 3106b90a45..9ccf60f701 100644
--- a/poky/documentation/dev-manual/index.rst
+++ b/poky/documentation/dev-manual/index.rst
@@ -42,6 +42,7 @@ Yocto Project Development Tasks Manual
runtime-testing
debugging
licenses
+ security-subjects
vulnerabilities
sbom
error-reporting-tool
diff --git a/poky/documentation/dev-manual/layers.rst b/poky/documentation/dev-manual/layers.rst
index 2d809562d1..c65a94b4fa 100644
--- a/poky/documentation/dev-manual/layers.rst
+++ b/poky/documentation/dev-manual/layers.rst
@@ -128,6 +128,20 @@ Follow these general steps to create your layer without using tools:
variable is a good way to indicate if your particular layer is
current.
+
+ .. note::
+
+ A layer does not have to contain only recipes ``.bb`` or append files
+ ``.bbappend``. Generally, developers create layers using
+ ``bitbake-layers create-layer``.
+ See ":ref:`dev-manual/layers:creating a general layer using the \`\`bitbake-layers\`\` script`",
+ explaining how the ``layer.conf`` file is created from a template located in
+ ``meta/lib/bblayers/templates/layer.conf``.
+ In fact, none of the variables set in ``layer.conf`` are mandatory,
+ except when :term:`BBFILE_COLLECTIONS` is present. In this case
+ :term:`LAYERSERIES_COMPAT` and :term:`BBFILE_PATTERN` have to be
+ defined too.
+
#. *Add Content:* Depending on the type of layer, add the content. If
the layer adds support for a machine, add the machine configuration
in a ``conf/machine/`` file within the layer. If the layer adds
diff --git a/poky/documentation/dev-manual/new-machine.rst b/poky/documentation/dev-manual/new-machine.rst
index 930dd7eac7..6b41d24db4 100644
--- a/poky/documentation/dev-manual/new-machine.rst
+++ b/poky/documentation/dev-manual/new-machine.rst
@@ -38,7 +38,7 @@ file or include from a lower-level configuration file are as follows:
- ``PREFERRED_PROVIDER_virtual/kernel``
-- :term:`MACHINE_FEATURES` (e.g. "apm screen wifi")
+- :term:`MACHINE_FEATURES` (e.g. "screen wifi")
You might also need these variables:
diff --git a/poky/documentation/dev-manual/new-recipe.rst b/poky/documentation/dev-manual/new-recipe.rst
index 02bb08474f..e741cef0e8 100644
--- a/poky/documentation/dev-manual/new-recipe.rst
+++ b/poky/documentation/dev-manual/new-recipe.rst
@@ -409,8 +409,8 @@ Patching Code
Sometimes it is necessary to patch code after it has been fetched. Any
files mentioned in :term:`SRC_URI` whose names end in ``.patch`` or
-``.diff`` or compressed versions of these suffixes (e.g. ``diff.gz`` are
-treated as patches. The
+``.diff`` or compressed versions of these suffixes (e.g. ``diff.gz``,
+``patch.bz2``, etc.) are treated as patches. The
:ref:`ref-tasks-patch` task
automatically applies these patches.
diff --git a/poky/documentation/dev-manual/runtime-testing.rst b/poky/documentation/dev-manual/runtime-testing.rst
index af3fe2c1dd..205a96cc59 100644
--- a/poky/documentation/dev-manual/runtime-testing.rst
+++ b/poky/documentation/dev-manual/runtime-testing.rst
@@ -160,12 +160,6 @@ options are available:
comments at the top of the BeagleBoneTarget
``meta-yocto-bsp/lib/oeqa/controllers/beaglebonetarget.py`` file.
-- *"EdgeRouterTarget":* Choose "EdgeRouterTarget" if you are deploying
- images and running tests on the Ubiquiti Networks EdgeRouter Lite.
- For information on how to use these tests, see the comments at the
- top of the EdgeRouterTarget
- ``meta-yocto-bsp/lib/oeqa/controllers/edgeroutertarget.py`` file.
-
- *"GrubTarget":* Choose "GrubTarget" if you are deploying images and running
tests on any generic PC that boots using GRUB. For information on how
to use these tests, see the comments at the top of the GrubTarget
@@ -288,7 +282,7 @@ Serial Console Connection
-------------------------
For test target classes requiring a serial console to interact with the
-bootloader (e.g. BeagleBoneTarget, EdgeRouterTarget, and GrubTarget),
+bootloader (e.g. BeagleBoneTarget and GrubTarget),
you need to specify a command to use to connect to the serial console of
the target machine by using the
:term:`TEST_SERIALCONTROL_CMD`
diff --git a/poky/documentation/dev-manual/security-subjects.rst b/poky/documentation/dev-manual/security-subjects.rst
new file mode 100644
index 0000000000..1b02b6a9e9
--- /dev/null
+++ b/poky/documentation/dev-manual/security-subjects.rst
@@ -0,0 +1,189 @@
+.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
+
+Dealing with Vulnerability Reports
+**********************************
+
+The Yocto Project and OpenEmbedded are open-source, community-based projects
+used in numerous products. They assemble multiple other open-source projects,
+and need to handle security issues and practices both internal (in the code
+maintained by both projects), and external (maintained by other projects and
+organizations).
+
+This manual assembles security-related information concerning the whole
+ecosystem. It includes information on reporting a potential security issue,
+the operation of the YP Security team and how to contribute in the
+related code. It is written to be useful for both security researchers and
+YP developers.
+
+How to report a potential security vulnerability?
+=================================================
+
+If you would like to report a public issue (for example, one with a released
+CVE number), please report it using the
+:yocto_bugs:`Security Bugzilla </enter_bug.cgi?product=Security>`.
+
+If you are dealing with a not-yet-released issue, or an urgent one, please send
+a message to security AT yoctoproject DOT org, including as many details as
+possible: the layer or software module affected, the recipe and its version,
+and any example code, if available. This mailing list is monitored by the
+Yocto Project Security team.
+
+For each layer, you might also look for specific instructions (if any) for
+reporting potential security issues in the specific ``SECURITY.md`` file at the
+root of the repository. Instructions on how and where submit a patch are
+usually available in ``README.md``. If this is your first patch to the
+Yocto Project/OpenEmbedded, you might want to have a look into the
+Contributor's Manual section
+":ref:`contributor-guide/submit-changes:preparing changes for submission`".
+
+Branches maintained with security fixes
+---------------------------------------
+
+See the
+:ref:`Release process <ref-manual/release-process:Stable Release Process>`
+documentation for details regarding the policies and maintenance of stable
+branches.
+
+The :yocto_wiki:`Releases page </Releases>` contains a list
+of all releases of the Yocto Project. Versions in gray are no longer actively
+maintained with security patches, but well-tested patches may still be accepted
+for them for significant issues.
+
+Security-related discussions at the Yocto Project
+-------------------------------------------------
+
+We have set up two security-related mailing lists:
+
+ - Public List: yocto [dash] security [at] yoctoproject[dot] org
+
+ This is a public mailing list for anyone to subscribe to. This list is an
+ open list to discuss public security issues/patches and security-related
+ initiatives. For more information, including subscription information,
+ please see the :yocto_lists:`yocto-security mailing list info page </g/yocto-security>`.
+
+ - Private List: security [at] yoctoproject [dot] org
+
+ This is a private mailing list for reporting non-published potential
+ vulnerabilities. The list is monitored by the Yocto Project Security team.
+
+
+What you should do if you find a security vulnerability
+-------------------------------------------------------
+
+If you find a security flaw: a crash, an information leakage, or anything that
+can have a security impact if exploited in any Open Source software built or
+used by the Yocto Project, please report this to the Yocto Project Security
+Team. If you prefer to contact the upstream project directly, please send a
+copy to the security team at the Yocto Project as well. If you believe this is
+highly sensitive information, please report the vulnerability in a secure way,
+i.e. encrypt the email and send it to the private list. This ensures that
+the exploit is not leaked and exploited before a response/fix has been generated.
+
+Security team
+=============
+
+The Yocto Project/OpenEmbedded security team coordinates the work on security
+subjects in the project. All general discussion takes place publicly. The
+Security Team only uses confidential communication tools to deal with private
+vulnerability reports before they are released.
+
+Security team appointment
+-------------------------
+
+The Yocto Project Security Team consists of at least three members. When new
+members are needed, the Yocto Project Technical Steering Committee (YP TSC)
+asks for nominations by public channels including a nomination deadline.
+Self-nominations are possible. When the limit time is
+reached, the YP TSC posts the list of candidates for the comments of project
+participants and developers. Comments may be sent publicly or privately to the
+YP and OE TSCs. The candidates are approved by both YP TSC and OpenEmbedded
+Technical Steering Committee (OE TSC) and the final list of the team members
+is announced publicly. The aim is to have people representing technical
+leadership, security knowledge and infrastructure present with enough people
+to provide backup/coverage but keep the notification list small enough to
+minimize information risk and maintain trust.
+
+YP Security Team members may resign at any time.
+
+Security Team Operations
+------------------------
+
+The work of the Security Team might require high confidentiality. Team members
+are individuals selected by merit and do not represent the companies they work
+for. They do not share information about confidential issues outside of the team
+and do not hint about ongoing embargoes.
+
+Team members can bring in domain experts as needed. Those people should be
+added to individual issues only and adhere to the same standards as the YP
+Security Team.
+
+The YP security team organizes its meetings and communication as needed.
+
+When the YP Security team receives a report about a potential security
+vulnerability, they quickly analyze and notify the reporter of the result.
+They might also request more information.
+
+If the issue is confirmed and affects the code maintained by the YP, they
+confidentially notify maintainers of that code and work with them to prepare
+a fix.
+
+If the issue is confirmed and affects an upstream project, the YP security team
+notifies the project. Usually, the upstream project analyzes the problem again.
+If they deem it a real security problem in their software, they develop and
+release a fix following their security policy. They may want to include the
+original reporter in the loop. There is also sometimes some coordination for
+handling patches, backporting patches etc, or just understanding the problem
+or what caused it.
+
+When the fix is publicly available, the YP security team member or the
+package maintainer sends patches against the YP code base, following usual
+procedures, including public code review.
+
+What Yocto Security Team does when it receives a security vulnerability
+-----------------------------------------------------------------------
+
+The YP Security Team team performs a quick analysis and would usually report
+the flaw to the upstream project. Normally the upstream project analyzes the
+problem. If they deem it a real security problem in their software, they
+develop and release a fix following their own security policy. They may want
+to include the original reporter in the loop. There is also sometimes some
+coordination for handling patches, backporting patches etc, or just
+understanding the problem or what caused it.
+
+The security policy of the upstream project might include a notification to
+Linux distributions or other important downstream projects in advance to
+discuss coordinated disclosure. These mailing lists are normally non-public.
+
+When the upstream project releases a version with the fix, they are responsible
+for contacting `Mitre <https://www.cve.org/>`__ to get a CVE number assigned and
+the CVE record published.
+
+If an upstream project does not respond quickly
+-----------------------------------------------
+
+If an upstream project does not fix the problem in a reasonable time,
+the Yocto's Security Team will contact other interested parties (usually
+other distributions) in the community and together try to solve the
+vulnerability as quickly as possible.
+
+The Yocto Project Security team adheres to the 90 days disclosure policy
+by default. An increase of the embargo time is possible when necessary.
+
+Current Security Team members
+-----------------------------
+
+For secure communications, please send your messages encrypted using the GPG
+keys. Remember, message headers are not encrypted so do not include sensitive
+information in the subject line.
+
+ - Ross Burton: <ross@burtonini.com> `Public key <https://keys.openpgp.org/search?q=ross%40burtonini.com>`__
+
+ - Michael Halstead: <mhalstead [at] linuxfoundation [dot] org>
+ `Public key <https://pgp.mit.edu/pks/lookup?op=vindex&search=0x3373170601861969>`__
+ or `Public key <https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xd1f2407285e571ed12a407a73373170601861969>`__
+
+ - Richard Purdie: <richard.purdie@linuxfoundation.org> `Public key <https://keys.openpgp.org/search?q=richard.purdie%40linuxfoundation.org>`__
+
+ - Marta Rybczynska: <marta DOT rybczynska [at] syslinbit [dot] com> `Public key <https://keys.openpgp.org/search?q=marta.rybczynska@syslinbit.com>`__
+
+ - Steve Sakoman: <steve [at] sakoman [dot] com> `Public key <https://keys.openpgp.org/search?q=steve%40sakoman.com>`__
diff --git a/poky/documentation/dev-manual/start.rst b/poky/documentation/dev-manual/start.rst
index 88afa27ad5..4a556967eb 100644
--- a/poky/documentation/dev-manual/start.rst
+++ b/poky/documentation/dev-manual/start.rst
@@ -88,27 +88,15 @@ particular working environment and set of practices.
For information about BitBake, see the
:doc:`bitbake:index`.
- It is relatively easy to set up Git services and create
- infrastructure like :yocto_git:`/`, which is based on
- server software called ``gitolite`` with ``cgit`` being used to
- generate the web interface that lets you view the repositories. The
- ``gitolite`` software identifies users using SSH keys and allows
+ It is relatively easy to set up Git services and create infrastructure like
+ :yocto_git:`/`, which is based on server software called
+ `Gitolite <https://gitolite.com>`__
+ with `cgit <https://git.zx2c4.com/cgit/about/>`__ being used to
+ generate the web interface that lets you view the repositories.
+ ``gitolite`` identifies users using SSH keys and allows
branch-based access controls to repositories that you can control as
little or as much as necessary.
- .. note::
-
- The setup of these services is beyond the scope of this manual.
- However, here are sites describing how to perform setup:
-
- - `Gitolite <https://gitolite.com>`__: Information for
- ``gitolite``.
-
- - `Interfaces, frontends, and
- tools <https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools>`__:
- Documentation on how to create interfaces and frontends for
- Git.
-
#. *Set up the Application Development Machines:* As mentioned earlier,
application developers are creating applications on top of existing
software stacks. Following are some best practices for setting up
diff --git a/poky/documentation/dev-manual/vulnerabilities.rst b/poky/documentation/dev-manual/vulnerabilities.rst
index 71111bb3e2..1bc2a85929 100644
--- a/poky/documentation/dev-manual/vulnerabilities.rst
+++ b/poky/documentation/dev-manual/vulnerabilities.rst
@@ -129,31 +129,97 @@ NVD about CVE entries can be provided through the `NVD contact form <https://nvd
Fixing vulnerabilities in recipes
=================================
-If a CVE security issue impacts a software component, it can be fixed by updating to a newer
-version of the software component, by applying a patch or by marking it as patched via
-:term:`CVE_STATUS` variable flag. For Poky and OE-Core master branches, updating
-to a newer software component release with fixes is the best option, but patches can be applied
-if releases are not yet available.
-
-For stable branches, it is preferred to apply patches for the issues. For some software
-components minor version updates can also be applied if they are backwards compatible.
+Suppose a CVE security issue impacts a software component. In that case, it can
+be fixed by updating to a newer version, by applying a patch, or by marking it
+as patched via :term:`CVE_STATUS` variable flag. For Poky and OE-Core master
+branches, updating to a more recent software component release with fixes is
+the best option, but patches can be applied if releases are not yet available.
+
+For stable branches, we want to avoid API (Application Programming Interface)
+or ABI (Application Binary Interface) breakages. When submitting an update,
+a minor version update of a component is preferred if the version is
+backward-compatible. Many software components have backward-compatible stable
+versions, with a notable example of the Linux kernel. However, if the new
+version does or likely might introduce incompatibilities, extracting and
+backporting patches is preferred.
Here is an example of fixing CVE security issues with patch files,
-an example from the :oe_layerindex:`ffmpeg recipe</layerindex/recipe/47350>`::
+an example from the :oe_layerindex:`ffmpeg recipe for dunfell </layerindex/recipe/122174>`::
SRC_URI = "https://www.ffmpeg.org/releases/${BP}.tar.xz \
+ file://mips64_cpu_detection.patch \
+ file://CVE-2020-12284.patch \
file://0001-libavutil-include-assembly-with-full-path-from-sourc.patch \
- file://fix-CVE-2020-20446.patch \
- file://fix-CVE-2020-20453.patch \
- file://fix-CVE-2020-22015.patch \
- file://fix-CVE-2020-22021.patch \
- file://fix-CVE-2020-22033-CVE-2020-22019.patch \
- file://fix-CVE-2021-33815.patch \
+ file://CVE-2021-3566.patch \
+ file://CVE-2021-38291.patch \
+ file://CVE-2022-1475.patch \
+ file://CVE-2022-3109.patch \
+ file://CVE-2022-3341.patch \
+ file://CVE-2022-48434.patch \
+ "
+
+The recipe has both generic and security-related fixes. The CVE patch files are named
+according to the CVE they fix.
+
+When preparing the patch file, take the original patch from the upstream repository.
+Do not use patches from different distributions, except if it is the only available source.
+
+Modify the patch adding OE-related metadata. We will follow the example of the
+``CVE-2022-3341.patch``.
+
+The original `commit message <https://github.com/FFmpeg/FFmpeg/commit/9cf652cef49d74afe3d454f27d49eb1a1394951e.patch/>`__
+is::
+
+ From 9cf652cef49d74afe3d454f27d49eb1a1394951e Mon Sep 17 00:00:00 2001
+ From: Jiasheng Jiang <jiasheng@iscas.ac.cn>
+ Date: Wed, 23 Feb 2022 10:31:59 +0800
+ Subject: [PATCH] avformat/nutdec: Add check for avformat_new_stream
+
+ Check for failure of avformat_new_stream() and propagate
+ the error code.
+
+ Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
+ ---
+ libavformat/nutdec.c | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+
+For the correct operations of the ``cve-check``, it requires the CVE
+identification in a ``CVE:`` tag of the patch file commit message using
+the format::
+
+ CVE: CVE-2022-3341
-A good practice is to include the CVE identifier in both the patch file name
-and inside the patch file commit message using the format::
+It is also recommended to add the ``Upstream-Status:`` tag with a link
+to the original patch and sign-off by people working on the backport.
+If there are any modifications to the original patch, note them in
+the ``Comments:`` tag.
- CVE: CVE-2020-22033
+With the additional information, the header of the patch file in OE-core becomes::
+
+ From 9cf652cef49d74afe3d454f27d49eb1a1394951e Mon Sep 17 00:00:00 2001
+ From: Jiasheng Jiang <jiasheng@iscas.ac.cn>
+ Date: Wed, 23 Feb 2022 10:31:59 +0800
+ Subject: [PATCH] avformat/nutdec: Add check for avformat_new_stream
+
+ Check for failure of avformat_new_stream() and propagate
+ the error code.
+
+ Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
+
+ CVE: CVE-2022-3341
+
+ Upstream-Status: Backport [https://github.com/FFmpeg/FFmpeg/commit/9cf652cef49d74afe3d454f27d49eb1a1394951e]
+
+ Comments: Refreshed Hunk
+ Signed-off-by: Narpat Mali <narpat.mali@windriver.com>
+ Signed-off-by: Bhabu Bindu <bhabu.bindu@kpit.com>
+ ---
+ libavformat/nutdec.c | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+A good practice is to include the CVE identifier in the patch file name, the patch file
+commit message and optionally in the recipe commit message.
CVE checker will then capture this information and change the CVE status to ``Patched``
in the generated reports.
@@ -161,8 +227,16 @@ in the generated reports.
If analysis shows that the CVE issue does not impact the recipe due to configuration, platform,
version or other reasons, the CVE can be marked as ``Ignored`` by using
the :term:`CVE_STATUS` variable flag with appropriate reason which is mapped to ``Ignored``.
-As mentioned previously, if data in the CVE database is wrong, it is recommend to fix those
-issues in the CVE database directly.
+The entry should have the format like::
+
+ CVE_STATUS[CVE-2016-10642] = "cpe-incorrect: This is specific to the npm package that installs cmake, so isn't relevant to OpenEmbedded"
+
+As mentioned previously, if data in the CVE database is wrong, it is recommended
+to fix those issues in the CVE database (NVD in the case of OE-core and Poky)
+directly.
+
+Note that if there are many CVEs with the same status and reason, those can be
+shared by using the :term:`CVE_STATUS_GROUPS` variable.
Recipes can be completely skipped by CVE check by including the recipe name in
the :term:`CVE_CHECK_SKIP_RECIPE` variable.
diff --git a/poky/documentation/dev-manual/wic.rst b/poky/documentation/dev-manual/wic.rst
index 664f07a212..312f78c403 100644
--- a/poky/documentation/dev-manual/wic.rst
+++ b/poky/documentation/dev-manual/wic.rst
@@ -140,19 +140,19 @@ command to return the available Wic images as follows::
$ wic list images
genericx86 Create an EFI disk image for genericx86*
- edgerouter Create SD card image for Edgerouter
beaglebone-yocto Create SD card image for Beaglebone
- qemux86-directdisk Create a qemu machine 'pcbios' direct disk image
- systemd-bootdisk Create an EFI disk image with systemd-boot
- mkhybridiso Create a hybrid ISO image
+ qemuriscv Create qcow2 image for RISC-V QEMU machines
mkefidisk Create an EFI disk image
- sdimage-bootpart Create SD card image with a boot partition
+ qemuloongarch Create qcow2 image for LoongArch QEMU machines
directdisk-multi-rootfs Create multi rootfs image using rootfs plugin
directdisk Create a 'pcbios' direct disk image
- directdisk-bootloader-config Create a 'pcbios' direct disk image with custom bootloader config
- qemuriscv Create qcow2 image for RISC-V QEMU machines
+ efi-bootdisk
+ mkhybridiso Create a hybrid ISO image
directdisk-gpt Create a 'pcbios' direct disk image
- efi-bootdisk
+ systemd-bootdisk Create an EFI disk image with systemd-boot
+ sdimage-bootpart Create SD card image with a boot partition
+ qemux86-directdisk Create a qemu machine 'pcbios' direct disk image
+ directdisk-bootloader-config Create a 'pcbios' direct disk image with custom bootloader config
Once you know the list of available
Wic images, you can use ``help`` with the command to get help on a
@@ -284,15 +284,17 @@ Use the following command to list the available kickstart files::
$ wic list images
genericx86 Create an EFI disk image for genericx86*
beaglebone-yocto Create SD card image for Beaglebone
- edgerouter Create SD card image for Edgerouter
- qemux86-directdisk Create a QEMU machine 'pcbios' direct disk image
- directdisk-gpt Create a 'pcbios' direct disk image
+ qemuriscv Create qcow2 image for RISC-V QEMU machines
mkefidisk Create an EFI disk image
+ qemuloongarch Create qcow2 image for LoongArch QEMU machines
+ directdisk-multi-rootfs Create multi rootfs image using rootfs plugin
directdisk Create a 'pcbios' direct disk image
- systemd-bootdisk Create an EFI disk image with systemd-boot
+ efi-bootdisk
mkhybridiso Create a hybrid ISO image
+ directdisk-gpt Create a 'pcbios' direct disk image
+ systemd-bootdisk Create an EFI disk image with systemd-boot
sdimage-bootpart Create SD card image with a boot partition
- directdisk-multi-rootfs Create multi rootfs image using rootfs plugin
+ qemux86-directdisk Create a qemu machine 'pcbios' direct disk image
directdisk-bootloader-config Create a 'pcbios' direct disk image with custom bootloader config
When you use an existing file, you
diff --git a/poky/documentation/kernel-dev/advanced.rst b/poky/documentation/kernel-dev/advanced.rst
index 355326de6e..bcaaaeed14 100644
--- a/poky/documentation/kernel-dev/advanced.rst
+++ b/poky/documentation/kernel-dev/advanced.rst
@@ -69,8 +69,7 @@ to indicate the branch.
You can use the :term:`KBRANCH` value to define an alternate branch typically
with a machine override as shown here from the ``meta-yocto-bsp`` layer::
- KBRANCH:edgerouter = "standard/edgerouter"
-
+ KBRANCH:beaglebone-yocto = "standard/beaglebone"
The linux-yocto style recipes can optionally define the following
variables:
diff --git a/poky/documentation/kernel-dev/common.rst b/poky/documentation/kernel-dev/common.rst
index 1d85202df4..9b197bfccb 100644
--- a/poky/documentation/kernel-dev/common.rst
+++ b/poky/documentation/kernel-dev/common.rst
@@ -387,13 +387,13 @@ Creating the Append File
You create this file in your custom layer. You also name it accordingly
based on the linux-yocto recipe you are using. For example, if you are
-modifying the ``meta/recipes-kernel/linux/linux-yocto_4.12.bb`` recipe,
+modifying the ``meta/recipes-kernel/linux/linux-yocto_6.1.bb`` recipe,
the append file will typically be located as follows within your custom
layer:
.. code-block:: none
- your-layer/recipes-kernel/linux/linux-yocto_4.12.bbappend
+ your-layer/recipes-kernel/linux/linux-yocto_6.1.bbappend
The append file should initially extend the
:term:`FILESPATH` search path by
@@ -421,35 +421,31 @@ As an example, consider the following append file used by the BSPs in
.. code-block:: none
- meta-yocto-bsp/recipes-kernel/linux/linux-yocto_4.12.bbappend
+ meta-yocto-bsp/recipes-kernel/linux/linux-yocto_6.1.bbappend
Here are the contents of this file. Be aware that the actual commit ID
strings in this example listing might be different than the actual
strings in the file from the ``meta-yocto-bsp`` layer upstream::
- KBRANCH:genericx86 = "standard/base"
- KBRANCH:genericx86-64 = "standard/base"
+ KBRANCH:genericx86 = "v6.1/standard/base"
+ KBRANCH:genericx86-64 = "v6.1/standard/base"
+ KBRANCH:beaglebone-yocto = "v6.1/standard/beaglebone"
- KMACHINE:genericx86 ?= "common-pc"
- KMACHINE:genericx86-64 ?= "common-pc-64"
- KBRANCH:edgerouter = "standard/edgerouter"
- KBRANCH:beaglebone = "standard/beaglebone"
+ KMACHINE:genericx86 ?= "common-pc"
+ KMACHINE:genericx86-64 ?= "common-pc-64"
+ KMACHINE:beaglebone-yocto ?= "beaglebone"
- SRCREV_machine:genericx86 ?= "d09f2ce584d60ecb7890550c22a80c48b83c2e19"
- SRCREV_machine:genericx86-64 ?= "d09f2ce584d60ecb7890550c22a80c48b83c2e19"
- SRCREV_machine:edgerouter ?= "b5c8cfda2dfe296410d51e131289fb09c69e1e7d"
- SRCREV_machine:beaglebone ?= "b5c8cfda2dfe296410d51e131289fb09c69e1e7d"
+ SRCREV_machine:genericx86 ?= "6ec439b4b456ce929c4c07fe457b5d6a4b468e86"
+ SRCREV_machine:genericx86-64 ?= "6ec439b4b456ce929c4c07fe457b5d6a4b468e86"
+ SRCREV_machine:beaglebone-yocto ?= "423e1996694b61fbfc8ec3bf062fc6461d64fde1"
+ COMPATIBLE_MACHINE:genericx86 = "genericx86"
+ COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64"
+ COMPATIBLE_MACHINE:beaglebone-yocto = "beaglebone-yocto"
- COMPATIBLE_MACHINE:genericx86 = "genericx86"
- COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64"
- COMPATIBLE_MACHINE:edgerouter = "edgerouter"
- COMPATIBLE_MACHINE:beaglebone = "beaglebone"
-
- LINUX_VERSION:genericx86 = "4.12.7"
- LINUX_VERSION:genericx86-64 = "4.12.7"
- LINUX_VERSION:edgerouter = "4.12.10"
- LINUX_VERSION:beaglebone = "4.12.10"
+ LINUX_VERSION:genericx86 = "6.1.30"
+ LINUX_VERSION:genericx86-64 = "6.1.30"
+ LINUX_VERSION:beaglebone-yocto = "6.1.20"
This append file
contains statements used to support several BSPs that ship with the
@@ -1005,7 +1001,7 @@ Section.
the following sequence of commands::
$ cd poky/build
- $ bitbake -c cleanall yocto-linux
+ $ bitbake -c cleanall linux-yocto
$ bitbake core-image-minimal -c cleanall
$ bitbake core-image-minimal
$ runqemu qemux86
diff --git a/poky/documentation/migration-guides/migration-4.3.rst b/poky/documentation/migration-guides/migration-4.3.rst
index 79cf907708..fc25397d70 100644
--- a/poky/documentation/migration-guides/migration-4.3.rst
+++ b/poky/documentation/migration-guides/migration-4.3.rst
@@ -26,15 +26,26 @@ no longer the default supported configuration. This setting does not affect whic
kernel versions SDKs will run against and does not affect which versions of the kernel
can be used to run builds.
+.. _migration-4.3-layername-override:
+
Layername override implications
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Code can now know which layer a recipe is coming from through the newly added
:term:`FILE_LAYERNAME` variable and the ``layer-<layername> override``. This is being used
for enabling QA checks on a per layer basis. For existing code this has the
-side effect that the QA checks will apply to things being bbappended to recipes
-from other layers. Those other layers would need to have patch upstream status
-entries for patches being bbappended for example.
+side effect that the QA checks will apply to recipes being bbappended
+from other layers - for example, patches added through such bbappends will now
+need to have the "Upstream-Status" specified in the patch header.
+
+.. _migration-4.3-compiling-changes:
+
+Compiling changes
+~~~~~~~~~~~~~~~~~
+
+- Code on 32 bit platforms is now compiled with largefile support and 64
+ bit ``time_t``, to avoid the Y2038 time overflow issue. This breaks the ABI
+ and could break existing programs in untested layers.
.. _migration-4.3-supported-distributions:
@@ -43,10 +54,31 @@ Supported distributions
This release supports running BitBake on new GNU/Linux distributions:
+- Ubuntu 22.10
+- Fedora 38
+- Debian 12
+- CentOS Stream 8
+- AlmaLinux 8.8
+- AlmaLinux 9.2
+
On the other hand, some earlier distributions are no longer supported:
+- Fedora 36
+- AlmaLinux 8.7
+- AlmaLinux 9.1
+
See :ref:`all supported distributions <system-requirements-supported-distros>`.
+.. _migration-4.3-removed-machines:
+
+edgerouter machine removed
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The ``edgerouter`` reference BSP for the MIPS architecture in ``meta-yocto-bsp``
+has been removed as the hardware has been unavailable for some time. There is no
+suitable reference MIPS hardware to replace it with, but the MIPS architecture
+will continue to get coverage via QEMU build/boot testing.
+
.. _migration-4.3-go-changes:
Go language changes
@@ -55,7 +87,9 @@ Go language changes
- Support for the Glide package manager has been removed, as ``go mod``
has become the standard.
-Systemd changes
+.. _migration-4.3-systemd-changes:
+
+systemd changes
~~~~~~~~~~~~~~~
Upstream systemd is now more strict on filesystem layout and the ``usrmerge``
@@ -70,14 +104,14 @@ Recipe changes
- Runtime testing of ptest now fails if no test results are returned by
any given ptest.
-.. _migration-4.3-class-changes:
+.. _migration-4.3-deprecated-variables:
-Class changes
-~~~~~~~~~~~~~
+Deprecated variables
+~~~~~~~~~~~~~~~~~~~~
-- The ``perl-version`` class no longer provides the ``PERLVERSION`` and ``PERLARCH`` variables
- as there were no users in any core layer. The functions for this functionality
- are still available.
+The following variables have been deprecated:
+
+- :term:`CVE_CHECK_IGNORE`: use :term:`CVE_STATUS` instead.
.. _migration-4.3-removed-variables:
@@ -86,8 +120,13 @@ Removed variables
The following variables have been removed:
+- ``AUTHOR``
- ``PERLARCH``
- ``PERLVERSION``
+- ``QEMU_USE_SLIRP`` - add ``slirp`` to ``TEST_RUNQEMUPARAMS`` instead.
+- ``SERIAL_CONSOLES_CHECK`` - no longer necessary because all
+ consoles listed in :term:`SERIAL_CONSOLES` are checked for their existence
+ before a ``getty`` is started.
.. _migration-4.3-removed-recipes:
@@ -96,7 +135,15 @@ Removed recipes
The following recipes have been removed in this release:
-- ``glide``, as explained in :ref:`migration-4.3-go-changes`.
+- ``apmd``: obsolete (``apm`` in :term:`MACHINE_FEATURES` also removed).
+- ``cve-update-db-native``: functionally replaced by ``cve-update-nvd2-native``
+- ``gcr3``: no longer needed by core recipes, moved to meta-gnome (gcr, i.e. version 4.x, is still provided).
+- ``glide``: as explained in :ref:`migration-4.3-go-changes`.
+- ``libdmx``: obsolete
+- ``linux-yocto`` version 5.15 (versions 6.1 and 6.5 provided instead).
+- ``python3-async``: obsolete - no longer needed by ``python3-gitdb`` or any other core recipe
+- ``rust-hello-world``: there are sufficient other Rust recipes and test cases such that this is no longer needed.
+
.. _migration-4.3-removed-classes:
@@ -105,6 +152,90 @@ Removed classes
The following classes have been removed in this release:
+- ``glide``: as explained in :ref:`migration-4.3-go-changes`.
+
+
+Output file naming changes
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In 4.3 there are some minor differences in image and SDK output file names.
+If you rely on the existing naming (e.g. in external scripts) you may need to
+either modify configuration or adapt to the new naming. Further details:
+
+- :term:`IMAGE_NAME` and :term:`IMAGE_LINK_NAME` now include the
+ :term:`IMAGE_NAME_SUFFIX` value directly. In practical terms, this means
+ that ``.rootfs`` will now appear in image output file names. If you do not
+ wish to have the ``.rootfs`` suffix used, you can just set
+ :term:`IMAGE_NAME_SUFFIX` to "" and this will now be consistently respected
+ in both the image file and image file symlink names. As part of this change,
+ support for the ``imgsuffix`` task varflag has been dropped (mostly
+ an internal implementation detail, but if you were implementing a custom
+ image construction with a task in a similar manner to ``do_bootimg``
+ you may have been using this).
+
+- :term:`SDK_NAME` now includes the values of :term:`IMAGE_BASENAME` and
+ :term:`MACHINE` so that they are unique when building SDKs for different
+ images and machines.
+
+
+
+.. _migration-4.3-pr-pe:
+
+Versioning changes
+~~~~~~~~~~~~~~~~~~
+
+- :term:`PR` values have been removed from all core recipes - distro maintainers
+ who make use of :term:`PR` values would need to curate these already so the
+ sparsely set base values would not be that useful anymore. If you have been
+ relying on these (i.e. you are maintaining a binary package feed where package
+ versions should only ever increase), double-check the output (perhaps with the
+ help of the :ref:`ref-classes-buildhistory` class) to ensure that package
+ versions are consistent.
+
+- The :term:`PR` value can no longer be set from the recipe file name - this
+ was rarely used, but in any case is no longer supported.
+
+- :term:`PE` and :term:`PR` are no longer included in the work directory path
+ (:term:`WORKDIR`). This may break some tool assumptions about directory paths,
+ but those should really be querying paths from the build system (or not poking
+ into :term:`WORKDIR` externally).
+
+- Source revision information has been moved from :term:`PV` to :term:`PKGV`.
+ The user visible effect of this change is that :term:`PV` will no longer have
+ revision information in it and this will now be appended to the :term:`PV`
+ value through :term:`PKGV` when the packages are written out (as long as "+"
+ is present in the :term:`PKGV` value). Since :term:`PV` is used in
+ :term:`STAMP` and :term:`WORKDIR`, you may notice small directory naming and
+ stamp naming changes.
+
+- The :term:`SRCPV` variable is no longer needed in :term:`PV`, but since
+ the default :term:`SRCPV` value is now "", using it is effectively now just a
+ null operation - you can remove it (leaving behind the "+") , but it is not
+ yet required to do so.
+
+
+.. _migration-4.3-qemu-changes:
+
+QEMU changes
+~~~~~~~~~~~~
+
+- The ``runqemu`` script no longer systematically adds two serial ports
+ (``--serial null`` and ``-serial mon:stdio``) to the QEMU emulated machine
+ if the user already adds such ports through the ``QB_OPT_APPEND`` setting.
+
+ If the user adds one port, only ``--serial null`` is added, and
+ ``-serial mon:stdio`` is no longer passed. If the user adds more than one
+ port, ``--serial null`` is no longer added either. This can break some
+ existing QEMU based configurations expecting such serial ports to be added
+ when ``runqemu`` is executed.
+
+ This change was made to avoid exceeding two serial ports, which interferes
+ with automated testing.
+
+- ``runqemu`` now uses the ``ip tuntap`` command instead of ``tunctl``, and
+ thus ``tunctl`` is no longer built by the ``qemu-helper-native`` recipe; if
+ for some reason you were calling ``tunctl`` directly from your own scripts
+ you should switch to calling ``ip tuntap`` instead.
.. _migration-4.3-misc-changes:
@@ -115,5 +246,7 @@ Miscellaneous changes
``virtual/XXX`` provider/dependencies where a ``PREFIX`` was used as well,
as we don't need both and it made automated dependency rewriting
unnecessarily complex. In general this only affects internal toolchain
- dependencies so isn't end user visible.
+ dependencies so isn't end user visible, but if for some reason you have
+ custom classes or recipes that rely upon the old providers then you will
+ need to update those.
diff --git a/poky/documentation/migration-guides/release-4.0.rst b/poky/documentation/migration-guides/release-4.0.rst
index adff55df10..748eab3bd0 100644
--- a/poky/documentation/migration-guides/release-4.0.rst
+++ b/poky/documentation/migration-guides/release-4.0.rst
@@ -20,3 +20,4 @@ Release 4.0 (kirkstone)
release-notes-4.0.11
release-notes-4.0.12
release-notes-4.0.13
+ release-notes-4.0.14
diff --git a/poky/documentation/migration-guides/release-4.2.rst b/poky/documentation/migration-guides/release-4.2.rst
index abeebcb1c8..5ef2cc6657 100644
--- a/poky/documentation/migration-guides/release-4.2.rst
+++ b/poky/documentation/migration-guides/release-4.2.rst
@@ -10,3 +10,4 @@ Release 4.2 (mickledore)
release-notes-4.2.1
release-notes-4.2.2
release-notes-4.2.3
+ release-notes-4.2.4
diff --git a/poky/documentation/migration-guides/release-notes-4.0.14.rst b/poky/documentation/migration-guides/release-notes-4.0.14.rst
new file mode 100644
index 0000000000..02253f33f7
--- /dev/null
+++ b/poky/documentation/migration-guides/release-notes-4.0.14.rst
@@ -0,0 +1,227 @@
+.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
+
+Release notes for Yocto-4.0.14 (Kirkstone)
+------------------------------------------
+
+Security Fixes in Yocto-4.0.14
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- bind: Fix :cve:`2023-3341` and :cve:`2023-4236`
+- binutils: Fix :cve:`2022-44840`, :cve:`2022-45703`, :cve:`2022-47008`, :cve:`2022-47011`, :cve:`2022-47673`, :cve:`2022-47695`, :cve:`2022-47696` and :cve:`2022-48063`
+- cups: Fix :cve:`2023-4504`
+- curl: Fix :cve:`2023-38545` and :cve:`2023-38546`
+- gawk: Fix :cve:`2023-4156`
+- ghostscript: Fix :cve:`2023-43115`
+- glibc: Fix :cve:`2023-4806`, :cve:`2023-4813`, :cve:`2023-4911` and :cve:`2023-5156`
+- glibc: Ignore :cve:`2023-4527`
+- go: Fix :cve:`2023-24538` and :cve:`2023-39318`
+- gstreamer1.0-plugins-bad: fix :cve_mitre:`2023-40474`, :cve_mitre:`2023-40475` and :cve_mitre:`2023-40476`
+- libtiff: Fix :cve:`2022-40090` and :cve:`2023-1916`
+- libwebp: Fix :cve:`2023-5129`
+- libx11: Fix :cve:`2023-43785`, :cve:`2023-43786` and :cve:`2023-43787`
+- libxml2: Fix :cve:`2023-45322`
+- libxpm: Fix :cve:`2023-43788` and :cve:`2023-43789`
+- linux-firmware: Fix :cve:`2022-40982`, :cve:`2023-20569` and :cve:`2023-20593`
+- linux-yocto: update CVE exclusions
+- linux-yocto/5.10: Ignore :cve:`2003-1604`, :cve:`2004-0230`, :cve:`2006-3635`, :cve:`2006-5331`, :cve:`2006-6128`, :cve:`2007-4774`, :cve:`2007-6761`, :cve:`2007-6762`, :cve:`2008-7316`, :cve:`2009-2692`, :cve:`2010-0008`, :cve:`2010-3432`, :cve:`2010-4648`, :cve:`2010-5313`, :cve:`2010-5328`, :cve:`2010-5329`, :cve:`2010-5331`, :cve:`2010-5332`, :cve:`2011-4098`, :cve:`2011-4131`, :cve:`2011-4915`, :cve:`2011-5321`, :cve:`2011-5327`, :cve:`2012-0957`, :cve:`2012-2119`, :cve:`2012-2136`, :cve:`2012-2137`, :cve:`2012-2313`, :cve:`2012-2319`, :cve:`2012-2372`, :cve:`2012-2375`, :cve:`2012-2390`, :cve:`2012-2669`, :cve:`2012-2744`, :cve:`2012-2745`, :cve:`2012-3364`, :cve:`2012-3375`, :cve:`2012-3400`, :cve:`2012-3412`, :cve:`2012-3430`, :cve:`2012-3510`, :cve:`2012-3511`, :cve:`2012-3520`, :cve:`2012-3552`, :cve:`2012-4398`, :cve:`2012-4444`, :cve:`2012-4461`, :cve:`2012-4467`, :cve:`2012-4508`, :cve:`2012-4530`, :cve:`2012-4565`, :cve:`2012-5374`, :cve:`2012-5375`, :cve:`2012-5517`, :cve:`2012-6536`, :cve:`2012-6537`, :cve:`2012-6538`, :cve:`2012-6539`, :cve:`2012-6540`, :cve:`2012-6541`, :cve:`2012-6542`, :cve:`2012-6543`, :cve:`2012-6544`, :cve:`2012-6545`, :cve:`2012-6546`, :cve:`2012-6547`, :cve:`2012-6548`, :cve:`2012-6549`, :cve:`2012-6638`, :cve:`2012-6647`, :cve:`2012-6657`, :cve:`2012-6689`, :cve:`2012-6701`, :cve:`2012-6703`, :cve:`2012-6704`, :cve:`2012-6712`, :cve:`2013-0160`, :cve:`2013-0190`, :cve:`2013-0216`, :cve:`2013-0217`, :cve:`2013-0228`, :cve:`2013-0231`, :cve:`2013-0268`, :cve:`2013-0290`, :cve:`2013-0309`, :cve:`2013-0310`, :cve:`2013-0311`, :cve:`2013-0313`, :cve:`2013-0343`, :cve:`2013-0349`, :cve:`2013-0871`, :cve:`2013-0913`, :cve:`2013-0914`, :cve:`2013-1059`, :cve:`2013-1763`, :cve:`2013-1767`, :cve:`2013-1772`, :cve:`2013-1773`, :cve:`2013-1774`, :cve:`2013-1792`, :cve:`2013-1796`, :cve:`2013-1797`, :cve:`2013-1798`, :cve:`2013-1819`, :cve:`2013-1826`, :cve:`2013-1827`, :cve:`2013-1828`, :cve:`2013-1848`, :cve:`2013-1858`, :cve:`2013-1860`, :cve:`2013-1928`, :cve:`2013-1929`, :cve:`2013-1943`, :cve:`2013-1956`, :cve:`2013-1957`, :cve:`2013-1958`, :cve:`2013-1959`, :cve:`2013-1979`, :cve:`2013-2015`, :cve:`2013-2017`, :cve:`2013-2058`, :cve:`2013-2094`, :cve:`2013-2128`, :cve:`2013-2140`, :cve:`2013-2141`, :cve:`2013-2146`, :cve:`2013-2147`, :cve:`2013-2148`, :cve:`2013-2164`, :cve:`2013-2206`, :cve:`2013-2232`, :cve:`2013-2234`, :cve:`2013-2237`, :cve:`2013-2546`, :cve:`2013-2547`, :cve:`2013-2548`, :cve:`2013-2596`, :cve:`2013-2634`, :cve:`2013-2635`, :cve:`2013-2636`, :cve:`2013-2850`, :cve:`2013-2851`, :cve:`2013-2852`, :cve:`2013-2888`, :cve:`2013-2889`, :cve:`2013-2890`, :cve:`2013-2891`, :cve:`2013-2892`, :cve:`2013-2893`, :cve:`2013-2894`, :cve:`2013-2895`, :cve:`2013-2896`, :cve:`2013-2897`, :cve:`2013-2898`, :cve:`2013-2899`, :cve:`2013-2929`, :cve:`2013-2930`, :cve:`2013-3076`, :cve:`2013-3222`, :cve:`2013-3223`, :cve:`2013-3224`, :cve:`2013-3225`, :cve:`2013-3226`, :cve:`2013-3227`, :cve:`2013-3228`, :cve:`2013-3229`, :cve:`2013-3230`, :cve:`2013-3231`, :cve:`2013-3232`, :cve:`2013-3233`, :cve:`2013-3234`, :cve:`2013-3235`, :cve:`2013-3236`, :cve:`2013-3237`, :cve:`2013-3301`, :cve:`2013-3302`, :cve:`2013-4125`, :cve:`2013-4127`, :cve:`2013-4129`, :cve:`2013-4162`, :cve:`2013-4163`, :cve:`2013-4205`, :cve:`2013-4220`, :cve:`2013-4247`, :cve:`2013-4254`, :cve:`2013-4270`, :cve:`2013-4299`, :cve:`2013-4300`, :cve:`2013-4312`, :cve:`2013-4343`, :cve:`2013-4345`, :cve:`2013-4348`, :cve:`2013-4350`, :cve:`2013-4387`, :cve:`2013-4470`, :cve:`2013-4483`, :cve:`2013-4511`, :cve:`2013-4512`, :cve:`2013-4513`, :cve:`2013-4514`, :cve:`2013-4515`, :cve:`2013-4516`, :cve:`2013-4563`, :cve:`2013-4579`, :cve:`2013-4587`, :cve:`2013-4588`, :cve:`2013-4591`, :cve:`2013-4592`, :cve:`2013-5634`, :cve:`2013-6282`, :cve:`2013-6367`, :cve:`2013-6368`, :cve:`2013-6376`, :cve:`2013-6378`, :cve:`2013-6380`, :cve:`2013-6381`, :cve:`2013-6382`, :cve:`2013-6383`, :cve:`2013-6431`, :cve:`2013-6432`, :cve:`2013-6885`, :cve:`2013-7026`, :cve:`2013-7027`, :cve:`2013-7263`, :cve:`2013-7264`, :cve:`2013-7265`, :cve:`2013-7266`, :cve:`2013-7267`, :cve:`2013-7268`, :cve:`2013-7269`, :cve:`2013-7270`, :cve:`2013-7271`, :cve:`2013-7281`, :cve:`2013-7339`, :cve:`2013-7348`, :cve:`2013-7421`, :cve:`2013-7446`, :cve:`2013-7470`, :cve:`2014-0038`, :cve:`2014-0049`, :cve:`2014-0055`, :cve:`2014-0069`, :cve:`2014-0077`, :cve:`2014-0100`, :cve:`2014-0101`, :cve:`2014-0102`, :cve:`2014-0131`, :cve:`2014-0155`, :cve:`2014-0181`, :cve:`2014-0196`, :cve:`2014-0203`, :cve:`2014-0205`, :cve:`2014-0206`, :cve:`2014-1438`, :cve:`2014-1444`, :cve:`2014-1445`, :cve:`2014-1446`, :cve:`2014-1690`, :cve:`2014-1737`, :cve:`2014-1738`, :cve:`2014-1739`, :cve:`2014-1874`, :cve:`2014-2038`, :cve:`2014-2039`, :cve:`2014-2309`, :cve:`2014-2523`, :cve:`2014-2568`, :cve:`2014-2580`, :cve:`2014-2672`, :cve:`2014-2673`, :cve:`2014-2678`, :cve:`2014-2706`, :cve:`2014-2739`, :cve:`2014-2851`, :cve:`2014-2889`, :cve:`2014-3122`, :cve:`2014-3144`, :cve:`2014-3145`, :cve:`2014-3153`, :cve:`2014-3180`, :cve:`2014-3181`, :cve:`2014-3182`, :cve:`2014-3183`, :cve:`2014-3184`, :cve:`2014-3185`, :cve:`2014-3186`, :cve:`2014-3534`, :cve:`2014-3535`, :cve:`2014-3601`, :cve:`2014-3610`, :cve:`2014-3611`, :cve:`2014-3631`, :cve:`2014-3645`, :cve:`2014-3646`, :cve:`2014-3647`, :cve:`2014-3673`, :cve:`2014-3687`, :cve:`2014-3688`, :cve:`2014-3690`, :cve:`2014-3917`, :cve:`2014-3940`, :cve:`2014-4014`, :cve:`2014-4027`, :cve:`2014-4157`, :cve:`2014-4171`, :cve:`2014-4508`, :cve:`2014-4608`, :cve:`2014-4611`, :cve:`2014-4652`, :cve:`2014-4653`, :cve:`2014-4654`, :cve:`2014-4655`, :cve:`2014-4656`, :cve:`2014-4667`, :cve:`2014-4699`, :cve:`2014-4943`, :cve:`2014-5045`, :cve:`2014-5077`, :cve:`2014-5206`, :cve:`2014-5207`, :cve:`2014-5471`, :cve:`2014-5472`, :cve:`2014-6410`, :cve:`2014-6416`, :cve:`2014-6417`, :cve:`2014-6418`, :cve:`2014-7145`, :cve:`2014-7283`, :cve:`2014-7284`, :cve:`2014-7822`, :cve:`2014-7825`, :cve:`2014-7826`, :cve:`2014-7841`, :cve:`2014-7842`, :cve:`2014-7843`, :cve:`2014-7970`, :cve:`2014-7975`, :cve:`2014-8086`, :cve:`2014-8133`, :cve:`2014-8134`, :cve:`2014-8159`, :cve:`2014-8160`, :cve:`2014-8171`, :cve:`2014-8172`, :cve:`2014-8173`, :cve:`2014-8369`, :cve:`2014-8480`, :cve:`2014-8481`, :cve:`2014-8559`, :cve:`2014-8709`, :cve:`2014-8884`, :cve:`2014-8989`, :cve:`2014-9090`, :cve:`2014-9322`, :cve:`2014-9419`, :cve:`2014-9420`, :cve:`2014-9428`, :cve:`2014-9529`, :cve:`2014-9584`, :cve:`2014-9585`, :cve:`2014-9644`, :cve:`2014-9683`, :cve:`2014-9710`, :cve:`2014-9715`, :cve:`2014-9717`, :cve:`2014-9728`, :cve:`2014-9729`, :cve:`2014-9730`, :cve:`2014-9731`, :cve:`2014-9803`, :cve:`2014-9870`, :cve:`2014-9888`, :cve:`2014-9895`, :cve:`2014-9903`, :cve:`2014-9904`, :cve:`2014-9914`, :cve:`2014-9922`, :cve:`2014-9940`, :cve:`2015-0239`, :cve:`2015-0274`, :cve:`2015-0275`, :cve:`2015-1333`, :cve:`2015-1339`, :cve:`2015-1350`, :cve:`2015-1420`, :cve:`2015-1421`, :cve:`2015-1465`, :cve:`2015-1573`, :cve:`2015-1593`, :cve:`2015-1805`, :cve:`2015-2041`, :cve:`2015-2042`, :cve:`2015-2150`, :cve:`2015-2666`, :cve:`2015-2672`, :cve:`2015-2686`, :cve:`2015-2830`, :cve:`2015-2922`, :cve:`2015-2925`, :cve:`2015-3212`, :cve:`2015-3214`, :cve:`2015-3288`, :cve:`2015-3290`, :cve:`2015-3291`, :cve:`2015-3331`, :cve:`2015-3339`, :cve:`2015-3636`, :cve:`2015-4001`, :cve:`2015-4002`, :cve:`2015-4003`, :cve:`2015-4004`, :cve:`2015-4036`, :cve:`2015-4167`, :cve:`2015-4170`, :cve:`2015-4176`, :cve:`2015-4177`, :cve:`2015-4178`, :cve:`2015-4692`, :cve:`2015-4700`, :cve:`2015-5156`, :cve:`2015-5157`, :cve:`2015-5257`, :cve:`2015-5283`, :cve:`2015-5307`, :cve:`2015-5327`, :cve:`2015-5364`, :cve:`2015-5366`, :cve:`2015-5697`, :cve:`2015-5706`, :cve:`2015-5707`, :cve:`2015-6252`, :cve:`2015-6526`, :cve:`2015-6937`, :cve:`2015-7509`, :cve:`2015-7513`, :cve:`2015-7515`, :cve:`2015-7550`, :cve:`2015-7566`, :cve:`2015-7613`, :cve:`2015-7799`, :cve:`2015-7833`, :cve:`2015-7872`, :cve:`2015-7884`, :cve:`2015-7885`, :cve:`2015-7990`, :cve:`2015-8104`, :cve:`2015-8215`, :cve:`2015-8324`, :cve:`2015-8374`, :cve:`2015-8539`, :cve:`2015-8543`, :cve:`2015-8550`, :cve:`2015-8551`, :cve:`2015-8552`, :cve:`2015-8553`, :cve:`2015-8569`, :cve:`2015-8575`, :cve:`2015-8660`, :cve:`2015-8709`, :cve:`2015-8746`, :cve:`2015-8767`, :cve:`2015-8785`, :cve:`2015-8787`, :cve:`2015-8812`, :cve:`2015-8816`, :cve:`2015-8830`, :cve:`2015-8839`, :cve:`2015-8844`, :cve:`2015-8845`, :cve:`2015-8950`, :cve:`2015-8952`, :cve:`2015-8953`, :cve:`2015-8955`, :cve:`2015-8956`, :cve:`2015-8961`, :cve:`2015-8962`, :cve:`2015-8963`, :cve:`2015-8964`, :cve:`2015-8966`, :cve:`2015-8967`, :cve:`2015-8970`, :cve:`2015-9004`, :cve:`2015-9016`, :cve:`2015-9289`, :cve:`2016-0617`, :cve:`2016-0723`, :cve:`2016-0728`, :cve:`2016-0758`, :cve:`2016-0821`, :cve:`2016-0823`, :cve:`2016-10044`, :cve:`2016-10088`, :cve:`2016-10147`, :cve:`2016-10150`, :cve:`2016-10153`, :cve:`2016-10154`, :cve:`2016-10200`, :cve:`2016-10208`, :cve:`2016-10229`, :cve:`2016-10318`, :cve:`2016-10723`, :cve:`2016-10741`, :cve:`2016-10764`, :cve:`2016-10905`, :cve:`2016-10906`, :cve:`2016-10907`, :cve:`2016-1237`, :cve:`2016-1575`, :cve:`2016-1576`, :cve:`2016-1583`, :cve:`2016-2053`, :cve:`2016-2069`, :cve:`2016-2070`, :cve:`2016-2085`, :cve:`2016-2117`, :cve:`2016-2143`, :cve:`2016-2184`, :cve:`2016-2185`, :cve:`2016-2186`, :cve:`2016-2187`, :cve:`2016-2188`, :cve:`2016-2383`, :cve:`2016-2384`, :cve:`2016-2543`, :cve:`2016-2544`, :cve:`2016-2545`, :cve:`2016-2546`, :cve:`2016-2547`, :cve:`2016-2548`, :cve:`2016-2549`, :cve:`2016-2550`, :cve:`2016-2782`, :cve:`2016-2847`, :cve:`2016-3044`, :cve:`2016-3070`, :cve:`2016-3134`, :cve:`2016-3135`, :cve:`2016-3136`, :cve:`2016-3137`, :cve:`2016-3138`, :cve:`2016-3139`, :cve:`2016-3140`, :cve:`2016-3156`, :cve:`2016-3157`, :cve:`2016-3672`, :cve:`2016-3689`, :cve:`2016-3713`, :cve:`2016-3841`, :cve:`2016-3857`, :cve:`2016-3951`, :cve:`2016-3955`, :cve:`2016-3961`, :cve:`2016-4440`, :cve:`2016-4470`, :cve:`2016-4482`, :cve:`2016-4485`, :cve:`2016-4486`, :cve:`2016-4557`, :cve:`2016-4558`, :cve:`2016-4565`, :cve:`2016-4568`, :cve:`2016-4569`, :cve:`2016-4578`, :cve:`2016-4580`, :cve:`2016-4581`, :cve:`2016-4794`, :cve:`2016-4805`, :cve:`2016-4913`, :cve:`2016-4951`, :cve:`2016-4997`, :cve:`2016-4998`, :cve:`2016-5195`, :cve:`2016-5243`, :cve:`2016-5244`, :cve:`2016-5400`, :cve:`2016-5412`, :cve:`2016-5696`, :cve:`2016-5728`, :cve:`2016-5828`, :cve:`2016-5829`, :cve:`2016-6130`, :cve:`2016-6136`, :cve:`2016-6156`, :cve:`2016-6162`, :cve:`2016-6187`, :cve:`2016-6197`, :cve:`2016-6198`, :cve:`2016-6213`, :cve:`2016-6327`, :cve:`2016-6480`, :cve:`2016-6516`, :cve:`2016-6786`, :cve:`2016-6787`, :cve:`2016-6828`, :cve:`2016-7039`, :cve:`2016-7042`, :cve:`2016-7097`, :cve:`2016-7117`, :cve:`2016-7425`, :cve:`2016-7910`, :cve:`2016-7911`, :cve:`2016-7912`, :cve:`2016-7913`, :cve:`2016-7914`, :cve:`2016-7915`, :cve:`2016-7916`, :cve:`2016-7917`, :cve:`2016-8399`, :cve:`2016-8405`, :cve:`2016-8630`, :cve:`2016-8632`, :cve:`2016-8633`, :cve:`2016-8636`, :cve:`2016-8645`, :cve:`2016-8646`, :cve:`2016-8650`, :cve:`2016-8655`, :cve:`2016-8658`, :cve:`2016-8666`, :cve:`2016-9083`, :cve:`2016-9084`, :cve:`2016-9120`, :cve:`2016-9178`, :cve:`2016-9191`, :cve:`2016-9313`, :cve:`2016-9555`, :cve:`2016-9576`, :cve:`2016-9588`, :cve:`2016-9604`, :cve:`2016-9685`, :cve:`2016-9754`, :cve:`2016-9755`, :cve:`2016-9756`, :cve:`2016-9777`, :cve:`2016-9793`, :cve:`2016-9794`, :cve:`2016-9806`, :cve:`2016-9919`, :cve:`2017-0605`, :cve:`2017-0627`, :cve:`2017-0750`, :cve:`2017-0786`, :cve:`2017-0861`, :cve:`2017-1000`, :cve:`2017-1000111`, :cve:`2017-1000112`, :cve:`2017-1000251`, :cve:`2017-1000252`, :cve:`2017-1000253`, :cve:`2017-1000255`, :cve:`2017-1000363`, :cve:`2017-1000364`, :cve:`2017-1000365`, :cve:`2017-1000370`, :cve:`2017-1000371`, :cve:`2017-1000379`, :cve:`2017-1000380`, :cve:`2017-1000405`, :cve:`2017-1000407`, :cve:`2017-1000410`, :cve:`2017-10661`, :cve:`2017-10662`, :cve:`2017-10663`, :cve:`2017-10810`, :cve:`2017-10911`, :cve:`2017-11089`, :cve:`2017-11176`, :cve:`2017-11472`, :cve:`2017-11473`, :cve:`2017-11600`, :cve:`2017-12134`, :cve:`2017-12146`, :cve:`2017-12153`, :cve:`2017-12154`, :cve:`2017-12168`, :cve:`2017-12188`, :cve:`2017-12190`, :cve:`2017-12192`, :cve:`2017-12193`, :cve:`2017-12762`, :cve:`2017-13080`, :cve:`2017-13166`, :cve:`2017-13167`, :cve:`2017-13168`, :cve:`2017-13215`, :cve:`2017-13216`, :cve:`2017-13220`, :cve:`2017-13305`, :cve:`2017-13686`, :cve:`2017-13695`, :cve:`2017-13715`, :cve:`2017-14051`, :cve:`2017-14106`, :cve:`2017-14140`, :cve:`2017-14156`, :cve:`2017-14340`, :cve:`2017-14489`, :cve:`2017-14497`, :cve:`2017-14954`, :cve:`2017-14991`, :cve:`2017-15102`, :cve:`2017-15115`, :cve:`2017-15116`, :cve:`2017-15121`, :cve:`2017-15126`, :cve:`2017-15127`, :cve:`2017-15128`, :cve:`2017-15129`, :cve:`2017-15265`, :cve:`2017-15274`, :cve:`2017-15299`, :cve:`2017-15306`, :cve:`2017-15537`, :cve:`2017-15649`, :cve:`2017-15868`, :cve:`2017-15951`, :cve:`2017-16525`, :cve:`2017-16526`, :cve:`2017-16527`, :cve:`2017-16528`, :cve:`2017-16529`, :cve:`2017-16530`, :cve:`2017-16531`, :cve:`2017-16532`, :cve:`2017-16533`, :cve:`2017-16534`, :cve:`2017-16535`, :cve:`2017-16536`, :cve:`2017-16537`, :cve:`2017-16538`, :cve:`2017-16643`, :cve:`2017-16644`, :cve:`2017-16645`, :cve:`2017-16646`, :cve:`2017-16647`, :cve:`2017-16648`, :cve:`2017-16649`, :cve:`2017-16650`, :cve:`2017-16911`, :cve:`2017-16912`, :cve:`2017-16913`, :cve:`2017-16914`, :cve:`2017-16939`, :cve:`2017-16994`, :cve:`2017-16995`, :cve:`2017-16996`, :cve:`2017-17052`, :cve:`2017-17053`, :cve:`2017-17448`, :cve:`2017-17449`, :cve:`2017-17450`, :cve:`2017-17558`, :cve:`2017-17712`, :cve:`2017-17741`, :cve:`2017-17805`, :cve:`2017-17806`, :cve:`2017-17807`, :cve:`2017-17852`, :cve:`2017-17853`, :cve:`2017-17854`, :cve:`2017-17855`, :cve:`2017-17856`, :cve:`2017-17857`, :cve:`2017-17862`, :cve:`2017-17863`, :cve:`2017-17864`, :cve:`2017-17975`, :cve:`2017-18017`, :cve:`2017-18075`, :cve:`2017-18079`, :cve:`2017-18174`, :cve:`2017-18193`, :cve:`2017-18200`, :cve:`2017-18202`, :cve:`2017-18203`, :cve:`2017-18204`, :cve:`2017-18208`, :cve:`2017-18216`, :cve:`2017-18218`, :cve:`2017-18221`, :cve:`2017-18222`, :cve:`2017-18224`, :cve:`2017-18232`, :cve:`2017-18241`, :cve:`2017-18249`, :cve:`2017-18255`, :cve:`2017-18257`, :cve:`2017-18261`, :cve:`2017-18270`, :cve:`2017-18344`, :cve:`2017-18360`, :cve:`2017-18379`, :cve:`2017-18509`, :cve:`2017-18549`, :cve:`2017-18550`, :cve:`2017-18551`, :cve:`2017-18552`, :cve:`2017-18595`, :cve:`2017-2583`, :cve:`2017-2584`, :cve:`2017-2596`, :cve:`2017-2618`, :cve:`2017-2634`, :cve:`2017-2636`, :cve:`2017-2647`, :cve:`2017-2671`, :cve:`2017-5123`, :cve:`2017-5546`, :cve:`2017-5547`, :cve:`2017-5548`, :cve:`2017-5549`, :cve:`2017-5550`, :cve:`2017-5551`, :cve:`2017-5576`, :cve:`2017-5577`, :cve:`2017-5669`, :cve:`2017-5715`, :cve:`2017-5753`, :cve:`2017-5754`, :cve:`2017-5897`, :cve:`2017-5967`, :cve:`2017-5970`, :cve:`2017-5972`, :cve:`2017-5986`, :cve:`2017-6001`, :cve:`2017-6074`, :cve:`2017-6214`, :cve:`2017-6345`, :cve:`2017-6346`, :cve:`2017-6347`, :cve:`2017-6348`, :cve:`2017-6353`, :cve:`2017-6874`, :cve:`2017-6951`, :cve:`2017-7184`, :cve:`2017-7187`, :cve:`2017-7261`, :cve:`2017-7273`, :cve:`2017-7277`, :cve:`2017-7294`, :cve:`2017-7308`, :cve:`2017-7346`, :cve:`2017-7374`, :cve:`2017-7472`, :cve:`2017-7477`, :cve:`2017-7482`, :cve:`2017-7487`, :cve:`2017-7495`, :cve:`2017-7518`, :cve:`2017-7533`, :cve:`2017-7541`, :cve:`2017-7542`, :cve:`2017-7558`, :cve:`2017-7616`, :cve:`2017-7618`, :cve:`2017-7645`, :cve:`2017-7889`, :cve:`2017-7895`, :cve:`2017-7979`, :cve:`2017-8061`, :cve:`2017-8062`, :cve:`2017-8063`, :cve:`2017-8064`, :cve:`2017-8065`, :cve:`2017-8066`, :cve:`2017-8067`, :cve:`2017-8068`, :cve:`2017-8069`, :cve:`2017-8070`, :cve:`2017-8071`, :cve:`2017-8072`, :cve:`2017-8106`, :cve:`2017-8240`, :cve:`2017-8797`, :cve:`2017-8824`, :cve:`2017-8831`, :cve:`2017-8890`, :cve:`2017-8924`, :cve:`2017-8925`, :cve:`2017-9059`, :cve:`2017-9074`, :cve:`2017-9075`, :cve:`2017-9076`, :cve:`2017-9077`, :cve:`2017-9150`, :cve:`2017-9211`, :cve:`2017-9242`, :cve:`2017-9605`, :cve:`2017-9725`, :cve:`2017-9984`, :cve:`2017-9985`, :cve:`2017-9986`, :cve:`2018-1000004`, :cve:`2018-1000026`, :cve:`2018-1000028`, :cve:`2018-1000199`, :cve:`2018-1000200`, :cve:`2018-1000204`, :cve:`2018-10021`, :cve:`2018-10074`, :cve:`2018-10087`, :cve:`2018-10124`, :cve:`2018-10322`, :cve:`2018-10323`, :cve:`2018-1065`, :cve:`2018-1066`, :cve:`2018-10675`, :cve:`2018-1068`, :cve:`2018-10840`, :cve:`2018-10853`, :cve:`2018-1087`, :cve:`2018-10876`, :cve:`2018-10877`, :cve:`2018-10878`, :cve:`2018-10879`, :cve:`2018-10880`, :cve:`2018-10881`, :cve:`2018-10882`, :cve:`2018-10883`, :cve:`2018-10901`, :cve:`2018-10902`, :cve:`2018-1091`, :cve:`2018-1092`, :cve:`2018-1093`, :cve:`2018-10938`, :cve:`2018-1094`, :cve:`2018-10940`, :cve:`2018-1095`, :cve:`2018-1108`, :cve:`2018-1118`, :cve:`2018-1120`, :cve:`2018-11232`, :cve:`2018-1128`, :cve:`2018-1129`, :cve:`2018-1130`, :cve:`2018-11412`, :cve:`2018-11506`, :cve:`2018-11508`, :cve:`2018-12126`, :cve:`2018-12127`, :cve:`2018-12130`, :cve:`2018-12207`, :cve:`2018-12232`, :cve:`2018-12233`, :cve:`2018-12633`, :cve:`2018-12714`, :cve:`2018-12896`, :cve:`2018-12904`, :cve:`2018-13053`, :cve:`2018-13093`, :cve:`2018-13094`, :cve:`2018-13095`, :cve:`2018-13096`, :cve:`2018-13097`, :cve:`2018-13098`, :cve:`2018-13099`, :cve:`2018-13100`, :cve:`2018-13405`, :cve:`2018-13406`, :cve:`2018-14609`, :cve:`2018-14610`, :cve:`2018-14611`, :cve:`2018-14612`, :cve:`2018-14613`, :cve:`2018-14614`, :cve:`2018-14615`, :cve:`2018-14616`, :cve:`2018-14617`, :cve:`2018-14619`, :cve:`2018-14625`, :cve:`2018-14633`, :cve:`2018-14634`, :cve:`2018-14641`, :cve:`2018-14646`, :cve:`2018-14656`, :cve:`2018-14678`, :cve:`2018-14734`, :cve:`2018-15471`, :cve:`2018-15572`, :cve:`2018-15594`, :cve:`2018-16276`, :cve:`2018-16597`, :cve:`2018-16658`, :cve:`2018-16862`, :cve:`2018-16871`, :cve:`2018-16880`, :cve:`2018-16882`, :cve:`2018-16884`, :cve:`2018-17182`, :cve:`2018-17972`, :cve:`2018-18021`, :cve:`2018-18281`, :cve:`2018-18386`, :cve:`2018-18397`, :cve:`2018-18445`, :cve:`2018-18559`, :cve:`2018-18690`, :cve:`2018-18710`, :cve:`2018-18955`, :cve:`2018-19406`, :cve:`2018-19407`, :cve:`2018-19824`, :cve:`2018-19854`, :cve:`2018-19985`, :cve:`2018-20169`, :cve:`2018-20449`, :cve:`2018-20509`, :cve:`2018-20510`, :cve:`2018-20511`, :cve:`2018-20669`, :cve:`2018-20784`, :cve:`2018-20836`, :cve:`2018-20854`, :cve:`2018-20855`, :cve:`2018-20856`, :cve:`2018-20961`, :cve:`2018-20976`, :cve:`2018-21008`, :cve:`2018-25015`, :cve:`2018-25020`, :cve:`2018-3620`, :cve:`2018-3639`, :cve:`2018-3646`, :cve:`2018-3665`, :cve:`2018-3693`, :cve:`2018-5332`, :cve:`2018-5333`, :cve:`2018-5344`, :cve:`2018-5390`, :cve:`2018-5391`, :cve:`2018-5703`, :cve:`2018-5750`, :cve:`2018-5803`, :cve:`2018-5814`, :cve:`2018-5848`, :cve:`2018-5873`, :cve:`2018-5953`, :cve:`2018-5995`, :cve:`2018-6412`, :cve:`2018-6554`, :cve:`2018-6555`, :cve:`2018-6927`, :cve:`2018-7191`, :cve:`2018-7273`, :cve:`2018-7480`, :cve:`2018-7492`, :cve:`2018-7566`, :cve:`2018-7740`, :cve:`2018-7754`, :cve:`2018-7755`, :cve:`2018-7757`, :cve:`2018-7995`, :cve:`2018-8043`, :cve:`2018-8087`, :cve:`2018-8781`, :cve:`2018-8822`, :cve:`2018-8897`, :cve:`2018-9363`, :cve:`2018-9385`, :cve:`2018-9415`, :cve:`2018-9422`, :cve:`2018-9465`, :cve:`2018-9516`, :cve:`2018-9517`, :cve:`2018-9518`, :cve:`2018-9568`, :cve:`2019-0136`, :cve:`2019-0145`, :cve:`2019-0146`, :cve:`2019-0147`, :cve:`2019-0148`, :cve:`2019-0149`, :cve:`2019-0154`, :cve:`2019-0155`, :cve:`2019-10124`, :cve:`2019-10125`, :cve:`2019-10126`, :cve:`2019-10142`, :cve:`2019-10207`, :cve:`2019-10220`, :cve:`2019-10638`, :cve:`2019-10639`, :cve:`2019-11085`, :cve:`2019-11091`, :cve:`2019-11135`, :cve:`2019-11190`, :cve:`2019-11191`, :cve:`2019-1125`, :cve:`2019-11477`, :cve:`2019-11478`, :cve:`2019-11479`, :cve:`2019-11486`, :cve:`2019-11487`, :cve:`2019-11599`, :cve:`2019-11683`, :cve:`2019-11810`, :cve:`2019-11811`, :cve:`2019-11815`, :cve:`2019-11833`, :cve:`2019-11884`, :cve:`2019-12378`, :cve:`2019-12379`, :cve:`2019-12380`, :cve:`2019-12381`, :cve:`2019-12382`, :cve:`2019-12454`, :cve:`2019-12455`, :cve:`2019-12614`, :cve:`2019-12615`, :cve:`2019-12817`, :cve:`2019-12818`, :cve:`2019-12819`, :cve:`2019-12881`, :cve:`2019-12984`, :cve:`2019-13233`, :cve:`2019-13272`, :cve:`2019-13631`, :cve:`2019-13648`, :cve:`2019-14283`, :cve:`2019-14284`, :cve:`2019-14615`, :cve:`2019-14763`, :cve:`2019-14814`, :cve:`2019-14815`, :cve:`2019-14816`, :cve:`2019-14821`, :cve:`2019-14835`, :cve:`2019-14895`, :cve:`2019-14896`, :cve:`2019-14897`, :cve:`2019-14901`, :cve:`2019-15030`, :cve:`2019-15031`, :cve:`2019-15090`, :cve:`2019-15098`, :cve:`2019-15099`, :cve:`2019-15117`, :cve:`2019-15118`, :cve:`2019-15211`, :cve:`2019-15212`, :cve:`2019-15213`, :cve:`2019-15214`, :cve:`2019-15215`, :cve:`2019-15216`, :cve:`2019-15217`, :cve:`2019-15218`, :cve:`2019-15219`, :cve:`2019-15220`, :cve:`2019-15221`, :cve:`2019-15222`, :cve:`2019-15223`, :cve:`2019-15291`, :cve:`2019-15292`, :cve:`2019-15504`, :cve:`2019-15505`, :cve:`2019-15538`, :cve:`2019-15666`, :cve:`2019-15807`, :cve:`2019-15916`, :cve:`2019-15917`, :cve:`2019-15918`, :cve:`2019-15919`, :cve:`2019-15920`, :cve:`2019-15921`, :cve:`2019-15922`, :cve:`2019-15923`, :cve:`2019-15924`, :cve:`2019-15925`, :cve:`2019-15926`, :cve:`2019-15927`, :cve:`2019-16229`, :cve:`2019-16230`, :cve:`2019-16231`, :cve:`2019-16232`, :cve:`2019-16233`, :cve:`2019-16234`, :cve:`2019-16413`, :cve:`2019-16714`, :cve:`2019-16746`, :cve:`2019-16921`, :cve:`2019-16994`, :cve:`2019-16995`, :cve:`2019-17052`, :cve:`2019-17053`, :cve:`2019-17054`, :cve:`2019-17055`, :cve:`2019-17056`, :cve:`2019-17075`, :cve:`2019-17133`, :cve:`2019-17351`, :cve:`2019-17666`, :cve:`2019-18198`, :cve:`2019-18282`, :cve:`2019-18660`, :cve:`2019-18675`, :cve:`2019-18683`, :cve:`2019-18786`, :cve:`2019-18805`, :cve:`2019-18806`, :cve:`2019-18807`, :cve:`2019-18808`, :cve:`2019-18809`, :cve:`2019-18810`, :cve:`2019-18811`, :cve:`2019-18812`, :cve:`2019-18813`, :cve:`2019-18814`, :cve:`2019-18885`, :cve:`2019-19036`, :cve:`2019-19037`, :cve:`2019-19039`, :cve:`2019-19043`, :cve:`2019-19044`, :cve:`2019-19045`, :cve:`2019-19046`, :cve:`2019-19047`, :cve:`2019-19048`, :cve:`2019-19049`, :cve:`2019-19050`, :cve:`2019-19051`, :cve:`2019-19052`, :cve:`2019-19053`, :cve:`2019-19054`, :cve:`2019-19055`, :cve:`2019-19056`, :cve:`2019-19057`, :cve:`2019-19058`, :cve:`2019-19059`, :cve:`2019-19060`, :cve:`2019-19061`, :cve:`2019-19062`, :cve:`2019-19063`, :cve:`2019-19064`, :cve:`2019-19065`, :cve:`2019-19066`, :cve:`2019-19067`, :cve:`2019-19068`, :cve:`2019-19069`, :cve:`2019-19070`, :cve:`2019-19071`, :cve:`2019-19072`, :cve:`2019-19073`, :cve:`2019-19074`, :cve:`2019-19075`, :cve:`2019-19076`, :cve:`2019-19077`, :cve:`2019-19078`, :cve:`2019-19079`, :cve:`2019-19080`, :cve:`2019-19081`, :cve:`2019-19082`, :cve:`2019-19083`, :cve:`2019-19227`, :cve:`2019-19241`, :cve:`2019-19252`, :cve:`2019-19318`, :cve:`2019-19319`, :cve:`2019-19332`, :cve:`2019-19338`, :cve:`2019-19377`, :cve:`2019-19447`, :cve:`2019-19448`, :cve:`2019-19449`, :cve:`2019-19462`, :cve:`2019-19523`, :cve:`2019-19524`, :cve:`2019-19525`, :cve:`2019-19526`, :cve:`2019-19527`, :cve:`2019-19528`, :cve:`2019-19529`, :cve:`2019-19530`, :cve:`2019-19531`, :cve:`2019-19532`, :cve:`2019-19533`, :cve:`2019-19534`, :cve:`2019-19535`, :cve:`2019-19536`, :cve:`2019-19537`, :cve:`2019-19543`, :cve:`2019-19602`, :cve:`2019-19767`, :cve:`2019-19768`, :cve:`2019-19769`, :cve:`2019-19770`, :cve:`2019-19807`, :cve:`2019-19813`, :cve:`2019-19815`, :cve:`2019-19816`, :cve:`2019-19922`, :cve:`2019-19927`, :cve:`2019-19947`, :cve:`2019-19965`, :cve:`2019-19966`, :cve:`2019-1999`, :cve:`2019-20054`, :cve:`2019-20095`, :cve:`2019-20096`, :cve:`2019-2024`, :cve:`2019-2025`, :cve:`2019-20422`, :cve:`2019-2054`, :cve:`2019-20636`, :cve:`2019-20806`, :cve:`2019-20810`, :cve:`2019-20811`, :cve:`2019-20812`, :cve:`2019-20908`, :cve:`2019-20934`, :cve:`2019-2101`, :cve:`2019-2181`, :cve:`2019-2182`, :cve:`2019-2213`, :cve:`2019-2214`, :cve:`2019-2215`, :cve:`2019-25044`, :cve:`2019-25045`, :cve:`2019-3016`, :cve:`2019-3459`, :cve:`2019-3460`, :cve:`2019-3701`, :cve:`2019-3819`, :cve:`2019-3837`, :cve:`2019-3846`, :cve:`2019-3874`, :cve:`2019-3882`, :cve:`2019-3887`, :cve:`2019-3892`, :cve:`2019-3896`, :cve:`2019-3900`, :cve:`2019-3901`, :cve:`2019-5108`, :cve:`2019-6133`, :cve:`2019-6974`, :cve:`2019-7221`, :cve:`2019-7222`, :cve:`2019-7308`, :cve:`2019-8912`, :cve:`2019-8956`, :cve:`2019-8980`, :cve:`2019-9003`, :cve:`2019-9162`, :cve:`2019-9213`, :cve:`2019-9245`, :cve:`2019-9444`, :cve:`2019-9445`, :cve:`2019-9453`, :cve:`2019-9454`, :cve:`2019-9455`, :cve:`2019-9456`, :cve:`2019-9457`, :cve:`2019-9458`, :cve:`2019-9466`, :cve:`2019-9500`, :cve:`2019-9503`, :cve:`2019-9506`, :cve:`2019-9857`, :cve:`2020-0009`, :cve:`2020-0030`, :cve:`2020-0041`, :cve:`2020-0066`, :cve:`2020-0067`, :cve:`2020-0110`, :cve:`2020-0255`, :cve:`2020-0305`, :cve:`2020-0404`, :cve:`2020-0423`, :cve:`2020-0427`, :cve:`2020-0429`, :cve:`2020-0430`, :cve:`2020-0431`, :cve:`2020-0432`, :cve:`2020-0433`, :cve:`2020-0435`, :cve:`2020-0444`, :cve:`2020-0465`, :cve:`2020-0466`, :cve:`2020-0543`, :cve:`2020-10135`, :cve:`2020-10690`, :cve:`2020-10711`, :cve:`2020-10720`, :cve:`2020-10732`, :cve:`2020-10742`, :cve:`2020-10751`, :cve:`2020-10757`, :cve:`2020-10766`, :cve:`2020-10767`, :cve:`2020-10768`, :cve:`2020-10769`, :cve:`2020-10773`, :cve:`2020-10781`, :cve:`2020-10942`, :cve:`2020-11494`, :cve:`2020-11565`, :cve:`2020-11608`, :cve:`2020-11609`, :cve:`2020-11668`, :cve:`2020-11669`, :cve:`2020-11884`, :cve:`2020-12114`, :cve:`2020-12351`, :cve:`2020-12352`, :cve:`2020-12464`, :cve:`2020-12465`, :cve:`2020-12652`, :cve:`2020-12653`, :cve:`2020-12654`, :cve:`2020-12655`, :cve:`2020-12656`, :cve:`2020-12657`, :cve:`2020-12659`, :cve:`2020-12768`, :cve:`2020-12769`, :cve:`2020-12770`, :cve:`2020-12771`, :cve:`2020-12826`, :cve:`2020-12888`, :cve:`2020-12912`, :cve:`2020-13143`, :cve:`2020-13974`, :cve:`2020-14305`, :cve:`2020-14314`, :cve:`2020-14331`, :cve:`2020-14351`, :cve:`2020-14353`, :cve:`2020-14356`, :cve:`2020-14381`, :cve:`2020-14385`, :cve:`2020-14386`, :cve:`2020-14390`, :cve:`2020-14416`, :cve:`2020-15393`, :cve:`2020-15436`, :cve:`2020-15437`, :cve:`2020-15780`, :cve:`2020-15852`, :cve:`2020-16119`, :cve:`2020-16120`, :cve:`2020-16166`, :cve:`2020-1749`, :cve:`2020-24394`, :cve:`2020-24490`, :cve:`2020-24586`, :cve:`2020-24587`, :cve:`2020-24588`, :cve:`2020-25211`, :cve:`2020-25212`, :cve:`2020-25221`, :cve:`2020-25284`, :cve:`2020-25285`, :cve:`2020-25639`, :cve:`2020-25641`, :cve:`2020-25643`, :cve:`2020-25645`, :cve:`2020-25656`, :cve:`2020-25668`, :cve:`2020-25669`, :cve:`2020-25670`, :cve:`2020-25671`, :cve:`2020-25672`, :cve:`2020-25673`, :cve:`2020-25704`, :cve:`2020-25705`, :cve:`2020-26088`, :cve:`2020-26139`, :cve:`2020-26141`, :cve:`2020-26145`, :cve:`2020-26147`, :cve:`2020-26541`, :cve:`2020-26555`, :cve:`2020-26558`, :cve:`2020-27066`, :cve:`2020-27067`, :cve:`2020-27068`, :cve:`2020-27152`, :cve:`2020-27170`, :cve:`2020-27171`, :cve:`2020-27194`, :cve:`2020-2732`, :cve:`2020-27418`, :cve:`2020-27673`, :cve:`2020-27675`, :cve:`2020-27777`, :cve:`2020-27784`, :cve:`2020-27786`, :cve:`2020-27815`, :cve:`2020-27820`, :cve:`2020-27825`, :cve:`2020-27830`, :cve:`2020-27835`, :cve:`2020-28097`, :cve:`2020-28374`, :cve:`2020-28588`, :cve:`2020-28915`, :cve:`2020-28941`, :cve:`2020-28974`, :cve:`2020-29368`, :cve:`2020-29369`, :cve:`2020-29370`, :cve:`2020-29371`, :cve:`2020-29372`, :cve:`2020-29373`, :cve:`2020-29374`, :cve:`2020-29534`, :cve:`2020-29568`, :cve:`2020-29569`, :cve:`2020-29660`, :cve:`2020-29661`, :cve:`2020-35499`, :cve:`2020-35508`, :cve:`2020-35513`, :cve:`2020-35519`, :cve:`2020-36158`, :cve:`2020-36310`, :cve:`2020-36311`, :cve:`2020-36312`, :cve:`2020-36313`, :cve:`2020-36322`, :cve:`2020-36385`, :cve:`2020-36386`, :cve:`2020-36387`, :cve:`2020-36516`, :cve:`2020-36557`, :cve:`2020-36558`, :cve:`2020-36691`, :cve:`2020-36694`, :cve:`2020-36766`, :cve:`2020-3702`, :cve:`2020-4788`, :cve:`2020-7053`, :cve:`2020-8428`, :cve:`2020-8647`, :cve:`2020-8648`, :cve:`2020-8649`, :cve:`2020-8694`, :cve:`2020-8834`, :cve:`2020-8835`, :cve:`2020-8992`, :cve:`2020-9383`, :cve:`2020-9391`, :cve:`2021-0129`, :cve:`2021-0342`, :cve_mitre:`2021-0447`, :cve_mitre:`2021-0448`, :cve:`2021-0512`, :cve:`2021-0605`, :cve:`2021-0707`, :cve:`2021-0920`, :cve:`2021-0929`, :cve:`2021-0935`, :cve_mitre:`2021-0937`, :cve:`2021-0938`, :cve:`2021-0941`, :cve:`2021-1048`, :cve:`2021-20177`, :cve:`2021-20194`, :cve:`2021-20226`, :cve:`2021-20239`, :cve:`2021-20261`, :cve:`2021-20265`, :cve:`2021-20268`, :cve:`2021-20292`, :cve:`2021-20317`, :cve:`2021-20320`, :cve:`2021-20321`, :cve:`2021-20322`, :cve:`2021-21781`, :cve:`2021-22543`, :cve:`2021-22555`, :cve:`2021-22600`, :cve:`2021-23133`, :cve:`2021-23134`, :cve:`2021-26401`, :cve:`2021-26708`, :cve:`2021-26930`, :cve:`2021-26931`, :cve:`2021-26932`, :cve:`2021-27363`, :cve:`2021-27364`, :cve:`2021-27365`, :cve:`2021-28038`, :cve:`2021-28039`, :cve:`2021-28375`, :cve:`2021-28660`, :cve:`2021-28688`, :cve:`2021-28691`, :cve:`2021-28711`, :cve:`2021-28712`, :cve:`2021-28713`, :cve:`2021-28714`, :cve:`2021-28715`, :cve:`2021-28950`, :cve:`2021-28951`, :cve:`2021-28952`, :cve:`2021-28964`, :cve:`2021-28971`, :cve:`2021-28972`, :cve:`2021-29154`, :cve:`2021-29155`, :cve:`2021-29264`, :cve:`2021-29265`, :cve:`2021-29266`, :cve:`2021-29646`, :cve:`2021-29647`, :cve:`2021-29648`, :cve:`2021-29649`, :cve:`2021-29650`, :cve:`2021-29657`, :cve:`2021-30002`, :cve:`2021-30178`, :cve:`2021-31440`, :cve:`2021-3178`, :cve:`2021-31829`, :cve:`2021-31916`, :cve:`2021-32399`, :cve:`2021-32606`, :cve:`2021-33033`, :cve:`2021-33034`, :cve:`2021-33098`, :cve:`2021-33135`, :cve:`2021-33200`, :cve:`2021-3347`, :cve:`2021-3348`, :cve:`2021-33624`, :cve:`2021-33655`, :cve:`2021-33656`, :cve:`2021-33909`, :cve:`2021-3411`, :cve:`2021-3428`, :cve:`2021-3444`, :cve:`2021-34556`, :cve:`2021-34693`, :cve:`2021-3483`, :cve:`2021-34866`, :cve:`2021-3489`, :cve:`2021-3490`, :cve:`2021-3491`, :cve_mitre:`2021-34981`, :cve:`2021-3501`, :cve:`2021-35039`, :cve:`2021-3506`, :cve:`2021-3543`, :cve:`2021-35477`, :cve:`2021-3564`, :cve:`2021-3573`, :cve:`2021-3587`, :cve_mitre:`2021-3600`, :cve:`2021-3609`, :cve:`2021-3612`, :cve:`2021-3635`, :cve:`2021-3640`, :cve:`2021-3653`, :cve:`2021-3655`, :cve:`2021-3656`, :cve:`2021-3659`, :cve:`2021-3679`, :cve:`2021-3715`, :cve:`2021-37159`, :cve:`2021-3732`, :cve:`2021-3736`, :cve:`2021-3739`, :cve:`2021-3743`, :cve:`2021-3744`, :cve:`2021-3752`, :cve:`2021-3753`, :cve:`2021-37576`, :cve:`2021-3759`, :cve:`2021-3760`, :cve:`2021-3764`, :cve:`2021-3772`, :cve:`2021-38160`, :cve:`2021-38166`, :cve:`2021-38198`, :cve:`2021-38199`, :cve:`2021-38200`, :cve:`2021-38201`, :cve:`2021-38202`, :cve:`2021-38203`, :cve:`2021-38204`, :cve:`2021-38205`, :cve:`2021-38206`, :cve:`2021-38207`, :cve:`2021-38208`, :cve:`2021-38209`, :cve:`2021-38300`, :cve:`2021-3894`, :cve:`2021-3896`, :cve:`2021-3923`, :cve:`2021-39633`, :cve:`2021-39634`, :cve:`2021-39636`, :cve:`2021-39648`, :cve:`2021-39656`, :cve:`2021-39657`, :cve:`2021-39685`, :cve:`2021-39686`, :cve:`2021-39698`, :cve:`2021-39711`, :cve:`2021-39713`, :cve:`2021-39714`, :cve:`2021-4001`, :cve:`2021-4002`, :cve:`2021-4028`, :cve:`2021-4032`, :cve:`2021-4037`, :cve:`2021-40490`, :cve:`2021-4083`, :cve:`2021-4090`, :cve:`2021-4093`, :cve:`2021-4095`, :cve:`2021-41073`, :cve:`2021-4135`, :cve:`2021-4148`, :cve:`2021-4149`, :cve:`2021-4154`, :cve:`2021-4155`, :cve:`2021-4157`, :cve:`2021-4159`, :cve:`2021-41864`, :cve:`2021-4197`, :cve:`2021-42008`, :cve:`2021-4202`, :cve:`2021-4203`, :cve:`2021-4218`, :cve:`2021-42252`, :cve:`2021-42327`, :cve:`2021-42739`, :cve:`2021-43056`, :cve:`2021-43057`, :cve:`2021-43267`, :cve:`2021-43389`, :cve:`2021-43975`, :cve:`2021-43976`, :cve:`2021-44733`, :cve:`2021-45095`, :cve:`2021-45100`, :cve:`2021-45402`, :cve:`2021-45469`, :cve:`2021-45480`, :cve:`2021-45485`, :cve:`2021-45486`, :cve:`2021-45868`, :cve:`2021-46283`, :cve:`2022-0001`, :cve:`2022-0002`, :cve:`2022-0168`, :cve:`2022-0171`, :cve:`2022-0185`, :cve:`2022-0264`, :cve:`2022-0286`, :cve:`2022-0322`, :cve:`2022-0330`, :cve:`2022-0433`, :cve:`2022-0435`, :cve:`2022-0487`, :cve:`2022-0492`, :cve:`2022-0494`, :cve:`2022-0516`, :cve:`2022-0617`, :cve:`2022-0644`, :cve:`2022-0646`, :cve:`2022-0742`, :cve:`2022-0812`, :cve:`2022-0847`, :cve:`2022-0850`, :cve:`2022-0854`, :cve:`2022-0995`, :cve:`2022-1011`, :cve:`2022-1012`, :cve:`2022-1015`, :cve:`2022-1016`, :cve:`2022-1043`, :cve:`2022-1048`, :cve:`2022-1055`, :cve:`2022-1158`, :cve:`2022-1184`, :cve:`2022-1195`, :cve:`2022-1198`, :cve:`2022-1199`, :cve:`2022-1204`, :cve:`2022-1205`, :cve:`2022-1353`, :cve:`2022-1419`, :cve:`2022-1462`, :cve:`2022-1516`, :cve:`2022-1651`, :cve:`2022-1652`, :cve:`2022-1671`, :cve:`2022-1678`, :cve:`2022-1679`, :cve:`2022-1729`, :cve:`2022-1734`, :cve:`2022-1786`, :cve:`2022-1789`, :cve:`2022-1836`, :cve:`2022-1852`, :cve:`2022-1882`, :cve:`2022-1943`, :cve:`2022-1966`, :cve:`2022-1972`, :cve:`2022-1973`, :cve:`2022-1974`, :cve:`2022-1975`, :cve:`2022-1976`, :cve:`2022-1998`, :cve:`2022-20008`, :cve:`2022-20132`, :cve:`2022-20141`, :cve:`2022-20153`, :cve:`2022-20154`, :cve:`2022-20158`, :cve:`2022-20166`, :cve:`2022-20368`, :cve:`2022-20369`, :cve:`2022-20421`, :cve:`2022-20422`, :cve:`2022-20423`, :cve_mitre:`2022-20565`, :cve:`2022-20566`, :cve:`2022-20567`, :cve:`2022-20572`, :cve:`2022-2078`, :cve:`2022-21123`, :cve:`2022-21125`, :cve:`2022-21166`, :cve:`2022-21385`, :cve:`2022-21499`, :cve_mitre:`2022-21505`, :cve:`2022-2153`, :cve:`2022-2196`, :cve_mitre:`2022-22942`, :cve:`2022-23036`, :cve:`2022-23037`, :cve:`2022-23038`, :cve:`2022-23039`, :cve:`2022-23040`, :cve:`2022-23041`, :cve:`2022-23042`, :cve:`2022-2308`, :cve:`2022-2318`, :cve:`2022-2380`, :cve:`2022-23816`, :cve:`2022-23960`, :cve:`2022-24122`, :cve:`2022-24448`, :cve:`2022-24958`, :cve:`2022-24959`, :cve:`2022-2503`, :cve:`2022-25258`, :cve:`2022-25375`, :cve:`2022-25636`, :cve_mitre:`2022-2585`, :cve_mitre:`2022-2586`, :cve_mitre:`2022-2588`, :cve:`2022-2590`, :cve_mitre:`2022-2602`, :cve:`2022-26365`, :cve:`2022-26373`, :cve:`2022-2639`, :cve:`2022-26490`, :cve:`2022-2663`, :cve:`2022-26966`, :cve:`2022-27223`, :cve:`2022-27666`, :cve:`2022-2785`, :cve:`2022-27950`, :cve:`2022-28356`, :cve:`2022-28388`, :cve:`2022-28389`, :cve:`2022-28390`, :cve:`2022-2873`, :cve:`2022-28796`, :cve:`2022-28893`, :cve:`2022-2905`, :cve:`2022-29156`, :cve:`2022-2938`, :cve:`2022-29581`, :cve:`2022-29582`, :cve:`2022-2959`, :cve:`2022-2964`, :cve:`2022-2977`, :cve:`2022-2978`, :cve:`2022-29900`, :cve:`2022-29901`, :cve:`2022-29968`, :cve:`2022-3028`, :cve:`2022-30594`, :cve:`2022-3061`, :cve:`2022-3077`, :cve:`2022-3078`, :cve:`2022-3103`, :cve:`2022-3104`, :cve:`2022-3105`, :cve:`2022-3106`, :cve:`2022-3107`, :cve:`2022-3110`, :cve:`2022-3111`, :cve:`2022-3112`, :cve:`2022-3113`, :cve:`2022-3114`, :cve:`2022-3115`, :cve:`2022-3169`, :cve:`2022-3170`, :cve:`2022-3202`, :cve:`2022-32250`, :cve:`2022-32296`, :cve:`2022-3239`, :cve:`2022-32981`, :cve:`2022-3303`, :cve:`2022-33740`, :cve:`2022-33741`, :cve:`2022-33742`, :cve:`2022-33743`, :cve:`2022-33744`, :cve:`2022-33981`, :cve:`2022-3424`, :cve:`2022-3435`, :cve:`2022-34494`, :cve:`2022-34495`, :cve:`2022-34918`, :cve:`2022-3521`, :cve:`2022-3524`, :cve:`2022-3526`, :cve:`2022-3531`, :cve:`2022-3532`, :cve:`2022-3534`, :cve:`2022-3535`, :cve:`2022-3541`, :cve:`2022-3542`, :cve:`2022-3543`, :cve:`2022-3545`, :cve:`2022-3564`, :cve:`2022-3565`, :cve:`2022-3577`, :cve:`2022-3586`, :cve:`2022-3594`, :cve:`2022-36123`, :cve:`2022-3619`, :cve:`2022-3621`, :cve:`2022-3623`, :cve:`2022-3625`, :cve:`2022-3628`, :cve:`2022-36280`, :cve:`2022-3629`, :cve:`2022-3630`, :cve:`2022-3633`, :cve:`2022-3635`, :cve:`2022-3640`, :cve:`2022-3643`, :cve:`2022-3646`, :cve:`2022-3649`, :cve:`2022-36879`, :cve:`2022-36946`, :cve:`2022-3707`, :cve:`2022-3910`, :cve:`2022-39189`, :cve:`2022-39190`, :cve:`2022-3977`, :cve:`2022-39842`, :cve:`2022-40307`, :cve:`2022-40476`, :cve:`2022-40768`, :cve:`2022-4095`, :cve:`2022-40982`, :cve:`2022-41218`, :cve:`2022-41222`, :cve:`2022-4127`, :cve:`2022-4128`, :cve:`2022-4129`, :cve:`2022-4139`, :cve:`2022-41674`, :cve:`2022-41849`, :cve:`2022-41850`, :cve:`2022-41858`, :cve:`2022-42328`, :cve:`2022-42329`, :cve:`2022-42432`, :cve:`2022-4269`, :cve:`2022-42703`, :cve:`2022-42719`, :cve:`2022-42720`, :cve:`2022-42721`, :cve:`2022-42722`, :cve:`2022-42895`, :cve:`2022-42896`, :cve:`2022-43750`, :cve:`2022-4378`, :cve:`2022-4379`, :cve:`2022-4382`, :cve:`2022-43945`, :cve:`2022-45869`, :cve:`2022-45886`, :cve:`2022-45887`, :cve:`2022-45888`, :cve:`2022-45919`, :cve:`2022-45934`, :cve:`2022-4662`, :cve:`2022-4744`, :cve:`2022-47518`, :cve:`2022-47519`, :cve:`2022-47520`, :cve:`2022-47521`, :cve:`2022-47929`, :cve:`2022-47938`, :cve:`2022-47939`, :cve:`2022-47940`, :cve:`2022-47941`, :cve:`2022-47942`, :cve:`2022-47943`, :cve:`2022-4842`, :cve:`2022-48423`, :cve:`2022-48424`, :cve:`2022-48425`, :cve:`2022-48502`, :cve:`2023-0030`, :cve:`2023-0045`, :cve:`2023-0047`, :cve:`2023-0122`, :cve:`2023-0160`, :cve:`2023-0179`, :cve:`2023-0210`, :cve:`2023-0240`, :cve:`2023-0266`, :cve:`2023-0394`, :cve:`2023-0458`, :cve:`2023-0459`, :cve:`2023-0461`, :cve:`2023-0468`, :cve:`2023-0469`, :cve:`2023-0590`, :cve:`2023-0615`, :cve_mitre:`2023-1032`, :cve:`2023-1073`, :cve:`2023-1074`, :cve:`2023-1076`, :cve:`2023-1077`, :cve:`2023-1078`, :cve:`2023-1079`, :cve:`2023-1095`, :cve:`2023-1118`, :cve:`2023-1192`, :cve:`2023-1194`, :cve:`2023-1195`, :cve:`2023-1206`, :cve:`2023-1249`, :cve:`2023-1252`, :cve:`2023-1281`, :cve:`2023-1380`, :cve:`2023-1382`, :cve:`2023-1390`, :cve:`2023-1513`, :cve:`2023-1582`, :cve:`2023-1583`, :cve:`2023-1611`, :cve:`2023-1637`, :cve:`2023-1652`, :cve:`2023-1670`, :cve:`2023-1829`, :cve:`2023-1838`, :cve:`2023-1855`, :cve:`2023-1859`, :cve:`2023-1989`, :cve:`2023-1990`, :cve:`2023-1998`, :cve:`2023-2002`, :cve:`2023-2006`, :cve:`2023-2008`, :cve:`2023-2019`, :cve:`2023-20569`, :cve:`2023-20588`, :cve:`2023-20593`, :cve:`2023-20938`, :cve:`2023-21102`, :cve:`2023-21106`, :cve:`2023-2124`, :cve:`2023-21255`, :cve:`2023-21264`, :cve:`2023-2156`, :cve:`2023-2162`, :cve:`2023-2163`, :cve:`2023-2166`, :cve:`2023-2177`, :cve:`2023-2194`, :cve:`2023-2235`, :cve:`2023-2236`, :cve:`2023-2248`, :cve:`2023-2269`, :cve:`2023-22996`, :cve:`2023-22997`, :cve:`2023-22998`, :cve:`2023-22999`, :cve:`2023-23001`, :cve:`2023-23002`, :cve:`2023-23003`, :cve:`2023-23004`, :cve:`2023-23005`, :cve:`2023-23006`, :cve:`2023-23454`, :cve:`2023-23455`, :cve:`2023-23559`, :cve:`2023-2483`, :cve:`2023-25012`, :cve:`2023-2513`, :cve:`2023-25775`, :cve:`2023-2598`, :cve:`2023-26544`, :cve:`2023-26545`, :cve:`2023-26605`, :cve:`2023-26606`, :cve:`2023-26607`, :cve:`2023-28327`, :cve:`2023-28328`, :cve:`2023-28410`, :cve:`2023-28464`, :cve:`2023-28466`, :cve:`2023-2860`, :cve:`2023-28772`, :cve:`2023-28866`, :cve:`2023-2898`, :cve:`2023-2985`, :cve:`2023-3006`, :cve:`2023-30456`, :cve:`2023-30772`, :cve:`2023-3090`, :cve:`2023-3106`, :cve:`2023-3111`, :cve:`2023-3117`, :cve:`2023-31248`, :cve:`2023-3141`, :cve:`2023-31436`, :cve:`2023-3159`, :cve:`2023-3161`, :cve:`2023-3212`, :cve:`2023-3220`, :cve:`2023-32233`, :cve:`2023-32247`, :cve:`2023-32248`, :cve:`2023-32250`, :cve:`2023-32252`, :cve:`2023-32254`, :cve:`2023-32257`, :cve:`2023-32258`, :cve:`2023-32269`, :cve:`2023-3268`, :cve:`2023-3269`, :cve:`2023-3312`, :cve:`2023-3317`, :cve:`2023-33203`, :cve:`2023-33250`, :cve:`2023-33288`, :cve:`2023-3338`, :cve:`2023-3355`, :cve:`2023-3357`, :cve:`2023-3358`, :cve:`2023-3359`, :cve:`2023-3390`, :cve:`2023-33951`, :cve:`2023-33952`, :cve:`2023-34255`, :cve:`2023-34256`, :cve:`2023-34319`, :cve:`2023-3439`, :cve:`2023-35001`, :cve:`2023-3567`, :cve:`2023-35788`, :cve:`2023-35823`, :cve:`2023-35824`, :cve:`2023-35826`, :cve:`2023-35828`, :cve:`2023-35829`, :cve:`2023-3609`, :cve:`2023-3610`, :cve:`2023-3611`, :cve:`2023-37453`, :cve:`2023-3772`, :cve:`2023-3773`, :cve:`2023-3776`, :cve:`2023-3777`, :cve:`2023-3812`, :cve:`2023-38409`, :cve:`2023-38426`, :cve:`2023-38427`, :cve:`2023-38428`, :cve:`2023-38429`, :cve:`2023-38430`, :cve:`2023-38431`, :cve:`2023-38432`, :cve:`2023-3863`, :cve_mitre:`2023-3865`, :cve_mitre:`2023-3866`, :cve_mitre:`2023-3867`, :cve:`2023-39189`, :cve:`2023-39192`, :cve:`2023-39193`, :cve:`2023-39194`, :cve:`2023-4004`, :cve:`2023-4015`, :cve:`2023-40283`, :cve:`2023-4128`, :cve:`2023-4132`, :cve:`2023-4147`, :cve:`2023-4155`, :cve:`2023-4194`, :cve:`2023-4206`, :cve:`2023-4207`, :cve:`2023-4208`, :cve:`2023-4273`, :cve:`2023-42752`, :cve:`2023-42753`, :cve:`2023-42755`, :cve:`2023-42756`, :cve:`2023-4385`, :cve:`2023-4387`, :cve:`2023-4389`, :cve:`2023-4394`, :cve:`2023-44466`, :cve:`2023-4459`, :cve:`2023-4569`, :cve:`2023-45862`, :cve:`2023-45871`, :cve:`2023-4611`, :cve:`2023-4623`, :cve:`2023-4732`, :cve:`2023-4921` and :cve:`2023-5345`
+- linux-yocto/5.15: Ignore :cve:`2022-45886`, :cve:`2022-45887`, :cve:`2022-45919`, :cve:`2022-48502`, :cve:`2023-0160`, :cve:`2023-1206`, :cve:`2023-20593`, :cve:`2023-21264`, :cve:`2023-2898`, :cve:`2023-31248`, :cve:`2023-33250`, :cve:`2023-34319`, :cve:`2023-35001`, :cve:`2023-3611`, :cve:`2023-37453`, :cve:`2023-3773`, :cve:`2023-3776`, :cve:`2023-3777`, :cve:`2023-38432`, :cve:`2023-3863`, :cve_mitre:`2023-3865`, :cve_mitre:`2023-3866`, :cve:`2023-4004`, :cve:`2023-4015`, :cve:`2023-4132`, :cve:`2023-4147`, :cve:`2023-4194`, :cve:`2023-4385`, :cve:`2023-4387`, :cve:`2023-4389`, :cve:`2023-4394`, :cve:`2023-4459` and :cve:`2023-4611`
+- openssl: Fix :cve:`2023-4807` and :cve:`2023-5363`
+- python3-git: Fix :cve:`2023-40590` and :cve:`2023-41040`
+- python3-urllib3: Fix :cve:`2023-43804`
+- qemu: Ignore :cve:`2023-2680`
+- ruby: Fix :cve:`2023-36617`
+- shadow: Fix :cve_mitre:`2023-4641`
+- tiff: Fix :cve:`2023-3576` and :cve:`2023-40745`
+- vim: Fix :cve:`2023-5441` and :cve:`2023-5535`
+- webkitgtk: Fix :cve:`2023-32439`
+- xdg-utils: Fix :cve:`2022-4055`
+- xserver-xorg: ignore :cve:`2022-3553` (XQuartz-specific)
+- zlib: Fix :cve:`2023-45853`
+
+
+
+Fixes in Yocto-4.0.14
+~~~~~~~~~~~~~~~~~~~~~
+
+- SECURITY.md: Add file
+- apt: add missing <cstdint> for uint16_t
+- bind: update to 9.18.19
+- bitbake: SECURITY.md: add file
+- bitbake: bitbake-getvar: Add a quiet command line argument
+- bitbake: bitbake-worker/runqueue: Avoid unnecessary bytes object copies
+- brief-yoctoprojectqs: use new CDN mirror for sstate
+- bsp-guide: bsp.rst: replace reference to wiki
+- bsp-guide: bsp: skip Intel machines no longer supported in Poky
+- build-appliance-image: Update to kirkstone head revision
+- ccache: fix build with gcc-13
+- cml1: Fix KCONFIG_CONFIG_COMMAND not conveyed fully in do_menuconfig
+- contributor-guide/style-guide: Add a note about task idempotence
+- contributor-guide/style-guide: Refer to recipes, not packages
+- contributor-guide: deprecate "Accepted" patch status
+- contributor-guide: discourage marking patches as Inappropriate
+- contributor-guide: recipe-style-guide: add more patch tagging examples
+- contributor-guide: recipe-style-guide: add section about CVE patches
+- contributor-guide: style-guide: discourage using Pending patch status
+- dev-manual: add security team processes
+- dev-manual: fix testimage usage instructions
+- dev-manual: layers: Add notes about layer.conf
+- dev-manual: new-recipe.rst: add missing parenthesis to "Patching Code" section
+- dev-manual: new-recipe.rst: replace reference to wiki
+- dev-manual: start.rst: remove obsolete reference
+- dev-manual: wic: update "wic list images" output
+- dev/ref-manual: Document :term:`INIT_MANAGER`
+- fontcache.bbclass: avoid native recipes depending on target fontconfig
+- glibc: Update to latest on stable 2.35 branch (c84018a05aec..)
+- json-c: define :term:`CVE_VERSION`
+- kernel.bbclass: Add force flag to rm calls
+- libxpm: upgrade to 3.5.17
+- linux-firmware: create separate packages
+- linux-firmware: upgrade to 20230804
+- linux-yocto/5.10: update to v5.10.197
+- linux-yocto: update CVE exclusions
+- manuals: correct "yocto-linux" by "linux-yocto"
+- manuals: update linux-yocto append examples
+- migration-guides: add release notes for 4.0.13
+- openssl: Upgrade to 3.0.12
+- overview: Add note about non-reproducibility side effects
+- package_rpm: Allow compression mode override
+- poky.conf: bump version for 4.0.14
+- profile-manual: aesthetic cleanups
+- python3-git: upgrade to 3.1.37
+- python3-jinja2: fix for the ptest result format
+- python3-urllib3: upgrade to 1.26.17
+- ref-manual: Fix :term:`PACKAGECONFIG` term and add an example
+- ref-manual: Warn about :term:`COMPATIBLE_MACHINE` skipping native recipes
+- ref-manual: releases.svg: Scarthgap is now version 5.0
+- ref-manual: variables: add :term:`RECIPE_SYSROOT` and :term:`RECIPE_SYSROOT_NATIVE`
+- ref-manual: variables: add :term:`TOOLCHAIN_OPTIONS` variable
+- ref-manual: variables: add example for :term:`SYSROOT_DIRS` variable
+- ref-manual: variables: provide no-match example for :term:`COMPATIBLE_MACHINE`
+- sdk-manual: appendix-obtain: improve and update descriptions
+- test-manual: reproducible-builds: stop mentioning LTO bug
+- uboot-extlinux-config.bbclass: fix missed override syntax migration
+- vim: Upgrade to 9.0.2048
+
+
+Known Issues in Yocto-4.0.14
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- N/A
+
+
+Contributors to Yocto-4.0.14
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Alexander Kanavin
+- Archana Polampalli
+- Armin Kuster
+- Arne Schwerdt
+- BELHADJ SALEM Talel
+- Bruce Ashfield
+- Chaitanya Vadrevu
+- Colin McAllister
+- Deepthi Hemraj
+- Etienne Cordonnier
+- Fahad Arslan
+- Hitendra Prajapati
+- Jaeyoon Jung
+- Joshua Watt
+- Khem Raj
+- Lee Chee Yang
+- Marta Rybczynska
+- Martin Jansa
+- Meenali Gupta
+- Michael Opdenacker
+- Narpat Mali
+- Niko Mauno
+- Paul Eggleton
+- Paulo Neves
+- Peter Marko
+- Quentin Schulz
+- Richard Purdie
+- Robert P. J. Day
+- Roland Hieber
+- Ross Burton
+- Ryan Eatmon
+- Shubham Kulkarni
+- Siddharth Doshi
+- Soumya Sambu
+- Steve Sakoman
+- Tim Orling
+- Trevor Gamblin
+- Vijay Anusuri
+- Wang Mingyu
+- Yash Shinde
+- Yogita Urade
+
+
+Repositories / Downloads for Yocto-4.0.14
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+poky
+
+- Repository Location: :yocto_git:`/poky`
+- Branch: :yocto_git:`kirkstone </poky/log/?h=kirkstone>`
+- Tag: :yocto_git:`yocto-4.0.14 </poky/log/?h=yocto-4.0.14>`
+- Git Revision: :yocto_git:`d8d6d921fad14b82167d9f031d4fca06b5e01883 </poky/commit/?id=d8d6d921fad14b82167d9f031d4fca06b5e01883>`
+- Release Artefact: poky-d8d6d921fad14b82167d9f031d4fca06b5e01883
+- sha: 46a6301e3921ee67cfe6be7ea544d6257f0c0f02ef15c5091287e024ff02d5f5
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.0.14/poky-d8d6d921fad14b82167d9f031d4fca06b5e01883.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.0.14/poky-d8d6d921fad14b82167d9f031d4fca06b5e01883.tar.bz2
+
+openembedded-core
+
+- Repository Location: :oe_git:`/openembedded-core`
+- Branch: :oe_git:`kirkstone </openembedded-core/log/?h=kirkstone>`
+- Tag: :oe_git:`yocto-4.0.14 </openembedded-core/log/?h=yocto-4.0.14>`
+- Git Revision: :oe_git:`0eb8e67aa6833df0cde29833568a70e65c21d7e5 </openembedded-core/commit/?id=0eb8e67aa6833df0cde29833568a70e65c21d7e5>`
+- Release Artefact: oecore-0eb8e67aa6833df0cde29833568a70e65c21d7e5
+- sha: d510a7067b87ba935b8a7c9f9608d0e06b057009ea753ed190ddfacc7195ecc5
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.0.14/oecore-0eb8e67aa6833df0cde29833568a70e65c21d7e5.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.0.14/oecore-0eb8e67aa6833df0cde29833568a70e65c21d7e5.tar.bz2
+
+meta-mingw
+
+- Repository Location: :yocto_git:`/meta-mingw`
+- Branch: :yocto_git:`kirkstone </meta-mingw/log/?h=kirkstone>`
+- Tag: :yocto_git:`yocto-4.0.14 </meta-mingw/log/?h=yocto-4.0.14>`
+- Git Revision: :yocto_git:`f6b38ce3c90e1600d41c2ebb41e152936a0357d7 </meta-mingw/commit/?id=f6b38ce3c90e1600d41c2ebb41e152936a0357d7>`
+- Release Artefact: meta-mingw-f6b38ce3c90e1600d41c2ebb41e152936a0357d7
+- sha: 7d57167c19077f4ab95623d55a24c2267a3a3fb5ed83688659b4c03586373b25
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.0.14/meta-mingw-f6b38ce3c90e1600d41c2ebb41e152936a0357d7.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.0.14/meta-mingw-f6b38ce3c90e1600d41c2ebb41e152936a0357d7.tar.bz2
+
+meta-gplv2
+
+- Repository Location: :yocto_git:`/meta-gplv2`
+- Branch: :yocto_git:`kirkstone </meta-gplv2/log/?h=kirkstone>`
+- Tag: :yocto_git:`yocto-4.0.14 </meta-gplv2/log/?h=yocto-4.0.14>`
+- Git Revision: :yocto_git:`d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a </meta-gplv2/commit/?id=d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a>`
+- Release Artefact: meta-gplv2-d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a
+- sha: c386f59f8a672747dc3d0be1d4234b6039273d0e57933eb87caa20f56b9cca6d
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.0.14/meta-gplv2-d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.0.14/meta-gplv2-d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a.tar.bz2
+
+bitbake
+
+- Repository Location: :oe_git:`/bitbake`
+- Branch: :oe_git:`2.0 </bitbake/log/?h=2.0>`
+- Tag: :oe_git:`yocto-4.0.14 </bitbake/log/?h=yocto-4.0.14>`
+- Git Revision: :oe_git:`6c1ffa9091d0c53a100e8c8c15122d28642034bd </bitbake/commit/?id=6c1ffa9091d0c53a100e8c8c15122d28642034bd>`
+- Release Artefact: bitbake-6c1ffa9091d0c53a100e8c8c15122d28642034bd
+- sha: 1ceffc3b3359063341530c989a3606c897d862b61111538e683f101b02a360a2
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.0.14/bitbake-6c1ffa9091d0c53a100e8c8c15122d28642034bd.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.0.14/bitbake-6c1ffa9091d0c53a100e8c8c15122d28642034bd.tar.bz2
+
+yocto-docs
+
+- Repository Location: :yocto_git:`/yocto-docs`
+- Branch: :yocto_git:`kirkstone </yocto-docs/log/?h=kirkstone>`
+- Tag: :yocto_git:`yocto-4.0.14 </yocto-docs/log/?h=yocto-4.0.14>`
+- Git Revision: :yocto_git:`260b446a1a75d99399a3421cd8d6ba276f508f37 </yocto-docs/commit/?id=260b446a1a75d99399a3421cd8d6ba276f508f37>`
+
diff --git a/poky/documentation/migration-guides/release-notes-4.2.4.rst b/poky/documentation/migration-guides/release-notes-4.2.4.rst
new file mode 100644
index 0000000000..3c20140e29
--- /dev/null
+++ b/poky/documentation/migration-guides/release-notes-4.2.4.rst
@@ -0,0 +1,364 @@
+.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
+
+Release notes for Yocto-4.2.4 (Mickledore)
+------------------------------------------
+
+Security Fixes in Yocto-4.2.4
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- bind: Fix :cve:`2023-3341` and :cve:`2023-4236`
+- binutils: Fix :cve:`2023-39128`
+- cups: fix :cve:`2023-4504`
+- curl: Fix :cve:`2023-28320`, :cve:`2023-32001`, :cve:`2023-38039`, :cve:`2023-38545` and :cve:`2023-38546`
+- dmidecode: fix for :cve:`2023-30630`
+- dropbear: fix :cve:`2023-36328`
+- ffmpeg: Ignore :cve:`2023-39018`
+- gcc: Fix :cve:`2023-4039`
+- gdb: Fix :cve:`2023-39128`
+- ghostscript: Fix :cve:`2023-38559` and :cve:`2023-43115`
+- glibc: Fix :cve:`2023-4527` and :cve:`2023-4806`
+- go: Fix :cve:`2023-29409` and :cve:`2023-39533`
+- grub: Fix :cve:`2023-4692` and :cve:`2023-4693`
+- gstreamer: Fix :cve_mitre:`2023-40474`, :cve_mitre:`2023-40475` and :cve_mitre:`2023-40476`
+- inetutils: fix :cve:`2023-40303`
+- librsvg: Fix :cve:`2023-38633`
+- libssh2: Fix :cve:`2020-22218`
+- libwebp: Fix :cve:`2023-4863` and :cve:`2023-5129`
+- libx11: Fix :cve:`2023-43785`, :cve:`2023-43786` and :cve:`2023-43787`
+- libxpm: Fix :cve:`2023-43788` and :cve:`2023-43789`
+- linux-yocto/6.1: Ignore :cve:`2003-1604`, :cve:`2004-0230`, :cve:`2006-3635`, :cve:`2006-5331`, :cve:`2006-6128`, :cve:`2007-4774`, :cve:`2007-6761`, :cve:`2007-6762`, :cve:`2008-7316`, :cve:`2009-2692`, :cve:`2010-0008`, :cve:`2010-3432`, :cve:`2010-4648`, :cve:`2010-5313`, :cve:`2010-5328`, :cve:`2010-5329`, :cve:`2010-5331`, :cve:`2010-5332`, :cve:`2011-4098`, :cve:`2011-4131`, :cve:`2011-4915`, :cve:`2011-5321`, :cve:`2011-5327`, :cve:`2012-0957`, :cve:`2012-2119`, :cve:`2012-2136`, :cve:`2012-2137`, :cve:`2012-2313`, :cve:`2012-2319`, :cve:`2012-2372`, :cve:`2012-2375`, :cve:`2012-2390`, :cve:`2012-2669`, :cve:`2012-2744`, :cve:`2012-2745`, :cve:`2012-3364`, :cve:`2012-3375`, :cve:`2012-3400`, :cve:`2012-3412`, :cve:`2012-3430`, :cve:`2012-3510`, :cve:`2012-3511`, :cve:`2012-3520`, :cve:`2012-3552`, :cve:`2012-4398`, :cve:`2012-4444`, :cve:`2012-4461`, :cve:`2012-4467`, :cve:`2012-4508`, :cve:`2012-4530`, :cve:`2012-4565`, :cve:`2012-5374`, :cve:`2012-5375`, :cve:`2012-5517`, :cve:`2012-6536`, :cve:`2012-6537`, :cve:`2012-6538`, :cve:`2012-6539`, :cve:`2012-6540`, :cve:`2012-6541`, :cve:`2012-6542`, :cve:`2012-6543`, :cve:`2012-6544`, :cve:`2012-6545`, :cve:`2012-6546`, :cve:`2012-6547`, :cve:`2012-6548`, :cve:`2012-6549`, :cve:`2012-6638`, :cve:`2012-6647`, :cve:`2012-6657`, :cve:`2012-6689`, :cve:`2012-6701`, :cve:`2012-6703`, :cve:`2012-6704`, :cve:`2012-6712`, :cve:`2013-0160`, :cve:`2013-0190`, :cve:`2013-0216`, :cve:`2013-0217`, :cve:`2013-0228`, :cve:`2013-0231`, :cve:`2013-0268`, :cve:`2013-0290`, :cve:`2013-0309`, :cve:`2013-0310`, :cve:`2013-0311`, :cve:`2013-0313`, :cve:`2013-0343`, :cve:`2013-0349`, :cve:`2013-0871`, :cve:`2013-0913`, :cve:`2013-0914`, :cve:`2013-1059`, :cve:`2013-1763`, :cve:`2013-1767`, :cve:`2013-1772`, :cve:`2013-1773`, :cve:`2013-1774`, :cve:`2013-1792`, :cve:`2013-1796`, :cve:`2013-1797`, :cve:`2013-1798`, :cve:`2013-1819`, :cve:`2013-1826`, :cve:`2013-1827`, :cve:`2013-1828`, :cve:`2013-1848`, :cve:`2013-1858`, :cve:`2013-1860`, :cve:`2013-1928`, :cve:`2013-1929`, :cve:`2013-1943`, :cve:`2013-1956`, :cve:`2013-1957`, :cve:`2013-1958`, :cve:`2013-1959`, :cve:`2013-1979`, :cve:`2013-2015`, :cve:`2013-2017`, :cve:`2013-2058`, :cve:`2013-2094`, :cve:`2013-2128`, :cve:`2013-2140`, :cve:`2013-2141`, :cve:`2013-2146`, :cve:`2013-2147`, :cve:`2013-2148`, :cve:`2013-2164`, :cve:`2013-2206`, :cve:`2013-2232`, :cve:`2013-2234`, :cve:`2013-2237`, :cve:`2013-2546`, :cve:`2013-2547`, :cve:`2013-2548`, :cve:`2013-2596`, :cve:`2013-2634`, :cve:`2013-2635`, :cve:`2013-2636`, :cve:`2013-2850`, :cve:`2013-2851`, :cve:`2013-2852`, :cve:`2013-2888`, :cve:`2013-2889`, :cve:`2013-2890`, :cve:`2013-2891`, :cve:`2013-2892`, :cve:`2013-2893`, :cve:`2013-2894`, :cve:`2013-2895`, :cve:`2013-2896`, :cve:`2013-2897`, :cve:`2013-2898`, :cve:`2013-2899`, :cve:`2013-2929`, :cve:`2013-2930`, :cve:`2013-3076`, :cve:`2013-3222`, :cve:`2013-3223`, :cve:`2013-3224`, :cve:`2013-3225`, :cve:`2013-3226`, :cve:`2013-3227`, :cve:`2013-3228`, :cve:`2013-3229`, :cve:`2013-3230`, :cve:`2013-3231`, :cve:`2013-3232`, :cve:`2013-3233`, :cve:`2013-3234`, :cve:`2013-3235`, :cve:`2013-3236`, :cve:`2013-3237`, :cve:`2013-3301`, :cve:`2013-3302`, :cve:`2013-4125`, :cve:`2013-4127`, :cve:`2013-4129`, :cve:`2013-4162`, :cve:`2013-4163`, :cve:`2013-4205`, :cve:`2013-4220`, :cve:`2013-4247`, :cve:`2013-4254`, :cve:`2013-4270`, :cve:`2013-4299`, :cve:`2013-4300`, :cve:`2013-4312`, :cve:`2013-4343`, :cve:`2013-4345`, :cve:`2013-4348`, :cve:`2013-4350`, :cve:`2013-4387`, :cve:`2013-4470`, :cve:`2013-4483`, :cve:`2013-4511`, :cve:`2013-4512`, :cve:`2013-4513`, :cve:`2013-4514`, :cve:`2013-4515`, :cve:`2013-4516`, :cve:`2013-4563`, :cve:`2013-4579`, :cve:`2013-4587`, :cve:`2013-4588`, :cve:`2013-4591`, :cve:`2013-4592`, :cve:`2013-5634`, :cve:`2013-6282`, :cve:`2013-6367`, :cve:`2013-6368`, :cve:`2013-6376`, :cve:`2013-6378`, :cve:`2013-6380`, :cve:`2013-6381`, :cve:`2013-6382`, :cve:`2013-6383`, :cve:`2013-6431`, :cve:`2013-6432`, :cve:`2013-6885`, :cve:`2013-7026`, :cve:`2013-7027`, :cve:`2013-7263`, :cve:`2013-7264`, :cve:`2013-7265`, :cve:`2013-7266`, :cve:`2013-7267`, :cve:`2013-7268`, :cve:`2013-7269`, :cve:`2013-7270`, :cve:`2013-7271`, :cve:`2013-7281`, :cve:`2013-7339`, :cve:`2013-7348`, :cve:`2013-7421`, :cve:`2013-7446`, :cve:`2013-7470`, :cve:`2014-0038`, :cve:`2014-0049`, :cve:`2014-0055`, :cve:`2014-0069`, :cve:`2014-0077`, :cve:`2014-0100`, :cve:`2014-0101`, :cve:`2014-0102`, :cve:`2014-0131`, :cve:`2014-0155`, :cve:`2014-0181`, :cve:`2014-0196`, :cve:`2014-0203`, :cve:`2014-0205`, :cve:`2014-0206`, :cve:`2014-1438`, :cve:`2014-1444`, :cve:`2014-1445`, :cve:`2014-1446`, :cve:`2014-1690`, :cve:`2014-1737`, :cve:`2014-1738`, :cve:`2014-1739`, :cve:`2014-1874`, :cve:`2014-2038`, :cve:`2014-2039`, :cve:`2014-2309`, :cve:`2014-2523`, :cve:`2014-2568`, :cve:`2014-2580`, :cve:`2014-2672`, :cve:`2014-2673`, :cve:`2014-2678`, :cve:`2014-2706`, :cve:`2014-2739`, :cve:`2014-2851`, :cve:`2014-2889`, :cve:`2014-3122`, :cve:`2014-3144`, :cve:`2014-3145`, :cve:`2014-3153`, :cve:`2014-3180`, :cve:`2014-3181`, :cve:`2014-3182`, :cve:`2014-3183`, :cve:`2014-3184`, :cve:`2014-3185`, :cve:`2014-3186`, :cve:`2014-3534`, :cve:`2014-3535`, :cve:`2014-3601`, :cve:`2014-3610`, :cve:`2014-3611`, :cve:`2014-3631`, :cve:`2014-3645`, :cve:`2014-3646`, :cve:`2014-3647`, :cve:`2014-3673`, :cve:`2014-3687`, :cve:`2014-3688`, :cve:`2014-3690`, :cve:`2014-3917`, :cve:`2014-3940`, :cve:`2014-4014`, :cve:`2014-4027`, :cve:`2014-4157`, :cve:`2014-4171`, :cve:`2014-4508`, :cve:`2014-4608`, :cve:`2014-4611`, :cve:`2014-4652`, :cve:`2014-4653`, :cve:`2014-4654`, :cve:`2014-4655`, :cve:`2014-4656`, :cve:`2014-4667`, :cve:`2014-4699`, :cve:`2014-4943`, :cve:`2014-5045`, :cve:`2014-5077`, :cve:`2014-5206`, :cve:`2014-5207`, :cve:`2014-5471`, :cve:`2014-5472`, :cve:`2014-6410`, :cve:`2014-6416`, :cve:`2014-6417`, :cve:`2014-6418`, :cve:`2014-7145`, :cve:`2014-7283`, :cve:`2014-7284`, :cve:`2014-7822`, :cve:`2014-7825`, :cve:`2014-7826`, :cve:`2014-7841`, :cve:`2014-7842`, :cve:`2014-7843`, :cve:`2014-7970`, :cve:`2014-7975`, :cve:`2014-8086`, :cve:`2014-8133`, :cve:`2014-8134`, :cve:`2014-8159`, :cve:`2014-8160`, :cve:`2014-8171`, :cve:`2014-8172`, :cve:`2014-8173`, :cve:`2014-8369`, :cve:`2014-8480`, :cve:`2014-8481`, :cve:`2014-8559`, :cve:`2014-8709`, :cve:`2014-8884`, :cve:`2014-8989`, :cve:`2014-9090`, :cve:`2014-9322`, :cve:`2014-9419`, :cve:`2014-9420`, :cve:`2014-9428`, :cve:`2014-9529`, :cve:`2014-9584`, :cve:`2014-9585`, :cve:`2014-9644`, :cve:`2014-9683`, :cve:`2014-9710`, :cve:`2014-9715`, :cve:`2014-9717`, :cve:`2014-9728`, :cve:`2014-9729`, :cve:`2014-9730`, :cve:`2014-9731`, :cve:`2014-9803`, :cve:`2014-9870`, :cve:`2014-9888`, :cve:`2014-9895`, :cve:`2014-9903`, :cve:`2014-9904`, :cve:`2014-9914`, :cve:`2014-9922`, :cve:`2014-9940`, :cve:`2015-0239`, :cve:`2015-0274`, :cve:`2015-0275`, :cve:`2015-1333`, :cve:`2015-1339`, :cve:`2015-1350`, :cve:`2015-1420`, :cve:`2015-1421`, :cve:`2015-1465`, :cve:`2015-1573`, :cve:`2015-1593`, :cve:`2015-1805`, :cve:`2015-2041`, :cve:`2015-2042`, :cve:`2015-2150`, :cve:`2015-2666`, :cve:`2015-2672`, :cve:`2015-2686`, :cve:`2015-2830`, :cve:`2015-2922`, :cve:`2015-2925`, :cve:`2015-3212`, :cve:`2015-3214`, :cve:`2015-3288`, :cve:`2015-3290`, :cve:`2015-3291`, :cve:`2015-3331`, :cve:`2015-3339`, :cve:`2015-3636`, :cve:`2015-4001`, :cve:`2015-4002`, :cve:`2015-4003`, :cve:`2015-4004`, :cve:`2015-4036`, :cve:`2015-4167`, :cve:`2015-4170`, :cve:`2015-4176`, :cve:`2015-4177`, :cve:`2015-4178`, :cve:`2015-4692`, :cve:`2015-4700`, :cve:`2015-5156`, :cve:`2015-5157`, :cve:`2015-5257`, :cve:`2015-5283`, :cve:`2015-5307`, :cve:`2015-5327`, :cve:`2015-5364`, :cve:`2015-5366`, :cve:`2015-5697`, :cve:`2015-5706`, :cve:`2015-5707`, :cve:`2015-6252`, :cve:`2015-6526`, :cve:`2015-6937`, :cve:`2015-7509`, :cve:`2015-7513`, :cve:`2015-7515`, :cve:`2015-7550`, :cve:`2015-7566`, :cve:`2015-7613`, :cve:`2015-7799`, :cve:`2015-7833`, :cve:`2015-7872`, :cve:`2015-7884`, :cve:`2015-7885`, :cve:`2015-7990`, :cve:`2015-8104`, :cve:`2015-8215`, :cve:`2015-8324`, :cve:`2015-8374`, :cve:`2015-8539`, :cve:`2015-8543`, :cve:`2015-8550`, :cve:`2015-8551`, :cve:`2015-8552`, :cve:`2015-8553`, :cve:`2015-8569`, :cve:`2015-8575`, :cve:`2015-8660`, :cve:`2015-8709`, :cve:`2015-8746`, :cve:`2015-8767`, :cve:`2015-8785`, :cve:`2015-8787`, :cve:`2015-8812`, :cve:`2015-8816`, :cve:`2015-8830`, :cve:`2015-8839`, :cve:`2015-8844`, :cve:`2015-8845`, :cve:`2015-8950`, :cve:`2015-8952`, :cve:`2015-8953`, :cve:`2015-8955`, :cve:`2015-8956`, :cve:`2015-8961`, :cve:`2015-8962`, :cve:`2015-8963`, :cve:`2015-8964`, :cve:`2015-8966`, :cve:`2015-8967`, :cve:`2015-8970`, :cve:`2015-9004`, :cve:`2015-9016`, :cve:`2015-9289`, :cve:`2016-0617`, :cve:`2016-0723`, :cve:`2016-0728`, :cve:`2016-0758`, :cve:`2016-0821`, :cve:`2016-0823`, :cve:`2016-10044`, :cve:`2016-10088`, :cve:`2016-10147`, :cve:`2016-10150`, :cve:`2016-10153`, :cve:`2016-10154`, :cve:`2016-10200`, :cve:`2016-10208`, :cve:`2016-10229`, :cve:`2016-10318`, :cve:`2016-10723`, :cve:`2016-10741`, :cve:`2016-10764`, :cve:`2016-10905`, :cve:`2016-10906`, :cve:`2016-10907`, :cve:`2016-1237`, :cve:`2016-1575`, :cve:`2016-1576`, :cve:`2016-1583`, :cve:`2016-2053`, :cve:`2016-2069`, :cve:`2016-2070`, :cve:`2016-2085`, :cve:`2016-2117`, :cve:`2016-2143`, :cve:`2016-2184`, :cve:`2016-2185`, :cve:`2016-2186`, :cve:`2016-2187`, :cve:`2016-2188`, :cve:`2016-2383`, :cve:`2016-2384`, :cve:`2016-2543`, :cve:`2016-2544`, :cve:`2016-2545`, :cve:`2016-2546`, :cve:`2016-2547`, :cve:`2016-2548`, :cve:`2016-2549`, :cve:`2016-2550`, :cve:`2016-2782`, :cve:`2016-2847`, :cve:`2016-3044`, :cve:`2016-3070`, :cve:`2016-3134`, :cve:`2016-3135`, :cve:`2016-3136`, :cve:`2016-3137`, :cve:`2016-3138`, :cve:`2016-3139`, :cve:`2016-3140`, :cve:`2016-3156`, :cve:`2016-3157`, :cve:`2016-3672`, :cve:`2016-3689`, :cve:`2016-3713`, :cve:`2016-3841`, :cve:`2016-3857`, :cve:`2016-3951`, :cve:`2016-3955`, :cve:`2016-3961`, :cve:`2016-4440`, :cve:`2016-4470`, :cve:`2016-4482`, :cve:`2016-4485`, :cve:`2016-4486`, :cve:`2016-4557`, :cve:`2016-4558`, :cve:`2016-4565`, :cve:`2016-4568`, :cve:`2016-4569`, :cve:`2016-4578`, :cve:`2016-4580`, :cve:`2016-4581`, :cve:`2016-4794`, :cve:`2016-4805`, :cve:`2016-4913`, :cve:`2016-4951`, :cve:`2016-4997`, :cve:`2016-4998`, :cve:`2016-5195`, :cve:`2016-5243`, :cve:`2016-5244`, :cve:`2016-5400`, :cve:`2016-5412`, :cve:`2016-5696`, :cve:`2016-5728`, :cve:`2016-5828`, :cve:`2016-5829`, :cve:`2016-6130`, :cve:`2016-6136`, :cve:`2016-6156`, :cve:`2016-6162`, :cve:`2016-6187`, :cve:`2016-6197`, :cve:`2016-6198`, :cve:`2016-6213`, :cve:`2016-6327`, :cve:`2016-6480`, :cve:`2016-6516`, :cve:`2016-6786`, :cve:`2016-6787`, :cve:`2016-6828`, :cve:`2016-7039`, :cve:`2016-7042`, :cve:`2016-7097`, :cve:`2016-7117`, :cve:`2016-7425`, :cve:`2016-7910`, :cve:`2016-7911`, :cve:`2016-7912`, :cve:`2016-7913`, :cve:`2016-7914`, :cve:`2016-7915`, :cve:`2016-7916`, :cve:`2016-7917`, :cve:`2016-8399`, :cve:`2016-8405`, :cve:`2016-8630`, :cve:`2016-8632`, :cve:`2016-8633`, :cve:`2016-8636`, :cve:`2016-8645`, :cve:`2016-8646`, :cve:`2016-8650`, :cve:`2016-8655`, :cve:`2016-8658`, :cve:`2016-8666`, :cve:`2016-9083`, :cve:`2016-9084`, :cve:`2016-9120`, :cve:`2016-9178`, :cve:`2016-9191`, :cve:`2016-9313`, :cve:`2016-9555`, :cve:`2016-9576`, :cve:`2016-9588`, :cve:`2016-9604`, :cve:`2016-9685`, :cve:`2016-9754`, :cve:`2016-9755`, :cve:`2016-9756`, :cve:`2016-9777`, :cve:`2016-9793`, :cve:`2016-9794`, :cve:`2016-9806`, :cve:`2016-9919`, :cve:`2017-0605`, :cve:`2017-0627`, :cve:`2017-0750`, :cve:`2017-0786`, :cve:`2017-0861`, :cve:`2017-1000`, :cve:`2017-1000111`, :cve:`2017-1000112`, :cve:`2017-1000251`, :cve:`2017-1000252`, :cve:`2017-1000253`, :cve:`2017-1000255`, :cve:`2017-1000363`, :cve:`2017-1000364`, :cve:`2017-1000365`, :cve:`2017-1000370`, :cve:`2017-1000371`, :cve:`2017-1000379`, :cve:`2017-1000380`, :cve:`2017-1000405`, :cve:`2017-1000407`, :cve:`2017-1000410`, :cve:`2017-10661`, :cve:`2017-10662`, :cve:`2017-10663`, :cve:`2017-10810`, :cve:`2017-10911`, :cve:`2017-11089`, :cve:`2017-11176`, :cve:`2017-11472`, :cve:`2017-11473`, :cve:`2017-11600`, :cve:`2017-12134`, :cve:`2017-12146`, :cve:`2017-12153`, :cve:`2017-12154`, :cve:`2017-12168`, :cve:`2017-12188`, :cve:`2017-12190`, :cve:`2017-12192`, :cve:`2017-12193`, :cve:`2017-12762`, :cve:`2017-13080`, :cve:`2017-13166`, :cve:`2017-13167`, :cve:`2017-13168`, :cve:`2017-13215`, :cve:`2017-13216`, :cve:`2017-13220`, :cve:`2017-13305`, :cve:`2017-13686`, :cve:`2017-13695`, :cve:`2017-13715`, :cve:`2017-14051`, :cve:`2017-14106`, :cve:`2017-14140`, :cve:`2017-14156`, :cve:`2017-14340`, :cve:`2017-14489`, :cve:`2017-14497`, :cve:`2017-14954`, :cve:`2017-14991`, :cve:`2017-15102`, :cve:`2017-15115`, :cve:`2017-15116`, :cve:`2017-15121`, :cve:`2017-15126`, :cve:`2017-15127`, :cve:`2017-15128`, :cve:`2017-15129`, :cve:`2017-15265`, :cve:`2017-15274`, :cve:`2017-15299`, :cve:`2017-15306`, :cve:`2017-15537`, :cve:`2017-15649`, :cve:`2017-15868`, :cve:`2017-15951`, :cve:`2017-16525`, :cve:`2017-16526`, :cve:`2017-16527`, :cve:`2017-16528`, :cve:`2017-16529`, :cve:`2017-16530`, :cve:`2017-16531`, :cve:`2017-16532`, :cve:`2017-16533`, :cve:`2017-16534`, :cve:`2017-16535`, :cve:`2017-16536`, :cve:`2017-16537`, :cve:`2017-16538`, :cve:`2017-16643`, :cve:`2017-16644`, :cve:`2017-16645`, :cve:`2017-16646`, :cve:`2017-16647`, :cve:`2017-16648`, :cve:`2017-16649`, :cve:`2017-16650`, :cve:`2017-16911`, :cve:`2017-16912`, :cve:`2017-16913`, :cve:`2017-16914`, :cve:`2017-16939`, :cve:`2017-16994`, :cve:`2017-16995`, :cve:`2017-16996`, :cve:`2017-17052`, :cve:`2017-17053`, :cve:`2017-17448`, :cve:`2017-17449`, :cve:`2017-17450`, :cve:`2017-17558`, :cve:`2017-17712`, :cve:`2017-17741`, :cve:`2017-17805`, :cve:`2017-17806`, :cve:`2017-17807`, :cve:`2017-17852`, :cve:`2017-17853`, :cve:`2017-17854`, :cve:`2017-17855`, :cve:`2017-17856`, :cve:`2017-17857`, :cve:`2017-17862`, :cve:`2017-17863`, :cve:`2017-17864`, :cve:`2017-17975`, :cve:`2017-18017`, :cve:`2017-18075`, :cve:`2017-18079`, :cve:`2017-18174`, :cve:`2017-18193`, :cve:`2017-18200`, :cve:`2017-18202`, :cve:`2017-18203`, :cve:`2017-18204`, :cve:`2017-18208`, :cve:`2017-18216`, :cve:`2017-18218`, :cve:`2017-18221`, :cve:`2017-18222`, :cve:`2017-18224`, :cve:`2017-18232`, :cve:`2017-18241`, :cve:`2017-18249`, :cve:`2017-18255`, :cve:`2017-18257`, :cve:`2017-18261`, :cve:`2017-18270`, :cve:`2017-18344`, :cve:`2017-18360`, :cve:`2017-18379`, :cve:`2017-18509`, :cve:`2017-18549`, :cve:`2017-18550`, :cve:`2017-18551`, :cve:`2017-18552`, :cve:`2017-18595`, :cve:`2017-2583`, :cve:`2017-2584`, :cve:`2017-2596`, :cve:`2017-2618`, :cve:`2017-2634`, :cve:`2017-2636`, :cve:`2017-2647`, :cve:`2017-2671`, :cve:`2017-5123`, :cve:`2017-5546`, :cve:`2017-5547`, :cve:`2017-5548`, :cve:`2017-5549`, :cve:`2017-5550`, :cve:`2017-5551`, :cve:`2017-5576`, :cve:`2017-5577`, :cve:`2017-5669`, :cve:`2017-5715`, :cve:`2017-5753`, :cve:`2017-5754`, :cve:`2017-5897`, :cve:`2017-5967`, :cve:`2017-5970`, :cve:`2017-5972`, :cve:`2017-5986`, :cve:`2017-6001`, :cve:`2017-6074`, :cve:`2017-6214`, :cve:`2017-6345`, :cve:`2017-6346`, :cve:`2017-6347`, :cve:`2017-6348`, :cve:`2017-6353`, :cve:`2017-6874`, :cve:`2017-6951`, :cve:`2017-7184`, :cve:`2017-7187`, :cve:`2017-7261`, :cve:`2017-7273`, :cve:`2017-7277`, :cve:`2017-7294`, :cve:`2017-7308`, :cve:`2017-7346`, :cve:`2017-7374`, :cve:`2017-7472`, :cve:`2017-7477`, :cve:`2017-7482`, :cve:`2017-7487`, :cve:`2017-7495`, :cve:`2017-7518`, :cve:`2017-7533`, :cve:`2017-7541`, :cve:`2017-7542`, :cve:`2017-7558`, :cve:`2017-7616`, :cve:`2017-7618`, :cve:`2017-7645`, :cve:`2017-7889`, :cve:`2017-7895`, :cve:`2017-7979`, :cve:`2017-8061`, :cve:`2017-8062`, :cve:`2017-8063`, :cve:`2017-8064`, :cve:`2017-8065`, :cve:`2017-8066`, :cve:`2017-8067`, :cve:`2017-8068`, :cve:`2017-8069`, :cve:`2017-8070`, :cve:`2017-8071`, :cve:`2017-8072`, :cve:`2017-8106`, :cve:`2017-8240`, :cve:`2017-8797`, :cve:`2017-8824`, :cve:`2017-8831`, :cve:`2017-8890`, :cve:`2017-8924`, :cve:`2017-8925`, :cve:`2017-9059`, :cve:`2017-9074`, :cve:`2017-9075`, :cve:`2017-9076`, :cve:`2017-9077`, :cve:`2017-9150`, :cve:`2017-9211`, :cve:`2017-9242`, :cve:`2017-9605`, :cve:`2017-9725`, :cve:`2017-9984`, :cve:`2017-9985`, :cve:`2017-9986`, :cve:`2018-1000004`, :cve:`2018-1000026`, :cve:`2018-1000028`, :cve:`2018-1000199`, :cve:`2018-1000200`, :cve:`2018-1000204`, :cve:`2018-10021`, :cve:`2018-10074`, :cve:`2018-10087`, :cve:`2018-10124`, :cve:`2018-10322`, :cve:`2018-10323`, :cve:`2018-1065`, :cve:`2018-1066`, :cve:`2018-10675`, :cve:`2018-1068`, :cve:`2018-10840`, :cve:`2018-10853`, :cve:`2018-1087`, :cve:`2018-10876`, :cve:`2018-10877`, :cve:`2018-10878`, :cve:`2018-10879`, :cve:`2018-10880`, :cve:`2018-10881`, :cve:`2018-10882`, :cve:`2018-10883`, :cve:`2018-10901`, :cve:`2018-10902`, :cve:`2018-1091`, :cve:`2018-1092`, :cve:`2018-1093`, :cve:`2018-10938`, :cve:`2018-1094`, :cve:`2018-10940`, :cve:`2018-1095`, :cve:`2018-1108`, :cve:`2018-1118`, :cve:`2018-1120`, :cve:`2018-11232`, :cve:`2018-1128`, :cve:`2018-1129`, :cve:`2018-1130`, :cve:`2018-11412`, :cve:`2018-11506`, :cve:`2018-11508`, :cve:`2018-12126`, :cve:`2018-12127`, :cve:`2018-12130`, :cve:`2018-12207`, :cve:`2018-12232`, :cve:`2018-12233`, :cve:`2018-12633`, :cve:`2018-12714`, :cve:`2018-12896`, :cve:`2018-12904`, :cve:`2018-13053`, :cve:`2018-13093`, :cve:`2018-13094`, :cve:`2018-13095`, :cve:`2018-13096`, :cve:`2018-13097`, :cve:`2018-13098`, :cve:`2018-13099`, :cve:`2018-13100`, :cve:`2018-13405`, :cve:`2018-13406`, :cve:`2018-14609`, :cve:`2018-14610`, :cve:`2018-14611`, :cve:`2018-14612`, :cve:`2018-14613`, :cve:`2018-14614`, :cve:`2018-14615`, :cve:`2018-14616`, :cve:`2018-14617`, :cve:`2018-14619`, :cve:`2018-14625`, :cve:`2018-14633`, :cve:`2018-14634`, :cve:`2018-14641`, :cve:`2018-14646`, :cve:`2018-14656`, :cve:`2018-14678`, :cve:`2018-14734`, :cve:`2018-15471`, :cve:`2018-15572`, :cve:`2018-15594`, :cve:`2018-16276`, :cve:`2018-16597`, :cve:`2018-16658`, :cve:`2018-16862`, :cve:`2018-16871`, :cve:`2018-16880`, :cve:`2018-16882`, :cve:`2018-16884`, :cve:`2018-17182`, :cve:`2018-17972`, :cve:`2018-18021`, :cve:`2018-18281`, :cve:`2018-18386`, :cve:`2018-18397`, :cve:`2018-18445`, :cve:`2018-18559`, :cve:`2018-18690`, :cve:`2018-18710`, :cve:`2018-18955`, :cve:`2018-19406`, :cve:`2018-19407`, :cve:`2018-19824`, :cve:`2018-19854`, :cve:`2018-19985`, :cve:`2018-20169`, :cve:`2018-20449`, :cve:`2018-20509`, :cve:`2018-20510`, :cve:`2018-20511`, :cve:`2018-20669`, :cve:`2018-20784`, :cve:`2018-20836`, :cve:`2018-20854`, :cve:`2018-20855`, :cve:`2018-20856`, :cve:`2018-20961`, :cve:`2018-20976`, :cve:`2018-21008`, :cve:`2018-25015`, :cve:`2018-25020`, :cve:`2018-3620`, :cve:`2018-3639`, :cve:`2018-3646`, :cve:`2018-3665`, :cve:`2018-3693`, :cve:`2018-5332`, :cve:`2018-5333`, :cve:`2018-5344`, :cve:`2018-5390`, :cve:`2018-5391`, :cve:`2018-5703`, :cve:`2018-5750`, :cve:`2018-5803`, :cve:`2018-5814`, :cve:`2018-5848`, :cve:`2018-5873`, :cve:`2018-5953`, :cve:`2018-5995`, :cve:`2018-6412`, :cve:`2018-6554`, :cve:`2018-6555`, :cve:`2018-6927`, :cve:`2018-7191`, :cve:`2018-7273`, :cve:`2018-7480`, :cve:`2018-7492`, :cve:`2018-7566`, :cve:`2018-7740`, :cve:`2018-7754`, :cve:`2018-7755`, :cve:`2018-7757`, :cve:`2018-7995`, :cve:`2018-8043`, :cve_mitre:`2018-8087`, :cve_mitre:`2018-8781`, :cve_mitre:`2018-8822`, :cve_mitre:`2018-8897`, :cve_mitre:`2018-9363`, :cve_mitre:`2018-9385`, :cve_mitre:`2018-9415`, :cve_mitre:`2018-9422`, :cve_mitre:`2018-9465`, :cve_mitre:`2018-9516`, :cve_mitre:`2018-9517`, :cve_mitre:`2018-9518` and :cve_mitre:`2018-9568`
+- linux-yocto/6.1 (Continued): Ignore :cve:`2019-0136`, :cve:`2019-0145`, :cve:`2019-0146`, :cve:`2019-0147`, :cve:`2019-0148`, :cve:`2019-0149`, :cve:`2019-0154`, :cve:`2019-0155`, :cve:`2019-10124`, :cve:`2019-10125`, :cve:`2019-10126`, :cve:`2019-10142`, :cve:`2019-10207`, :cve:`2019-10220`, :cve:`2019-10638`, :cve:`2019-10639`, :cve:`2019-11085`, :cve:`2019-11091`, :cve:`2019-11135`, :cve:`2019-11190`, :cve:`2019-11191`, :cve:`2019-1125`, :cve:`2019-11477`, :cve:`2019-11478`, :cve:`2019-11479`, :cve:`2019-11486`, :cve:`2019-11487`, :cve:`2019-11599`, :cve:`2019-11683`, :cve:`2019-11810`, :cve:`2019-11811`, :cve:`2019-11815`, :cve:`2019-11833`, :cve:`2019-11884`, :cve:`2019-12378`, :cve:`2019-12379`, :cve:`2019-12380`, :cve:`2019-12381`, :cve:`2019-12382`, :cve:`2019-12454`, :cve:`2019-12455`, :cve:`2019-12614`, :cve:`2019-12615`, :cve:`2019-12817`, :cve:`2019-12818`, :cve:`2019-12819`, :cve:`2019-12881`, :cve:`2019-12984`, :cve:`2019-13233`, :cve:`2019-13272`, :cve:`2019-13631`, :cve:`2019-13648`, :cve:`2019-14283`, :cve:`2019-14284`, :cve:`2019-14615`, :cve:`2019-14763`, :cve:`2019-14814`, :cve:`2019-14815`, :cve:`2019-14816`, :cve:`2019-14821`, :cve:`2019-14835`, :cve:`2019-14895`, :cve:`2019-14896`, :cve:`2019-14897`, :cve:`2019-14901`, :cve:`2019-15030`, :cve:`2019-15031`, :cve:`2019-15090`, :cve:`2019-15098`, :cve:`2019-15099`, :cve:`2019-15117`, :cve:`2019-15118`, :cve:`2019-15211`, :cve:`2019-15212`, :cve:`2019-15213`, :cve:`2019-15214`, :cve:`2019-15215`, :cve:`2019-15216`, :cve:`2019-15217`, :cve:`2019-15218`, :cve:`2019-15219`, :cve:`2019-15220`, :cve:`2019-15221`, :cve:`2019-15222`, :cve:`2019-15223`, :cve:`2019-15291`, :cve:`2019-15292`, :cve:`2019-15504`, :cve:`2019-15505`, :cve:`2019-15538`, :cve:`2019-15666`, :cve:`2019-15794`, :cve:`2019-15807`, :cve:`2019-15916`, :cve:`2019-15917`, :cve:`2019-15918`, :cve:`2019-15919`, :cve:`2019-15920`, :cve:`2019-15921`, :cve:`2019-15922`, :cve:`2019-15923`, :cve:`2019-15924`, :cve:`2019-15925`, :cve:`2019-15926`, :cve:`2019-15927`, :cve:`2019-16229`, :cve:`2019-16230`, :cve:`2019-16231`, :cve:`2019-16232`, :cve:`2019-16233`, :cve:`2019-16234`, :cve:`2019-16413`, :cve:`2019-16714`, :cve:`2019-16746`, :cve:`2019-16921`, :cve:`2019-16994`, :cve:`2019-16995`, :cve:`2019-17052`, :cve:`2019-17053`, :cve:`2019-17054`, :cve:`2019-17055`, :cve:`2019-17056`, :cve:`2019-17075`, :cve:`2019-17133`, :cve:`2019-17351`, :cve:`2019-17666`, :cve:`2019-18198`, :cve:`2019-18282`, :cve:`2019-18660`, :cve:`2019-18675`, :cve:`2019-18683`, :cve:`2019-18786`, :cve:`2019-18805`, :cve:`2019-18806`, :cve:`2019-18807`, :cve:`2019-18808`, :cve:`2019-18809`, :cve:`2019-18810`, :cve:`2019-18811`, :cve:`2019-18812`, :cve:`2019-18813`, :cve:`2019-18814`, :cve:`2019-18885`, :cve:`2019-19036`, :cve:`2019-19037`, :cve:`2019-19039`, :cve:`2019-19043`, :cve:`2019-19044`, :cve:`2019-19045`, :cve:`2019-19046`, :cve:`2019-19047`, :cve:`2019-19048`, :cve:`2019-19049`, :cve:`2019-19050`, :cve:`2019-19051`, :cve:`2019-19052`, :cve:`2019-19053`, :cve:`2019-19054`, :cve:`2019-19055`, :cve:`2019-19056`, :cve:`2019-19057`, :cve:`2019-19058`, :cve:`2019-19059`, :cve:`2019-19060`, :cve:`2019-19061`, :cve:`2019-19062`, :cve:`2019-19063`, :cve:`2019-19064`, :cve:`2019-19065`, :cve:`2019-19066`, :cve:`2019-19067`, :cve:`2019-19068`, :cve:`2019-19069`, :cve:`2019-19070`, :cve:`2019-19071`, :cve:`2019-19072`, :cve:`2019-19073`, :cve:`2019-19074`, :cve:`2019-19075`, :cve:`2019-19076`, :cve:`2019-19077`, :cve:`2019-19078`, :cve:`2019-19079`, :cve:`2019-19080`, :cve:`2019-19081`, :cve:`2019-19082`, :cve:`2019-19083`, :cve:`2019-19227`, :cve:`2019-19241`, :cve:`2019-19252`, :cve:`2019-19318`, :cve:`2019-19319`, :cve:`2019-19332`, :cve:`2019-19338`, :cve:`2019-19377`, :cve:`2019-19447`, :cve:`2019-19448`, :cve:`2019-19449`, :cve:`2019-19462`, :cve:`2019-19523`, :cve:`2019-19524`, :cve:`2019-19525`, :cve:`2019-19526`, :cve:`2019-19527`, :cve:`2019-19528`, :cve:`2019-19529`, :cve:`2019-19530`, :cve:`2019-19531`, :cve:`2019-19532`, :cve:`2019-19533`, :cve:`2019-19534`, :cve:`2019-19535`, :cve:`2019-19536`, :cve:`2019-19537`, :cve:`2019-19543`, :cve:`2019-19602`, :cve:`2019-19767`, :cve:`2019-19768`, :cve:`2019-19769`, :cve:`2019-19770`, :cve:`2019-19807`, :cve:`2019-19813`, :cve:`2019-19815`, :cve:`2019-19816`, :cve:`2019-19922`, :cve:`2019-19927`, :cve:`2019-19947`, :cve:`2019-19965`, :cve:`2019-19966`, :cve:`2019-1999`, :cve:`2019-20054`, :cve:`2019-20095`, :cve:`2019-20096`, :cve:`2019-2024`, :cve:`2019-2025`, :cve:`2019-20422`, :cve:`2019-2054`, :cve:`2019-20636`, :cve:`2019-20806`, :cve:`2019-20810`, :cve:`2019-20811`, :cve:`2019-20812`, :cve:`2019-20908`, :cve:`2019-20934`, :cve:`2019-2101`, :cve:`2019-2181`, :cve:`2019-2182`, :cve:`2019-2213`, :cve:`2019-2214`, :cve:`2019-2215`, :cve:`2019-25044`, :cve:`2019-25045`, :cve:`2019-3016`, :cve:`2019-3459`, :cve:`2019-3460`, :cve:`2019-3701`, :cve:`2019-3819`, :cve:`2019-3837`, :cve:`2019-3846`, :cve:`2019-3874`, :cve:`2019-3882`, :cve:`2019-3887`, :cve:`2019-3892`, :cve:`2019-3896`, :cve:`2019-3900`, :cve:`2019-3901`, :cve:`2019-5108`, :cve:`2019-6133`, :cve:`2019-6974`, :cve:`2019-7221`, :cve:`2019-7222`, :cve:`2019-7308`, :cve:`2019-8912`, :cve:`2019-8956`, :cve:`2019-8980`, :cve:`2019-9003`, :cve:`2019-9162`, :cve:`2019-9213`, :cve:`2019-9245`, :cve:`2019-9444`, :cve:`2019-9445`, :cve:`2019-9453`, :cve:`2019-9454`, :cve:`2019-9455`, :cve:`2019-9456`, :cve:`2019-9457`, :cve:`2019-9458`, :cve:`2019-9466`, :cve:`2019-9500`, :cve:`2019-9503`, :cve:`2019-9506`, :cve:`2019-9857`, :cve:`2020-0009`, :cve:`2020-0030`, :cve:`2020-0041`, :cve:`2020-0066`, :cve:`2020-0067`, :cve:`2020-0110`, :cve:`2020-0255`, :cve:`2020-0305`, :cve:`2020-0404`, :cve:`2020-0423`, :cve:`2020-0427`, :cve:`2020-0429`, :cve:`2020-0430`, :cve:`2020-0431`, :cve:`2020-0432`, :cve:`2020-0433`, :cve:`2020-0435`, :cve:`2020-0444`, :cve:`2020-0465`, :cve:`2020-0466`, :cve:`2020-0543`, :cve:`2020-10135`, :cve:`2020-10690`, :cve:`2020-10711`, :cve:`2020-10720`, :cve:`2020-10732`, :cve:`2020-10742`, :cve:`2020-10751`, :cve:`2020-10757`, :cve:`2020-10766`, :cve:`2020-10767`, :cve:`2020-10768`, :cve:`2020-10769`, :cve:`2020-10773`, :cve:`2020-10781`, :cve:`2020-10942`, :cve:`2020-11494`, :cve:`2020-11565`, :cve:`2020-11608`, :cve:`2020-11609`, :cve:`2020-11668`, :cve:`2020-11669`, :cve:`2020-11884`, :cve:`2020-12114`, :cve:`2020-12351`, :cve:`2020-12352`, :cve:`2020-12362`, :cve:`2020-12363`, :cve:`2020-12364`, :cve:`2020-12464`, :cve:`2020-12465`, :cve:`2020-12652`, :cve:`2020-12653`, :cve:`2020-12654`, :cve:`2020-12655`, :cve:`2020-12656`, :cve:`2020-12657`, :cve:`2020-12659`, :cve:`2020-12768`, :cve:`2020-12769`, :cve:`2020-12770`, :cve:`2020-12771`, :cve:`2020-12826`, :cve:`2020-12888`, :cve:`2020-12912`, :cve:`2020-13143`, :cve:`2020-13974`, :cve:`2020-14305`, :cve:`2020-14314`, :cve:`2020-14331`, :cve:`2020-14351`, :cve:`2020-14353`, :cve:`2020-14356`, :cve:`2020-14381`, :cve:`2020-14385`, :cve:`2020-14386`, :cve:`2020-14390`, :cve:`2020-14416`, :cve:`2020-15393`, :cve:`2020-15436`, :cve:`2020-15437`, :cve:`2020-15780`, :cve:`2020-15852`, :cve:`2020-16119`, :cve:`2020-16120`, :cve:`2020-16166`, :cve:`2020-1749`, :cve:`2020-24394`, :cve:`2020-24490`, :cve:`2020-24504`, :cve:`2020-24586`, :cve:`2020-24587`, :cve:`2020-24588`, :cve:`2020-25211`, :cve:`2020-25212`, :cve:`2020-25221`, :cve:`2020-25284`, :cve:`2020-25285`, :cve:`2020-25639`, :cve:`2020-25641`, :cve:`2020-25643`, :cve:`2020-25645`, :cve:`2020-25656`, :cve:`2020-25668`, :cve:`2020-25669`, :cve:`2020-25670`, :cve:`2020-25671`, :cve:`2020-25672`, :cve:`2020-25673`, :cve:`2020-25704`, :cve:`2020-25705`, :cve:`2020-26088`, :cve:`2020-26139`, :cve:`2020-26141`, :cve:`2020-26145`, :cve:`2020-26147`, :cve:`2020-26541`, :cve:`2020-26555`, :cve:`2020-26558`, :cve:`2020-27066`, :cve:`2020-27067`, :cve:`2020-27068`, :cve:`2020-27152`, :cve:`2020-27170`, :cve:`2020-27171`, :cve:`2020-27194`, :cve:`2020-2732`, :cve:`2020-27673`, :cve:`2020-27675`, :cve:`2020-27777`, :cve:`2020-27784`, :cve:`2020-27786`, :cve:`2020-27815`, :cve:`2020-27820`, :cve:`2020-27825`, :cve:`2020-27830`, :cve:`2020-27835`, :cve:`2020-28097`, :cve:`2020-28374`, :cve:`2020-28588`, :cve:`2020-28915`, :cve:`2020-28941`, :cve:`2020-28974`, :cve:`2020-29368`, :cve:`2020-29369`, :cve:`2020-29370`, :cve:`2020-29371`, :cve:`2020-29372`, :cve:`2020-29373`, :cve:`2020-29374`, :cve:`2020-29534`, :cve:`2020-29568`, :cve:`2020-29569`, :cve:`2020-29660`, :cve:`2020-29661`, :cve:`2020-35499`, :cve:`2020-35508`, :cve:`2020-35513`, :cve:`2020-35519`, :cve:`2020-36158`, :cve:`2020-36310`, :cve:`2020-36311`, :cve:`2020-36312`, :cve:`2020-36313`, :cve:`2020-36322`, :cve:`2020-36385`, :cve:`2020-36386`, :cve:`2020-36387`, :cve:`2020-36516`, :cve:`2020-36557`, :cve:`2020-36558`, :cve:`2020-36691`, :cve:`2020-36694`, :cve:`2020-36766`, :cve:`2020-3702`, :cve:`2020-4788`, :cve:`2020-7053`, :cve:`2020-8428`, :cve:`2020-8647`, :cve:`2020-8648`, :cve:`2020-8649`, :cve:`2020-8694`, :cve:`2020-8834`, :cve:`2020-8835`, :cve:`2020-8992`, :cve:`2020-9383`, :cve:`2020-9391`, :cve:`2021-0129`, :cve:`2021-0342`, :cve_mitre:`2021-0447`, :cve_mitre:`2021-0448`, :cve:`2021-0512`, :cve:`2021-0605`, :cve:`2021-0707`, :cve:`2021-0920`, :cve:`2021-0929`, :cve:`2021-0935`, :cve_mitre:`2021-0937`, :cve:`2021-0938`, :cve:`2021-0941`, :cve:`2021-1048`, :cve:`2021-20177`, :cve:`2021-20194`, :cve:`2021-20226`, :cve:`2021-20239`, :cve:`2021-20261`, :cve:`2021-20265`, :cve:`2021-20268`, :cve:`2021-20292`, :cve:`2021-20317`, :cve:`2021-20320`, :cve:`2021-20321`, :cve:`2021-20322`, :cve:`2021-21781`, :cve:`2021-22543`, :cve:`2021-22555`, :cve:`2021-22600`, :cve:`2021-23133`, :cve:`2021-23134`, :cve:`2021-26401`, :cve:`2021-26708`, :cve:`2021-26930`, :cve:`2021-26931`, :cve:`2021-26932`, :cve:`2021-27363`, :cve:`2021-27364`, :cve:`2021-27365`, :cve:`2021-28038`, :cve:`2021-28039`, :cve:`2021-28375`, :cve:`2021-28660`, :cve:`2021-28688`, :cve:`2021-28691`, :cve:`2021-28711`, :cve:`2021-28712`, :cve:`2021-28713`, :cve:`2021-28714`, :cve:`2021-28715`, :cve:`2021-28950`, :cve:`2021-28951`, :cve:`2021-28952`, :cve:`2021-28964`, :cve:`2021-28971`, :cve:`2021-28972`, :cve:`2021-29154`, :cve:`2021-29155`, :cve:`2021-29264`, :cve:`2021-29265`, :cve:`2021-29266`, :cve:`2021-29646`, :cve:`2021-29647`, :cve:`2021-29648`, :cve:`2021-29649`, :cve:`2021-29650`, :cve:`2021-29657`, :cve:`2021-30002`, :cve:`2021-30178`, :cve:`2021-31440`, :cve:`2021-3178`, :cve:`2021-31829`, :cve:`2021-31916`, :cve:`2021-32078`, :cve:`2021-32399`, :cve:`2021-32606`, :cve:`2021-33033`, :cve:`2021-33034`, :cve:`2021-33061`, :cve:`2021-33098`, :cve:`2021-33135`, :cve:`2021-33200`, :cve:`2021-3347`, :cve:`2021-3348`, :cve:`2021-33624`, :cve:`2021-33655`, :cve:`2021-33656`, :cve:`2021-33909`, :cve:`2021-3411`, :cve:`2021-3428`, :cve:`2021-3444`, :cve:`2021-34556`, :cve:`2021-34693`, :cve:`2021-3483`, :cve:`2021-34866`, :cve:`2021-3489`, :cve:`2021-3490`, :cve:`2021-3491`, :cve:`2021-3493`, :cve_mitre:`2021-34981`, :cve:`2021-3501`, :cve:`2021-35039`, :cve:`2021-3506`, :cve:`2021-3543`, :cve:`2021-35477`, :cve:`2021-3564`, :cve:`2021-3573`, :cve:`2021-3587`, :cve_mitre:`2021-3600`, :cve:`2021-3609`, :cve:`2021-3612`, :cve:`2021-3635`, :cve:`2021-3640`, :cve:`2021-3653`, :cve:`2021-3655`, :cve:`2021-3656`, :cve:`2021-3659`, :cve:`2021-3669`, :cve:`2021-3679`, :cve:`2021-3715`, :cve:`2021-37159`, :cve:`2021-3732`, :cve:`2021-3736`, :cve:`2021-3739`, :cve:`2021-3743`, :cve:`2021-3744`, :cve:`2021-3752`, :cve:`2021-3753`, :cve:`2021-37576`, :cve:`2021-3759`, :cve:`2021-3760`, :cve:`2021-3764`, :cve:`2021-3772`, :cve:`2021-38160`, :cve:`2021-38166`, :cve:`2021-38198`, :cve:`2021-38199`, :cve:`2021-38200`, :cve:`2021-38201`, :cve:`2021-38202`, :cve:`2021-38203`, :cve:`2021-38204`, :cve:`2021-38205`, :cve:`2021-38206`, :cve:`2021-38207`, :cve:`2021-38208`, :cve:`2021-38209`, :cve:`2021-38300`, :cve:`2021-3894`, :cve:`2021-3896`, :cve:`2021-3923`, :cve:`2021-39633`, :cve:`2021-39634`, :cve:`2021-39636`, :cve:`2021-39648`, :cve:`2021-39656`, :cve:`2021-39657`, :cve:`2021-39685`, :cve:`2021-39686`, :cve:`2021-39698`, :cve:`2021-39711`, :cve:`2021-39713`, :cve:`2021-39714`, :cve:`2021-4001`, :cve:`2021-4002`, :cve:`2021-4023`, :cve:`2021-4028`, :cve:`2021-4032`, :cve:`2021-4037`, :cve:`2021-40490`, :cve:`2021-4083`, :cve:`2021-4090`, :cve:`2021-4093`, :cve:`2021-4095`, :cve:`2021-41073`, :cve:`2021-4135`, :cve:`2021-4148`, :cve:`2021-4149`, :cve:`2021-4150`, :cve:`2021-4154`, :cve:`2021-4155`, :cve:`2021-4157`, :cve:`2021-4159`, :cve:`2021-41864`, :cve:`2021-4197`, :cve:`2021-42008`, :cve:`2021-4202`, :cve:`2021-4203`, :cve:`2021-4204`, :cve:`2021-4218`, :cve:`2021-42252`, :cve:`2021-42327`, :cve:`2021-42739`, :cve:`2021-43056`, :cve:`2021-43057`, :cve:`2021-43267`, :cve:`2021-43389`, :cve:`2021-43975`, :cve:`2021-43976`, :cve:`2021-44733`, :cve:`2021-44879`, :cve:`2021-45095`, :cve:`2021-45100`, :cve:`2021-45402`, :cve:`2021-45469`, :cve:`2021-45480`, :cve:`2021-45485`, :cve:`2021-45486`, :cve:`2021-45868`, :cve:`2021-46283`, :cve:`2022-0001`, :cve:`2022-0002`, :cve:`2022-0168`, :cve:`2022-0171`, :cve:`2022-0185`, :cve:`2022-0264`, :cve:`2022-0286`, :cve:`2022-0322`, :cve:`2022-0330`, :cve:`2022-0382`, :cve:`2022-0433`, :cve:`2022-0435`, :cve:`2022-0480`, :cve:`2022-0487`, :cve:`2022-0492`, :cve:`2022-0494`, :cve:`2022-0500`, :cve:`2022-0516`, :cve:`2022-0617`, :cve:`2022-0644`, :cve:`2022-0646`, :cve:`2022-0742`, :cve:`2022-0812`, :cve:`2022-0847`, :cve:`2022-0850`, :cve:`2022-0854`, :cve:`2022-0995`, :cve:`2022-0998`, :cve:`2022-1011`, :cve:`2022-1012`, :cve:`2022-1015`, :cve:`2022-1016`, :cve:`2022-1043`, :cve:`2022-1048`, :cve:`2022-1055`, :cve:`2022-1158`, :cve:`2022-1184`, :cve:`2022-1195`, :cve:`2022-1198`, :cve:`2022-1199`, :cve:`2022-1204`, :cve:`2022-1205`, :cve:`2022-1263`, :cve:`2022-1280`, :cve:`2022-1353`, :cve:`2022-1419`, :cve:`2022-1462`, :cve:`2022-1508`, :cve:`2022-1516`, :cve:`2022-1651`, :cve:`2022-1652`, :cve:`2022-1671`, :cve:`2022-1678`, :cve:`2022-1679`, :cve:`2022-1729`, :cve:`2022-1734`, :cve:`2022-1786`, :cve:`2022-1789`, :cve:`2022-1836`, :cve:`2022-1852`, :cve:`2022-1882`, :cve:`2022-1943`, :cve:`2022-1966`, :cve:`2022-1972`, :cve:`2022-1973`, :cve:`2022-1974`, :cve:`2022-1975`, :cve:`2022-1976`, :cve:`2022-1998`, :cve:`2022-20008`, :cve:`2022-20132`, :cve:`2022-20141`, :cve:`2022-20148`, :cve:`2022-20153`, :cve:`2022-20154`, :cve:`2022-20158`, :cve:`2022-20166`, :cve:`2022-20368`, :cve:`2022-20369`, :cve:`2022-20409`, :cve:`2022-20421`, :cve:`2022-20422`, :cve:`2022-20423`, :cve:`2022-20424`, :cve_mitre:`2022-20565`, :cve:`2022-20566`, :cve:`2022-20567`, :cve:`2022-20568`, :cve:`2022-20572`, :cve:`2022-2078`, :cve:`2022-21123`, :cve:`2022-21125`, :cve:`2022-21166`, :cve:`2022-21385`, :cve:`2022-21499`, :cve_mitre:`2022-21505`, :cve:`2022-2153`, :cve:`2022-2196`, :cve_mitre:`2022-22942`, :cve:`2022-23036`, :cve:`2022-23037`, :cve:`2022-23038`, :cve:`2022-23039`, :cve:`2022-23040`, :cve:`2022-23041`, :cve:`2022-23042`, :cve:`2022-2308`, :cve:`2022-2318`, :cve:`2022-23222`, :cve:`2022-2327`, :cve:`2022-2380`, :cve:`2022-23816`, :cve:`2022-23960`, :cve:`2022-24122`, :cve:`2022-24448`, :cve:`2022-24958`, :cve:`2022-24959`, :cve:`2022-2503`, :cve:`2022-25258`, :cve:`2022-25375`, :cve:`2022-25636`, :cve_mitre:`2022-2585`, :cve_mitre:`2022-2586`, :cve_mitre:`2022-2588`, :cve:`2022-2590`, :cve_mitre:`2022-2602`, :cve:`2022-26365`, :cve:`2022-26373`, :cve:`2022-2639`, :cve:`2022-26490`, :cve:`2022-2663`, :cve:`2022-26966`, :cve:`2022-27223`, :cve:`2022-27666`, :cve:`2022-27672`, :cve:`2022-2785`, :cve:`2022-27950`, :cve:`2022-28356`, :cve:`2022-28388`, :cve:`2022-28389`, :cve:`2022-28390`, :cve:`2022-2873`, :cve:`2022-28796`, :cve:`2022-28893`, :cve:`2022-2905`, :cve:`2022-29156`, :cve:`2022-2938`, :cve:`2022-29581`, :cve:`2022-29582`, :cve:`2022-2959`, :cve:`2022-2964`, :cve:`2022-2977`, :cve:`2022-2978`, :cve:`2022-29900`, :cve:`2022-29901`, :cve:`2022-2991`, :cve:`2022-29968`, :cve:`2022-3028`, :cve:`2022-30594`, :cve:`2022-3061`, :cve:`2022-3077`, :cve:`2022-3078`, :cve:`2022-3103`, :cve:`2022-3104`, :cve:`2022-3105`, :cve:`2022-3106`, :cve:`2022-3107`, :cve:`2022-3108`, :cve:`2022-3110`, :cve:`2022-3111`, :cve:`2022-3112`, :cve:`2022-3113`, :cve:`2022-3114`, :cve:`2022-3115`, :cve:`2022-3169`, :cve:`2022-3170`, :cve:`2022-3176`, :cve:`2022-3202`, :cve:`2022-32250`, :cve:`2022-32296`, :cve:`2022-3239`, :cve:`2022-32981`, :cve:`2022-3303`, :cve:`2022-3344`, :cve:`2022-33740`, :cve:`2022-33741`, :cve:`2022-33742`, :cve:`2022-33743`, :cve:`2022-33744`, :cve:`2022-33981`, :cve:`2022-3424`, :cve:`2022-3435`, :cve:`2022-34494`, :cve:`2022-34495`, :cve:`2022-34918`, :cve:`2022-3521`, :cve:`2022-3522`, :cve:`2022-3524`, :cve:`2022-3526`, :cve:`2022-3531`, :cve:`2022-3532`, :cve:`2022-3534`, :cve:`2022-3535`, :cve:`2022-3541`, :cve:`2022-3542`, :cve:`2022-3543`, :cve:`2022-3545`, :cve:`2022-3564`, :cve:`2022-3565`, :cve:`2022-3577`, :cve:`2022-3586`, :cve:`2022-3594`, :cve:`2022-3595`, :cve:`2022-36123`, :cve:`2022-3619`, :cve:`2022-3621`, :cve:`2022-3623`, :cve:`2022-3624`, :cve:`2022-3625`, :cve:`2022-3628`, :cve:`2022-36280`, :cve:`2022-3629`, :cve:`2022-3630`, :cve:`2022-3633`, :cve:`2022-3635`, :cve:`2022-3636`, :cve:`2022-3640`, :cve:`2022-3643`, :cve:`2022-3646`, :cve:`2022-3649`, :cve:`2022-36879`, :cve:`2022-36946`, :cve:`2022-3707`, :cve:`2022-38457`, :cve:`2022-3903`, :cve:`2022-3910`, :cve:`2022-39188`, :cve:`2022-39189`, :cve:`2022-39190`, :cve:`2022-3977`, :cve:`2022-39842`, :cve:`2022-40133`, :cve:`2022-40307`, :cve:`2022-40476`, :cve:`2022-40768`, :cve:`2022-4095`, :cve:`2022-40982`, :cve:`2022-41218`, :cve:`2022-41222`, :cve:`2022-4127`, :cve:`2022-4128`, :cve:`2022-4129`, :cve:`2022-4139`, :cve:`2022-41674`, :cve:`2022-41849`, :cve:`2022-41850`, :cve:`2022-41858`, :cve:`2022-42328`, :cve:`2022-42329`, :cve:`2022-42432`, :cve:`2022-4269`, :cve:`2022-42703`, :cve:`2022-42719`, :cve:`2022-42720`, :cve:`2022-42721`, :cve:`2022-42722`, :cve:`2022-42895`, :cve:`2022-42896`, :cve:`2022-43750`, :cve:`2022-4378`, :cve:`2022-4379`, :cve:`2022-4382`, :cve:`2022-43945`, :cve:`2022-45869`, :cve:`2022-45886`, :cve:`2022-45887`, :cve:`2022-45919`, :cve:`2022-45934`, :cve:`2022-4662`, :cve:`2022-4696`, :cve:`2022-4744`, :cve:`2022-47518`, :cve:`2022-47519`, :cve:`2022-47520`, :cve:`2022-47521`, :cve:`2022-47929`, :cve:`2022-47938`, :cve:`2022-47939`, :cve:`2022-47940`, :cve:`2022-47941`, :cve:`2022-47942`, :cve:`2022-47943`, :cve:`2022-47946`, :cve:`2022-4842`, :cve:`2022-48423`, :cve:`2022-48424`, :cve:`2022-48425`, :cve:`2022-48502`, :cve:`2023-0030`, :cve:`2023-0045`, :cve:`2023-0047`, :cve:`2023-0122`, :cve:`2023-0160`, :cve:`2023-0179`, :cve:`2023-0210`, :cve:`2023-0240`, :cve:`2023-0266`, :cve:`2023-0386`, :cve:`2023-0394`, :cve:`2023-0458`, :cve:`2023-0459`, :cve:`2023-0461`, :cve:`2023-0468`, :cve:`2023-0469`, :cve:`2023-0590`, :cve:`2023-0615`, :cve_mitre:`2023-1032`, :cve:`2023-1073`, :cve:`2023-1074`, :cve:`2023-1076`, :cve:`2023-1077`, :cve:`2023-1078`, :cve:`2023-1079`, :cve:`2023-1095`, :cve:`2023-1118`, :cve:`2023-1192`, :cve:`2023-1194`, :cve:`2023-1195`, :cve:`2023-1206`, :cve:`2023-1249`, :cve:`2023-1252`, :cve:`2023-1281`, :cve:`2023-1295`, :cve:`2023-1380`, :cve:`2023-1382`, :cve:`2023-1390`, :cve:`2023-1513`, :cve:`2023-1582`, :cve:`2023-1583`, :cve:`2023-1611`, :cve:`2023-1637`, :cve:`2023-1652`, :cve:`2023-1670`, :cve:`2023-1829`, :cve:`2023-1838`, :cve:`2023-1855`, :cve:`2023-1859`, :cve:`2023-1872`, :cve:`2023-1989`, :cve:`2023-1990`, :cve:`2023-1998`, :cve:`2023-2002`, :cve:`2023-2006`, :cve:`2023-2007`, :cve:`2023-2008`, :cve:`2023-2019`, :cve:`2023-20569`, :cve:`2023-20588`, :cve:`2023-20593`, :cve:`2023-20928`, :cve:`2023-20938`, :cve:`2023-21102`, :cve:`2023-21106`, :cve:`2023-2124`, :cve:`2023-21255`, :cve:`2023-2156`, :cve:`2023-2162`, :cve:`2023-2163`, :cve:`2023-2166`, :cve:`2023-2177`, :cve:`2023-2194`, :cve:`2023-2235`, :cve:`2023-2236`, :cve:`2023-2248`, :cve:`2023-2269`, :cve:`2023-22995`, :cve:`2023-22996`, :cve:`2023-22997`, :cve:`2023-22998`, :cve:`2023-22999`, :cve:`2023-23000`, :cve:`2023-23001`, :cve:`2023-23002`, :cve:`2023-23003`, :cve:`2023-23004`, :cve:`2023-23006`, :cve:`2023-23454`, :cve:`2023-23455`, :cve:`2023-23559`, :cve:`2023-23586`, :cve:`2023-2430`, :cve:`2023-2483`, :cve:`2023-25012`, :cve:`2023-2513`, :cve:`2023-25775`, :cve:`2023-2598`, :cve:`2023-26544`, :cve:`2023-26545`, :cve:`2023-26605`, :cve:`2023-26606`, :cve:`2023-26607`, :cve:`2023-28327`, :cve:`2023-28328`, :cve:`2023-28410`, :cve:`2023-28464`, :cve:`2023-28466`, :cve:`2023-2860`, :cve:`2023-28772`, :cve:`2023-28866`, :cve:`2023-2898`, :cve:`2023-2985`, :cve:`2023-3006`, :cve:`2023-30456`, :cve:`2023-30772`, :cve:`2023-3090`, :cve:`2023-3106`, :cve:`2023-3111`, :cve:`2023-3117`, :cve:`2023-31248`, :cve:`2023-3141`, :cve:`2023-31436`, :cve:`2023-3159`, :cve:`2023-3161`, :cve:`2023-3212`, :cve:`2023-3220`, :cve:`2023-32233`, :cve:`2023-32247`, :cve:`2023-32248`, :cve:`2023-32250`, :cve:`2023-32252`, :cve:`2023-32254`, :cve:`2023-32257`, :cve:`2023-32258`, :cve:`2023-32269`, :cve:`2023-3268`, :cve:`2023-3269`, :cve:`2023-3312`, :cve:`2023-3317`, :cve:`2023-33203`, :cve:`2023-33250`, :cve:`2023-33288`, :cve:`2023-3338`, :cve:`2023-3355`, :cve:`2023-3357`, :cve:`2023-3358`, :cve:`2023-3359`, :cve:`2023-3389`, :cve:`2023-3390`, :cve:`2023-33951`, :cve:`2023-33952`, :cve:`2023-34255`, :cve:`2023-34256`, :cve:`2023-34319`, :cve:`2023-3439`, :cve:`2023-35001`, :cve:`2023-3567`, :cve:`2023-35788`, :cve:`2023-35823`, :cve:`2023-35824`, :cve:`2023-35826`, :cve:`2023-35828`, :cve:`2023-35829`, :cve:`2023-3609`, :cve:`2023-3610`, :cve:`2023-3611`, :cve:`2023-37453`, :cve:`2023-3772`, :cve:`2023-3773`, :cve:`2023-3776`, :cve:`2023-3777`, :cve:`2023-3812`, :cve:`2023-38409`, :cve:`2023-38426`, :cve:`2023-38427`, :cve:`2023-38428`, :cve:`2023-38429`, :cve:`2023-38430`, :cve:`2023-38431`, :cve:`2023-38432`, :cve:`2023-3863`, :cve_mitre:`2023-3865`, :cve_mitre:`2023-3866`, :cve_mitre:`2023-3867`, :cve:`2023-4004`, :cve:`2023-4015`, :cve:`2023-40283`, :cve:`2023-4128`, :cve:`2023-4132`, :cve:`2023-4147`, :cve:`2023-4155`, :cve:`2023-4194`, :cve:`2023-4206`, :cve:`2023-4207`, :cve:`2023-4208`, :cve:`2023-4273`, :cve:`2023-42752`, :cve:`2023-42753`, :cve:`2023-4385`, :cve:`2023-4387`, :cve:`2023-4389`, :cve:`2023-4394`, :cve:`2023-4459`, :cve:`2023-4569`, :cve:`2023-4611` and :cve:`2023-4623`
+- nghttp2: Fix :cve:`2023-35945`
+- openssl: Fix :cve:`2023-2975`, :cve:`2023-3446`, :cve:`2023-3817`, :cve:`2023-4807` and :cve:`2023-5363`
+- pixman: Ignore :cve:`2023-37769`
+- procps: Fix :cve:`2023-4016`
+- python3-git: Fix :cve:`2023-40267`, :cve:`2023-40590` and :cve:`2023-41040`
+- python3-pygments: Fix :cve:`2022-40896`
+- python3-urllib3: Fix :cve:`2023-43804` and :cve:`2023-45803`
+- python3: Fix :cve:`2023-24329` and :cve:`2023-40217`
+- qemu: Fix :cve:`2023-3180`, :cve:`2023-3354` and :cve:`2023-42467`
+- qemu: Ignore :cve:`2023-2680`
+- screen: Fix :cve:`2023-24626`
+- shadow: Fix :cve_mitre:`2023-4641`
+- tiff: Fix :cve:`2023-40745` and :cve:`2023-41175`
+- vim: Fix :cve:`2023-3896`, :cve:`2023-4733`, :cve:`2023-4734`, :cve:`2023-4735`, :cve:`2023-4736`, :cve:`2023-4738`, :cve:`2023-4750`, :cve:`2023-4752`, :cve:`2023-4781`, :cve:`2023-5441` and :cve:`2023-5535`
+- webkitgtk: Fix :cve:`2023-32435` and :cve:`2023-32439`
+- xserver-xorg: Fix :cve:`2023-5367` and :cve:`2023-5380`
+
+
+Fixes in Yocto-4.2.4
+~~~~~~~~~~~~~~~~~~~~
+
+- README: Update to point to new contributor guide
+- README: fix mail address in git example command
+- SECURITY.md: Add file
+- avahi: handle invalid service types gracefully
+- bind: upgrade to 9.18.19
+- bitbake.conf: add bunzip2 in :term:`HOSTTOOLS`
+- bitbake: Fix disk space monitoring on cephfs
+- bitbake: SECURITY.md: add file
+- brief-yoctoprojectqs: use new CDN mirror for sstate
+- bsp-guide: bsp.rst: replace reference to wiki
+- bsp-guide: bsp: skip Intel machines no longer supported in Poky
+- build-appliance-image: Update to mickledore head revision
+- build-sysroots: Add :term:`SUMMARY` field
+- build-sysroots: Ensure dependency chains are minimal
+- build-sysroots: target or native sysroot population need to be selected explicitly
+- buildtools-tarball: Add libacl
+- busybox: Set PATH in syslog initscript
+- busybox: remove coreutils dependency in busybox-ptest
+- cmake.bbclass: fix allarch override syntax
+- cml1: Fix KCONFIG_CONFIG_COMMAND not conveyed fully in do_menuconfig
+- contributor-guide/style-guide: Add a note about task idempotence
+- contributor-guide/style-guide: Refer to recipes, not packages
+- contributor-guide: deprecate "Accepted" patch status
+- contributor-guide: discourage marking patches as Inappropriate
+- contributor-guide: recipe-style-guide: add Upstream-Status
+- contributor-guide: recipe-style-guide: add more patch tagging examples
+- contributor-guide: recipe-style-guide: add section about CVE patches
+- contributor-guide: style-guide: discourage using Pending patch status
+- core-image-ptest: Define a fallback for :term:`SUMMARY` field
+- cve-check: add CVSS vector string to CVE database and reports
+- cve-check: don't warn if a patch is remote
+- cve-check: slightly more verbose warning when adding the same package twice
+- cve-check: sort the package list in the JSON report
+- cve-exclusion_6.1.inc: update for 6.1.57
+- dbus: add additional entries to :term:`CVE_PRODUCT`
+- dbus: upgrade to 1.14.10
+- dev-manual: add security team processes
+- dev-manual: disk-space: improve wording for obsolete sstate cache files
+- dev-manual: disk-space: mention faster "find" command to trim sstate cache
+- dev-manual: fix testimage usage instructions
+- dev-manual: layers: Add notes about layer.conf
+- dev-manual: licenses: mention :term:`SPDX` for license compliance
+- dev-manual: new-recipe.rst fix inconsistency with contributor guide
+- dev-manual: new-recipe.rst: add missing parenthesis to "Patching Code" section
+- dev-manual: new-recipe.rst: replace reference to wiki
+- dev-manual: remove unsupported :term: markup inside markup
+- dev-manual: start.rst: remove obsolete reference
+- ell: upgrade to 0.58
+- externalsrc: fix dependency chain issues
+- ffmpeg: upgrade to 5.1.3
+- ffmpeg: avoid neon on unsupported machines
+- file: fix call to localtime_r()
+- file: upgrade to 5.45
+- fontcache.bbclass: avoid native recipes depending on target fontconfig
+- gcc-crosssdk: ignore MULTILIB_VARIANTS in signature computation
+- gcc-runtime: remove bashism
+- gcc: backport a fix for ICE caused by CVE-2023-4039.patch
+- gcc: depend on zstd
+- gdb: fix :term:`RDEPENDS` for PACKAGECONFIG[tui]
+- glib-2.0: libelf has a configure option now, specify it
+- glibc: stable 2.37 branch updates
+- gnupg: Fix reproducibility failure
+- gnupg: upgrade to 2.4.3
+- go: upgrade to 1.20.7
+- graphene: fix runtime detection of IEEE754 behaviour
+- gstreamer: upgrade to 1.22.6
+- gtk4: upgrade to 4.10.5
+- gzip: upgrade to 1.13
+- igt-gpu-tools: do not write shortened git commit hash into binaries
+- inetutils: don't guess target paths
+- inetutils: remove obsolete cruft from do_configure
+- insane.bbclass: Count raw bytes in shebang-size
+- kernel.bbclass: Add force flag to rm calls
+- lib/package_manager: Improve repo artefact filtering
+- libc-test: Run as non-root user
+- libconvert-asn1-perl: upgrade to 0.34
+- libevent: fix patch Upstream-Status
+- libgudev: explicitly disable tests and vapi
+- librepo: upgrade to 1.15.2
+- librsvg: upgrade to 2.54.6
+- libsndfile1: upgrade to 1.2.2
+- libsoup-2.4: Only specify --cross-file when building for target
+- libsoup-2.4: update :term:`PACKAGECONFIG`
+- libx11: upgrade to 1.8.7
+- libxkbcommon: add :term:`CVE_PRODUCT`
+- libxpm: upgrade to 3.5.17
+- linux-firmware: add firmware files for NXP BT chipsets
+- linux-firmware: package Dragonboard 845c sensors DSP firmware
+- linux-firmware: package audio topology for Lenovo X13s
+- linux-firmware: upgrade to 20230804
+- linux-yocto/5.15: update to v5.15.133
+- linux-yocto/6.1: fix CONFIG_F2FS_IO_TRACE configuration warning
+- linux-yocto/6.1: fix IRQ-80 warnings
+- linux-yocto/6.1: fix uninitialized read in nohz_full/isolcpus setup
+- linux-yocto/6.1: tiny: fix arm 32 boot
+- linux-yocto/6.1: update to v6.1.57
+- linux-yocto: add script to generate kernel :term:`CVE_CHECK_IGNORE` entries
+- linux-yocto: make sure the pahole-native available before do_kernel_configme
+- linux/cve-exclusion: add generated CVE_CHECK_IGNOREs
+- linux/generate-cve-exclusions: fix mishandling of boundary values
+- linux/generate-cve-exclusions: print the generated time in UTC
+- manuals: add new contributor guide
+- manuals: correct "yocto-linux" by "linux-yocto"
+- mdadm: Disable further tests due to intermittent failures
+- mdadm: skip running 04update-uuid and 07revert-inplace testcases
+- migration-guides: add release notes for 4.0.12
+- migration-guides: add release notes for 4.0.13
+- migration-guides: add release notes for 4.2.3
+- mpfr: upgrade to 4.2.1
+- multilib.conf: explicitly make MULTILIB_VARIANTS vardeps on MULTILIBS
+- nativesdk-intercept: Fix bad intercept chgrp/chown logic
+- nettle: avoid neon on unsupported machines
+- oe-depends-dot: improve '-w' behavior
+- oeqa dnf_runtime.py: fix HTTP server IP address and port
+- oeqa selftest context.py: remove warning from missing meta-selftest
+- oeqa selftest context.py: whitespace fix
+- oeqa/concurrencytest: Remove invalid buffering option
+- oeqa/selftest/context.py: check git command return values
+- oeqa/selftest/wic: Improve assertTrue calls
+- oeqa/selftest: Fix broken symlink removal handling
+- oeqa/utils/gitarchive: Handle broken commit counts in results repo
+- openssl: upgrade to 3.1.4
+- openssl: build and install manpages only if they are enabled
+- openssl: ensure all ptest fails are caught
+- openssl: parallelize tests
+- overview: Add note about non-reproducibility side effects
+- packages.bbclass: Correct the check for conflicts with renamed packages
+- pango: explictly enable/disable libthai
+- patch.py: use --absolute-git-dir instead of --show-toplevel to retrieve gitdir
+- pixman: Remove duplication of license MIT
+- pixman: avoid neon on unsupported machines
+- poky.conf: bump version for 4.2.4 release
+- profile-manual: aesthetic cleanups
+- pseudo: Fix to work with glibc 2.38
+- ptest: report tests that were killed on timeout
+- python3-git: upgrade to 3.1.37
+- python3-urllib3: update to v1.26.18
+- python3: upgrade to 3.11.5
+- qemu: fix "Bad FPU state detected" fault on qemu-system-i386
+- ref-manual: Fix :term:`PACKAGECONFIG` term and add an example
+- ref-manual: Warn about :term:`COMPATIBLE_MACHINE` skipping native recipes
+- ref-manual: point outdated link to the new location
+- ref-manual: releases.svg: Scarthgap is now version 5.0
+- ref-manual: system-requirements: update supported distros
+- ref-manual: variables: add :term:`RECIPE_SYSROOT` and :term:`RECIPE_SYSROOT_NATIVE`
+- ref-manual: variables: add :term:`TOOLCHAIN_OPTIONS` variable
+- ref-manual: variables: add example for :term:`SYSROOT_DIRS` variable
+- ref-manual: variables: provide no-match example for :term:`COMPATIBLE_MACHINE`
+- resulttool/report: Avoid divide by zero
+- runqemu: check permissions of available render nodes as well as their presence
+- screen: upgrade to 4.9.1
+- scripts/create-pull-request: update URLs to git repositories
+- sdk-manual: appendix-obtain: improve and update descriptions
+- sdk-manual: extensible.rst: fix multiple formatting issues
+- shadow: fix patch Upstream-Status
+- strace: parallelize ptest
+- sudo: upgrade to 1.9.15p2
+- systemd-bootchart: musl fixes have been rejected upstream
+- systemd: backport patch to fix warning in systemd-vconsole-setup
+- tar: upgrade to 1.35
+- tcl: Add a way to skip ptests
+- tcl: prevent installing another copy of tzdata
+- template: fix typo in section header
+- test-manual: reproducible-builds: stop mentioning LTO bug
+- uboot-extlinux-config.bbclass: fix missed override syntax migration
+- vim: upgrade to 9.0.2048
+- vim: update obsolete comment
+- wayland-utils: add libdrm :term:`PACKAGECONFIG`
+- weston-init: fix init code indentation
+- weston-init: remove misleading comment about udev rule
+- wic: bootimg-partition: Fix file name in debug message
+- wic: fix wrong attempt to create file system in upartitioned regions
+- wireless-regdb: upgrade to 2023.09.01
+- xz: upgrade to 5.4.4
+- yocto-uninative: Update to 4.2 for glibc 2.38
+- yocto-uninative: Update to 4.3
+
+
+Known Issues in Yocto-4.2.4
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- N/A
+
+
+Contributors to Yocto-4.2.4
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Alberto Planas
+- Alexander Kanavin
+- Alexis Lothoré
+- Antoine Lubineau
+- Anuj Mittal
+- Archana Polampalli
+- Arne Schwerdt
+- BELHADJ SALEM Talel
+- Benjamin Bara
+- Bruce Ashfield
+- Chen Qi
+- Colin McAllister
+- Daniel Semkowicz
+- Dmitry Baryshkov
+- Eilís 'pidge' Ní Fhlannagáin
+- Emil Kronborg Andersen
+- Etienne Cordonnier
+- Jaeyoon Jung
+- Jan Garcia
+- Joe Slater
+- Joshua Watt
+- Julien Stephan
+- Kai Kang
+- Khem Raj
+- Lee Chee Yang
+- Markus Niebel
+- Markus Volk
+- Marta Rybczynska
+- Martijn de Gouw
+- Martin Jansa
+- Michael Halstead
+- Michael Opdenacker
+- Mikko Rapeli
+- Mingli Yu
+- Narpat Mali
+- Otavio Salvador
+- Ovidiu Panait
+- Peter Kjellerstedt
+- Peter Marko
+- Peter Suti
+- Poonam Jadhav
+- Quentin Schulz
+- Richard Purdie
+- Robert P. J. Day
+- Roland Hieber
+- Ross Burton
+- Ryan Eatmon
+- Sakib Sajal
+- Samantha Jalabert
+- Sanjana
+- Sanjay Chitroda
+- Sean Nyekjaer
+- Siddharth Doshi
+- Soumya Sambu
+- Stefan Tauner
+- Steve Sakoman
+- Tan Wen Yan
+- Tom Hochstein
+- Trevor Gamblin
+- Vijay Anusuri
+- Wang Mingyu
+- Xiangyu Chen
+- Yash Shinde
+- Yoann Congal
+- Yogita Urade
+- Yuta Hayama
+
+
+Repositories / Downloads for Yocto-4.2.4
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+poky
+
+- Repository Location: :yocto_git:`/poky`
+- Branch: :yocto_git:`mickledore </poky/log/?h=mickledore>`
+- Tag: :yocto_git:`yocto-4.2.4 </poky/log/?h=yocto-4.2.4>`
+- Git Revision: :yocto_git:`7235399a86b134e57d5eb783d7f1f57ca0439ae5 </poky/commit/?id=7235399a86b134e57d5eb783d7f1f57ca0439ae5>`
+- Release Artefact: poky-7235399a86b134e57d5eb783d7f1f57ca0439ae5
+- sha: 3d56bb4232ab29ae18249529856f0e638c50c764fc495d6beb1ecd295fa5e5e3
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.2.4/poky-7235399a86b134e57d5eb783d7f1f57ca0439ae5.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.2.4/poky-7235399a86b134e57d5eb783d7f1f57ca0439ae5.tar.bz2
+
+openembedded-core
+
+- Repository Location: :oe_git:`/openembedded-core`
+- Branch: :oe_git:`mickledore </openembedded-core/log/?h=mickledore>`
+- Tag: :oe_git:`yocto-4.2.4 </openembedded-core/log/?h=yocto-4.2.4>`
+- Git Revision: :oe_git:`23b5141400b2c676c806df3308f023f7c04e34e0 </openembedded-core/commit/?id=23b5141400b2c676c806df3308f023f7c04e34e0>`
+- Release Artefact: oecore-23b5141400b2c676c806df3308f023f7c04e34e0
+- sha: 152f4ee3cdd2e159f6bd34b01d517de44dfe670d35a5e3c84cc32ee7842d9741
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.2.4/oecore-23b5141400b2c676c806df3308f023f7c04e34e0.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.2.4/oecore-23b5141400b2c676c806df3308f023f7c04e34e0.tar.bz2
+
+meta-mingw
+
+- Repository Location: :yocto_git:`/meta-mingw`
+- Branch: :yocto_git:`mickledore </meta-mingw/log/?h=mickledore>`
+- Tag: :yocto_git:`yocto-4.2.4 </meta-mingw/log/?h=yocto-4.2.4>`
+- Git Revision: :yocto_git:`d87d4f00b9c6068fff03929a4b0f231a942d3873 </meta-mingw/commit/?id=d87d4f00b9c6068fff03929a4b0f231a942d3873>`
+- Release Artefact: meta-mingw-d87d4f00b9c6068fff03929a4b0f231a942d3873
+- sha: 8036847cf5bf3da9db4bad13aac9080d559848679f0ae03694d55a576bcaf75f
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.2.4/meta-mingw-d87d4f00b9c6068fff03929a4b0f231a942d3873.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.2.4/meta-mingw-d87d4f00b9c6068fff03929a4b0f231a942d3873.tar.bz2
+
+bitbake
+
+- Repository Location: :oe_git:`/bitbake`
+- Branch: :oe_git:`2.4 </bitbake/log/?h=2.4>`
+- Tag: :oe_git:`yocto-4.2.4 </bitbake/log/?h=yocto-4.2.4>`
+- Git Revision: :oe_git:`c7e094ec3beccef0bbbf67c100147c449d9c6836 </bitbake/commit/?id=c7e094ec3beccef0bbbf67c100147c449d9c6836>`
+- Release Artefact: bitbake-c7e094ec3beccef0bbbf67c100147c449d9c6836
+- sha: 6a35a62bee3446cd0f9e0ec1de9b8f60fc396109075b37d7c4a1f2e6d63271c6
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.2.4/bitbake-c7e094ec3beccef0bbbf67c100147c449d9c6836.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.2.4/bitbake-c7e094ec3beccef0bbbf67c100147c449d9c6836.tar.bz2
+
+yocto-docs
+
+- Repository Location: :yocto_git:`/yocto-docs`
+- Branch: :yocto_git:`mickledore </yocto-docs/log/?h=mickledore>`
+- Tag: :yocto_git:`yocto-4.2.4 </yocto-docs/log/?h=yocto-4.2.4>`
+- Git Revision: :yocto_git:`91a29ca94314c87fd3dc68601cd4932bdfffde35 </yocto-docs/commit/?id=91a29ca94314c87fd3dc68601cd4932bdfffde35>`
+
diff --git a/poky/documentation/migration-guides/release-notes-4.3.rst b/poky/documentation/migration-guides/release-notes-4.3.rst
index 87cd622743..85180dfc3c 100644
--- a/poky/documentation/migration-guides/release-notes-4.3.rst
+++ b/poky/documentation/migration-guides/release-notes-4.3.rst
@@ -1,16 +1,24 @@
.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
-Release notes for 4.3 (nandbield)
-----------------------------------
+Release notes for 4.3 (nanbield)
+--------------------------------
New Features / Enhancements in 4.3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Linux kernel 6.x, glibc 2.xx and ~xxx other recipe upgrades
+- Linux kernel 6.5 and 6.1, gcc 13, glibc 2.38, LLVM 17, and over 300 other recipe upgrades
+
+- The autobuilder's shared-state artefacts are now available over the `jsDelivr
+ <https://jsdelivr.com>`__ Content Delivery Network (CDN).
+ See :term:`SSTATE_MIRRORS`.
- New variables:
- - :term:`FILE_LAYERNAME`: bitbake now sets this to the name of the layer containing the recipe
+ - :term:`CVE_CHECK_STATUSMAP`, :term:`CVE_STATUS`, :term:`CVE_STATUS_GROUPS`,
+ replacing the deprecated :term:`CVE_CHECK_IGNORE`.
+
+ - :term:`FILE_LAYERNAME`: bitbake now sets this to the name of the layer
+ containing the recipe
- :term:`FIT_ADDRESS_CELLS` and :term:`UBOOT_FIT_ADDRESS_CELLS`.
See details below.
@@ -19,62 +27,257 @@ New Features / Enhancements in 4.3
- :term:`KERNEL_DTBVENDORED`: whether to keep vendor subdirectories.
+ - :term:`KERNEL_LOCALVERSION`: to add a string to the kernel version
+ information.
+
+ - :term:`KERNEL_STRIP`: to specify the command to strip the kernel binary.
+
- :term:`LICENSE_FLAGS_DETAILS`: add extra details about a recipe license
in case it is not allowed by :term:`LICENSE_FLAGS_ACCEPTED`.
-- Layername functionality available through overrides
+ - :term:`MESON_TARGET`: to compile a specific Meson target instead of the
+ default ones.
+
+ - :term:`OEQA_REPRODUCIBLE_TEST_PACKAGE`: to restrict package managers used
+ in reproducibility testing.
+
+- Layername functionality available through overrides
- Code can now know which layer a recipe is coming from through the newly added :term:`FILE_LAYERNAME`
- variable. This has been added as an override of the form ``layer-<layername>``. In particular,
- this means QA checks can now be layer specific, for example::
+ Code can now know which layer a recipe is coming from through the newly added :term:`FILE_LAYERNAME`
+ variable. This has been added as an override of the form ``layer-<layername>``. In particular,
+ this means QA checks can now be layer specific, for example::
- ERROR_QA:layer-core:append = " patch-status"
+ ERROR_QA:layer-core:append = " patch-status"
- which will enable the ``patch-status`` QA check for the core layer.
+ This will enable the ``patch-status`` QA check for the core layer.
- Architecture-specific enhancements:
+ - RISCV support is now enabled in LLVM 17.
+
+ - Loongarch support in the :ref:`ref-classes-linuxloader` class and
+ ``core-image-minimal-initramfs`` image.
+
+ - The ``arch-armv8`` and ``arch-armv9`` architectures are now given
+ `Scalable Vector Extension (SVE)
+ <https://developer.arm.com/documentation/100891/0612/sve-overview/introducing-sve>`__
+ based tune options. Commits:
+ :yocto_git:`1 </poky/commit/?id=e4be03be5be62e367a40437a389121ef97d6cff3>`,
+ :yocto_git:`2 </poky/commit/?id=8cd5d264af4c346730531cb98ae945ab862dbd69>`.
+
+ - Many changes to support 64-bit ``time_t`` on 32-bit architectures
+
- Kernel-related enhancements:
+ - The default kernel is the current stable (6.5), and there is also support
+ for the latest long-term release (6.1).
+
+ - The list of fixed kernel CVEs is updated regularly using data from
+ `linuxkernelcves.com <https://linuxkernelcves.com>`__.
+
+ - A ``showconfig`` task was added to the :ref:`ref-classes-cml1` class, to
+ easily examine the final generated ``.config`` file.
+
- New core recipes:
-- New classes:
+ - `appstream <https://github.com/ximion/appstream>`__: a collaborative effort
+ for making machine-readable software metadata easily available
+ (from meta-oe)
+
+ - `cargo-c-native <https://crates.io/crates/cargo-c>`__: cargo applet to build
+ and install C-ABI compatible dynamic and static libraries
+
+ - `libadwaita <https://gitlab.gnome.org/GNOME/libadwaita>`__: Building blocks
+ for modern GNOME applications (from meta-gnome)
+
+ - `libtraceevent <https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/>`__:
+ API to access the kernel tracefs directory (from meta-openembedded)
+
+ - `libxmlb <https://github.com/hughsie/libxmlb>`__: A library to help create
+ and query binary XML blobs (from meta-oe)
+
+ - ``musl-legacy-error``: glibc ``error()`` API implementation still needed
+ by a few packages.
+
+ - `python3-beartype <https://beartype.readthedocs.io>`__, unbearably fast
+ runtime type checking in pure Python.
+
+ - `python3-booleanpy <https://github.com/bastikr/boolean.py>`__: Define boolean
+ algebras, create and parse boolean expressions and create custom boolean DSL
+ (from meta-python)
+
+ - `python3-calver <https://github.com/di/calver>`__: Setuptools extension for
+ CalVer package versions
- - A ``ptest-cargo`` class was added to allow Cargo based recipes to easily add ptests
+ - `python3-click <http://click.pocoo.org/>`__: A simple wrapper around optparse
+ for powerful command line utilities (from meta-python)
-- QEMU/runqemu enhancements:
+ - ``python3-dtc``: Python Library for the Device Tree Compiler (from
+ meta-virtualization)
- - QEMU has been upgraded to version 8.0
+ - `python3-isodate <https://github.com/gweis/isodate/>`__: ISO 8601 date/time
+ parser (from meta-python)
+
+ - `python3-license-expression <https://github.com/nexB/license-expression>`__:
+ Utility library to parse, compare, simplify and normalize license expressions
+ (from meta-python)
+
+ - `python3-rdflib <https://github.com/RDFLib/rdflib>`__: a pure Python package
+ for working with RDF (from meta-python)
+
+ - `python3-spdx-tools <https://github.com/spdx/tools-python>`__,
+ tools for SPDX validation and conversion.
+
+ - `python3-trove-classifiers <https://github.com/pypa/trove-classifiers>`__:
+ Canonical source for classifiers on PyPI (pypi.org)
+
+ - `python3-uritools <https://github.com/tkem/uritools/>`__, replacement for
+ the ``urllib.parse`` module.
+
+ - `python3-xmltodict <https://github.com/martinblech/xmltodict>`__: Makes
+ working with XML feel like you are working with JSON (from meta-python)
+
+ - `ttyrun <https://github.com/ibm-s390-linux/s390-tools>`__, starts
+ ``getty`` programs only when a terminal exists, preventing respawns
+ through the ``init`` program. This enabled removing the
+ ``SERIAL_CONSOLES_CHECK`` variable.
+
+ - ``vulkan-validation-layers``: Khronos official validation layers to assist in
+ verifying that applications correctly use the
+ `Vulkan API <https://www.khronos.org/vulkan>`__.
+
+ - `xcb-util-cursor <http://xcb.freedesktop.org/XcbUtil/>`__: XCB port of
+ libXcursor (from meta-oe)
+
+- QEMU / ``runqemu`` enhancements:
+
+ - QEMU has been upgraded to version 8.1
+
+ - Many updates to the ``runqemu`` command.
+
+ - The ``qemu-system-native`` recipe is now built with PNG support, which could be
+ useful to grab screenshots for error reporting purposes.
- Rust improvements:
- - Rust has been upgraded to version 1.69
+ - Rust has been upgraded to version 1.70
-- Image-related enhancements:
+ - New ``ptest-cargo`` class was added to allow Cargo based recipes to easily add ptests
+
+ - New :ref:`ref-classes-cargo_c` class was added to allow recipes to make Rust code
+ available to C and C++ programs. See
+ ``meta-selftest/recipes-devtools/rust/rust-c-lib-example_git.bb`` for an example.
- wic Image Creator enhancements:
+ - ``bootimg-efi``: if ``fixed-size`` is set then use that for mkdosfs
+
+ - ``bootimg-efi``: stop hardcoding VMA offsets, as required by systemd-boot v254
+ (and dracut/ukify)
+
+ - ``bootimg-pcbios``: use kernel name from :term:`KERNEL_IMAGETYPE` instead of
+ hardcoding ``vmlinuz``
+
+ - Added new ``gpt-hybrid`` option to ``ptable_format`` (formatting a disk with a hybrid
+ MBR and GPT partition scheme)
+
+ - Use ``part_name`` in default imager when defined
+
+ - Added ``--hidden`` argument to default imager to avoid MS Windows prompting to
+ format partition after flashing to a USB stick/SD card
+
- FIT image related improvements:
- New :term:`FIT_ADDRESS_CELLS` and :term:`UBOOT_FIT_ADDRESS_CELLS` variables allowing
to specify 64 bit addresses, typically for loading U-Boot.
+ - Added ``compatible`` line to config section (with value from dtb) to allow bootloaders
+ to select the best matching configuration.
+
+
- SDK-related improvements:
+ - Extended the following recipes to ``nativesdk``: ``libwebp``, ``python3-ply``
+
- Testing:
+ - The :ref:`ref-classes-insane` class now adds an :ref:`unimplemented-ptest
+ <qa-check-unimplemented-ptest>` infrastructure to detect package sources
+ with unit tests but no implemented ptests in the recipe.
+
+ - A new task to perform recipe-wide QA checks was added: ``do_recipe_qa``.
+
+ - New build-time checks for set :term:`SUMMARY`, :term:`HOMEPAGE`, and
+ :term:`RECIPE_MAINTAINER` fields was added, and enabled for the core
+ recipes.
+
+ - The ``parselogs`` runtime test was rewritten. Notably it no longer uses
+ regular expressions, which may mean custom patterns need updating.
+
+ - A self-test to validate that the :term:`SPDX` manifests generated by
+ image builds are valid was added.
+
+ - The ``QEMU_USE_SLIRP`` variable has been replaced by adding ``slirp`` to
+ ``TEST_RUNQEMUPARAMS``.
+
- Utility script changes:
+ - New ``scripts/patchtest`` utility to check patches to the
+ OpenEmbedded-Core project. See
+ :ref:`contributor-guide/submit-changes:validating patches with patchtest`
+ for details.
+
+ - ``scripts/bblock`` was added, allowing the user to lock/unlock specific
+ recipes from being built. This makes it possibly to work on the
+ ``python3`` recipe without causing ``python3-native`` to rebuild.
+
- BitBake improvements:
+ - A fetcher for the Google Cloud Platform (``gs://``) was added.
+
- The BitBake Cooker log now contains notes when the caches are
- invalidated which is useful for memory resident bitbake debugging.
+ invalidated which is useful for memory resident BitBake debugging.
+
+ - BitBake no longer watches files with :wikipedia:`inotify <inotify>` for
+ changes, as under load this can lead to races causing build instability.
+
+ - Toaster's dependencies were upgraded to current releases, specifically
+ to Django 4.2.
- Packaging changes:
+ - :term:`FILES` now accepts a ``**`` wildcard, which matches zero or more
+ subdirectories.
+
+ - The X server packagegroup now defaults to using the ``modesetting`` X
+ driver, which obsoletes the ``fbdev`` driver.
+
+ - If a recipe uses :term:`LICENSE_FLAGS` and the licenses are not accepted,
+ it can set a custom message with :term:`LICENSE_FLAGS_DETAILS` to be
+ displayed to the users.
+
+ - Recipes that fetch specific revisions no longer need to explicitly add
+ :term:`SRCPV` to :term:`PV` as BitBake will now automatically add the
+ revision information to :term:`PKGV` if needed (as long as "+" is still
+ present in the :term:`PKGV` value, which is set from :term:`PV` by
+ default).
+
+ - The default :term:`PR` values in many recipes have been removed.
+
+- Security improvements:
+
+ - Most repositories now include a :yocto_git:`SECURITY.md
+ </poky/tree/SECURITY.md>` file with hints for security researchers
+ and other parties who might report potential security vulnerabilities.
+
- Prominent documentation updates:
- - Long due documentation for the :ref:`ref-classes-devicetree` class.
+ - New :doc:`../contributor-guide/index` document.
+
+ - New :doc:`../dev-manual/security-subjects` chapter in the Development
+ Tasks Manual.
+
+ - Long overdue documentation for the :ref:`ref-classes-devicetree` class.
- New :ref:`summary about available init systems
<dev-manual/init-manager:summary>`.
@@ -85,26 +288,678 @@ New Features / Enhancements in 4.3
- Miscellaneous changes:
- - Git based recipes in OE-Core which used the git protocol have been
- changed to use https where possibile. https is now believed to be
- faster and more reliable.
+ - Selecting systemd via :term:`INIT_MANAGER` now adds ``usrmerge`` to
+ :term:`DISTRO_FEATURES` as current versions of systemd now require
+ merged ``/usr``.
+
+ - Generation of :term:`SPDX` manifests is now enabled by default.
+
+ - Git based recipes in OE-Core which used the ``git`` protocol have been
+ changed to use `https`` where possible, as it is typically faster and
+ more reliable.
- The ``os-release`` recipe added a ``CPE_NAME`` to the fields provided, with the
default being populated from :term:`DISTRO`.
+ - The ``psplash`` recipe now accepts a PNG format image through
+ :term:`SPLASH_IMAGES`, instead of a harder to generate and modify
+ ``.h`` file.
+
+ - The ; character is no longer needed to separate functions specified in
+ :term:`IMAGE_POSTPROCESS_COMMAND`, :term:`IMAGE_PREPROCESS_COMMAND`,
+ :term:`POPULATE_SDK_POST_HOST_COMMAND`, :term:`ROOTFS_POSTINSTALL_COMMAND`
+ etc. (If any are present they will be replaced with spaces, so existing
+ metadata does not yet need to be changed.)
+
+ - In the ``Upstream-Status`` field in a patch header, "Accepted" is no longer
+ a valid value since it is logically the same as "Backport". Change any
+ values you have (particularly in patches applied through bbappends for core
+ recipes, since they will be validated as indicated above).
+
+
Known Issues in 4.3
~~~~~~~~~~~~~~~~~~~
+- N/A
+
+
Recipe License changes in 4.3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The following corrections have been made to the :term:`LICENSE` values set by recipes:
+- ``glib-networking``: make :term:`LICENSE` more accurate (``LGPL-2.1`` -> ``LGPL-2.1-or-later``) and add an exception for linking to OpenSSL if it is enabled (``openssl`` is in :term:`PACKAGECONFIG`)
+- ``libbsd``: set per-package licensing to clarify that BSD-4-Clause code is only in the ``-doc`` package
+- ``openssh``: BSD-4-Clause code has been removed completely from the codebase as part of 9.4p1 update - previously in the kirkstone release, ``BSD-4-Clause`` was removed from the :term:`LICENSE` value in our recipe, however some BSD-4-Clause code actually still remained upstream until 9.4p1.
+- ``python3-sphinx``: remove ``BSD-3-Clause`` from :term:`LICENSE` - BSD-3-Clause code was removed as part of the python3-sphinx 7.0.1 release (see `this upstream commit <https://github.com/sphinx-doc/sphinx/commit/a7f5d91c29d6f377b9fe7e926965c6f9d3e7b802>`__)
+
+
Security Fixes in 4.3
~~~~~~~~~~~~~~~~~~~~~
+- bind: :cve:`2023-2911`, :cve:`2023-2828`, :cve:`2023-3341`, :cve:`2023-4236`
+- binutils: :cve:`2023-1972`
+- connman: :cve:`2023-28488`
+- cups: :cve:`2023-32324`, :cve:`2023-34241`, :cve:`2023-4504`
+- dbus: :cve:`2023-34969`
+- dmidecode: :cve:`2023-30630`
+- dropbear: :cve:`2023-36328`
+- erofs-utils: :cve:`2023-33551`, :cve:`2023-33552`
+- gcc: :cve:`2023-4039`
+- ghostscript: :cve:`2023-28879`, :cve:`2023-36664`, :cve:`2023-38559;` ignore :cve:`2023-38560`
+- git: :cve:`2023-25652`, :cve:`2023-29007`
+- glibc: :cve:`2023-4527`, :cve:`2023-4806`
+- go: :cve:`2023-24537`, :cve:`2023-39325`
+- gstreamer: :cve:`2023-40475`, :cve:`2023-40476`
+- inetutils: :cve:`2023-40303`
+- libarchive: ignore :cve:`2023-30571`
+- librsvg: :cve:`2023-38633`
+- libwebp: :cve:`2023-1999`, :cve:`2023-4863`
+- libx11: :cve:`2023-3138`, :cve:`2023-43785`, :cve:`2023-43786`, :cve:`2023-43787`
+- libxml2: :cve:`2023-28484`, :cve:`2023-29469;` ignore disputed :cve:`2023-45322`
+- libxpm: :cve:`2023-43788`, :cve:`2023-43789`, :cve:`2022-44617`
+- linux: update CVE exclusions
+- ncurses: :cve:`2023-29491`
+- nghttp2: :cve:`2023-44487`
+- ninja: ignore :cve:`2021-4336`, wrong ninja
+- openssh: :cve:`2023-38408`
+- openssl: :cve:`2023-2650`, :cve:`2023-1255`, :cve:`2023-0466`, :cve:`2023-0465`, :cve:`2023-0464`, :cve:`2023-3817`, :cve:`2023-3446`, :cve:`2023-2975`, :cve:`2023-4807`
+- perl: :cve:`2023-31484`, :cve:`2023-31486`
+- pixman: ignore :cve:`2023-37769`
+- procps: :cve:`2023-4016`
+- python3-git: :cve:`2023-41040`
+- python3: ignore :cve:`2023-36632`
+- python3-urllib3: :cve:`2023-43804`
+- qemu: :cve:`2023-40360`, :cve:`2023-42467;` ignore :cve:`2023-0664` (Windows-specific), ignore :cve:`2023-2680` (RHEL specific)
+- screen: :cve:`2023-24626`
+- shadow: :cve:`2023-29383`
+- sqlite3: ignore :cve:`2023-36191`
+- sysstat: :cve:`2023-33204`
+- tiff: :cve:`2022-4645`, :cve:`2023-2731`, :cve:`2023-26965`, :cve:`2023-40745`, :cve:`2023-41175`
+- vim: :cve:`2023-2426`, :cve:`2023-2609`, :cve:`2023-2610`, :cve:`2023-3896`, :cve:`2023-5441`, :cve:`2023-5535`
+- zlib: ignore :cve:`2023-45853`
+
+
Recipe Upgrades in 4.3
~~~~~~~~~~~~~~~~~~~~~~
+- acpica: upgrade 20220331 -> 20230628
+- adwaita-icon-theme: 43 -> 45.0
+- alsa-lib: upgrade 1.2.8 -> 1.2.10
+- alsa-ucm-conf: upgrade 1.2.8 -> 1.2.10
+- alsa-utils: upgrade 1.2.8 -> 1.2.10
+- apr: upgrade 1.7.2 -> 1.7.4
+- apt: Upgrade to v2.6.0
+- at-spi2-core: update 2.46.0 -> 2.50.0
+- autoconf: Upgrade to 2.72c
+- babeltrace2: upgrade 2.0.4 -> 2.0.5
+- bind: upgrade 9.18.12 -> 9.18.19
+- binutils: Upgrade to 2.41 release
+- bluez5: upgrade 5.66 -> 5.69
+- boost: upgrade 1.81.0 -> 1.83.0
+- btrfs-tools: upgrade 6.1.3 -> 6.5.1
+- busybox: 1.36.0 -> 1.36.1
+- ccache: upgrade 4.7.4 -> 4.8.3
+- cmake: upgrade to 3.27.5
+- connman: update 1.41 -> 1.42
+- coreutils: upgrade 9.1 -> 9.4
+- cpio: upgrade to 2.14
+- cracklib: upgrade 2.9.10 -> 2.9.11
+- createrepo-c: update 0.20.1 -> 1.0.0
+- cryptodev: update to 1.13 + latest git
+- cups: upgrade to 2.4.6
+- curl: upgrade 8.0.1 -> 8.4.0
+- dbus: upgrade 1.14.6 -> 1.14.10
+- debianutils: upgrade 5.8 -> 5.13
+- dhcpcd: upgrade to 10.0.2
+- diffoscope: upgrade 236 -> 249
+- diffutils: update 3.9 -> 3.10
+- dmidecode: upgrade to 3.5
+- dnf: upgrade 4.14.0 -> 4.17.0
+- dos2unix: upgrade 7.4.4 -> 7.5.1
+- dpkg: upgrade to v1.22.0
+- efivar: Upgrade to tip of trunk
+- elfutils: upgrade 0.188 -> 0.189
+- ell: upgrade 0.56 -> 0.58
+- enchant2: upgrade 2.3.4 -> 2.6.1
+- epiphany: upgrade 43.1 -> 44.6
+- erofs-utils: update 1.5 -> 1.6
+- ethtool: upgrade 6.2 -> 6.5
+- eudev: Upgrade 3.2.11 -> 3.2.12
+- ffmpeg: update 5.1.2 -> 6.0
+- file: upgrade 5.44 -> 5.45
+- flac: Upgrade 1.4.2 -> 1.4.3
+- font-util: upgrade 1.4.0 -> 1.4.1
+- freetype: upgrade 2.13.0 -> 2.13.2
+- fribidi: upgrade 1.0.12 -> 1.0.13
+- gawk: upgrade 5.2.1 -> 5.2.2
+- gcc: upgrade to 13.2
+- gcompat: Upgrade to 1.1.0
+- gcr: update 4.0.0 -> 4.1.0
+- gdb: upgrade 13.1 -> 13.2
+- gettext: upgrade 0.21.1 -> 0.22
+- ghostscript: upgrade to 10.02.0
+- git: upgrade to 2.42.0
+- glib-2.0: upgrade 2.74.6 -> 2.78.0
+- glibc: upgrade to 2.38 + stable updates
+- glib-networking: upgrade 2.74.0 -> 2.76.1
+- glslang: upgrade to 1.3.243
+- gmp: upgrade 6.2.1 -> 6.3.0
+- gnu-efi: upgrade 3.0.15 -> 3.0.17
+- gnupg: upgrade 2.4.0 -> 2.4.3
+- gnutls: update 3.8.0 -> 3.8.1
+- gobject-introspection: upgrade 1.74.0 -> 1.78.1
+- go-helloworld: Upgrade to tip of trunk
+- go: update 1.20.1 -> 1.20.10
+- gpgme: update 1.18.0 -> 1.22.0
+- grep: upgrade 3.10 -> 3.11
+- groff: update 1.22.4 -> 1.23.0
+- gsettings-desktop-schemas: upgrade 43.0 -> 44.0
+- gstreamer1.0: upgrade 1.22.0 -> 1.22.5
+- gstreamer: upgrade 1.22.5 -> 1.22.6
+- gtk+3: upgrade 3.24.36 -> 3.24.38
+- gtk4: update 4.10.0 -> 4.12.3
+- gzip: update 1.12 -> 1.13
+- harfbuzz: upgrade 7.1.0 -> 8.2.1
+- icu: upgrade 72-1 -> 73-2
+- igt-gpu-tools: update 1.27.1 -> 1.28
+- iproute2: upgrade 6.2.0 -> 6.5.0
+- iso-codes: upgrade 4.13.0 -> 4.15.0
+- jquery: upgrade 3.6.3 -> 3.7.1
+- json-c: upgrade 0.16 -> 0.17
+- kbd: upgrade 2.5.1 -> 2.6.3
+- kea: upgrade to v2.4.0
+- kexec-tools: upgrade 2.0.26 -> 2.0.27
+- kmscube: upgrade to latest revision
+- less: update 608 -> 643
+- libadwaita: upgrade 1.3.3 -> 1.4.0
+- libarchive: upgrade 3.6.2 -> 3.7.2
+- libassuan: upgrade 2.5.5 -> 2.5.6
+- libatomic-ops: update 7.6.14 -> 7.8.0
+- libcap: upgrade 2.67 -> 2.69
+- libcgroup: update 3.0.0 -> 3.1.0
+- libconvert-asn1-perl: upgrade 0.33 -> 0.34
+- libdnf: update 0.70.1 -> 0.70.1
+- libdrm: upgrade 2.4.115 -> 2.4.116
+- libedit: upgrade 20221030-3.1 -> 20230828-3.1
+- libevdev: upgrade 1.13.0 -> 1.13.1
+- libgcrypt: update 1.10.1 -> 1.10.2
+- libgit2: upgrade 1.6.3 -> 1.7.1
+- libglu: update 9.0.2 -> 9.0.3
+- libgpg-error: update 1.46 -> 1.47
+- libgudev: upgrade 237 -> 238
+- libhandy: upgrade 1.8.1 -> 1.8.2
+- libinput: upgrade to 1.24.0
+- libjpeg-turbo: upgrade to 3.0.0
+- libksba: upgrade 1.6.3 -> 1.6.4
+- libmd: upgrade 1.0.4 -> 1.1.0
+- libmicrohttpd: upgrade 0.9.76 -> 0.9.77
+- libmodule-build-perl: upgrade 0.4232 -> 0.4234
+- libmodulemd: upgrade 2.14.0 -> 2.15.0
+- libnl: upgrade 3.7.0 -> 3.8.0
+- libnss-nis: upgrade 3.1 -> 3.2
+- libpam: update 1.5.2 -> 1.5.3
+- libpcap: upgrade 1.10.3 -> 1.10.4
+- libpng: upgrade 1.6.39 -> 1.6.40
+- libportal: upgrade 0.6 -> 0.7.1
+- libproxy: update 0.4.18 -> 0.5.3
+- libpthread-stubs: update 0.4 -> 0.5
+- librepo: upgrade 1.15.1 -> 1.16.0
+- librsvf: update 2.54.5 -> 2.56.0
+- librsvg: update 2.56.0 -> 2.56.3
+- libsdl2: upgrade 2.26.3 -> 2.28.3
+- libsecret: upgrade 0.20.5 -> 0.21.1
+- libsndfile1: upgrade 1.2.0 -> 1.2.2
+- libsolv: upgrade 0.7.23 -> 0.7.25
+- libsoup: upgrade 3.2.2 -> 3.4.2
+- libssh2: update 1.10.0 -> 1.11.0
+- libtraceevent: upgrade 1.7.2 -> 1.7.3
+- libubootenv: upgrade 0.3.3 -> 0.3.4
+- liburi-perl: update 5.17 -> 5.21
+- libuv: upgrade 1.44.2 -> 1.46.0
+- libva: update 2.16 -> 2.19.0
+- libva-utils: update 2.19.0 -> 2.20.0
+- libwebp: upgrade 1.3.0 -> 1.3.2
+- libx11: upgrade 1.8.4 -> 1.8.7
+- libxcb: upgrade 1.15 -> 1.16
+- libxcrypt: upgrade 4.4.33 -> 4.4.36
+- libxfixes: Upgrade to v6.0.1
+- libxft: upgrade 2.3.7 -> 2.3.8
+- libxi: upgrade to v1.8.1
+- libxml2: upgrade 2.10.3 -> 2.11.5
+- libxpm: upgrade 3.5.15 -> 3.5.17
+- libxslt: upgrade 1.1.37 -> 1.1.38
+- libxt: Upgrade to v1.3.0
+- lighttpd: upgrade 1.4.69 -> 1.4.71
+- linux-firmware: upgrade 20230210 -> 20230804
+- linux-libc-headers: uprev to v6.5
+- linux-yocto/6.1: update to v6.1.57
+- linux-yocto-dev: update to v6.6-rcX
+- linux-yocto: introduce 6.5 reference kernel recipes
+- llvm: Upgrade to 17.0.2
+- ltp: upgrade 20230127 -> 20230516
+- lttng-modules: Upgrade 2.13.9 -> 2.13.10
+- lttng-tools: Upgrade 2.13.9 -> 2.13.11
+- lttng-ust: upgrade 2.13.5 -> 2.13.6
+- lua: update 5.4.4 -> 5.4.6
+- man-pages: upgrade 6.03 -> 6.05.01
+- mc: upgrade 4.8.29 -> 4.8.30
+- mesa: upgrade 23.0.0 -> 23.2.1
+- meson: upgrade 1.0.1 -> 1.2.2
+- mmc-utils: upgrade to latest revision
+- mobile-broadband-provider-info: upgrade 20221107 -> 20230416
+- mpfr: upgrade 4.2.0 -> 4.2.1
+- mpg123: upgrade 1.31.2 -> 1.31.3
+- msmtp: upgrade 1.8.23 -> 1.8.24
+- mtd-utils: upgrade 2.1.5 -> 2.1.6
+- mtools: upgrade 4.0.42 -> 4.0.43
+- musl: update to latest master
+- neard: upgrade 0.18 -> 0.19
+- nettle: upgrade 3.8.1 -> 3.9.1
+- nfs-utils: upgrade 2.6.2 -> 2.6.3
+- nghttp2: upgrade 1.52.0 -> 1.57.0
+- ofono: upgrade 2.0 -> 2.1
+- openssh: upgrade to 9.5p1
+- openssl: upgrade 3.1.0 -> 3.1.3
+- opkg: upgrade 0.6.1 -> 0.6.2
+- opkg-utils: upgrade 0.5.0 -> 0.6.2
+- orc: upgrade 0.4.33 -> 0.4.34
+- ovmf: update 202211 -> 202305
+- ovmf: update edk2-stable202305 -> edk2-stable202308
+- p11-kit: upgrade 0.24.1 -> 0.25.0
+- pango: upgrade 1.50.13 -> 1.51.0
+- parted: upgrade 3.5 -> 3.6
+- patchelf: Upgrade 0.17.2 -> 0.18.0
+- pciutils: upgrade 3.9.0 -> 3.10.0
+- perlcross: update 1.4 -> 1.5
+- perl: update 5.36.0 -> 5.38.0
+- piglit: upgrade to latest revision
+- pigz: upgrade 2.7 -> 2.8
+- pkgconf: upgrade 1.9.4 -> 2.0.3
+- ppp: upgrade 2.4.9 -> 2.5.0
+- procps: update 4.0.3 -> 4.0.4
+- puzzles: upgrade to latest revision
+- python3-attrs: upgrade 22.2.0 -> 23.1.0
+- python3-build: upgrade to 1.0.3
+- python3-certifi: upgrade 2022.12.7 -> 2023.7.22
+- python3-chardet: upgrade 5.1.0 -> 5.2.0
+- python3-cryptography{-vectors}: upgrade 39.0.2 -> 41.0.4
+- python3-cython: upgrade 0.29.33 -> 0.29.36
+- python3-dbusmock: upgrade 0.28.7 -> 0.29.1
+- python3-docutils: upgrade 0.19 -> 0.20.1
+- python3-dtc: upgrade 1.6.1 -> 1.7.0
+- python3-dtschema: upgrade 2023.1 -> 2023.7
+- python3-editables: upgrade 0.3 -> 0.5
+- python3-flit-core: upgrade 3.8.0 -> 3.9.0
+- python3-git: upgrade 3.1.31 -> 3.1.36
+- python3-hatch-fancy-pypi-readme: upgrade 22.8.0 -> 23.1.0
+- python3-hatchling: upgrade 1.13.0 -> 1.18.0
+- python3-hypothesis: upgrade 6.68.2 -> 6.86.2
+- python3-importlib-metadata: upgrade 6.0.0 -> 6.8.0
+- python3-installer: upgrade 0.6.0 -> 0.7.0
+- python3-iso8601: upgrade 1.1.0 -> 2.0.0
+- python3-jsonpointer: upgrade to 2.4
+- python3-libarchive-c: upgrade 4.0 -> 5.0
+- python3-lxml: upgrade 4.9.2 -> 4.9.3
+- python3-markdown: upgrade 3.4.1 -> 3.4.4
+- python3-markupsafe: upgrade 2.1.2 -> 2.1.3
+- python3-more-itertools: upgrade 9.1.0 -> 10.1.0
+- python3-numpy: upgrade 1.24.2 -> 1.26.0
+- python3-packaging: upgrade 23.0 -> 23.1
+- python3-pathspec: upgrade 0.11.0 -> 0.11.2
+- python3-pip: upgrade 23.0.1 -> 23.2.1
+- python3-pluggy: upgrade 1.0.0 -> 1.3.0
+- python3-poetry-core: upgrade 1.5.2 -> 1.7.0
+- python3-psutil: upgrade 5.9.4 -> 5.9.5
+- python3-pyasn1: upgrade 0.4.8 -> 0.5.0
+- python3-pycairo: upgrade 1.23.0 -> 1.24.0
+- python3-pycryptodome: upgrade 3.17 -> 3.19.0
+- python3-pycryptodomex: upgrade 3.17 -> 3.19.0
+- python3-pyelftools: upgrade 0.29 -> 0.30
+- python3-pygments: upgrade 2.14.0 -> 2.16.1
+- python3-pygobject: upgrade 3.42.2 -> 3.46.0
+- python3-pyopenssl: upgrade 23.0.0 -> 23.2.0
+- python3-pyparsing: upgrade 3.0.9 -> 3.1.1
+- python3-pytest-subtests: upgrade 0.10.0 -> 0.11.0
+- python3-pytest: upgrade 7.2.2 -> 7.4.2
+- python3-pytz: upgrade 2022.7.1 -> 2023.3
+- python3-pyyaml: upgrade 6.0 -> 6.0.1
+- python3-requests: Upgrade to 2.31.0
+- python3-ruamel-yaml: upgrade 0.17.21 -> 0.17.32
+- python3-setuptools-rust: upgrade 1.5.2 -> 1.7.0
+- python3-setuptools: upgrade 67.6.0 -> 68.2.2
+- python3-smmap: upgrade 5.0.0 -> 6.0.0
+- python3-sphinx-rtd-theme: upgrade 1.2.0 -> 1.3.0
+- python3-sphinx: upgrade 6.1.3 -> 7.2.6
+- python3-trove-classifiers: upgrade 2023.4.29 -> 2023.9.19
+- python3-typing-extensions: upgrade 4.5.0 -> 4.8.0
+- python3: upgrade 3.11.2 -> 3.11.5
+- python3-urllib3: upgrade 1.26.15 -> 2.0.6
+- python3-webcolors: upgrade 1.12 -> 1.13
+- python3-wheel: upgrade 0.40.0 -> 0.41.2
+- python3-zipp: upgrade 3.15.0 -> 3.17.0
+- qemu: Upgrade 7.2.0 -> 8.1.0
+- re2c: upgrade 3.0 -> 3.1
+- repo: upgrade 2.32 -> 2.36.1
+- rpcsvc-proto: Upgrade to 1.4.4
+- rpm2cpio.sh: update to the last 4.x version
+- rpm: update 4.18.0 -> 4.18.1
+- ruby: upgrade 3.2.1 -> 3.2.2
+- rust: Upgrade 1.68.1 -> 1.70.0
+- screen: update 4.9.0 -> 4.9.1
+- seatd: upgrade 0.7.0 -> 0.8.0
+- serf: upgrade 1.3.9 -> 1.3.10
+- shaderc: upgrade 2023.2 -> 2023.6
+- spirv-headers: upgrade 1.3.239.0 -> 1.3.243.0
+- spirv-tools: upgrade 1.3.239.0 -> 1.3.243.0
+- sqlite3: upgrade 3.41.0 -> 3.43.1
+- squashfs-tools: upgrade 4.5.1 -> 4.6.1
+- sstatesig: Update to match bitbake changes to runtaskdeps
+- strace: upgrade 6.2 -> 6.5
+- stress-ng: upgrade 0.15.06 -> 0.16.05
+- sudo: update 1.9.13p3 -> 1.9.14p3
+- sysfsutils: update 2.1.0 -> 2.1.1
+- sysklogd: upgrade 2.4.4 -> 2.5.2
+- sysstat: update 12.6.2 -> 12.7.4
+- systemd: upgrade 253.1 -> 254.4
+- systemtap: upgrade 4.8 -> 4.9
+- taglib: upgrade 1.13 -> 1.13.1
+- tar: upgrade 1.34 -> 1.35
+- tcf-agent: Update to 1.8.0 release
+- texinfo: upgrade 7.0.2 -> 7.0.3
+- tiff: upgrade to 4.6.0
+- u-boot: Upgrade to 2023.10
+- util-linux: upgrade 2.38.1 -> 2.39.2
+- vala: upgrade 0.56.4 -> 0.56.13
+- valgrind: update 3.20.0 -> 3.21.0
+- vim: upgrade 9.0.1429 -> 9.0.2048
+- vte: upgrade 0.72.0 -> 0.72.2
+- vulkan-headers: upgrade to 1.3.243
+- vulkan-loader: upgrade to 1.3.243
+- vulkan-samples: update to latest SHA
+- vulkan-tools: upgrade to 1.3.243
+- vulkan: upgrade 1.3.243.0 -> 1.3.261.1
+- waffle: upgrade 1.7.0 -> 1.7.2
+- wayland-protocols: upgrade 1.31 -> 1.32
+- wayland: upgrade 1.21.0 -> 1.22.0
+- wayland-utils: upgrade 1.1.0 -> 1.2.0
+- webkitgtk: update 2.38.5 -> 2.40.5
+- weston: update 11.0.1 -> 12.0.2
+- wget: upgrade 1.21.3 -> 1.21.4
+- wireless-regdb: upgrade 2023.02.13 -> 2023.09.01
+- wpebackend-fdo: upgrade 1.14.0 -> 1.14.2
+- xcb-proto: upgrade 1.15.2 -> 1.16.0
+- xdpyinfo: upgrade 1.3.3 -> 1.3.4
+- xeyes: upgrade 1.2.0 -> 1.3.0
+- xf86-input-libinput: upgrade 1.2.1 -> 1.4.0
+- xf86-input-mouse: upgrade 1.9.4 -> 1.9.5
+- xinput: upgrade to v1.6.4
+- xkeyboard-config: upgrade 2.38 -> 2.39
+- xorgproto: upgrade 2022.2 -> 2023.2
+- xserver-xorg: upgrade 21.1.7 -> 21.1.8
+- xtrans: update 1.4.0 -> 1.5.0
+- xwayland: upgrade 22.1.8 -> 23.2.1
+- xwininfo: upgrade to v1.1.6
+- xxhash: upgrade 0.8.1 -> 0.8.2
+- xz: upgrade 5.4.2 -> 5.4.4
+- zlib: upgrade 1.2.13 -> 1.3
+- zstd: upgrade 1.5.4 -> 1.5.5
+
+
+
+
Contributors to 4.3
~~~~~~~~~~~~~~~~~~~
+
+Thanks to the following people who contributed to this release:
+
+- Adrian Freihofer
+- Alassane Yattara
+- Alberto Pianon
+- Alberto Planas
+- Alejandro Hernandez Samaniego
+- Alexander Kanavin
+- Alexandre Belloni
+- Alexis Lothoré
+- Alex Kiernan
+- Andreas Cord-Landwehr
+- André Draszik
+- Andrej Valek
+- Andrew Jeffery
+- Andrey Zhizhikin
+- Angelo Ribeiro
+- Antoine Lubineau
+- Antonin Godard
+- Anuj Mittal
+- Archana Polampalli
+- Armin Kuster
+- Arne Schwerdt
+- Arno Baumfalk
+- Arslan Ahmad
+- Bartosz Golaszewski
+- BELHADJ SALEM Talel
+- BELOUARGA Mohamed
+- Benjamin Bara
+- Benjamin Bouvier
+- Bergin, Peter
+- Bruce Ashfield
+- Changhyeok Bae
+- Changqing Li
+- Charles-Antoine Couret
+- Charlie Wu
+- Chen Qi
+- Chi Xu
+- Chris Laplante
+- Christopher Larson
+- Daniel Ammann
+- Daniel McGregor
+- Daniel Semkowicz
+- David Reyna
+- Deepthi Hemraj
+- Denis OSTERLAND-HEIM
+- Denys Dmytriyenko
+- Derek Straka
+- Dit Kozmaj
+- Dmitry Baryshkov
+- Ed Beroset
+- Eero Aaltonen
+- Eilís 'pidge' Ní Fhlannagáin
+- Emil Ekmečić
+- Emil Kronborg Andersen
+- Enrico Jörns
+- Enrico Scholz
+- Etienne Cordonnier
+- Fabien Mahot
+- Fabio Estevam
+- Fahad Arslan
+- Frank WOLFF
+- Frederic Martinsons
+- Frieder Paape
+- Frieder Schrempf
+- Geoff Parker
+- Hannu Lounento
+- Ian Ray
+- Insu Park
+- Jaeyoon Jung
+- Jamin Lin
+- Jan Garcia
+- Jan Vermaete
+- Jasper Orschulko
+- Jean-Marie Lemetayer
+- Jérémy Rosen
+- Jermain Horsman
+- Jialing Zhang
+- Joel Stanley
+- Joe Slater
+- Johannes Schrimpf
+- Jon Mason
+- Jörg Sommer
+- Jose Quaresma
+- Joshua Watt
+- Julien Stephan
+- Kai Kang
+- Khem Raj
+- Kyle Russell
+- Lee Chee Yang
+- Lei Maohui
+- Leon Anavi
+- Lorenzo Arena
+- Louis Rannou
+- Luan Rafael Carneiro
+- Luca Boccassi
+- Luca Ceresoli
+- Marc Ferland
+- Marcus Flyckt
+- Marek Vasut
+- Mark Asselstine
+- Mark Hatle
+- Markus Niebel
+- Markus Volk
+- Marlon Rodriguez Garcia
+- Marta Rybczynska
+- Martijn de Gouw
+- Martin Jansa
+- Martin Siegumfeldt
+- Matthias Schnelte
+- Mauro Queiros
+- Max Krummenacher
+- Michael Halstead
+- Michael Opdenacker
+- Mickael RAMILISON
+- Mikko Rapeli
+- Ming Liu
+- Mingli Yu
+- Narpat Mali
+- Natasha Bailey
+- Nikhil R
+- Ninad Palsule
+- Ola x Nilsson
+- Oleksandr Hnatiuk
+- Otavio Salvador
+- Ovidiu Panait
+- Pascal Bach
+- Patrick Williams
+- Paul Eggleton
+- Paul Gortmaker
+- Paulo Neves
+- Pavel Zhukov
+- Pawan Badganchi
+- Peter Bergin
+- Peter Hoyes
+- Peter Kjellerstedt
+- Peter Marko
+- Peter Suti
+- Petr Gotthard
+- Petr Kubizňák
+- Piotr Łobacz
+- Poonam Jadhav
+- Qiu Tingting
+- Quentin Schulz
+- Randolph Sapp
+- Randy MacLeod
+- Ranjitsinh Rathod
+- Rasmus Villemoes
+- Remi Peuvergne
+- Richard Purdie
+- Riyaz Khan
+- Robert Joslyn
+- Robert P. J. Day
+- Robert Yang
+- Roland Hieber
+- Ross Burton
+- Ryan Eatmon
+- Sakib Sajal
+- Samantha Jalabert
+- Sanjay Chitroda
+- Sean Nyekjaer
+- Sergei Zhmylev
+- Siddharth Doshi
+- Soumya Sambu
+- Staffan Rydén
+- Stefano Babic
+- Stefan Tauner
+- Stéphane Veyret
+- Stephan Wurm
+- Sudip Mukherjee
+- Sundeep KOKKONDA
+- Svend Meyland Nicolaisen
+- Tan Wen Yan
+- Thomas Roos
+- Tim Orling
+- Tom Hochstein
+- Tom Isaacson
+- Trevor Gamblin
+- Ulrich Ölmann
+- Victor Kamensky
+- Vincent Davis Jr
+- Virendra Thakur
+- Wang Mingyu
+- Xiangyu Chen
+- Yang Xu
+- Yash Shinde
+- Yi Zhao
+- Yoann Congal
+- Yogita Urade
+- Yuta Hayama
+- Zang Ruochen
+- Zhixiong Chi
+
+
+Repositories / Downloads for Yocto-4.3
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+poky
+
+- Repository Location: :yocto_git:`/poky`
+- Branch: :yocto_git:`nanbield </poky/log/?h=nanbield>`
+- Tag: :yocto_git:`yocto-4.3 </poky/log/?h=yocto-4.3>`
+- Git Revision: :yocto_git:`15b576c4101231d248fda7ae0824e1780e1a8901 </poky/commit/?id=15b576c4101231d248fda7ae0824e1780e1a8901>`
+- Release Artefact: poky-15b576c4101231d248fda7ae0824e1780e1a8901
+- sha: 6b0ef7914d15db057f3efdf091b169a7361c74aac0abcfa717ef55d1a0adf74c
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.3/poky-15b576c4101231d248fda7ae0824e1780e1a8901.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.3/poky-15b576c4101231d248fda7ae0824e1780e1a8901.tar.bz2
+
+openembedded-core
+
+- Repository Location: :oe_git:`/openembedded-core`
+- Branch: :oe_git:`nanbield </openembedded-core/log/?h=nanbield>`
+- Tag: :oe_git:`yocto-4.3 </openembedded-core/log/?h=yocto-4.3>`
+- Git Revision: :oe_git:`4c261f8cbdf0c7196a74daad041d04eb093015f3 </openembedded-core/commit/?id=4c261f8cbdf0c7196a74daad041d04eb093015f3>`
+- Release Artefact: oecore-4c261f8cbdf0c7196a74daad041d04eb093015f3
+- sha: c9e6ac75d7848ce8844cb29c98659dd8f83b3de13b916124dff76abe034e6a5c
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.3/oecore-4c261f8cbdf0c7196a74daad041d04eb093015f3.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.3/oecore-4c261f8cbdf0c7196a74daad041d04eb093015f3.tar.bz2
+
+meta-mingw
+
+- Repository Location: :yocto_git:`/meta-mingw`
+- Branch: :yocto_git:`nanbield </meta-mingw/log/?h=nanbield>`
+- Tag: :yocto_git:`yocto-4.3 </meta-mingw/log/?h=yocto-4.3>`
+- Git Revision: :yocto_git:`65ef95a74f6ae815f63f636ed53e140a26a014ce </meta-mingw/commit/?id=65ef95a74f6ae815f63f636ed53e140a26a014ce>`
+- Release Artefact: meta-mingw-65ef95a74f6ae815f63f636ed53e140a26a014ce
+- sha: fb2bf806941a00a1be6349c074379b63a76490bcf0f3b740d96d1aeeefa12286
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.3/meta-mingw-65ef95a74f6ae815f63f636ed53e140a26a014ce.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.3/meta-mingw-65ef95a74f6ae815f63f636ed53e140a26a014ce.tar.bz2
+
+bitbake
+
+- Repository Location: :oe_git:`/bitbake`
+- Branch: :oe_git:`2.6 </bitbake/log/?h=2.6>`
+- Tag: :oe_git:`yocto-4.3 </bitbake/log/?h=yocto-4.3>`
+- Git Revision: :oe_git:`5419a8473d6d4cd1d01537de68ad8d72cf5be0b2 </bitbake/commit/?id=5419a8473d6d4cd1d01537de68ad8d72cf5be0b2>`
+- Release Artefact: bitbake-5419a8473d6d4cd1d01537de68ad8d72cf5be0b2
+- sha: e5dab4b3345d91307860803e2ad73b2fcffa9d17dd3fde0e013ca0ebea0d05ca
+- Download Locations:
+ http://downloads.yoctoproject.org/releases/yocto/yocto-4.3/bitbake-5419a8473d6d4cd1d01537de68ad8d72cf5be0b2.tar.bz2
+ http://mirrors.kernel.org/yocto/yocto/yocto-4.3/bitbake-5419a8473d6d4cd1d01537de68ad8d72cf5be0b2.tar.bz2
+
+yocto-docs
+
+- Repository Location: :yocto_git:`/yocto-docs`
+- Branch: :yocto_git:`nanbield </yocto-docs/log/?h=nanbield>`
+- Tag: :yocto_git:`yocto-4.3 </yocto-docs/log/?h=yocto-4.3>`
+- Git Revision: :yocto_git:`ceb1812e63b9fac062f886c2a1dde23137c0e1ed </yocto-docs/commit/?id=ceb1812e63b9fac062f886c2a1dde23137c0e1ed>`
+
diff --git a/poky/documentation/overview-manual/concepts.rst b/poky/documentation/overview-manual/concepts.rst
index 4e3f6425a4..d335c2fcdd 100644
--- a/poky/documentation/overview-manual/concepts.rst
+++ b/poky/documentation/overview-manual/concepts.rst
@@ -2189,3 +2189,173 @@ For more information, see the
BitBake User Manual. You can also reference the "`Why Not
Fakeroot? <https://github.com/wrpseudo/pseudo/wiki/WhyNotFakeroot>`__"
article for background information on Fakeroot and Pseudo.
+
+BitBake Tasks Map
+=================
+
+To understand how BitBake operates in the build directory and environment
+we can consider the following recipes and diagram, to have full picture
+about the tasks that BitBake runs to generate the final package file
+for the recipe.
+
+We will have two recipes as an example:
+
+- ``libhello``: A recipe that provides a shared library
+- ``sayhello``: A recipe that uses ``libhello`` library to do its job
+
+.. note::
+
+ ``sayhello`` depends on ``libhello`` at compile time as it needs the shared
+ library to do the dynamic linking process. It also depends on it at runtime
+ as the shared library loader needs to find the library.
+ For more details about dependencies check :ref:`ref-varlocality-recipe-dependencies`.
+
+``libhello`` sources are as follows:
+
+- ``LICENSE``: This is the license associated with this library
+- ``Makefile``: The file used by ``make`` to build the library
+- ``hellolib.c``: The implementation of the library
+- ``hellolib.h``: The C header of the library
+
+``sayhello`` sources are as follows:
+
+- ``LICENSE``: This is the license associated with this project
+- ``Makefile``: The file used by ``make`` to build the project
+- ``sayhello.c``: The source file of the project
+
+Before presenting the contents of each file, here are the steps
+that we need to follow to accomplish what we want in the first place,
+which is integrating ``sayhello`` in our root file system:
+
+#. Create a Git repository for each project with the corresponding files
+
+#. Create a recipe for each project
+
+#. Make sure that ``sayhello`` recipe :term:`DEPENDS` on ``libhello``
+
+#. Make sure that ``sayhello`` recipe :term:`RDEPENDS` on ``libhello``
+
+#. Add ``sayhello`` to :term:`IMAGE_INSTALL` to integrate it into
+ the root file system
+
+The following are the contents of ``libhello/Makefile``::
+
+ LIB=libhello.so
+
+ all: $(LIB)
+
+ $(LIB): hellolib.o
+ $(CC) $< -Wl,-soname,$(LIB).1 -fPIC $(LDFLAGS) -shared -o $(LIB).1.0
+
+ %.o: %.c
+ $(CC) -c $<
+
+ clean:
+ rm -rf *.o *.so*
+
+.. note::
+
+ When creating shared libraries, it is strongly recommended to follow the Linux
+ conventions and guidelines (see `this article
+ <https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html>`__
+ for some background).
+
+.. note::
+
+ When creating ``Makefile`` files, it is strongly recommended to use ``CC``, ``LDFLAGS``
+ and ``CFLAGS`` as BitBake will set them as environment variables according
+ to your build configuration.
+
+The following are the contents of ``libhello/hellolib.h``::
+
+ #ifndef HELLOLIB_H
+ #define HELLOLIB_H
+
+ void Hello();
+
+ #endif
+
+The following are the contents of ``libhello/hellolib.c``::
+
+ #include <stdio.h>
+
+ void Hello(){
+ puts("Hello from a Yocto demo \n");
+ }
+
+The following are the contents of ``sayhello/Makefile``::
+
+ EXEC=sayhello
+ LDFLAGS += -lhello
+
+ all: $(EXEC)
+
+ $(EXEC): sayhello.c
+ $(CC) $< $(LDFLAGS) $(CFLAGS) -o $(EXEC)
+
+ clean:
+ rm -rf $(EXEC) *.o
+
+The following are the contents of ``sayhello/sayhello.c``::
+
+ #include <hellolib.h>
+
+ int main(){
+ Hello();
+ return 0;
+ }
+
+The following are the contents of ``libhello_0.1.bb``::
+
+ SUMMARY = "Hello demo library"
+ DESCRIPTION = "Hello shared library used in Yocto demo"
+
+ # NOTE: Set the License according to the LICENSE file of your project
+ # and then add LIC_FILES_CHKSUM accordingly
+ LICENSE = "CLOSED"
+
+ # Assuming the branch is main
+ # Change <username> accordingly
+ SRC_URI = "git://github.com/<username>/libhello;branch=main;protocol=https"
+
+ S = "${WORKDIR}/git"
+
+ do_install(){
+ install -d ${D}${includedir}
+ install -d ${D}${libdir}
+
+ install hellolib.h ${D}${includedir}
+ oe_soinstall ${PN}.so.${PV} ${D}${libdir}
+ }
+
+The following are the contents of ``sayhello_0.1.bb``::
+
+ SUMMARY = "SayHello demo"
+ DESCRIPTION = "SayHello project used in Yocto demo"
+
+ # NOTE: Set the License according to the LICENSE file of your project
+ # and then add LIC_FILES_CHKSUM accordingly
+ LICENSE = "CLOSED"
+
+ # Assuming the branch is main
+ # Change <username> accordingly
+ SRC_URI = "git://github.com/<username>/sayhello;branch=main;protocol=https"
+
+ DEPENDS += "libhello"
+ RDEPENDS:${PN} += "libhello"
+
+ S = "${WORKDIR}/git"
+
+ do_install(){
+ install -d ${D}/usr/bin
+ install -m 0700 sayhello ${D}/usr/bin
+ }
+
+After placing the recipes in a custom layer we can run ``bitbake sayhello``
+to build the recipe.
+
+The following diagram shows the sequences of tasks that BitBake
+executes to accomplish that.
+
+.. image:: svg/bitbake_tasks_map.*
+ :width: 100%
diff --git a/poky/documentation/overview-manual/svg/bitbake_tasks_map.svg b/poky/documentation/overview-manual/svg/bitbake_tasks_map.svg
new file mode 100644
index 0000000000..09ef36faae
--- /dev/null
+++ b/poky/documentation/overview-manual/svg/bitbake_tasks_map.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Do not edit this file with editors other than draw.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="12270px" height="3804px" viewBox="-0.5 -0.5 12270 3804" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2023-11-01T08:31:56.536Z&quot; agent=&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36&quot; etag=&quot;p-CQVME_iMteI52En1Eq&quot; version=&quot;22.0.8&quot; type=&quot;device&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;c7558073-3199-34d8-9f00-42111426c3f3&quot;&gt;7V1bc6M6tv41rprzYAohro9JnO7O2X1JJZk9Z89LCtvEZtox3oA7nfn1R1yEQcjmLmRHPVV7YowxRp++dV9rAm9ef3/27d36m7d0NhNFXv6ewNlEUaCl6uj/oiPvyRFFM2FyZOW7y+QYOBx4dP/rpAfl9OjeXTpB4cTQ8zahuyseXHjbrbMIC8ds3/feiqe9eJvit+7slVM68LiwN+Wj/3KX4To5air64fgXx12t8TcD3UremduLnyvf22/T79t6Wyd559XGl0l/Y7C2l95b7hC8ncAb3/PC5K/X3zfOJnqu+Ikln/t05N3sln1nG9b5gPOn9ja72cPZi/UlfHp//N+7+WoKLTO5zi97s08fRnq74Tt+OvHvc6LLgAm8flu7ofO4sxfRu28IEOjYOnzdpG+/uJvNjbfxfPQ6fhrwemkH6+zjL942/GS/upsIK1/duePboett0Tc+2tsgPeHR2/vx9ddhiCCgaPAK/Qf9tOg/0QmBtPK81caxd24gLbzX+I1FEJ/66SW5PPqz8AWacp1+RfnRpU/zl+OHzu/cofRRfna8Vyf00TVl/K6lpuuaYt7Er98OAFLM9Ng6Dx4tPWinoF1lFz+sHvojXcAmi4l3XW7tnCUCevrS88O1t/K29ub2cPT6cPSr5+3SVfqPE4bv6T6196FXXGP02Pz3/0MvZMnQ8Ou/8m/OosckZ6/es1fLq2i7opeLjR0E7uJp7W6TNz65G3z9AmAWe//XeaAnwN97fIHSpQ9tf+WEJ89Mt2G0fifx6DsbdIe/ikRGg1b8UfT07ffcCTvPRY8jd+X76EAO5oZqFGBu6QTLVH1AT6nyAOzkHg4wz35Me+SrssEI+b/dMA989PKv3FsH2Ecv3vN7IPlUo91SQH4Q+t7PTDpBgmknClzKC8dRsjNz78jxv4+0e7BUG3v3mFZRSABACmniE4psnv7EMPsne7RCDWioBphytRqAl7CgBijqUGoAwoxYzDaLCWuspWIwXUugKsOv5SpSxVKZc4nrip6ijiRvfmmhVXNpARhsaXUGS3uJy5nR6SnKVdluUxmUlq5a/ywubidttLsyelA/K023FFsHm+38dUusMFaqlpbVt2bZzeSHJiPDpyVsihj/ICABUObC/jBBUephAjxmfUyx5kg/fyDbQ1UFhLmDMFThWUIYyOrJDwzlfyqrbgLDY2NYxVrZuWFYHZiH9+EP7fr+38Gnuf63/Cd0vb9n0ykQEOYQwup5ahLoE+xZmBrL1Ddhigb0ztIO7Wn09zTwF/EZ+t/7KAB7nSAkwgdCxxFsxMjIcAFnV/4iMsgX0YO7RkhHhqbjHy6J/lpF/x++7vBtpJfG75Q2XGNzH+/OdJvlPTlZvJl766y+6W+Q3nGzbPrTvDgDGv5tWLO74X/ZxrhV186Se2fHTmjAN84ZAb15/s9hGIgDmDVhwQEYKKOb8RhIZ6S3tXI2nuapS9LpMjKqQVsaV7QFNG0UISa81yNAr3e3Tl3o0Y1Ozn1/GUZzCD3glY7RQtpOIQBXM/3to4BRhSpfPIjvnDP9Dd/D/HBAnRjX3/759enu29XNl+enq4fPt0/PPx4nxiyn6M3JCwjlr6PyB4vKn0qLPLPV/nB6ghDd58qWsLbo7j2psSNbQi7ZcuPO1+j2PUF6/ZAeVHQJOzZS3tOUsY1eHCBh7XYTFHbCnK1BYXxlz2R3zhmFBfa7oLAeKcwyinrb+PyF6wfPjr8u2W6tnd6l633TWKugLMQZxLjUyjwdlDVPnj5MTDYzhwTSzxHp2nkiHRB1V4ygfl6k3sKG/zC4NziL0Fht6lvPys3zcaDFR1JiU0rV9REoVTHalDcI7YEPqCt67/EdJlCfamNoDzKf2YuyBKa+LDwRfTlTie4Y8sieCCifldLKA2S6UGftzEZD4YI6gSwXE7+ruNPST54/UAnZeYUDPgqIFU6KFxqDGEB1BA0AtqrAESgeHMW9B60YoVjDgGKKYv2sHL4fBcVQ46QlVmMU68YoKD4rx8OHQTEnkbfmKDbHcJ9BU6CYRxSbxnmiuNSdkJFnjM+yOuEZGzRHx0yxOVqODq5OONWfTdT6dmVNnFJfo6kSZ6VLbRynPUrTyl7bafAWh2tF6VI7MNIXv3cJ3pGr+KxcQhJiu/HsZSCkZD9SclrqZDp+ATruFHYOuSmXLUprlxLhrsLc0BefpUQrN1QEcw3FXBCOzFzoFsZR6FOFLnuRU81OKHR9TIBooxTyANYurKjXZUVOkp0VIv1INSq8MsT5BoteawCWS6cQXa7382hxJUST9mtEejF37gPH39qvTnY0plDpUOZ0CVya225O/I+2EaEOLbjsiVGBQlKqSkknUiBLToVwnEzlzEgWnMqCU+tWfA6VAkIJExLuQ5lAePKj0k8dQN7YZ15iZ6Ui8jMSPeud6flQSC/ouSd61samZ4BTshvRc8EtKKpK2PGsVlt3xSnuvFj0Wpl/OLHohUHfD78BItPXoBTVa0y5TSvHib/ZPx30XJzLWN2cpHrRov+lX52XYPE/mmzT4389rT1WL9K1z7Jb8o2wcG+/wgimoRZfhWfly2kzCJcHFHaQZXrdQK8KOZNlejm49vXu5vb74+3F0Qob1bhEH5RpfGzpQwFtWuAydFR0bkRak3HEmGGgg9pKNx8zkohmFxasKNEiTtdZ+CPwQ81x6Iv7W9rZ4WJ9cSzKl3JmURRz1uzKPFeqJbtKsqwXGNa0YAOORe/cO76LnprjT/rzMPMA8S6EWjcvQcGoHHvaEcmQ5klCJYfSyBCwYNRyzkTsrt24c2khKHVYSqU4ctlSataDjjMHW+gMNe2KE0wy9LBpxV4RozvYlJGajYuuu6f6SFVLVd667hplW4AH6greA9/zwunSCcKl6wsW64fFshY3J2gMKCx5DMoj56iIrmLHG95U05k1Wh3Q6TvnjM58Z+HunGnKaoLN+mEzC9RgM8A07InbOgs244jNao9EMDirJDP4HIngvtorR5BYPyQGoSzhrkYneAx7mBjR2LgBfEFjJ8ipmsawD5QXGjNZDZYcZxLaKcwVQhIfB4C9t9XuKEcNLuXoPhCOjb6kqCpLSjEHkpYHp0KcBc5Ijo7T84k/HuQBkh2oz6ybLwf6byfVEYF8NqNwt4vNfimMiN6MCE0iGoxalHm4GpQMpvxnnZU7hAfgdCGp2rlyFmf6mclnEGrjzgVB9UNQqmZl1HOCoJjrZ2XDIMvbEamQ/ebtQKUooIAMygAwKd56rNcPsPzlIiVcaCsFnlQeZCAQ0IkEFDI5DxhSubMkNQA9XPKWVdaQCyCQyok2Agb9wkBVasNgMC6waDpIp3XPPfM056lQQmb7i1SD5V73bLC2AFaTPMB9SfIrq2cY6D9XztRbmCEM24P2kZdeSn5P7sP4KANFs8y6MZJWjuSiQ4Losi5rFY1QymVChG8TAPJKya/u3FJFJwqSAGbhujOmyA8Mk3CfLXaOrW8RS72Ha3e7ij4dwRYbb/Njgev5wZ6TX7zNMjIC5XBtR7/PDSIg+k7gxD+XfsHHvx4ffvx4ep7dPTweue6bG/+cOfpeeeHtXLRHI+LzHak/8ZIvFuWuTHnQ6lUyodGkGJV0RWK4zOxW1e+d3PwNSL6tiCqIF1FHpYC6zrYBMr5bMbsmE5pZFbOTQ4YZMXurwWsddTUVFtzEkmVZFdshfkWWF7aJuxUTBBrvIspOPOt9lfVOqlGf2LsTu9W+Ak01JlU1RtlXfLZ1XnrP7jYI7egX1HO1I80gLG5le+OutujvBYJbtBmvI/3BXdibq/SNV3e5TEJLTuD+155vsNWdLi66rnY90WbRtRBRBAlnANrOy5SXY/oX1/uvvmKlGCSsKe1MLYpiRRomPVa8lWfAXLqjjlULGLO41kf8stSiWmM4tw3gM20LUdbC2764q72fGZNz/8BXgsY4oDEcZDRoOGZLW2YJxSLGyKo3gElxB7Btt6LQ4gpckFja70cQGJcEhqPm9H5SVTHz4ehMoU3i4wLP+y0iyp8C0HwDWpHJTty06ZJsLQulss4uXbkD7kAegvIiW6/DQfgS/yucN8rWyEUtcnDHZyV3E/889OUy0Ha/k88QV9Hp8Y16WwstgrsLnGqNxg526PegFy/u70gLIpJBib1BuMFy72i6BowL2jXAqLNraO3rB9w1lV2PxK4xxK4Z0/qjaEuM90ilC0PsEVPskREly5S0MCgeE8Z7ppzbwYmFgT6+iwcYCBODZ0iX8ktlmjubsYlR9gIKQUBcxRKCYExBAGptG7ayAFZ6T8W2AbLYN2NKG7VGpJzxruGzb1QUc/B2+40dOs8NW+EJxYkFlDVAJnNToJyN4GGEZeFlqpYAQEiAMYuezBrbhqkEgBrzEUrN0sk7p8qKFHQFZ23VGPzce1OadqmysKQqVeTKAo3oasIoWRbSrHViP/VaDMo1FBuEqci0UWo9jkqhwkyrGECDsFpwoRizPBKrYXBUsxrepJx0scnunDOrS4xZ7m/MMgSczVlW1LKDTMxZHia3VMFdkU80mGScXKoqpdW/1Gm4vC3+6GNys2YC3A9yzKk8jcbkinJIRVVr23gaHzbesYzloyZe6QOGysDCU8tpzIH9nhSTiYmNA5MnB1Nw1XKIBK//xa0+oyrC0irX1o+GqyGEeG6GaMZxwZ5Qte5kAohHn48tJbXGnlAdT2pk6wlVaQmswhNazYaqBiTLKtoMHDQnUseZSCCmC5xak9qd6/oP5HREE5+pumJAWZ9OT9Xkb0JZ5mUVPMYPj2lKXR7TVL54DN85ZzwmBkT1yGIWjxOi0PMZhcfEhKi+ua+2oxbPxBm6+3A5dybrxV3RNLg341ErO1l5oNV51MxX0GpPymE0eco6/CtAztIo8XHGQ6gUnU8U4t51U1kCAo79wHEKiH7Q1JHwMtMMDX3k4QNV8rnofSu6juf2wlxS40OZ65iuSmTaA1WVKLqslfQm7u0QbZRtfCeKHB0tzjT4EHqEUVuPMBjpEWhPEUlPMhGtqTvFAOgVF+ppiEH5jtOCqGM3VvqArlV54+Gp8wfyxevVzSQqS0jUUgnJONLvEX1x/F1y/j11Ylz/68fDH7O7h4mB3vyUJC8ePluvoAXtiK/23NlMBqsY20SXRyy9dHxMikvnxd7H9xcgkexuV08xcSuHA1+dl5BrljotwEpiOKqt2m7RUqePapLG64+LZ2SCG2Qf+uRVR5LSiU94Ly+BM4xRgzPcOVMn8ba5ZE2yurosjSg2UTuJlJi0MjD9Tek1QA+6KTQhOQKT1sOL5kYfbOqZgoPKnIF5JmDMLYxBCcY0I0vRaX7UAYHMpwf/UQCZVyADrdpVwBzFfA7pqK15CxQzR7ECJQ7ZmE+Xq2BjbnE8zRLheIIxn310ngSMeYWxCrhUjit76IwVAVu6vgAzt2AmRttZBiWay3JIu2LwORHK3S42e4RNAWZ+wQx1naRmGp5pw1QGxDOf+dMPtzd397fP6XRrgWleMW2ZUDKL00QNSsYNALoEWLqVoQZK6OCq/Vgh56FmYkGxNJ0D+B4FUHWWgZmeWV0wh+HES6a2yWfAQngWuCVJAEuzcwy1HHdjbZOZfAYshKuXYyCTEQseYMxnxGImYMwtjDVYjiDzgGQ+YxYir4d3PMtEAyONMkGJbVaPyaebLOr/7zvRw372nYW7E1MAuGxdYahEhiatnblCK6IYbgoALpoT7Zp6a9ek6kXPEeKxekOyBmzXpFg0dbLT+n6MdjMmIYNorWayzGVGrWYstbR0XBU+fUC/n5UGgmtUKXPWXNtiNdCCv8r4DwlAKHPmeLb4zKEQLUJ6Kx42DS47hFhGC+YTHUL4o76643qg3HuTyo4IrJxdO2bWjaC/nuhPjzp5FOjPolgRzNt34JYiotMbN1yWKWc1uIyvTm/ZnXPGZRt3LnisHx6zTKuU6EfhMcZqXCbUc8CL3Zdo5aX1ZSwyNwMHTK0oxw6dz8bK9IRy2YGNG0BJgSeV8+UEAjqRAJEqgRBAG2ZP7749HAeUvdsFEEjlprYCBv3CQFVqw2A4LqBlGgwZ5LD9RaroypygpI+1JcOUNJIH0CivrK4MN29ErrSV24z5HqnOcO0G0UPaBN4k7vUT2u42OuKF6+h8OZoyGL1+8aNvwYd1+zXC53Ye7Ca5Ced+lgbg7JAx5GwXrhNI6GOztHES+pW5d6Iv9pMnQl5gbgdRiD8CmJy9S32y5d+Ez9/jA6vFIqd578nzJoWB6jd9fCNakh16cD6i/qD+V8v2dtnt22udj26qwfM427SNlCWLLFukyUsME2takTN12qB6WszfGEwnAnwa5Gnt0/Ps9vFJpN9xnH6nk6mktAKoQ8oKGw2PotAxjNngv2N/ZRTSqhe0meTdnJXTPcXYMYhn2VV6QQHOrOLFC6qMOnWgiE9D4HN8fOp84RNU5uIvsuU6SG74soj+Vxbmn91wvb9sB3u1DEfvKFBVtZ7yR6cqIMvqoFV2reAyt7zczfKJBwAOn1k6S+/5xQkX67Ite8Y21AWmvkf1bGQOkCpTUM0y+R2C6r7fydodgAcK3iM6WSYa+eheptMejWrfWHKV/AiNxg4KtAjuLnCq2d4Oduj3oBcv7u9IQhA6UW0i1nQNGJe0b6KusDX2DWS6bxQhDIQw6FkYaGMLA0UIg0phoAlhwJswoOwbtsIA8tk4BgmDhbd9cVd73xECgW9gA6AW0wkshZJLANjCWhHioNI2UIQ8GHXbgOptw1gY8Nm1JhYGcXKAEAW8Y1onMK3R8gtpofQBUV3pNReyIOqDKWTBiPsG1tk3bKWBymcKCpIG+y1C2E8hDPgGtULoNzTPJ1tJoFYau0ISCKNgVEFgVu8ZxlKgTZ0pw8rSC2oDAnHqfnX9qMpXZooKTYESDlHSe35d/NGmg8eBrBIZMcrpOeIWME6dPxlkjrgKBdPxh2G1/xw8NhgGwDj5gWFAnD1Yzoy2KJhz0YmGDCv5DxV9KbIUysAeWlPDPqr49+EP7fr+38Gnuf63/Cd0vb9n0ynOKGHHnHnerJpqkvVsmuTzq0+nVxe4ts1YFB5w2YWftTI/05eeDxXDJPzO+AccY2fyfLxfjmokOKBIP38oMi8P2tx4C3sjJXR6CbzJvMEvpZ0dpHX4Vcv82UcHBPom4rwlbIENaxLg+dSJ1mBDSntO+kIqfbNhR+dNOdVzPt/Y744fCA7ptZcSjUOoOS/DtVHRKuM17b3COd/ykfL9/Kivqpr9ZdLaIGpmsHK2aFWTpgVh1E+h+psmiC6NbACIMYvNlejQ9f139HKavLj/M36rWcn+IZR0t6Xdy8oNj/ykZHJD9IsWa3uLdj9arbDTbyp+Vy8dBxrtbu4IvNiHoA9DStFK+1ijzaWGB5WhULClDbeXFS7N+GhUiX0yR9/FB/7x3YvXB53tBP+TQ6h7fNOJ+C1XsSgyr9OkZCtTZdxw7QK1SveWiOCKVB6u0jppzdLZhnA1kQBXuWlUsWnGnK2F53DjpnW02VqMNw23VZLuNgjt6BcI9YlnTAMIVNK6ADIlVMM2B04ThZLV2dBCGoy6c5ClUb1t2IoDXSmvsxi3MK5bXqs9Okbna3RMduecKRdRVr29EqNj+vIv6oQDxaA4F2kjkAf0n1hcAu/+j8+zi0bdWfcSBboFJZzjg6FMGU0Pdcmghc0H6ydqsoqbZ1PfjO5j36rSlQrBdtGuMZPd1VIe106MnSqq48lwmTejKleUTEciPzFQfhF+tDlpcBVbeLvo93qRPUdvWl8MW85ykVaqNyI73/kdzaZzt6vjp+eu/Sl4D3zPC6feNgIXzSLrJBuO+B+4C3wOO/BcB4akF91vtDHZyAajTrgbUFnRK/3W4wVBC4qycMFx6kjQDKS4qAS1UlzLbF1wejmtU7jgSBecaFY27s5RoYRLP/kJypjlgXDCCze2fl57dn3/+nlHHuYzxJcqF8E02G0KOYCX5xZh6Ywz5WpnHHXi3YAKbmUsbjRv3O3j00Uj77wdchaRY0TzxukUKA/nijOMUSRz5phr4pf7EFLZqiuVDciZVOYzRBHY7/FE2otmRabyWDGJQSkmZUYZ2/CYIaL83DEZ5qcaTMbZODF855wx2T7wBYn1RWLQJKuJLcq8ZRXSBi0OyGNtAqMjaWOC+6oZrbLwGAwT+qwRqZShQY4NT+42/SQB5T7Clkal/3wUXp0j/Ale7YtXoQSUIq8atJa4GqRGJYejVjy5jwK+YGdvOwU9PnmbpePHRcS+Y4cIINGv8qNiYjv+7853AidGuEutT8YHsmrh+6ubP64+3zYpzv5l+24cXYzHul+74bX9M/run1vvLbq1t7Ud3UAyd/0tvb24zHm3jyueEQ+vohP3QRzoRwecWvf66e5rhxt1ftuvu036hOt+WXRyXCz+vVGxuIy2Q1zr/ebGiFl5k4aV3g2/sJiG8RLDJH76blSLK7vBkIjIjiX4FrXltRhMkzUJFtsY0mrLoQKoBAZUMzs+AInxKUFFZsXZxIcNtSSgOcisMCsjeiKzIpoFLDIrRtw5AJKCgYPMCrxPheeTH+vfNMrW/5Ezrb7N/448zGdge+nsNt779KiSnLWm2f1c5Qix1LGmDXEKk79iWoiscJefYbXpaytIcVhSrB3YtjgLB+E754wUKWwYeygSP8Hz1cPNl6KvQlDf0NRHbbTFmPqqG221tkAQLcU+zthbOq/nHPR3r0F9l9VNrWsunXmDa8qeX+uq7u5n7atKZT/H09oJ8g5f75e7jB3B8/fyydV3k/pTntHz6/vx4Uujx9jgKSZ+4/pXR4+zwdVjwRe7Zn0nNkARrUdb/Sb2R9eDGma+m69Xj4+NPNIvMUTC1EGeoeCwXgu0QxL/fVRcN+i9pK7peHvZu50TM3Dphmo6re++f7l9uHuq//VtvXfCi0zEwYgOAjQXskprwTio/1gF2iiKcZpfgP+uM8ihbRW2KLzO9OfqGT24e9vIhdeHqSc4ZJw2cTtWd136gCZXFGqrhM+b+MBkmDptqxyuwemoU1kCU1+WqEp7pl5UOzYuQWVn3gceWKpO5LBalNJpBdd5FFy5Cpk206PyXt3jravyHtrBz+jeN0GkQSydSMGIjnuNotDN9ZqbNkpwC/9eo4B8U0tmAENmEDumseo7nD3S3vLp8HD2x3fKW7qVo70y9zZL6l6ptmEKMMqbLHTLcIIHJiS5QVmwvDBGYWu/xu8m+TfRHbbZMS2yVOqBNb30w3CXPuq5qmWbVrY8GZ5cWBhPeYGZlrpxZ08dF969W1qKQkxepvVAgbSpesAYygmnyqOkcfOw8u3NFlWu2y9KlUerfKMPj2rT3KC3KYo5+/ikSYx3YzrDZ/LhZyVSAUdfYL76H2Q3zllAKonSDyP0OEAa61R6aJA2Kst5sUccRuPUJ7UMrPOAmi78VLeAcgA/XkeCOh6EnBd1/tnt/dcffz3P7h6ea+vjx4LagmAaEoyqS7g9Op6GSKnkBorFtlRHlfnssn3Icn9+89H59RErkuJHINgm7mCtKGipeb3Z1EAmib2qXJl1JFLigXHKESNS4gffN0T+E9N8eHo9NXNbvFl4uo2ZXbDTeYBOm3h+LT347kH7z+rd/e/1p6vdf7b6dbiWnWntNiI4esaLFgxoWjDV0S0014aaqwYI01jFzTxGy7xUQXUNW4cCc/8QNgqSsErYIhvz7v6PvmM3D/ff2obpjl90dtsg7CL/o6SIL9bO4mf8xJ1d9FzzekJ2Un64sUhua1IiTXTOgaopYbIr5LfRrEYg4SKjAbYgn+VLByfHRTtHz7s1J5IgZHknpGizJkWmDNadUwV8ekKevt0LMHMMZhMW7TKFAmSmbWZVwGcN1eyrYGUugXyCgXVF0k2W2FWUFj6FHoNek0bR/nbJ9rUcEdyptrWcCp2Da3rfboVjOeqmLKmWnP0jQjOmIammZiBFJfkvoUUnP3mw5n0qHsfDGYOLoMyFBmWQ0lK0Mg2D4uJhG5PBMkbEZE7EZEwRkxlz2wCiNIq2bZiGZMwW2lO3iIzx8UIyHTQhpW63IlXpvVtRu3JBiJU3DPF0LPvRckHyA3qqWw1a/Zc92IK0ECZlQ5OyF04kWxTRhmAz9YcorFiRPgE7swCraq+bUWkbO/I8qZQaqVZrEmnWpIWXSLVS6Z1j2zTm/o/P/3q4e7qd3T00Ci/Wi1jmrt4szlgzeJm7fqN46+C1mEP1hiEN6YY/o1nBarE/DJOSO+78Xv2HdC2rKCGhCSRKSoUKdMmkOF+N0iyJ/sgJKkfJqXPj/q/uwtnG7YXijIGk7/06brvToDV75IPydntE1c7zxl00ALP9ElviNb/DDqOu8Scgf/LrkgZOcwexTNz5P+12hH97sH/Ff5a/I3kkWaOApqW2X+9unuPG/c83X/54/GeThBH3ZZJOIiDvaZOtXSxgtl5Y60HefP3xeDtrT265sz5MX31KzXEPpDNViJk0hkWbFAKVw6imQv2uPFwnDhUe93Z3Jp1UIzqMwUgAvA/i6v+4s1fgoCeL6CSWdwt351B6ks3t5AMxMtAOcf1M95TQX+m3rO0g+xlJ97LWTQXIrMXo4NPVw+fbp+c/b7/PfkSdAaaFwz8em03LEFttoK2m6hrZ9Z/akQyqdPE+lG+QmRnc2qJtEU09bt5+jLpqSBksT199zhK2YTmDd+FtX6ZItXACKfwdXpz7jlG7LdL/BiEllEfrhqgMRTygTYfwEbI4moxk/Oj9HHBqf/XQxdEajNNvh70QbCUD5Ul9GSiwWBeLnMlAfOOcpfkEQYjMoenCXhxcAReZrsmyjKpWgxEgQwk3nGFTSKUed/iNCcHHx6erp1uRL8xlvjCO9KpQskz5aA4lraCDDu8+Qr8nJz5TegJfHIAYmRcmUCXLKqw0kCltAGkzDZVeIhf0lYbM9TqgWnnNbipLsgyr1Lvo1b3ju+hXR8mrTSL5x9U8HtDYXn+DuAVNZSxfGS+Wf9K2GdBxnY0xjqZi2O42Ce/Hilkaws581vJ8725iJ/U+jKdM5wqX807vaEbKYWR1dNIh7pNebVKIUy3d6GNJzGextrdxM103eoXHXafxreQS+OsT7/r+EDVK3g7sV4fSuFf4n/vyP2d9pU4IYuo4DGswB9DxUuHO+2RQbTW/iMkSUvZpMopo6aKtE3q+6xAZOEg38+N9Zy8WvhdkGzXAOySwfyUXiJvFBzGY8QggvKVDJDCOasJiKw0WNdUP4VCs7Jg1d5M6lKqjVHoNOksdDOb3ouDxEIP7eYYvgj7YRykT8UynOq3zX5P2Gv3mVAXLJvlNdedspekPDe5W5Er1Y26Q7S8UnZa2cCxVarg9WOk26a75uXG6Qm772fF9ldC6sd8dPziC8FQzy9Q9JI68fSxS0IUDN9Et39ZOhJON56VZWYlmiR6VHcnT09rah4HzMCIGyERijkqL11F76g9WRVSj9K4ruuP/RFk1CRJf3NU+W+Ai8hNEOkGAnrFrbxKTws8+1ljufLu6+XL3/XYAKTG7e3x6+CFkxPibysJ5rJnSRpEZKk1pG2xLDTptyonZOgiSOTeJVbH23iYnkl5TtwxS5pwp2mThNDY1ps72lwArYwkAcFA603Eo49FUkLX96huw1Poa2tiDo0srVy8t5dkVx0dGJ+VjGkceI+VhH49QQLIWjWK8UWvRhnqqNLXx7J4qWfUcDfij1C/QOkIO9mBp7T/P7sHKxIMFQKY8Vkp69mCPlZaZfX6Plai3MSCFX1mClaZen9tTBWpprCfUqXVMPT1a9NL3Ir0ne+8zehDrb97Sic74fw==&lt;/diagram&gt;&lt;/mxfile&gt;" style="background-color: rgb(255, 255, 255);"><defs><style type="text/css">@import url(https://fonts.googleapis.com/css?family=Liberation+Sans);&#xa;</style></defs><g><rect x="9428" y="2640" width="1120" height="600" rx="90" ry="90" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><path d="M 8868 3120.57 Q 8656.57 3120.57 8656.57 1980.33" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 8656.57 1959.33 L 8665.9 1987.33 L 8656.57 1980.33 L 8647.24 1987.33 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 9228 3600 Q 9228 3760.57 9608 3760.57 Q 9988 3760.57 9988 3280.42" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 9988 3253.42 L 10006 3289.42 L 9988 3280.42 L 9970 3289.42 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="8868" y="2640" width="480" height="960" rx="72" ry="72" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><rect x="2868" y="2640" width="1080" height="960" rx="144" ry="144" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><rect x="1082" y="840" width="1080" height="440" rx="66" ry="66" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><rect x="2148" y="2640" width="560" height="960" rx="84" ry="84" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><path d="M 4928 160 L 4928 360" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 4928.57 160 L 4928.57 200.57 Q 4928.57 240.57 4888.57 240.57 L 1662.29 240.57 Q 1622.29 240.57 1622.19 280.57 L 1622.06 334.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1622.01 355.53 L 1608.08 327.49 L 1622.06 334.53 L 1636.08 327.56 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 4928.57 160 L 4928.57 200.57 Q 4928.57 240.57 4968.57 240.57 L 5808.57 240.57 Q 5848.57 240.57 5848.38 280.57 L 5848.12 334.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 5848.02 355.53 L 5834.16 327.46 L 5848.12 334.53 L 5862.16 327.6 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 4928.57 160 L 4928.57 200.57 Q 4928.57 240.57 4968.57 240.57 L 7273.71 240.57 Q 7313.71 240.57 7313.81 280.57 L 7313.94 334.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 7313.99 355.53 L 7299.92 327.56 L 7313.94 334.53 L 7327.92 327.49 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 4928.57 160 L 4928.57 200.57 Q 4928.57 240.57 4888.57 240.57 L 2620 240.57 Q 2580 240.57 2580.01 280.57 L 2580.02 334.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 2580.02 355.53 L 2566.01 327.53 L 2580.02 334.53 L 2594.01 327.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="4788" y="0" width="280" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 20px; margin-left: 1198px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">tmp</font></div></div></div></foreignObject><text x="1232" y="24" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">tmp</text></switch></g><path d="M 4928 520 L 4928 1040" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><rect x="4788" y="360" width="280" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 110px; margin-left: 1198px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">work</font></div></div></div></foreignObject><text x="1232" y="114" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">work</text></switch></g><path d="M 4928 1200 L 4928.29 1240.57 Q 4928.57 1280.57 4968.57 1280.57 L 5648.57 1280.57 Q 5688.57 1280.57 5688.57 1320.29 L 5688.57 1360" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 4928 1200 L 4928.29 1240.57 Q 4928.57 1280.57 4888.57 1280.57 L 3156 1280.57 Q 3116 1280.57 3115.98 1320.29 L 3115.96 1360" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 4588 1120 Q 4398.29 1120.57 4398.24 1334.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 4398.24 1355.53 L 4388.91 1327.53 L 4398.24 1334.53 L 4407.58 1327.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="4588" y="1040" width="680" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 280px; margin-left: 1148px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter"><b>${MULTIMACH_TARGET_OS}</b></font></div></div></div></foreignObject><text x="1232" y="284" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">${MULTIMACH_TARGET_OS}</text></switch></g><path d="M 3115.96 1520 L 3116 1680" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><rect x="2975.96" y="1360" width="280" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 360px; margin-left: 745px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">libhello</font></div></div></div></foreignObject><text x="779" y="364" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">libhello</text></switch></g><path d="M 5688.57 1520 L 5688.57 1560.57 Q 5688.57 1600.57 5688.57 1570.29 L 5688.57 1555.14 Q 5688.57 1540 5688.29 1580 L 5688 1620" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><rect x="5548" y="1360" width="280" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 360px; margin-left: 1388px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">sayhello</font></div></div></div></foreignObject><text x="1422" y="364" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">sayhello</text></switch></g><path d="M 3116 1840 L 3116 1960.57 Q 3116 2000.57 3076 2000.57 L 2036 2000.57 Q 1996 2000.57 1996 2040.57 L 1996 2134.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1996 2155.53 L 1986.67 2127.53 L 1996 2134.53 L 2005.33 2127.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 3116 1840 L 3116 1960.57 Q 3116 2000.57 3076 2000.57 L 2468 2000.57 Q 2428 2000.57 2428 2040.57 L 2428 2134.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 2428 2155.53 L 2418.67 2127.53 L 2428 2134.53 L 2437.33 2127.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 3116 1840 L 3115.96 2134.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 3115.96 2155.53 L 3101.96 2127.53 L 3115.96 2134.53 L 3129.96 2127.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 3116 1840 L 3116 1960.57 Q 3116 2000.57 3156 2000.57 L 4268 2000.57 Q 4308 2000.57 4308 2040.57 L 4308 2134.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 4308 2155.53 L 4294 2127.53 L 4308 2134.53 L 4322 2127.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 3116 1840 L 3116 1960.57 Q 3116 2000.57 3076 2000.57 L 1508 2000.57 Q 1468 2000.57 1468 2040.57 L 1468 2134.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1468 2155.53 L 1458.67 2127.53 L 1468 2134.53 L 1477.33 2127.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="2976" y="1680" width="280" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 440px; margin-left: 745px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">0.1-r0</font></div></div></div></foreignObject><text x="779" y="444" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">0.1-r0</text></switch></g><path d="M 5688.57 1780 L 5688.57 1960.57 Q 5688.57 2000.57 5648.57 2000.57 L 5568.57 2000.57 Q 5528.57 2000.57 5528.43 2040.57 L 5528.09 2134.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 5528.02 2155.53 L 5514.12 2127.48 L 5528.09 2134.53 L 5542.12 2127.58 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 5688.57 1780 L 5688.57 1960.57 Q 5688.57 2000.57 5728.57 2000.57 L 6988 2000.57 Q 7028 2000.57 7028 2040.57 L 7028 2134.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 7028 2155.53 L 7014 2127.53 L 7028 2134.53 L 7042 2127.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 5688.57 1780 L 5688.57 1960.57 Q 5688.57 2000.57 5728.57 2000.57 L 7676 2000.57 Q 7716 2000.57 7715.99 2040.57 L 7715.97 2134.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 7715.96 2155.53 L 7701.97 2127.52 L 7715.97 2134.53 L 7729.97 2127.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 5688.57 1780 L 5688.57 1960.57 Q 5688.57 2000.57 5728.57 2000.57 L 8313.71 2000.57 Q 8353.71 2000.57 8353.79 2040.57 L 8353.95 2134.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 8353.99 2155.53 L 8339.94 2127.55 L 8353.95 2134.53 L 8367.94 2127.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 5688.57 1780 L 5688.57 1960.57 Q 5688.57 2000.57 5728.57 2000.57 L 9068 2000.57 Q 9108 2000.57 9108 2040.57 L 9108 2134.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 9108 2155.53 L 9094 2127.53 L 9108 2134.53 L 9122 2127.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 5688.57 1780 L 5688.57 1960.57 Q 5688.57 2000.57 5728.57 2000.57 L 9948 2000.57 Q 9988 2000.57 9988 2040.57 L 9988 2134.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 9988 2155.53 L 9974 2127.53 L 9988 2134.53 L 10002 2127.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="5548" y="1620" width="280" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 425px; margin-left: 1388px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">0.1-r0</font></div></div></div></foreignObject><text x="1422" y="429" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">0.1-r0</text></switch></g><path d="M 1622.29 520 L 1622.29 560.57 Q 1622.29 600.57 1622.29 560.57 L 1622.29 540.57 Q 1622.29 520.57 1622.29 560.29 L 1622.29 600" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1762 440 Q 2215.43 440.57 2215.04 205.47" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 2215.01 184.47 L 2224.39 212.46 L 2215.04 205.47 L 2205.72 212.49 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="1482" y="360" width="280" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 110px; margin-left: 371px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">downloads</font></div></div></div></foreignObject><text x="405" y="114" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">downloads</text></switch></g><path d="M 1622 760 L 1622.14 800.57 Q 1622.29 840.57 1622.29 800.57 L 1622.29 780.57 Q 1622.29 760.57 1622.29 800.29 L 1622.29 840" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><rect x="1482" y="600" width="280" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 170px; margin-left: 371px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">git2</font></div></div></div></foreignObject><text x="405" y="174" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">git2</text></switch></g><path d="M 2082 1160 L 2628 1160.53 Q 2668 1160.57 2668 1200.57 L 2668 2200.57 Q 2668 2240.57 2628 2240.41 L 2568.42 2240.16" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 2541.42 2240.05 L 2577.49 2222.2 L 2568.42 2240.16 L 2577.34 2258.2 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="1162" y="880" width="920" height="160" rx="24" ry="24" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 240px; margin-left: 291px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">github.com.&lt;username&gt;.sayhello</div></div></div></foreignObject><text x="405" y="244" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">github.com.&lt;username&gt;.sayhello</text></switch></g><path d="M 2082 960 L 6628 960.57 Q 6668 960.57 6668 1000.57 L 6668 2200.57 Q 6668 2240.57 6708 2240.48 L 6887.58 2240.09" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 6914.58 2240.03 L 6878.62 2258.11 L 6887.58 2240.09 L 6878.54 2222.11 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="1162" y="1080" width="920" height="160" rx="24" ry="24" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 290px; margin-left: 291px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">github.com.&lt;username&gt;.libhello</div></div></div></foreignObject><text x="405" y="294" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">github.com.&lt;username&gt;.libhello</text></switch></g><path d="M 2428 2320 Q 2428 2320 2428 2614.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 2428 2635.53 L 2414 2607.53 L 2428 2614.53 L 2442 2607.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="2328" y="2160" width="200" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 560px; margin-left: 583px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">git</font></div></div></div></foreignObject><text x="607" y="564" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">git</text></switch></g><rect x="2212" y="2720" width="456" height="80" rx="12" ry="12" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 690px; margin-left: 554px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Makefile</div></div></div></foreignObject><text x="610" y="694" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">Makefile</text></switch></g><path d="M 2212 2880.57 L 2117.14 2880.57 Q 2077.14 2880.57 2077.14 2840.57 L 2077.14 2714.86 Q 2077.14 2674.86 2037.14 2674.9 L 1966.47 2674.97" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 1945.47 2675 L 1973.46 2665.63 L 1966.47 2674.97 L 1973.48 2684.3 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="2212" y="2840" width="456" height="80" rx="12" ry="12" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 720px; margin-left: 554px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LICENSE</div></div></div></foreignObject><text x="610" y="724" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">LICENSE</text></switch></g><path d="M 2212 3000 Q 2028 3000.57 2028 3060.57 Q 2028 3120.57 2171.58 3120.13" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 2198.58 3120.04 L 2162.62 3132.15 L 2171.58 3120.13 L 2162.55 3108.15 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="2212" y="2960" width="456" height="80" rx="12" ry="12" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 750px; margin-left: 554px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">fix.patch</div></div></div></foreignObject><text x="610" y="754" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">fix.patch</text></switch></g><path d="M 2214.74 3151.44 Q 1988 3151.43 1988 3278.29 Q 1988 3405.14 2179.58 3405.02" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 2206.58 3405.01 L 2170.6 3423.03 L 2179.58 3405.02 L 2170.57 3387.03 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="2212" y="3080" width="456" height="80" rx="12" ry="12" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 780px; margin-left: 554px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">hellolib.c</div></div></div></foreignObject><text x="610" y="784" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">hellolib.c</text></switch></g><rect x="1896" y="2160" width="200" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 560px; margin-left: 475px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">temp</font></div></div></div></foreignObject><text x="499" y="564" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">temp</text></switch></g><path d="M 4308 2320 L 4308 2640" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><rect x="4068" y="2160" width="480" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 560px; margin-left: 1018px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">sysroot-destdir</font></div></div></div></foreignObject><text x="1077" y="564" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">sysroot-destdir</text></switch></g><path d="M 5528 2320 L 5528 2614.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 5528 2635.53 L 5518.67 2607.53 L 5528 2614.53 L 5537.33 2607.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="5308" y="2160" width="440" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 560px; margin-left: 1328px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">recipe-sysroot</font></div></div></div></foreignObject><text x="1382" y="564" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">recipe-sysroot</text></switch></g><path d="M 3116 2320 L 3116 2694.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 3116 2715.53 L 3106.67 2687.53 L 3116 2694.53 L 3125.33 2687.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="2989.96" y="2160" width="252" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 61px; height: 1px; padding-top: 560px; margin-left: 748px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">image</font></div></div></div></foreignObject><text x="779" y="564" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">image</text></switch></g><path d="M 3116 2880 L 3116 2920.57 Q 3116 2960.57 3115.99 2987.55 L 3115.99 3014.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 3115.98 3035.53 L 3106.65 3007.53 L 3115.99 3014.53 L 3125.32 3007.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 3116 2880 Q 3116 2960.57 3354.86 2960.57 Q 3593.71 2960.57 3593.91 3014.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 3593.98 3035.53 L 3584.55 3007.56 L 3593.91 3014.53 L 3603.22 3007.49 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="3029" y="2720" width="174" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 42px; height: 1px; padding-top: 700px; margin-left: 758px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">usr</font></div></div></div></foreignObject><text x="779" y="704" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">usr</text></switch></g><path d="M 3115.98 3200 L 3116 3294.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 3116 3315.53 L 3106.66 3287.53 L 3116 3294.53 L 3125.33 3287.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="3008.48" y="3040" width="215" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 52px; height: 1px; padding-top: 780px; margin-left: 753px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">include</font></div></div></div></foreignObject><text x="779" y="784" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">include</text></switch></g><path d="M 3593.71 3200 L 3593.71 3240.57 Q 3593.71 3280.57 3593.76 3287.55 L 3593.82 3294.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 3593.97 3315.53 L 3579.77 3287.63 L 3593.82 3294.53 L 3607.76 3287.43 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="3507" y="3040" width="174" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 42px; height: 1px; padding-top: 780px; margin-left: 878px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">lib</font></div></div></div></foreignObject><text x="899" y="784" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">lib</text></switch></g><rect x="2956" y="3320" width="320" height="100" rx="15" ry="15" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 843px; margin-left: 740px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">hellolib.h</div></div></div></foreignObject><text x="779" y="846" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">hellolib.h</text></switch></g><rect x="3348" y="3350" width="480" height="80" rx="12" ry="12" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 848px; margin-left: 838px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">libhello.so.1</div></div></div></foreignObject><text x="897" y="851" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">libhello.so.1</text></switch></g><rect x="3348" y="3450" width="480" height="100" rx="15" ry="15" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 875px; margin-left: 838px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">libhello.so.1.0</div></div></div></foreignObject><text x="897" y="879" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">libhello.so.1.0</text></switch></g><rect x="3320" y="3320" width="548" height="250" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><path d="M 4428 3600 Q 4428 3760.57 4978.29 3760.57 Q 5528.57 3760.57 5528.14 3640.42" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 5528.05 3613.42 L 5546.18 3649.35 L 5528.14 3640.42 L 5510.18 3649.48 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="4068" y="2640" width="480" height="960" rx="72" ry="72" fill="#eeeeee" stroke="#36393d" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 780px; margin-left: 1018px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Everything in <b>image</b> folder that is present in <b>SYSROOT_DIRS</b> will be copied here.</div></div></div></foreignObject><text x="1077" y="784" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">Everything in image...</text></switch></g><path d="M 3678 3600 Q 3678.29 3760.57 3993.14 3760.57 Q 4308 3760.57 4308 3640.42" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 4308 3613.42 L 4326 3649.42 L 4308 3640.42 L 4290 3649.42 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><path d="M 2428 3600 Q 2428 3760.57 2941.14 3760.57 Q 3454.29 3760.57 3454.4 3639.46" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 3454.43 3612.46 L 3472.39 3648.47 L 3454.4 3639.46 L 3436.39 3648.44 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="2748" y="3680" width="360" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 935px; margin-left: 732px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_install</font></div></div></div></foreignObject><text x="732" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_install</text></switch></g><rect x="2220" y="3350" width="456" height="110" rx="16.5" ry="16.5" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 851px; margin-left: 556px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">libhello.so.1.0</div></div></div></foreignObject><text x="612" y="855" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">libhello.so.1.0</text></switch></g><rect x="1668" y="3180" width="440" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 810px; margin-left: 472px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_configure<br /></font></div></div></div></foreignObject><text x="472" y="814" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_configure&#xa;</text></switch></g><rect x="2212" y="3200" width="456" height="80" rx="12" ry="12" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 810px; margin-left: 554px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">hellolib.h</div></div></div></foreignObject><text x="610" y="814" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">hellolib.h</text></switch></g><rect x="1788" y="3000" width="320" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 765px; margin-left: 487px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_patch<br /></font></div></div></div></foreignObject><text x="487" y="769" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_patch&#xa;</text></switch></g><rect x="2494" y="1620" width="360" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 420px; margin-left: 669px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_unpack<br /></font></div></div></div></foreignObject><text x="669" y="424" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_unpack&#xa;</text></switch></g><ellipse cx="2434" cy="1680" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 420px; margin-left: 595px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">6</b></font></div></div></div></foreignObject><text x="609" y="424" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">6</text></switch></g><ellipse cx="1728" cy="3060" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 765px; margin-left: 418px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">7</b></font></div></div></div></foreignObject><text x="432" y="769" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">7</text></switch></g><ellipse cx="1608" cy="3240" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 810px; margin-left: 388px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">8</b></font></div></div></div></foreignObject><text x="402" y="814" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">8</text></switch></g><rect x="1748" y="3310" width="360" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 843px; margin-left: 482px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_compile<br /></font></div></div></div></foreignObject><text x="482" y="846" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_compile&#xa;</text></switch></g><ellipse cx="1688" cy="3370" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 843px; margin-left: 408px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">9</b></font></div></div></div></foreignObject><text x="422" y="846" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">9</text></switch></g><ellipse cx="2688" cy="3740" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 935px; margin-left: 658px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">10</b></font></div></div></div></foreignObject><text x="672" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">10</text></switch></g><rect x="3728" y="3680" width="640" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 935px; margin-left: 1012px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_populate_sysroot</font></div></div></div></foreignObject><text x="1012" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_populate_sysroot</text></switch></g><ellipse cx="3668" cy="3740" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 935px; margin-left: 903px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">11</b></font></div></div></div></foreignObject><text x="917" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">11</text></switch></g><path d="M 7028 3280 Q 7028 3760.57 7372 3760.57 Q 7716 3760.57 7715.97 3640.42" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 7715.96 3613.42 L 7733.97 3649.41 L 7715.97 3640.42 L 7697.97 3649.42 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="6748" y="2640" width="560" height="640" rx="84" ry="84" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><path d="M 7028 2320 Q 7028 2320 7028 2614.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 7028 2635.53 L 7014 2607.53 L 7028 2614.53 L 7042 2607.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="6928" y="2160" width="200" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 560px; margin-left: 1733px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">git</font></div></div></div></foreignObject><text x="1757" y="564" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">git</text></switch></g><rect x="6800" y="2720" width="456" height="80" rx="12" ry="12" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 690px; margin-left: 1701px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Makefile</div></div></div></foreignObject><text x="1757" y="694" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">Makefile</text></switch></g><rect x="6800" y="2840" width="456" height="80" rx="12" ry="12" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 720px; margin-left: 1701px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LICENSE</div></div></div></foreignObject><text x="1757" y="724" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">LICENSE</text></switch></g><path d="M 6800 3000 Q 6588 3000.57 6588 3088 Q 6588 3175.43 6759.58 3175.08" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 6786.58 3175.03 L 6750.62 3193.1 L 6759.58 3175.08 L 6750.55 3157.1 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="6800" y="2960" width="456" height="80" rx="12" ry="12" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 750px; margin-left: 1701px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">sayhello.c</div></div></div></foreignObject><text x="1757" y="754" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">sayhello.c</text></switch></g><rect x="6800" y="3120" width="456" height="110" rx="16.5" ry="16.5" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 794px; margin-left: 1701px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">sayhello</div></div></div></foreignObject><text x="1757" y="797" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">sayhello</text></switch></g><path d="M 7835.96 3600 Q 7828 3760.57 8090.86 3760.57 Q 8353.71 3760.57 8353.94 3640.42" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 8353.99 3613.42 L 8371.93 3649.45 L 8353.94 3640.42 L 8335.93 3649.38 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="7475.96" y="2640" width="480" height="960" rx="72" ry="72" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><path d="M 7715.96 2320 L 7715.96 2614.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 7715.96 2635.53 L 7706.63 2607.53 L 7715.96 2614.53 L 7725.29 2607.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="7589.96" y="2160" width="252" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 61px; height: 1px; padding-top: 560px; margin-left: 1898px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">image</font></div></div></div></foreignObject><text x="1929" y="564" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">image</text></switch></g><path d="M 7716 2880 L 7716 2940 Q 7716 2980 7716.01 3017.26 L 7716.01 3054.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 7716.02 3075.53 L 7706.68 3047.53 L 7716.01 3054.53 L 7725.35 3047.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="7629" y="2720" width="174" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 42px; height: 1px; padding-top: 700px; margin-left: 1908px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">usr</font></div></div></div></foreignObject><text x="1929" y="704" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">usr</text></switch></g><path d="M 7716.02 3240 L 7716 3394.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 7716 3415.53 L 7706.67 3387.53 L 7716 3394.53 L 7725.34 3387.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="7608.52" y="3080" width="215" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 52px; height: 1px; padding-top: 790px; margin-left: 1903px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">bin</font></div></div></div></foreignObject><text x="1929" y="794" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">bin</text></switch></g><rect x="1268" y="2160" width="400" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 560px; margin-left: 318px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">libhello-0.1</font></div></div></div></foreignObject><text x="367" y="564" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">libhello-0.1</text></switch></g><path d="M 1241 2160 Q 1241.71 2220 1245.14 2050.29 Q 1248.57 1880.57 1785.14 1880.57 Q 2321.71 1880.57 2321.08 2127.06" fill="none" stroke="#000000" stroke-width="8" stroke-miterlimit="10" stroke-dasharray="8 16" pointer-events="stroke"/><path d="M 2321.02 2151.06 L 2310.44 2119.03 L 2321.08 2127.06 L 2331.77 2119.08 Z" fill="#000000" stroke="#000000" stroke-width="8" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 472px; margin-left: 435px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); border-color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); border: 1px solid rgb(0, 0, 0); white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" style="font-size: 14px;">S = "${WORKDIR}/git"</font></div></div></div></foreignObject><text x="435" y="475" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="11px" text-anchor="middle">S = "${WORKDIR}/git"</text></switch></g><rect x="3203" y="1620" width="252" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 61px; height: 1px; padding-top: 418px; margin-left: 802px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">WORKDIR</font></div></div></div></foreignObject><text x="832" y="421" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">WORKDIR</text></switch></g><rect x="2923" y="2160" width="106" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 24px; height: 1px; padding-top: 553px; margin-left: 732px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">D</font></div></div></div></foreignObject><text x="744" y="556" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">D</text></switch></g><rect x="2268" y="2160" width="106" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 24px; height: 1px; padding-top: 553px; margin-left: 568px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">S</font></div></div></div></foreignObject><text x="580" y="556" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">S</text></switch></g><rect x="2162" y="2160" width="106" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 24px; height: 1px; padding-top: 553px; margin-left: 542px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">B</font></div></div></div></foreignObject><text x="554" y="556" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">B</text></switch></g><rect x="1188" y="2160" width="106" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 24px; height: 1px; padding-top: 553px; margin-left: 298px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">S</font></div></div></div></foreignObject><text x="310" y="556" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">S</text></switch></g><rect x="1835" y="2160" width="106" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 24px; height: 1px; padding-top: 553px; margin-left: 460px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">T</font></div></div></div></foreignObject><text x="472" y="556" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">T</text></switch></g><rect x="3628" y="3160" width="200" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 803px; margin-left: 908px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">libdir</font></div></div></div></foreignObject><text x="932" y="806" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">libdir</text></switch></g><rect x="3135" y="3160" width="320" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 803px; margin-left: 785px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">includedir</font></div></div></div></foreignObject><text x="824" y="806" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">includedir</text></switch></g><rect x="5603.48" y="2280" width="464.52" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 114px; height: 1px; padding-top: 583px; margin-left: 1402px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">RECIPE_SYSROOT</font></div></div></div></foreignObject><text x="1459" y="586" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">RECIPE_SYSROOT</text></switch></g><path d="M 7226.86 2260 Q 7226.86 2110.29 7197.14 2110.29 Q 7167.43 2110.29 7167.49 1985.47" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 7167.5 1964.47 L 7176.82 1992.48 L 7167.49 1985.47 L 7158.15 1992.47 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="7174" y="2260" width="106" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 24px; height: 1px; padding-top: 578px; margin-left: 1795px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">S</font></div></div></div></foreignObject><text x="1807" y="581" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">S</text></switch></g><rect x="7068" y="2260" width="106" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 24px; height: 1px; padding-top: 578px; margin-left: 1768px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">B</font></div></div></div></foreignObject><text x="1780" y="581" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">B</text></switch></g><rect x="7803" y="2260" width="106" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 24px; height: 1px; padding-top: 578px; margin-left: 1952px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">D</font></div></div></div></foreignObject><text x="1964" y="581" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">D</text></switch></g><rect x="5788" y="1580" width="252" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 61px; height: 1px; padding-top: 408px; margin-left: 1448px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">WORKDIR</font></div></div></div></foreignObject><text x="1479" y="411" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">WORKDIR</text></switch></g><rect x="4640" y="3680" width="800" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 935px; margin-left: 1260px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_prepare_recipe_sysroot</font></div></div></div></foreignObject><text x="1260" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_prepare_recipe_sysroot</text></switch></g><rect x="7536" y="3420" width="360" height="110" rx="16.5" ry="16.5" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 869px; margin-left: 1885px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">sayhello</div></div></div></foreignObject><text x="1929" y="872" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">sayhello</text></switch></g><rect x="4988" y="2640" width="1080" height="960" rx="144" ry="144" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><path d="M 5236 2880 Q 5236 2960.57 5235.99 3014.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 5235.98 3035.53 L 5226.65 3007.53 L 5235.99 3014.53 L 5245.32 3007.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 5236 2880 Q 5236 2960.57 5474.86 2960.57 Q 5713.71 2960.57 5713.91 3014.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 5713.98 3035.53 L 5704.55 3007.56 L 5713.91 3014.53 L 5723.22 3007.49 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="5149" y="2720" width="174" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 42px; height: 1px; padding-top: 700px; margin-left: 1288px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">usr</font></div></div></div></foreignObject><text x="1309" y="704" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">usr</text></switch></g><path d="M 5235.98 3200 L 5236 3294.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 5236 3315.53 L 5226.66 3287.53 L 5236 3294.53 L 5245.33 3287.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="5128.48" y="3040" width="215" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 52px; height: 1px; padding-top: 780px; margin-left: 1283px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">include</font></div></div></div></foreignObject><text x="1309" y="784" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">include</text></switch></g><path d="M 5713.71 3200 L 5713.71 3240.57 Q 5713.71 3280.57 5713.76 3287.55 L 5713.82 3294.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 5713.97 3315.53 L 5704.43 3287.6 L 5713.82 3294.53 L 5723.1 3287.46 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="5627" y="3040" width="174" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 42px; height: 1px; padding-top: 780px; margin-left: 1408px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">lib</font></div></div></div></foreignObject><text x="1429" y="784" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">lib</text></switch></g><rect x="5076" y="3320" width="320" height="100" rx="15" ry="15" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 843px; margin-left: 1270px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">hellolib.h</div></div></div></foreignObject><text x="1309" y="846" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">hellolib.h</text></switch></g><rect x="5468" y="3350" width="480" height="80" rx="12" ry="12" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 848px; margin-left: 1368px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">libhello.so.1</div></div></div></foreignObject><text x="1427" y="851" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">libhello.so.1</text></switch></g><rect x="5468" y="3450" width="480" height="100" rx="15" ry="15" fill="#f5f5f5" stroke="#666666" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 875px; margin-left: 1368px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">libhello.so.1.0</div></div></div></foreignObject><text x="1427" y="879" fill="#333333" font-family="Liberation Sans" font-size="12px" text-anchor="middle">libhello.so.1.0</text></switch></g><rect x="5440" y="3320" width="548" height="250" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><rect x="3880" y="1680" width="1560" height="280" fill="none" stroke="#36393d" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 455px; margin-left: 1165px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" style="font-size: 15px;">This also contains other files from other <br />dependencies. Default dependencies are:<br />basically <b style=""><u>gcc</u></b>, <b style=""><u>compilerlibs</u></b> and <b style=""><u style="">libc</u></b></font></div></div></div></foreignObject><text x="1165" y="459" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">This also contains other files from other...</text></switch></g><rect x="4368" y="2280" width="510" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 126px; height: 1px; padding-top: 583px; margin-left: 1093px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">SYSROOT_DESTDIR</font></div></div></div></foreignObject><text x="1156" y="586" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">SYSROOT_DESTDIR</text></switch></g><path d="M 330 960 L 1121.58 960" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1148.58 960 L 1112.58 978 L 1121.58 960 L 1112.58 942 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><path d="M 330 1160 L 1121.58 1160" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1148.58 1160 L 1112.58 1178 L 1121.58 1160 L 1112.58 1142 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="2" y="860" width="328" height="400" rx="49.2" ry="49.2" fill="#000000" stroke="#23445d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 80px; height: 1px; padding-top: 265px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font color="#fcfcfc">Github</font></div></div></div></foreignObject><text x="41" y="269" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">Github</text></switch></g><rect x="535" y="900" width="320" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 240px; margin-left: 174px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_fetch<br /></font></div></div></div></foreignObject><text x="174" y="244" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_fetch&#xa;</text></switch></g><ellipse cx="475" cy="960" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 240px; margin-left: 105px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">1</b></font></div></div></div></foreignObject><text x="119" y="244" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">1</text></switch></g><rect x="535" y="1100" width="320" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 290px; margin-left: 174px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_fetch<br /></font></div></div></div></foreignObject><text x="174" y="294" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_fetch&#xa;</text></switch></g><ellipse cx="475" cy="1160" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 290px; margin-left: 105px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">5</b></font></div></div></div></foreignObject><text x="119" y="294" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">5</text></switch></g><rect x="6228" y="2980" width="440" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 760px; margin-left: 1612px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_configure<br /></font></div></div></div></foreignObject><text x="1612" y="764" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_configure&#xa;</text></switch></g><ellipse cx="6168" cy="3040" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 760px; margin-left: 1528px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">12</b></font></div></div></div></foreignObject><text x="1542" y="764" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">12</text></switch></g><rect x="6308" y="3110" width="360" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 793px; margin-left: 1622px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_compile<br /></font></div></div></div></foreignObject><text x="1622" y="796" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_compile&#xa;</text></switch></g><ellipse cx="6248" cy="3170" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 793px; margin-left: 1548px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">13</b></font></div></div></div></foreignObject><text x="1562" y="796" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">13</text></switch></g><rect x="2508" y="900" width="360" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 240px; margin-left: 672px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_unpack<br /></font></div></div></div></foreignObject><text x="672" y="244" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_unpack&#xa;</text></switch></g><ellipse cx="2448" cy="960" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 240px; margin-left: 598px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">2</b></font></div></div></div></foreignObject><text x="612" y="244" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">2</text></switch></g><path d="M 5848.57 520 Q 5848.57 600.57 5849.05 594.61" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 5847.36 615.54 L 5835.66 586.51 L 5849.05 594.61 L 5863.57 588.76 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 5848.57 520 Q 5848.57 560.57 5593.14 560.57 Q 5337.71 560.57 5337.31 594.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 5337.05 615.53 L 5323.39 587.36 L 5337.31 594.53 L 5351.39 587.7 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 5848.57 520 Q 5848.57 560.57 6108.57 560.57 Q 6368.57 560.57 6368.24 594.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 6368.04 615.53 L 6354.31 587.39 L 6368.24 594.53 L 6382.31 587.66 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="5708" y="360" width="280" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 110px; margin-left: 1428px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">conf</font></div></div></div></foreignObject><text x="1462" y="114" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">conf</text></switch></g><path d="M 5149 660 Q 5108 660 5108 510.29 Q 5108 360.57 5252 360.57 Q 5396 360.57 5396 205.47" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 5396 184.47 L 5405.33 212.47 L 5396 205.47 L 5386.67 212.47 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="5149" y="620" width="376" height="80" rx="12" ry="12" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 92px; height: 1px; padding-top: 165px; margin-left: 1288px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">local.conf</div></div></div></foreignObject><text x="1334" y="169" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">local.conf</text></switch></g><path d="M 5847.43 700 Q 5847.43 860 6048 860 Q 6248.57 860 6248.09 994.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 6248.02 1015.53 L 6238.78 987.49 L 6248.09 994.53 L 6257.45 987.56 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="5627" y="620" width="440" height="80" rx="12" ry="12" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 165px; margin-left: 1408px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">bblayers.conf</div></div></div></foreignObject><text x="1462" y="169" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">bblayers.conf</text></switch></g><rect x="6707" y="1360" width="921" height="600" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 415px; margin-left: 1678px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 15px;"><b><u>S</u></b> defaults generally to <b><u>${WORKDIR}/${BPN}-${PV}</u></b><br />In <b>git</b> recipes change it to <b><u>${WORKDIR}/git</u></b></font></div></div></div></foreignObject><text x="1792" y="419" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">S defaults generally to ${WORKDIR}/${B...</text></switch></g><rect x="6228" y="2700" width="440" height="160" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 695px; margin-left: 1612px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_patch<br /><i>(No patches)</i><br /></font></div></div></div></foreignObject><text x="1612" y="699" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_patch...</text></switch></g><ellipse cx="6168" cy="2780" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 695px; margin-left: 1528px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">3</b></font></div></div></div></foreignObject><text x="1542" y="699" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">3</text></switch></g><ellipse cx="4580" cy="3740" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 935px; margin-left: 1131px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">4</b></font></div></div></div></foreignObject><text x="1145" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">4</text></switch></g><rect x="6927" y="3560" width="360" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 905px; margin-left: 1777px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_install<br /></font></div></div></div></foreignObject><text x="1777" y="909" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_install&#xa;</text></switch></g><ellipse cx="6868" cy="3620" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 905px; margin-left: 1703px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">14</b></font></div></div></div></foreignObject><text x="1717" y="909" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">14</text></switch></g><path d="M 8354.02 2320 L 8354.02 2614.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 8354.02 2635.53 L 8344.69 2607.53 L 8354.02 2614.53 L 8363.35 2607.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="8228" y="2160" width="252" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 61px; height: 1px; padding-top: 560px; margin-left: 2058px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">package</font></div></div></div></foreignObject><text x="2089" y="564" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">package</text></switch></g><rect x="8441.04" y="2260" width="146.96" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 35px; height: 1px; padding-top: 578px; margin-left: 2111px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">PKGD</font></div></div></div></foreignObject><text x="2129" y="581" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">PKGD</text></switch></g><path d="M 8461.77 3600 Q 8461.14 3760.57 8784.57 3760.57 Q 9108 3760.57 9108 3640.42" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 9108 3613.42 L 9126 3649.42 L 9108 3640.42 L 9090 3649.42 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="8138.52" y="2640" width="431" height="960" rx="64.65" ry="64.65" fill="#eeeeee" stroke="#36393d" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 106px; height: 1px; padding-top: 780px; margin-left: 2036px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">A copy of <b>${D}<br /></b>excluding<br /><b>/sysroot-only</b></div></div></div></foreignObject><text x="2089" y="784" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">A copy of ${D}...</text></switch></g><rect x="7960.96" y="3680" width="360" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 935px; margin-left: 2035px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_package<br /></font></div></div></div></foreignObject><text x="2035" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_package&#xa;</text></switch></g><ellipse cx="7901.96" cy="3740" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 935px; margin-left: 1961px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">15</b></font></div></div></div></foreignObject><text x="1975" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">15</text></switch></g><path d="M 9108 2320 L 9108 2614.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 9108 2635.53 L 9098.67 2607.53 L 9108 2614.53 L 9117.33 2607.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="8868" y="2160" width="480" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 560px; margin-left: 2218px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">packages-split</font></div></div></div></foreignObject><text x="2277" y="564" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">packages-split</text></switch></g><rect x="9308" y="2260" width="240" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 578px; margin-left: 2328px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">PKGDEST</font></div></div></div></foreignObject><text x="2357" y="581" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">PKGDEST</text></switch></g><path d="M 9108 2840 L 9108 2895.1" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 9108 2916.1 L 9098.67 2888.1 L 9108 2895.1 L 9117.33 2888.1 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="8982" y="2680" width="252" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 61px; height: 1px; padding-top: 690px; margin-left: 2247px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">sayhello</font></div></div></div></foreignObject><text x="2277" y="694" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">sayhello</text></switch></g><path d="M 9108 3080 L 9108 3120.57 Q 9108 3160.57 9108 3162.55 L 9108 3164.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 9107.98 3185.53 L 9098.67 3157.52 L 9108 3164.53 L 9117.34 3157.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="9021" y="2920" width="174" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 42px; height: 1px; padding-top: 750px; margin-left: 2256px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">usr</font></div></div></div></foreignObject><text x="2277" y="754" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">usr</text></switch></g><path d="M 9107.98 3350 L 9107.97 3414.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 9107.96 3435.53 L 9098.63 3407.53 L 9107.97 3414.53 L 9117.3 3407.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="9000.48" y="3190" width="215" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 52px; height: 1px; padding-top: 818px; margin-left: 2251px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">bin</font></div></div></div></foreignObject><text x="2277" y="821" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">bin</text></switch></g><rect x="7689.48" y="1360" width="1287" height="595" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 320px; height: 1px; padding-top: 414px; margin-left: 1923px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 15px;">Folders created here are present in <b><u>PACKAGES</u></b> variable, BitBake knows what and where to put things using the <b><u>FILES</u></b> variable, example: <b><u>FILES:${PN}</u></b> files will go to <b><u>${PN}</u></b> folder which is in <b><u>PACKAGES</u></b></span></div></div></div></foreignObject><text x="2083" y="418" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">Folders created here are present in PACKAGES variable...</text></switch></g><rect x="8640.48" y="3680" width="360" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 935px; margin-left: 2205px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_package<br /></font></div></div></div></foreignObject><text x="2205" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_package&#xa;</text></switch></g><ellipse cx="8581.48" cy="3740" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 935px; margin-left: 2131px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">16</b></font></div></div></div></foreignObject><text x="2145" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">16</text></switch></g><path d="M 9988 2320 L 9988 2674.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 9988 2695.53 L 9978.67 2667.53 L 9988 2674.53 L 9997.33 2667.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="9748" y="2160" width="480" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 560px; margin-left: 2438px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">deploy-<b><i>pkg</i></b></font></div></div></div></foreignObject><text x="2497" y="564" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">deploy-pkg</text></switch></g><path d="M 9988 2860 L 9988 3014.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 9988 3035.53 L 9978.67 3007.53 L 9988 3014.53 L 9997.33 3007.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="9748" y="2700" width="480" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 695px; margin-left: 2438px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter"><b>${PACKAGE_ARCH}</b></font></div></div></div></foreignObject><text x="2497" y="699" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">${PACKAGE_ARCH}</text></switch></g><rect x="9028" y="1360" width="1640" height="595" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 408px; height: 1px; padding-top: 414px; margin-left: 2258px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 15px;">This can be <b><u>rpms</u></b>, <b><u>debs</u></b> or <b><u>ipks</u></b>.<br />These are provided by<br /><b><u>package_rpm</u></b>, <b><u>package_deb</u></b> and <b><u>package_ipk</u></b> classes respectively, use <b><u>PACKAGE_CLASSES</u></b> for that as<br />content of <b><u>PACKAGE_CLASSES</u></b> will be appended<br />to <b><u>INHERIT</u></b><br /></font></div></div></div></foreignObject><text x="2462" y="418" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">This can be rpms, debs or ipks....</text></switch></g><path d="M 10522 3105 L 10708 3105.59 Q 10748 3105.71 10748 3065.71 L 10748 1320.57 Q 10748 1280.57 10708 1280.57 L 7353.71 1280.57 Q 7313.71 1280.57 7313.8 1240.57 L 7313.92 1180.42" fill="none" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 7313.97 1153.42 L 7331.9 1189.45 L 7313.92 1180.42 L 7295.9 1189.38 Z" fill="#000000" stroke="#000000" stroke-width="12" stroke-miterlimit="10" pointer-events="all"/><rect x="9454" y="3040" width="1068" height="130" rx="19.5" ry="19.5" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 265px; height: 1px; padding-top: 776px; margin-left: 2365px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">sayhello-0.1-r0.${PACKAGE_ARCH}.<i>pkg</i></div></div></div></foreignObject><text x="2497" y="780" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">sayhello-0.1-r0.${PACKAGE_ARCH}.pkg</text></switch></g><rect x="10788" y="2640" width="1480" height="680" fill="none" stroke="#36393d" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 368px; height: 1px; padding-top: 745px; margin-left: 2698px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 15px;">This task also depends on <b><u>PACKAGE_CLASSES</u></b>,<br /><b><u><i>pkg</i></u></b> can be <b><u>rpm</u></b>, <b><u>deb</u></b> or <b><u>ipk</u></b> for <b><u>package_rpm</u></b>,<br /><b><u>package_deb</u></b> or <u style="font-weight: bold;">package_ipk</u> respectively.<br />The generated package generally named using:<br /><b><u>${PN}</u></b>, <b><u>${PR}</u></b>, <b><u>${PACKAGE_ARCH}</u></b> and <b><u><i>pkg</i></u></b><br /></font></div></div></div></foreignObject><text x="2882" y="749" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">This task also depends on PACKAGE_CLASSES,...</text></switch></g><path d="M 7314 520 L 7314 654.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 7314 675.53 L 7300 647.53 L 7314 654.53 L 7328 647.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 7454 440 Q 7454 440 7742.53 440" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 7763.53 440 L 7735.53 449.33 L 7742.53 440 L 7735.53 430.67 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="7174" y="360" width="280" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 110px; margin-left: 1795px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">deploy</font></div></div></div></foreignObject><text x="1829" y="114" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">deploy</text></switch></g><path d="M 7313.71 840 L 7313.71 880.57 Q 7313.71 920.57 7313.71 910.29 L 7313.71 905.14 Q 7313.71 900 7313.81 927.26 L 7313.91 954.53" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 7313.98 975.53 L 7299.88 947.58 L 7313.91 954.53 L 7327.88 947.48 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="7054.48" y="680" width="519" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 190px; margin-left: 1765px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>${DEPLOY_DIR_<i>pkg</i>}</b></div></div></div></foreignObject><text x="1828" y="194" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">${DEPLOY_DIR_pkg}</text></switch></g><rect x="9488" y="3680" width="600" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 935px; margin-left: 2447px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_package_write_<i>pkg</i><br /></font></div></div></div></foreignObject><text x="2447" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_package_write_pkg&#xa;</text></switch></g><ellipse cx="9408" cy="3740" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 935px; margin-left: 2338px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">17</b></font></div></div></div></foreignObject><text x="2352" y="939" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">17</text></switch></g><path d="M 10048 3740 Q 11528.57 3740 11528.03 3345.47" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 11528.01 3324.47 L 11537.38 3352.46 L 11528.03 3345.47 L 11518.71 3352.48 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="7074" y="980" width="480" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 265px; margin-left: 1770px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">${PACKAGE_ARCH}</div></div></div></foreignObject><text x="1829" y="269" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">${PACKAGE_ARCH}</text></switch></g><rect x="7768" y="672.52" width="1660" height="167.48" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 413px; height: 1px; padding-top: 189px; margin-left: 1943px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 15px;">For packages, this can be <b><u>IPK</u></b>, <b><u>RPM</u></b> or <b><u>DEB</u></b> (<i>check step 17</i>)</font></div></div></div></foreignObject><text x="2150" y="193" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">For packages, this can be IPK, RPM or DEB (check step 17)</text></switch></g><rect x="7369.48" y="480" width="320" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 133px; margin-left: 1843px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">DEPLOY_DIR</font></div></div></div></foreignObject><text x="1882" y="136" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">DEPLOY_DIR</text></switch></g><rect x="4988" y="80" width="240" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 33px; margin-left: 1248px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">TMPDIR</font></div></div></div></foreignObject><text x="1277" y="36" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">TMPDIR</text></switch></g><rect x="1668" y="480" width="250.72" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 61px; height: 1px; padding-top: 133px; margin-left: 418px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">DL_DIR</font></div></div></div></foreignObject><text x="448" y="136" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">DL_DIR</text></switch></g><path d="M 7573.48 760 L 7630.29 760.34 Q 7670.29 760.57 7706.42 758.98 L 7742.55 757.38" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 7763.53 756.46 L 7735.97 767.02 L 7742.55 757.38 L 7735.15 748.37 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="10488" y="2380" width="600" height="120" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 610px; margin-left: 2697px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">do_package_write_<i>pkg</i><br /></font></div></div></div></foreignObject><text x="2697" y="614" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">do_package_write_pkg&#xa;</text></switch></g><ellipse cx="10408" cy="2440" rx="60.00000000000001" ry="60.00000000000001" fill="#000000" stroke="#56517e" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 610px; margin-left: 2588px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter" color="#ffffff" size="1"><b style="font-size: 15px;">18</b></font></div></div></div></foreignObject><text x="2602" y="614" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">18</text></switch></g><path d="M 10268 2310.29 Q 10879.43 2310.29 10879.43 1999.43 Q 10879.43 1688.57 10878.68 1140.47" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 10878.65 1119.47 L 10888.02 1147.46 L 10878.68 1140.47 L 10869.35 1147.48 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="10148" y="2260" width="120" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><path d="M 10088 2200 Q 10088.57 2077.14 10173.14 2077.14 Q 10257.71 2077.14 10257.94 1980.47" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 10257.99 1959.47 L 10267.26 1987.49 L 10257.94 1980.47 L 10248.59 1987.45 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="9628" y="805" width="1667.52" height="310" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 415px; height: 1px; padding-top: 240px; margin-left: 2408px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 15px;">This can be <b><u>PKGWRITEDIRRPM</u></b>, <b><u>PKGWRITEDIRDEB</u></b> or <b><u>PKGWRITEDIRIPK</u></b> for <b><u>package_rpm</u></b>, <b><u>package_deb</u></b><br />or <b><u>package_ipk</u></b> respectively<br /></font></div></div></div></foreignObject><text x="2615" y="244" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">This can be PKGWRITEDIRRPM, PKGWRITEDIRDEB or PKGWRITEDIRIPK for pack...</text></switch></g><rect x="628" y="2470" width="1313" height="410" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 326px; height: 1px; padding-top: 669px; margin-left: 158px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 15px;">License checking happens in <b><u>do_populate_lic</u></b> after <b><u>do_patch<br /></u></b>and before that a checksum check<br />happends on <b><u>LIC_FILES_CHKSUM</u></b> if the<br />license is not <b><u>CLOSED</u></b><br /></span></div></div></div></foreignObject><text x="321" y="672" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">License checking happens in do_populate_lic after do_pa...</text></switch></g><rect x="3528.48" y="1360" width="1739.52" height="280" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 433px; height: 1px; padding-top: 375px; margin-left: 883px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 15px;">This variable is used to separate recipes<br />based on their target. This has value of<br /><b><u>${PACKAGE_ARCH}${TARGET_VENDOR}-${TARGET_OS}</u></b><br /></span></div></div></div></foreignObject><text x="1100" y="379" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">This variable is used to separate recipes...</text></switch></g><path d="M 6588 660 Q 6863.43 660 6863.4 505.47" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 6863.39 484.47 L 6872.73 512.47 L 6863.4 505.47 L 6854.06 512.47 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="6148" y="620" width="440" height="80" rx="12" ry="12" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 165px; margin-left: 1538px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">conf-notes.txt</div></div></div></foreignObject><text x="1592" y="169" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">conf-notes.txt</text></switch></g><path d="M 2580.02 520 Q 2580 660 3042.53 660" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 3063.53 660 L 3035.53 669.33 L 3042.53 660 L 3035.53 650.67 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 2374 440 Q 2215.43 440.57 2215.04 205.47" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 2215.01 184.47 L 2224.39 212.46 L 2215.04 205.47 L 2205.72 212.49 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="2374" y="360" width="412.04" height="160" rx="24" ry="24" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 101px; height: 1px; padding-top: 110px; margin-left: 595px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">sstate-cache</font></div></div></div></foreignObject><text x="645" y="114" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">sstate-cache</text></switch></g><rect x="2643.92" y="480" width="332.04" height="100" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 81px; height: 1px; padding-top: 133px; margin-left: 662px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><font data-font-src="https://fonts.googleapis.com/css?family=Architects+Daughter">SSTATE_DIR</font></div></div></div></foreignObject><text x="702" y="136" fill="#ffffff" font-family="Liberation Sans" font-size="12px" text-anchor="middle" font-weight="bold">SSTATE_DIR</text></switch></g><rect x="8927.96" y="3440" width="360" height="110" rx="16.5" ry="16.5" fill="#eeeeee" stroke="#36393d" stroke-width="4" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 874px; margin-left: 2233px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">sayhello</div></div></div></foreignObject><text x="2277" y="877" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">sayhello</text></switch></g><path d="M 4660 1960 Q 4660 2300 4904.57 2300 Q 5149.14 2300 5148.94 2611.65" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="stroke"/><path d="M 5148.92 2632.65 L 5139.61 2604.64 L 5148.94 2611.65 L 5158.27 2604.65 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="3068" y="480" width="1640" height="360" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 408px; height: 1px; padding-top: 165px; margin-left: 768px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 15px;">This folder contains cache for recipes build output, this is used by BitBake, if the recipe checksum did not change it knows that the output to use is the same.<br /></span></div></div></div></foreignObject><text x="972" y="169" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">This folder contains cache for recipes build output, this is used by...</text></switch></g><rect x="1395" y="0" width="1640" height="180" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 408px; height: 1px; padding-top: 23px; margin-left: 350px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 15px;"><font data-font-src="https://fonts.googleapis.com/css?family=Liberation+Sans">These directories can be shared accross builds to save disk space and build time</font><br /></span></div></div></div></foreignObject><text x="554" y="26" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">These directories can be shared accross builds to save disk space an...</text></switch></g><rect x="7768" y="350" width="1667.52" height="180" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 415px; height: 1px; padding-top: 110px; margin-left: 1943px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 15px;">This directory contains other output directories such as <b><u>images</u></b>, <b><u>sdk</u></b> and <b><u>licenses</u></b><br /></font></div></div></div></foreignObject><text x="2150" y="114" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">This directory contains other output directories such as images, sdk...</text></switch></g><rect x="5908" y="1020" width="680" height="520" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 320px; margin-left: 1478px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 15px;">This file contains all <b>layers</b> that BitBake should consider when looking for metadata.<br /></font></div></div></div></foreignObject><text x="1562" y="324" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">This file contains all layer...</text></switch></g><rect x="5396" y="20" width="1760" height="160" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 438px; height: 1px; padding-top: 25px; margin-left: 1350px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 15px;">This is base configuration file containing essential user config such as <b><u>MACHINE</u></b> and <b><u>DISTRO</u></b><br /></font></div></div></div></foreignObject><text x="1569" y="29" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">This is base configuration file containing essential user config such as...</text></switch></g><rect x="6140" y="320" width="964.52" height="160" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" stroke-dasharray="12 12" pointer-events="all"/><g transform="translate(-0.5 -0.5)scale(4)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 239px; height: 1px; padding-top: 100px; margin-left: 1536px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: &quot;Liberation Sans&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 15px;">The message to show after <b>source oe-init-build-env</b><br /></font></div></div></div></foreignObject><text x="1656" y="104" fill="rgb(0, 0, 0)" font-family="Liberation Sans" font-size="12px" text-anchor="middle">The message to show after source oe-init...</text></switch></g><rect x="10948" y="2400" width="120" height="80" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><rect x="10348" y="3065" width="80" height="80" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><rect x="9948" y="3700" width="100" height="80" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><rect x="10028" y="2200" width="80" height="80" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/><rect x="7454" y="725" width="80" height="80" fill="none" stroke="rgb(0, 0, 0)" stroke-width="4" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
diff --git a/poky/documentation/poky.yaml.in b/poky/documentation/poky.yaml.in
index 2922214bc9..7a686ac4e1 100644
--- a/poky/documentation/poky.yaml.in
+++ b/poky/documentation/poky.yaml.in
@@ -1,10 +1,10 @@
-DISTRO : "4.2"
-DISTRO_NAME_NO_CAP : "mickledore"
-DISTRO_NAME : "Mickledore"
-DISTRO_NAME_NO_CAP_MINUS_ONE : "langdale"
+DISTRO : "4.3"
+DISTRO_NAME_NO_CAP : "nanbield"
+DISTRO_NAME : "Nanbield"
+DISTRO_NAME_NO_CAP_MINUS_ONE : "mickledore"
DISTRO_NAME_NO_CAP_LTS : "kirkstone"
-YOCTO_DOC_VERSION : "4.2"
-DISTRO_REL_TAG : "yocto-4.2"
+YOCTO_DOC_VERSION : "4.3"
+DISTRO_REL_TAG : "yocto-4.3"
DOCCONF_VERSION : "dev"
BITBAKE_SERIES : ""
YOCTO_DL_URL : "https://downloads.yoctoproject.org"
diff --git a/poky/documentation/profile-manual/intro.rst b/poky/documentation/profile-manual/intro.rst
index 93f8429ee3..86310cf318 100644
--- a/poky/documentation/profile-manual/intro.rst
+++ b/poky/documentation/profile-manual/intro.rst
@@ -7,43 +7,45 @@ Yocto Project Profiling and Tracing Manual
Introduction
============
-Yocto bundles a number of tracing and profiling tools --- this 'HOWTO'
+Yocto Project bundles a number of tracing and profiling tools --- this manual
describes their basic usage and shows by example how to make use of them
-to examine application and system behavior.
+to analyze application and system behavior.
-The tools presented are for the most part completely open-ended and have
+The tools presented are, for the most part, completely open-ended and have
quite good and/or extensive documentation of their own which can be used
to solve just about any problem you might come across in Linux. Each
section that describes a particular tool has links to that tool's
documentation and website.
-The purpose of this 'HOWTO' is to present a set of common and generally
+The purpose of this manual is to present a set of common and generally
useful tracing and profiling idioms along with their application (as
appropriate) to each tool, in the context of a general-purpose
'drill-down' methodology that can be applied to solving a large number
-(90%?) of problems. For help with more advanced usages and problems,
-please see the documentation and/or websites listed for each tool.
+of problems. For help with more advanced usages and problems,
+refer to the documentation and/or websites provided for each tool.
-The final section of this 'HOWTO' is a collection of real-world examples
-which we'll be continually adding to as we solve more problems using the
-tools --- feel free to add your own examples to the list!
+The final section of this manual is a collection of real-world examples
+which we'll be continually updating as we solve more problems using the
+tools --- feel free to suggest additions to what you read here.
General Setup
=============
-Most of the tools are available only in 'sdk' images or in images built
-after adding 'tools-profile' to your local.conf. So, in order to be able
-to access all of the tools described here, please first build and boot
-an 'sdk' image e.g. ::
+Most of the tools are available only in ``sdk`` images or in images built
+after adding ``tools-profile`` to your ``local.conf`` file. So, in order to be able
+to access all of the tools described here, you can build and boot
+an ``sdk`` image, perhaps one of::
$ bitbake core-image-sato-sdk
+ $ bitbake core-image-weston-sdk
+ $ bitbake core-image-rt-sdk
-or alternatively by adding 'tools-profile' to the :term:`EXTRA_IMAGE_FEATURES` line in
-your local.conf::
+Alternatively, you can add ``tools-profile`` to the :term:`EXTRA_IMAGE_FEATURES` line in
+your ``local.conf`` file::
EXTRA_IMAGE_FEATURES = "debug-tweaks tools-profile"
-If you use the 'tools-profile' method, you don't need to build an sdk image -
+If you use the ``tools-profile`` method, you don't need to build an sdk image ---
the tracing and profiling tools will be included in non-sdk images as well e.g.::
$ bitbake core-image-sato
@@ -64,12 +66,12 @@ the tracing and profiling tools will be included in non-sdk images as well e.g.:
If you've already built a stripped image, you can generate debug
packages (xxx-dbg) which you can manually install as needed.
-To generate debug info for packages, you can add dbg-pkgs to
-:term:`EXTRA_IMAGE_FEATURES` in local.conf. For example::
+To generate debug info for packages, you can add ``dbg-pkgs`` to
+:term:`EXTRA_IMAGE_FEATURES` in ``local.conf``. For example::
EXTRA_IMAGE_FEATURES = "debug-tweaks tools-profile dbg-pkgs"
-Additionally, in order to generate the right type of debuginfo, we also need to
+Additionally, in order to generate the right type of debug info, we also need to
set :term:`PACKAGE_DEBUG_SPLIT_STYLE` in the ``local.conf`` file::
PACKAGE_DEBUG_SPLIT_STYLE = 'debug-file-directory'
diff --git a/poky/documentation/ref-manual/classes.rst b/poky/documentation/ref-manual/classes.rst
index 3f0d4844e8..a8afe9f2dc 100644
--- a/poky/documentation/ref-manual/classes.rst
+++ b/poky/documentation/ref-manual/classes.rst
@@ -281,6 +281,19 @@ tool.
This class inherits the :ref:`ref-classes-cargo_common` class.
+.. _ref-classes-cargo_c:
+
+``cargo_c``
+===========
+
+The :ref:`ref-classes-cargo_c` class can be inherited by a recipe to generate
+a Rust library that can be called by C/C++ code. The recipe which inherits this
+class has to only replace ``inherit cargo`` by ``inherit cargo_c``.
+
+See the :yocto_git:`rust-c-lib-example_git.bb
+</poky/tree/meta-selftest/recipes-devtools/rust/rust-c-lib-example_git.bb>`
+example recipe.
+
.. _ref-classes-cargo_common:
``cargo_common``
@@ -370,7 +383,9 @@ preferred CMake Module directory: ``${D}${datadir}/cmake/modules/``.
========
The :ref:`ref-classes-cml1` class provides basic support for the Linux kernel style
-build configuration system.
+build configuration system. "cml" stands for "Configuration Menu Language", which
+originates from the Linux kernel but is also used in other projects such as U-Boot
+and BusyBox. It could have been called "kconfig" too.
.. _ref-classes-compress_doc:
@@ -1480,6 +1495,9 @@ Here are the tests you can list with the :term:`WARN_QA` and
also inherits :ref:`ref-classes-features_check` in order for the
requirement to actually work.
+- ``unimplemented-ptest:`` Checks that ptests are implemented for upstream
+ tests.
+
- ``unlisted-pkg-lics:`` Checks that all declared licenses applying
for a package are also declared on the recipe level (i.e. any license
in ``LICENSE:*`` should appear in :term:`LICENSE`).
@@ -1776,9 +1794,10 @@ class.
=========
The :ref:`ref-classes-meson` class allows to create recipes that build software
-using the `Meson <https://mesonbuild.com/>`__ build system. You can use
-the :term:`MESON_BUILDTYPE` and :term:`EXTRA_OEMESON` variables to specify
-additional configuration options to be passed using the ``meson`` command line.
+using the `Meson <https://mesonbuild.com/>`__ build system. You can use the
+:term:`MESON_BUILDTYPE`, :term:`MESON_TARGET` and :term:`EXTRA_OEMESON`
+variables to specify additional configuration options to be passed using the
+``meson`` command line.
.. _ref-classes-metadata_scm:
diff --git a/poky/documentation/ref-manual/features.rst b/poky/documentation/ref-manual/features.rst
index d6307f1a2f..dd14339bc2 100644
--- a/poky/documentation/ref-manual/features.rst
+++ b/poky/documentation/ref-manual/features.rst
@@ -52,8 +52,6 @@ Project metadata:
- *alsa:* Hardware has ALSA audio drivers
-- *apm:* Hardware uses APM (or APM emulation)
-
- *bluetooth:* Hardware has integrated BT
- *efi:* Support for booting through EFI
@@ -225,6 +223,10 @@ metadata, as extra layers can define their own:
reduced shell overhead, and other features. This ``init`` manager is
used by many distributions.
+- *systemd-resolved:* Include support and use ``systemd-resolved`` as the
+ main DNS name resolver in ``glibc`` Name Service Switch. This is a DNS
+ resolver daemon from ``systemd``.
+
- *usbgadget:* Include USB Gadget Device support (for USB
networking/serial/storage).
diff --git a/poky/documentation/ref-manual/qa-checks.rst b/poky/documentation/ref-manual/qa-checks.rst
index 4a02e7206a..58526a0e57 100644
--- a/poky/documentation/ref-manual/qa-checks.rst
+++ b/poky/documentation/ref-manual/qa-checks.rst
@@ -789,6 +789,17 @@ Errors and Warnings
use a relative path rather than an absolute one, or to pick up the path from
runtime configuration or environment variables.
+.. _qa-check-unimplemented-ptest:
+
+- ``<tool> tests detected [unimplemented-ptest]``
+
+ This check will detect if the source of the package contains some
+ upstream-provided tests and, if so, that ptests are implemented for this
+ recipe. See the ":ref:`dev-manual/packages:testing packages with ptest`"
+ section in the Yocto Project Development Tasks Manual. See also the
+ ":ref:`ref-classes-ptest`" section.
+
+
Configuring and Disabling QA Checks
===================================
diff --git a/poky/documentation/ref-manual/svg/releases.svg b/poky/documentation/ref-manual/svg/releases.svg
index 5333498d1f..198d4632b1 100644
--- a/poky/documentation/ref-manual/svg/releases.svg
+++ b/poky/documentation/ref-manual/svg/releases.svg
@@ -404,15 +404,15 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
- inkscape:window-width="1846"
- inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:window-height="1043"
id="namedview4"
showgrid="true"
- inkscape:zoom="0.51166405"
- inkscape:cx="-43.974166"
- inkscape:cy="311.72798"
- inkscape:window-x="1994"
- inkscape:window-y="27"
+ inkscape:zoom="1.4472045"
+ inkscape:cx="736.24703"
+ inkscape:cy="312.32629"
+ inkscape:window-x="1728"
+ inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g10"
inkscape:document-rotation="0"
@@ -669,28 +669,28 @@
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#fffefe;fill-opacity:1;stroke:none"
id="tspan10317-2-9-1-4">4.2</tspan></text>
<g
- id="g32107">
+ id="g1379">
<rect
- style="opacity:0.75;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-opacity:1"
- id="rect917-0-0-4-4-9-4-5-3"
- width="140.00014"
+ style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-opacity:1"
+ id="rect917-0-0-4-4-9-4-5-38"
+ width="140.00003"
height="45.000004"
- x="1199.9999"
- y="-229.99998"
+ x="1220"
+ y="-230.00005"
ry="2.2558987" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#fffefe;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- x="1247.2329"
+ x="1269.2329"
y="-210.32925"
id="text1185-3-55-4-0-0-0-1-1"><tspan
sodipodi:role="line"
- x="1247.2329"
+ x="1269.2329"
y="-210.32925"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#fffefe;fill-opacity:1;stroke:none"
id="tspan957-2-8-6-3-9-7-4">Nanbield</tspan><tspan
sodipodi:role="line"
- x="1247.2329"
+ x="1269.2329"
y="-192.33258"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#fffefe;fill-opacity:1;stroke:none"
id="tspan10317-2-9-1-4-6">4.3</tspan></text>
diff --git a/poky/documentation/ref-manual/variables.rst b/poky/documentation/ref-manual/variables.rst
index 11523bb9e7..b394d31099 100644
--- a/poky/documentation/ref-manual/variables.rst
+++ b/poky/documentation/ref-manual/variables.rst
@@ -1358,6 +1358,32 @@ system and gives an overview of their function and contents.
speed since the build system skips parsing recipes not compatible
with the current machine.
+ If one wants to have a recipe only available for some architectures
+ (here ``aarch64`` and ``mips64``), the following can be used::
+
+ COMPATIBLE_MACHINE = "^$"
+ COMPATIBLE_MACHINE:arch64 = "^(aarch64)$"
+ COMPATIBLE_MACHINE:mips64 = "^(mips64)$"
+
+ The first line means "match all machines whose :term:`MACHINEOVERRIDES`
+ contains the empty string", which will always be none.
+
+ The second is for matching all machines whose :term:`MACHINEOVERRIDES`
+ contains one override which is exactly ``aarch64``.
+
+ The third is for matching all machines whose :term:`MACHINEOVERRIDES`
+ contains one override which is exactly ``mips64``.
+
+ The same could be achieved with::
+
+ COMPATIBLE_MACHINE = "^(aarch64|mips64)$"
+
+ .. note::
+
+ When :term:`COMPATIBLE_MACHINE` is set in a recipe inherits from
+ native, the recipe is always skipped. All native recipes must be
+ entirely target independent and should not rely on :term:`MACHINE`.
+
:term:`COMPLEMENTARY_GLOB`
Defines wildcards to match when installing a list of complementary
packages for all the packages explicitly (or implicitly) installed in
@@ -1698,7 +1724,8 @@ system and gives an overview of their function and contents.
It has the format "reason: description" and the description is optional.
The Reason is mapped to the final CVE state by mapping via
- :term:`CVE_CHECK_STATUSMAP`
+ :term:`CVE_CHECK_STATUSMAP`. See :ref:`dev-manual/vulnerabilities:fixing vulnerabilities in recipes`
+ for details.
:term:`CVE_STATUS_GROUPS`
If there are many CVEs with the same status and reason, they can by simplified by using this
@@ -2459,6 +2486,16 @@ system and gives an overview of their function and contents.
external tools. See the :ref:`ref-classes-kernel-yocto` class in
``meta/classes-recipe`` to see how the variable is used.
+ :term:`KERNEL_LOCALVERSION`
+ This variable allows to append a string to the version
+ of the kernel image. This corresponds to the ``CONFIG_LOCALVERSION``
+ kernel configuration parameter.
+
+ Using this variable is only useful when you are using a kernel recipe
+ inheriting the :ref:`ref-classes-kernel` class, and which doesn't
+ already set a local version. Therefore, setting this variable has no
+ impact on ``linux-yocto`` kernels.
+
:term:`EXTERNAL_TOOLCHAIN`
When you intend to use an
:ref:`external toolchain <dev-manual/external-toolchain:optionally using an external toolchain>`,
@@ -3765,9 +3802,9 @@ system and gives an overview of their function and contents.
:term:`IMAGE_POSTPROCESS_COMMAND`
Specifies a list of functions to call once the OpenEmbedded build
system creates the final image output files. You can specify
- functions separated by semicolons::
+ functions separated by spaces::
- IMAGE_POSTPROCESS_COMMAND += "function; ... "
+ IMAGE_POSTPROCESS_COMMAND += "function"
If you need to pass the root filesystem path to a command within the
function, you can use ``${IMAGE_ROOTFS}``, which points to the
@@ -3778,9 +3815,9 @@ system and gives an overview of their function and contents.
:term:`IMAGE_PREPROCESS_COMMAND`
Specifies a list of functions to call before the OpenEmbedded build
system creates the final image output files. You can specify
- functions separated by semicolons::
+ functions separated by spaces::
- IMAGE_PREPROCESS_COMMAND += "function; ... "
+ IMAGE_PREPROCESS_COMMAND += "function"
If you need to pass the root filesystem path to a command within the
function, you can use ``${IMAGE_ROOTFS}``, which points to the
@@ -4333,17 +4370,16 @@ system and gives an overview of their function and contents.
This variable is also used from the kernel's append file to identify
the kernel branch specific to a particular machine or target
hardware. Continuing with the previous kernel example, the kernel's
- append file (i.e. ``linux-yocto_4.12.bbappend``) is located in the
+ append file is located in the
BSP layer for a given machine. For example, the append file for the
- Beaglebone, EdgeRouter, and generic versions of both 32 and 64-bit IA
+ Beaglebone and generic versions of both 32 and 64-bit IA
machines (``meta-yocto-bsp``) is named
- ``meta-yocto-bsp/recipes-kernel/linux/linux-yocto_4.12.bbappend``.
+ ``meta-yocto-bsp/recipes-kernel/linux/linux-yocto_6.1.bbappend``.
Here are the related statements from that append file::
- KBRANCH:genericx86 = "standard/base"
- KBRANCH:genericx86-64 = "standard/base"
- KBRANCH:edgerouter = "standard/edgerouter"
- KBRANCH:beaglebone = "standard/beaglebone"
+ KBRANCH:genericx86 = "v6.1/standard/base"
+ KBRANCH:genericx86-64 = "v6.1/standard/base"
+ KBRANCH:beaglebone-yocto = "v6.1/standard/beaglebone"
The :term:`KBRANCH` statements
identify the kernel branch to use when building for each supported
@@ -4718,6 +4754,10 @@ system and gives an overview of their function and contents.
to the :term:`KERNEL_SRC` variable. Both variables are common variables
used by external Makefiles to point to the kernel source directory.
+ :term:`KERNEL_STRIP`
+ Allows to specific which ``strip`` command to use to strip the kernel
+ binary, typically either GNU binutils ``strip`` or ``llvm-strip``.
+
:term:`KERNEL_VERSION`
Specifies the version of the kernel as extracted from ``version.h``
or ``utsrelease.h`` within the kernel sources. Effects of setting
@@ -5075,7 +5115,6 @@ system and gives an overview of their function and contents.
MACHINE ?= "genericx86"
MACHINE ?= "genericx86-64"
MACHINE ?= "beaglebone"
- MACHINE ?= "edgerouter"
The last five are Yocto Project reference hardware
boards, which are provided in the ``meta-yocto-bsp`` layer.
@@ -5280,6 +5319,11 @@ system and gives an overview of their function and contents.
you to specify the inclusion of debugging symbols and the compiler
optimizations (none, performance or size).
+ :term:`MESON_TARGET`
+ A variable for the :ref:`ref-classes-meson` class, allowing to choose
+ a Meson target to build in :ref:`ref-tasks-compile`. Otherwise, the
+ default targets are built.
+
:term:`METADATA_BRANCH`
The branch currently checked out for the OpenEmbedded-Core layer (path
determined by :term:`COREBASE`).
@@ -5303,9 +5347,8 @@ system and gives an overview of their function and contents.
:term:`PREMIRRORS`, the upstream source, and then
locations specified by :term:`MIRRORS` in that order.
- Assuming your distribution (:term:`DISTRO`) is "poky",
- the default value for :term:`MIRRORS` is defined in the
- ``conf/distro/poky.conf`` file in the ``meta-poky`` Git repository.
+ The default value for :term:`MIRRORS` is defined in the
+ ``meta/classes-global/mirrors.bbclass`` file in the core metadata layer.
:term:`MLPREFIX`
Specifies a prefix has been added to :term:`PN` to create a
@@ -5591,6 +5634,11 @@ system and gives an overview of their function and contents.
For additional information on how this variable is used, see the
initialization script.
+ :term:`OEQA_REPRODUCIBLE_TEST_PACKAGE`
+ Set the package manager(s) for build reproducibility testing.
+ See :yocto_git:`reproducible.py </poky/tree/meta/lib/oeqa/selftest/cases/reproducible.py>`
+ and :doc:`/test-manual/reproducible-builds`.
+
:term:`OEQA_REPRODUCIBLE_TEST_TARGET`
Set build target for build reproducibility testing. By default
all available recipes are compiled with "bitbake world", see also :term:`EXCLUDE_FROM_WORLD`
@@ -6059,13 +6107,11 @@ system and gives an overview of their function and contents.
omit any argument you like but must retain the separating commas. The
order is important and specifies the following:
- #. Extra arguments that should be added to the configure script
- argument list (:term:`EXTRA_OECONF` or
- :term:`PACKAGECONFIG_CONFARGS`) if
- the feature is enabled.
+ #. Extra arguments that should be added to :term:`PACKAGECONFIG_CONFARGS`
+ if the feature is enabled.
- #. Extra arguments that should be added to :term:`EXTRA_OECONF` or
- :term:`PACKAGECONFIG_CONFARGS` if the feature is disabled.
+ #. Extra arguments that should be added to :term:`PACKAGECONFIG_CONFARGS`
+ if the feature is disabled.
#. Additional build dependencies (:term:`DEPENDS`)
that should be added if the feature is enabled.
@@ -6123,6 +6169,38 @@ system and gives an overview of their function and contents.
PACKAGECONFIG:append:pn-recipename = " f4"
+ Consider the following example of a :ref:`ref-classes-cmake` recipe with a systemd service
+ in which :term:`PACKAGECONFIG` is used to transform the systemd service
+ into a feature that can be easily enabled or disabled via :term:`PACKAGECONFIG`::
+
+ example.c
+ example.service
+ CMakeLists.txt
+
+ The ``CMakeLists.txt`` file contains::
+
+ if(WITH_SYSTEMD)
+ install(FILES ${PROJECT_SOURCE_DIR}/example.service DESTINATION /etc/systemd/systemd)
+ endif(WITH_SYSTEMD)
+
+ In order to enable the installation of ``example.service`` we need to
+ ensure that ``-DWITH_SYSTEMD=ON`` is passed to the ``cmake`` command
+ execution. Recipes that have ``CMakeLists.txt`` generally inherit the
+ :ref:`ref-classes-cmake` class, that runs ``cmake`` with
+ :term:`EXTRA_OECMAKE`, which :term:`PACKAGECONFIG_CONFARGS` will be
+ appended to. Now, knowing that :term:`PACKAGECONFIG_CONFARGS` is
+ automatically filled with either the first or second element of
+ :term:`PACKAGECONFIG` flag value, the recipe would be like::
+
+ inherit cmake
+ PACKAGECONFIG = "systemd"
+ PACKAGECONFIG[systemd] = "-DWITH_SYSTEMD=ON,-DWITH_SYSTEMD=OFF"
+
+ A side note to this recipe is to check if ``systemd`` is in fact the used :term:`INIT_MANAGER`
+ or not::
+
+ PACKAGECONFIG = "${@'systemd' if d.getVar('INIT_MANAGER') == 'systemd' else ''}"
+
:term:`PACKAGECONFIG_CONFARGS`
A space-separated list of configuration options generated from the
:term:`PACKAGECONFIG` setting.
@@ -6409,9 +6487,9 @@ system and gives an overview of their function and contents.
:term:`POPULATE_SDK_POST_HOST_COMMAND`
Specifies a list of functions to call once the OpenEmbedded build
system has created the host part of the SDK. You can specify
- functions separated by semicolons::
+ functions separated by spaces::
- POPULATE_SDK_POST_HOST_COMMAND += "function; ... "
+ POPULATE_SDK_POST_HOST_COMMAND += "function"
If you need to pass the SDK path to a command within a function, you
can use ``${SDK_DIR}``, which points to the parent directory used by
@@ -6421,9 +6499,9 @@ system and gives an overview of their function and contents.
:term:`POPULATE_SDK_POST_TARGET_COMMAND`
Specifies a list of functions to call once the OpenEmbedded build
system has created the target part of the SDK. You can specify
- functions separated by semicolons::
+ functions separated by spaces::
- POPULATE_SDK_POST_TARGET_COMMAND += "function; ... "
+ POPULATE_SDK_POST_TARGET_COMMAND += "function"
If you need to pass the SDK path to a command within a function, you
can use ``${SDK_DIR}``, which points to the parent directory used by
@@ -6568,9 +6646,8 @@ system and gives an overview of their function and contents.
source, and then locations specified by
:term:`MIRRORS` in that order.
- Assuming your distribution (:term:`DISTRO`) is "poky",
- the default value for :term:`PREMIRRORS` is defined in the
- ``conf/distro/poky.conf`` file in the ``meta-poky`` Git repository.
+ The default value for :term:`PREMIRRORS` is defined in the
+ ``meta/classes-global/mirrors.bbclass`` file in the core metadata layer.
Typically, you could add a specific server for the build system to
attempt before any others by adding something like the following to
@@ -6910,6 +6987,22 @@ system and gives an overview of their function and contents.
":ref:`bitbake-user-manual/bitbake-user-manual-execution:dependencies`" sections in the
BitBake User Manual for additional information on tasks and dependencies.
+ :term:`RECIPE_MAINTAINER`
+ This variable defines the name and e-mail address of the maintainer of a
+ recipe. Such information can be used by human users submitted changes,
+ and by automated tools to send notifications, for example about
+ vulnerabilities or source updates.
+
+ The variable can be defined in a global distribution :oe_git:`maintainers.inc
+ </openembedded-core/tree/meta/conf/distro/include/maintainers.inc>` file::
+
+ meta/conf/distro/include/maintainers.inc:RECIPE_MAINTAINER:pn-sysvinit = "Ross Burton <ross.burton@arm.com>"
+
+ It can also be directly defined in a recipe,
+ for example in the ``libgpiod`` one::
+
+ RECIPE_MAINTAINER = "Bartosz Golaszewski <brgl@bgdev.pl>"
+
:term:`RECIPE_NO_UPDATE_REASON`
If a recipe should not be replaced by a more recent upstream version,
putting the reason why in this variable in a recipe allows
@@ -6917,6 +7010,36 @@ system and gives an overview of their function and contents.
in the ":ref:`ref-manual/devtool-reference:checking on the upgrade status of a recipe`"
section.
+ :term:`RECIPE_SYSROOT`
+ This variable points to the directory that holds all files populated from
+ recipes specified in :term:`DEPENDS`. As the name indicates,
+ think of this variable as a custom root (``/``) for the recipe that will be
+ used by the compiler in order to find headers and other files needed to complete
+ its job.
+
+ This variable is related to :term:`STAGING_DIR_HOST` or :term:`STAGING_DIR_TARGET`
+ according to the type of the recipe and the build target.
+
+ To better understand this variable, consider the following examples:
+
+ - For ``#include <header.h>``, ``header.h`` should be in ``"${RECIPE_SYSROOT}/usr/include"``
+
+ - For ``-lexample``, ``libexample.so`` should be in ``"${RECIPE_SYSROOT}/lib"``
+ or other library sysroot directories.
+
+ The default value is ``"${WORKDIR}/recipe-sysroot"``.
+ Do not modify it.
+
+ :term:`RECIPE_SYSROOT_NATIVE`
+ This is similar to :term:`RECIPE_SYSROOT` but the populated files are from
+ ``-native`` recipes. This allows a recipe built for the target machine to
+ use ``native`` tools.
+
+ This variable is related to :term:`STAGING_DIR_NATIVE`.
+
+ The default value is ``"${WORKDIR}/recipe-sysroot-native"``.
+ Do not modify it.
+
:term:`REPODIR`
See :term:`bitbake:REPODIR` in the BitBake manual.
@@ -6979,9 +7102,9 @@ system and gives an overview of their function and contents.
:term:`ROOTFS_POSTINSTALL_COMMAND`
Specifies a list of functions to call after the OpenEmbedded build
system has installed packages. You can specify functions separated by
- semicolons::
+ spaces::
- ROOTFS_POSTINSTALL_COMMAND += "function; ... "
+ ROOTFS_POSTINSTALL_COMMAND += "function"
If you need to pass the root filesystem path to a command within a
function, you can use ``${IMAGE_ROOTFS}``, which points to the
@@ -6992,9 +7115,9 @@ system and gives an overview of their function and contents.
:term:`ROOTFS_POSTPROCESS_COMMAND`
Specifies a list of functions to call once the OpenEmbedded build
system has created the root filesystem. You can specify functions
- separated by semicolons::
+ separated by spaces::
- ROOTFS_POSTPROCESS_COMMAND += "function; ... "
+ ROOTFS_POSTPROCESS_COMMAND += "function"
If you need to pass the root filesystem path to a command within a
function, you can use ``${IMAGE_ROOTFS}``, which points to the
@@ -7007,9 +7130,9 @@ system and gives an overview of their function and contents.
system has removed unnecessary packages. When runtime package
management is disabled in the image, several packages are removed
including ``base-passwd``, ``shadow``, and ``update-alternatives``.
- You can specify functions separated by semicolons::
+ You can specify functions separated by spaces::
- ROOTFS_POSTUNINSTALL_COMMAND += "function; ... "
+ ROOTFS_POSTUNINSTALL_COMMAND += "function"
If you need to pass the root filesystem path to a command within a
function, you can use ``${IMAGE_ROOTFS}``, which points to the
@@ -7020,9 +7143,9 @@ system and gives an overview of their function and contents.
:term:`ROOTFS_PREPROCESS_COMMAND`
Specifies a list of functions to call before the OpenEmbedded build
system has created the root filesystem. You can specify functions
- separated by semicolons::
+ separated by spaces::
- ROOTFS_PREPROCESS_COMMAND += "function; ... "
+ ROOTFS_PREPROCESS_COMMAND += "function"
If you need to pass the root filesystem path to a command within a
function, you can use ``${IMAGE_ROOTFS}``, which points to the
@@ -7297,13 +7420,16 @@ system and gives an overview of their function and contents.
:term:`SDK_EXT_TYPE` is set to "full".
:term:`SDK_NAME`
- The base name for SDK output files. The name is derived from the
- :term:`DISTRO`, :term:`TCLIBC`,
- :term:`SDK_ARCH`,
- :term:`IMAGE_BASENAME`, and
- :term:`TUNE_PKGARCH` variables::
+ The base name for SDK output files. The default value (as set in
+ ``meta-poky/conf/distro/poky.conf``) is derived from the
+ :term:`DISTRO`,
+ :term:`TCLIBC`,
+ :term:`SDKMACHINE`,
+ :term:`IMAGE_BASENAME`,
+ :term:`TUNE_PKGARCH`, and
+ :term:`MACHINE` variables::
- SDK_NAME = "${DISTRO}-${TCLIBC}-${SDK_ARCH}-${IMAGE_BASENAME}-${TUNE_PKGARCH}"
+ SDK_NAME = "${DISTRO}-${TCLIBC}-${SDKMACHINE}-${IMAGE_BASENAME}-${TUNE_PKGARCH}-${MACHINE}"
:term:`SDK_OS`
Specifies the operating system for which the SDK will be built. The
@@ -7334,7 +7460,9 @@ system and gives an overview of their function and contents.
:term:`SDK_POSTPROCESS_COMMAND`
Specifies a list of functions to call once the OpenEmbedded build
system creates the SDK. You can specify functions separated by
- semicolons: SDK_POSTPROCESS_COMMAND += "function; ... "
+ spaces:
+
+ SDK_POSTPROCESS_COMMAND += "function"
If you need to pass an SDK path to a command within a function, you
can use ``${SDK_DIR}``, which points to the parent directory used by
@@ -7516,23 +7644,6 @@ system and gives an overview of their function and contents.
SERIAL_CONSOLES = "115200;ttyS0 115200;ttyS1"
- :term:`SERIAL_CONSOLES_CHECK`
- Specifies serial consoles, which must be listed in
- :term:`SERIAL_CONSOLES`, to check against
- ``/proc/console`` before enabling them using getty. This variable
- allows aliasing in the format: <device>:<alias>. If a device was
- listed as "sclp_line0" in ``/dev/`` and "ttyS0" was listed in
- ``/proc/console``, you would do the following::
-
- SERIAL_CONSOLES_CHECK = "slcp_line0:ttyS0"
-
- This variable is currently only supported with SysVinit (i.e. not
- with systemd). Note that :term:`SERIAL_CONSOLES_CHECK` also requires
- ``/etc/inittab`` to be writable when used with SysVinit. This makes it
- incompatible with customizations such as the following::
-
- EXTRA_IMAGE_FEATURES += "read-only-rootfs"
-
:term:`SETUPTOOLS_BUILD_ARGS`
When used by recipes that inherit the :ref:`ref-classes-setuptools3`
class, this variable can be used to specify additional arguments to be
@@ -8105,6 +8216,16 @@ system and gives an overview of their function and contents.
file://.* https://someserver.tld/share/sstate/PATH;downloadfilename=PATH \
file://.* file:///some-local-dir/sstate/PATH"
+ The Yocto Project actually shares the cache data objects built by its
+ autobuilder::
+
+ SSTATE_MIRRORS ?= "file://.* http://cdn.jsdelivr.net/yocto/sstate/all/PATH;downloadfilename=PATH"
+
+ As such binary artifacts are built for the generic QEMU machines
+ supported by the various Poky releases, they are less likely to be
+ reusable in real projects building binaries optimized for a specific
+ CPU family.
+
:term:`SSTATE_SCAN_FILES`
Controls the list of files the OpenEmbedded build system scans for
hardcoded installation paths. The variable uses a space-separated
@@ -8221,10 +8342,15 @@ system and gives an overview of their function and contents.
for ``-native`` recipes, as they make use of host headers and
libraries.
+ Check :term:`RECIPE_SYSROOT` and :term:`RECIPE_SYSROOT_NATIVE`.
+
:term:`STAGING_DIR_NATIVE`
Specifies the path to the sysroot directory used when building
components that run on the build host itself.
+ The default value is ``"${RECIPE_SYSROOT_NATIVE}"``,
+ check :term:`RECIPE_SYSROOT_NATIVE`.
+
:term:`STAGING_DIR_TARGET`
Specifies the path to the sysroot used for the system for which the
component generates code. For components that do not generate code,
@@ -8409,6 +8535,35 @@ system and gives an overview of their function and contents.
${libdir}/${BPN}/ptest \
"
+ Consider the following example in which you need to manipulate this variable.
+ Assume you have a recipe ``A`` that provides a shared library ``.so.*`` that is
+ installed into a custom folder other than "``${libdir}``"
+ or "``${base_libdir}``", let's say "``/opt/lib``".
+
+ .. note::
+
+ This is not a recommended way to deal with shared libraries, but this
+ is just to show the usefulness of setting :term:`SYSROOT_DIRS`.
+
+ When a recipe ``B`` :term:`DEPENDS` on ``A``, it means what is in
+ :term:`SYSROOT_DIRS` will be copied from :term:`D` of the recipe ``B``
+ into ``B``'s :term:`SYSROOT_DESTDIR` that is "``${WORKDIR}/sysroot-destdir``".
+
+ Now, since ``/opt/lib`` is not in :term:`SYSROOT_DIRS`, it will never be copied to
+ ``A``'s :term:`RECIPE_SYSROOT`, which is "``${WORKDIR}/recipe-sysroot``". So,
+ the linking process will fail.
+
+ To fix this, you need to add ``/opt/lib`` to :term:`SYSROOT_DIRS`::
+
+ SYSROOT_DIRS:append = " /opt/lib"
+
+ .. note::
+ Even after setting ``/opt/lib`` to :term:`SYSROOT_DIRS`, the linking process will still fail
+ because the linker does not know that location, since :term:`TARGET_LDFLAGS`
+ doesn't contain it (if your recipe is for the target). Therefore, so you should add::
+
+ TARGET_LDFLAGS:append = " -L${RECIPE_SYSROOT}/opt/lib"
+
:term:`SYSROOT_DIRS_NATIVE`
Extra directories staged into the sysroot by the
:ref:`ref-tasks-populate_sysroot` task for
@@ -9046,6 +9201,16 @@ system and gives an overview of their function and contents.
portion of an eSDK. This is similar to :term:`TOOLCHAIN_HOST_TASK`
applying to SDKs.
+ :term:`TOOLCHAIN_OPTIONS`
+ This variable holds extra options passed to the compiler and the linker
+ for non ``-native`` recipes as they have to point to their custom
+ ``sysroot`` folder pointed to by :term:`RECIPE_SYSROOT`::
+
+ TOOLCHAIN_OPTIONS = " --sysroot=${RECIPE_SYSROOT}"
+
+ Native recipes don't need this variable to be set, as they are
+ built for the host machine with the native compiler.
+
:term:`TOOLCHAIN_OUTPUTNAME`
This variable defines the name used for the toolchain output. The
:ref:`populate_sdk_base <ref-classes-populate-sdk-*>` class sets
diff --git a/poky/documentation/sdk-manual/appendix-obtain.rst b/poky/documentation/sdk-manual/appendix-obtain.rst
index f40ea6d4ab..ad531cbf24 100644
--- a/poky/documentation/sdk-manual/appendix-obtain.rst
+++ b/poky/documentation/sdk-manual/appendix-obtain.rst
@@ -39,27 +39,20 @@ Follow these steps to locate and hand-install the toolchain:
download the installer appropriate for your build host, target
hardware, and image type.
- The installer files (``*.sh``) follow this naming convention::
+ The installer files (``*.sh``) follow this naming convention:
+ ``poky-glibc-host_system-core-image-type-arch-toolchain[-ext]-release.sh``:
- poky-glibc-host_system-core-image-type-arch-toolchain[-ext]-release.sh
+ - ``host_system``: string representing your development system: ``i686`` or ``x86_64``
- Where:
- host_system is a string representing your development system:
- "i686" or "x86_64"
+ - ``type``: string representing the image: ``sato`` or ``minimal``
- type is a string representing the image:
- "sato" or "minimal"
+ - ``arch``: string representing the target architecture such as ``cortexa57-qemuarm64``
- arch is a string representing the target architecture:
- "aarch64", "armv5e", "core2-64", "cortexa8hf-neon", "i586", "mips32r2",
- "mips64", or "ppc7400"
-
- release is the version of Yocto Project.
-
- NOTE:
- The standard SDK installer does not have the "-ext" string as
- part of the filename.
+ - ``release``: version of the Yocto Project.
+ .. note::
+ The standard SDK installer does not have the ``-ext`` string as
+ part of the filename.
The toolchains provided by the Yocto
Project are based off of the ``core-image-sato`` and
@@ -67,16 +60,16 @@ Follow these steps to locate and hand-install the toolchain:
developing against those images.
For example, if your build host is a 64-bit x86 system and you need
- an extended SDK for a 64-bit core2 target, go into the ``x86_64``
+ an extended SDK for a 64-bit core2 QEMU target, go into the ``x86_64``
folder and download the following installer::
- poky-glibc-x86_64-core-image-sato-core2-64-toolchain-ext-&DISTRO;.sh
+ poky-glibc-x86_64-core-image-sato-core2-64-qemux86-64-toolchain-&DISTRO;.sh
#. *Run the Installer:* Be sure you have execution privileges and run
the installer. Following is an example from the ``Downloads``
directory::
- $ ~/Downloads/poky-glibc-x86_64-core-image-sato-core2-64-toolchain-ext-&DISTRO;.sh
+ $ ~/Downloads/poky-glibc-x86_64-core-image-sato-core2-64-qemux86-64-toolchain-&DISTRO;.sh
During execution of the script, you choose the root location for the
toolchain. See the
@@ -216,21 +209,14 @@ Follow these steps to extract the root filesystem:
also contain flattened root filesystem image files (``*.ext4``),
which you can use with QEMU directly.
- The pre-built root filesystem image files follow these naming
- conventions::
-
- core-image-profile-arch.tar.bz2
+ The pre-built root filesystem image files follow the
+ ``core-image-profile-machine.tar.bz2`` naming convention:
- Where:
- profile is the filesystem image's profile:
- lsb, lsb-dev, lsb-sdk, minimal, minimal-dev, minimal-initramfs,
- sato, sato-dev, sato-sdk, sato-sdk-ptest. For information on
- these types of image profiles, see the "Images" chapter in
- the Yocto Project Reference Manual.
+ - ``profile``: filesystem image's profile, such as ``minimal``,
+ ``minimal-dev`` or ``sato``. For information on these types of image
+ profiles, see the "Images" chapter in the Yocto Project Reference Manual.
- arch is a string representing the target architecture:
- beaglebone-yocto, beaglebone-yocto-lsb, edgerouter, edgerouter-lsb,
- genericx86, genericx86-64, genericx86-64-lsb, genericx86-lsb and qemu*.
+ - ``machine``: same string as the name of the parent download directory.
The root filesystems
provided by the Yocto Project are based off of the
diff --git a/poky/documentation/set_versions.py b/poky/documentation/set_versions.py
index 354dabe618..a7c4d5af0b 100755
--- a/poky/documentation/set_versions.py
+++ b/poky/documentation/set_versions.py
@@ -26,8 +26,8 @@ ourversion = None
if len(sys.argv) == 2:
ourversion = sys.argv[1]
-activereleases = ["mickledore", "kirkstone", "dunfell"]
-devbranch = "nanbield"
+activereleases = ["nanbield", "mickledore", "kirkstone", "dunfell"]
+devbranch = "scarthgap"
ltsseries = ["kirkstone", "dunfell"]
# used by run-docs-builds to get the default page
@@ -36,6 +36,7 @@ if ourversion == "getlatest":
sys.exit(0)
release_series = collections.OrderedDict()
+release_series["scarthgap"] = "5.0"
release_series["nanbield"] = "4.3"
release_series["mickledore"] = "4.2"
release_series["langdale"] = "4.1"
@@ -67,6 +68,7 @@ release_series["laverne"] = "0.9"
bitbake_mapping = {
+ "scarthgap" : "2.8",
"nanbield" : "2.6",
"mickledore" : "2.4",
"langdale" : "2.2",
diff --git a/poky/documentation/test-manual/reproducible-builds.rst b/poky/documentation/test-manual/reproducible-builds.rst
index d4b828b2d6..91f94a5c74 100644
--- a/poky/documentation/test-manual/reproducible-builds.rst
+++ b/poky/documentation/test-manual/reproducible-builds.rst
@@ -68,17 +68,6 @@ things we do within the build system to ensure reproducibility include:
- Filtering the tools available from the host's ``PATH`` to only a specific set
of tools, set using the :term:`HOSTTOOLS` variable.
-.. note::
-
- Because of an open bug in GCC, using ``DISTRO_FEATURES:append = " lto"`` or
- adding ``-flto`` (Link Time Optimization) to :term:`CFLAGS` makes the resulting
- binary non-reproducible, in that it depends on the full absolute build path
- to ``recipe-sysroot-native``, so installing the Yocto Project in a different
- directory results in a different binary.
-
- This issue is addressed by
- :yocto_bugs:`bug 14481 - Programs built with -flto are not reproducible</show_bug.cgi?id=14481>`.
-
=========================================
Can we prove the project is reproducible?
=========================================
diff --git a/poky/documentation/what-i-wish-id-known.rst b/poky/documentation/what-i-wish-id-known.rst
index 10f746ff1f..fe79bc0129 100644
--- a/poky/documentation/what-i-wish-id-known.rst
+++ b/poky/documentation/what-i-wish-id-known.rst
@@ -29,8 +29,9 @@ contact us with other suggestions.
#. **Get to know the layer index:**
All layers can be found in the :oe_layerindex:`layer index <>`. Layers which
have applied for Yocto Project Compatible status (structure continuity
- assurance and testing) can be found in the :yocto_home:`Yocto Project Compatible index
- </software-over/layer/>`. Generally check the Compatible layer index first,
+ assurance and testing) can be found in the :yocto_home:`Yocto Project
+ Compatible Layers </development/yocto-project-compatible-layers/>` page.
+ Generally check the Compatible layer index first,
and if you don't find the necessary layer check the general layer index. The
layer index is an original artifact from the Open Embedded Project. As such,
that index doesn't have the curating and testing that the Yocto Project
diff --git a/poky/meta-poky/conf/distro/poky-tiny.conf b/poky/meta-poky/conf/distro/poky-tiny.conf
index 32c2ec3e1f..24bcbee9bb 100644
--- a/poky/meta-poky/conf/distro/poky-tiny.conf
+++ b/poky/meta-poky/conf/distro/poky-tiny.conf
@@ -125,4 +125,4 @@ PACKAGECONFIG:remove:pn-opkg-utils = "python"
# If shadow-base is brought into the image, logins will fail because it
# doesn't have the heuristics to work when CONFIG_MULTIUSER is unset.
-PACKAGE_EXCLUDE:poky-tiny = "shadow-base"
+PACKAGE_EXCLUDE += "shadow-base"
diff --git a/poky/meta-poky/conf/distro/poky.conf b/poky/meta-poky/conf/distro/poky.conf
index f290a15e35..e742666b4e 100644
--- a/poky/meta-poky/conf/distro/poky.conf
+++ b/poky/meta-poky/conf/distro/poky.conf
@@ -1,6 +1,6 @@
DISTRO = "poky"
DISTRO_NAME = "Poky (Yocto Project Reference Distro)"
-DISTRO_VERSION = "4.2+snapshot-${METADATA_REVISION}"
+DISTRO_VERSION = "4.3+snapshot-${METADATA_REVISION}"
DISTRO_CODENAME = "nanbield"
SDK_VENDOR = "-pokysdk"
SDK_VERSION = "${@d.getVar('DISTRO_VERSION').replace('snapshot-${METADATA_REVISION}', 'snapshot')}"
@@ -33,8 +33,8 @@ TCLIBCAPPEND = ""
PACKAGE_CLASSES ?= "package_rpm"
SANITY_TESTED_DISTROS ?= " \
- poky-4.1 \n \
poky-4.2 \n \
+ poky-4.3 \n \
ubuntu-18.04 \n \
ubuntu-20.04 \n \
ubuntu-22.04 \n \
diff --git a/poky/meta-poky/conf/templates/default/local.conf.sample b/poky/meta-poky/conf/templates/default/local.conf.sample
index f9cb8aa77d..5fb6944f3f 100644
--- a/poky/meta-poky/conf/templates/default/local.conf.sample
+++ b/poky/meta-poky/conf/templates/default/local.conf.sample
@@ -33,7 +33,6 @@
#MACHINE ?= "beaglebone-yocto"
#MACHINE ?= "genericx86"
#MACHINE ?= "genericx86-64"
-#MACHINE ?= "edgerouter"
#
# This sets the default machine to be qemux86-64 if no other machine is selected:
MACHINE ??= "qemux86-64"
@@ -228,15 +227,21 @@ BB_DISKMON_DIRS ??= "\
# Yocto Project SState Mirror
#
# The Yocto Project has prebuilt artefacts available for its releases, you can enable
-# use of these by uncommenting the following lines. This will mean the build uses
+# use of these by uncommenting some of the following lines. This will mean the build uses
# the network to check for artefacts at the start of builds, which does slow it down
-# equally, it will also speed up the builds by not having to build things if they are
+# initially but it will then speed up the builds by not having to build things if they are
# present in the cache. It assumes you can download something faster than you can build it
# which will depend on your network.
# Note: For this to work you also need hash-equivalence passthrough to the matching server
+# There is a choice between our sstate server directly and a faster content delivery network
+# (CDN) kindly provided by JSDelivr, uncomment one of the SSTATE_MIRRORS lines, not both.
+# Using the CDN rather than the yoctoproject.org address is suggested/preferred.
#
#BB_HASHSERVE_UPSTREAM = "hashserv.yocto.io:8687"
-#SSTATE_MIRRORS ?= "file://.* http://sstate.yoctoproject.org/all/PATH;downloadfilename=PATH"
+#SSTATE_MIRRORS ?= "file://.* http://cdn.jsdelivr.net/yocto/sstate/all/PATH;downloadfilename=PATH"
+#
+###SSTATE_MIRRORS ?= "file://.* http://sstate.yoctoproject.org/all/PATH;downloadfilename=PATH"
+
#
# Qemu configuration
diff --git a/poky/meta-selftest/classes/base-do-configure-modified.bbclass b/poky/meta-selftest/classes/base-do-configure-modified.bbclass
new file mode 100644
index 0000000000..9175bb8ad9
--- /dev/null
+++ b/poky/meta-selftest/classes/base-do-configure-modified.bbclass
@@ -0,0 +1,3 @@
+base_do_configure:append () {
+ echo "this changes base_do_configure() definiton "
+}
diff --git a/poky/meta-selftest/files/static-group b/poky/meta-selftest/files/static-group
index af2fa0f016..f7a66de24d 100644
--- a/poky/meta-selftest/files/static-group
+++ b/poky/meta-selftest/files/static-group
@@ -26,3 +26,4 @@ wayland:x:526:
render:x:527:
sgx:x:528:
ptest:x:529:
+xuser:x:530:
diff --git a/poky/meta-selftest/files/static-passwd b/poky/meta-selftest/files/static-passwd
index a4f652198c..cc6c5acd5c 100644
--- a/poky/meta-selftest/files/static-passwd
+++ b/poky/meta-selftest/files/static-passwd
@@ -18,3 +18,4 @@ builder:x:522:522::/:/bin/nologin
_apt:x:523:523::/:/bin/nologin
weston:x:525:525::/:/bin/nologin
ptest:x:529:529::/:/bin/nologin
+xuser:x:530:530::/:/bin/nologin
diff --git a/poky/meta-selftest/recipes-test/gcc-source/gcc-source_%.bbappend b/poky/meta-selftest/recipes-test/gcc-source/gcc-source_%.bbappend
new file mode 100644
index 0000000000..205720982c
--- /dev/null
+++ b/poky/meta-selftest/recipes-test/gcc-source/gcc-source_%.bbappend
@@ -0,0 +1,2 @@
+# This bbappend is used to alter the recipe using the test_recipe.inc file created by tests.
+include test_recipe.inc
diff --git a/poky/meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend b/poky/meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend
new file mode 100644
index 0000000000..205720982c
--- /dev/null
+++ b/poky/meta-selftest/recipes-test/quilt-native/quilt-native_%.bbappend
@@ -0,0 +1,2 @@
+# This bbappend is used to alter the recipe using the test_recipe.inc file created by tests.
+include test_recipe.inc
diff --git a/poky/meta-yocto-bsp/conf/machine/beaglebone-yocto.conf b/poky/meta-yocto-bsp/conf/machine/beaglebone-yocto.conf
index 8b67cefef7..9f389711b3 100644
--- a/poky/meta-yocto-bsp/conf/machine/beaglebone-yocto.conf
+++ b/poky/meta-yocto-bsp/conf/machine/beaglebone-yocto.conf
@@ -18,7 +18,6 @@ MACHINE_ESSENTIAL_EXTRA_RDEPENDS += "kernel-image kernel-devicetree"
do_image_wic[depends] += "mtools-native:do_populate_sysroot dosfstools-native:do_populate_sysroot virtual/bootloader:do_deploy"
SERIAL_CONSOLES ?= "115200;ttyS0 115200;ttyO0 115200;ttyAMA0"
-SERIAL_CONSOLES_CHECK = "${SERIAL_CONSOLES}"
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
PREFERRED_VERSION_linux-yocto ?= "6.1%"
diff --git a/poky/meta-yocto-bsp/conf/machine/genericx86-64.conf b/poky/meta-yocto-bsp/conf/machine/genericx86-64.conf
index 14913ea1f1..f19a1c1527 100644
--- a/poky/meta-yocto-bsp/conf/machine/genericx86-64.conf
+++ b/poky/meta-yocto-bsp/conf/machine/genericx86-64.conf
@@ -6,6 +6,5 @@ DEFAULTTUNE ?= "core2-64"
require conf/machine/include/x86/tune-core2.inc
require conf/machine/include/genericx86-common.inc
-SERIAL_CONSOLES_CHECK = "ttyS0"
#For runqemu
QB_SYSTEM_NAME = "qemu-system-x86_64"
diff --git a/poky/meta/classes-global/base.bbclass b/poky/meta/classes-global/base.bbclass
index f57f9cf827..ac84312a87 100644
--- a/poky/meta/classes-global/base.bbclass
+++ b/poky/meta/classes-global/base.bbclass
@@ -634,7 +634,7 @@ python () {
# Mercurial packages should DEPEND on mercurial-native
elif uri.scheme == "hg":
d.appendVar("EXTRANATIVEPATH", ' python3-native ')
- d.appendVarFlag('do_fetch', 'depends', ' mercurial-native:do_populate_sysroot')
+ d.appendVarFlag('do_fetch', 'depends', ' mercurial-native:do_populate_sysroot ca-certificates-native:do_populate_sysroot')
# OSC packages should DEPEND on osc-native
elif uri.scheme == "osc":
diff --git a/poky/meta/classes-global/debian.bbclass b/poky/meta/classes-global/debian.bbclass
index 7135d74837..e2a129d028 100644
--- a/poky/meta/classes-global/debian.bbclass
+++ b/poky/meta/classes-global/debian.bbclass
@@ -19,21 +19,6 @@ AUTO_LIBNAME_PKGS = "${PACKAGES}"
inherit package
-DEBIANRDEP = "do_packagedata"
-do_package_write_ipk[deptask] = "${DEBIANRDEP}"
-do_package_write_deb[deptask] = "${DEBIANRDEP}"
-do_package_write_tar[deptask] = "${DEBIANRDEP}"
-do_package_write_rpm[deptask] = "${DEBIANRDEP}"
-do_package_write_ipk[rdeptask] = "${DEBIANRDEP}"
-do_package_write_deb[rdeptask] = "${DEBIANRDEP}"
-do_package_write_tar[rdeptask] = "${DEBIANRDEP}"
-do_package_write_rpm[rdeptask] = "${DEBIANRDEP}"
-
-python () {
- if not d.getVar("PACKAGES"):
- d.setVar("DEBIANRDEP", "")
-}
-
python debian_package_name_hook () {
import glob, copy, stat, errno, re, pathlib, subprocess
diff --git a/poky/meta/classes-global/insane.bbclass b/poky/meta/classes-global/insane.bbclass
index 5743d91240..b78bb6f445 100644
--- a/poky/meta/classes-global/insane.bbclass
+++ b/poky/meta/classes-global/insane.bbclass
@@ -923,8 +923,12 @@ def package_qa_check_rdepends(pkg, pkgdest, skip, taskdeps, packages, d):
if "file-rdeps" not in skip:
ignored_file_rdeps = set(['/bin/sh', '/usr/bin/env', 'rtld(GNU_HASH)'])
+ if bb.utils.contains('DISTRO_FEATURES', 'usrmerge', True, False, d):
+ ignored_file_rdeps |= set(['/usr/bin/sh'])
if bb.data.inherits_class('nativesdk', d):
ignored_file_rdeps |= set(['/bin/bash', '/usr/bin/perl', 'perl'])
+ if bb.utils.contains('DISTRO_FEATURES', 'usrmerge', True, False, d):
+ ignored_file_rdeps |= set(['/usr/bin/bash'])
# For Saving the FILERDEPENDS
filerdepends = {}
rdep_data = oe.packagedata.read_subpkgdata(pkg, d)
@@ -1348,6 +1352,61 @@ python do_qa_patch() {
if msg:
oe.qa.handle_error("patch-status", msg, d)
+ ###########################################################################
+ # Check for missing ptests
+ ###########################################################################
+ def match_line_in_files(toplevel, filename_glob, line_regex):
+ import pathlib
+ try:
+ toppath = pathlib.Path(toplevel)
+ for entry in toppath.glob(filename_glob):
+ try:
+ with open(entry, 'r', encoding='utf-8', errors='ignore') as f:
+ for line in f.readlines():
+ if re.match(line_regex, line):
+ return True
+ except FileNotFoundError:
+ # Broken symlink in source
+ pass
+ except FileNotFoundError:
+ # pathlib.Path.glob() might throw this when file/directory
+ # disappear while scanning.
+ bb.note("unimplemented-ptest: FileNotFoundError exception while scanning (disappearing file while scanning?). Check was ignored." % d.getVar('PN'))
+ pass
+ return False
+
+ srcdir = d.getVar('S')
+ if not bb.utils.contains('DISTRO_FEATURES', 'ptest', True, False, d):
+ pass
+ elif bb.data.inherits_class('ptest', d):
+ bb.note("Package %s QA: skipping unimplemented-ptest: ptest implementation detected" % d.getVar('PN'))
+ elif srcdir == d.getVar('WORKDIR'):
+ bb.note("Package %s QA: skipping unimplemented-ptest: This check is not supported for recipe with \"S = \"${WORKDIR}\"" % d.getVar('PN'))
+
+ # Detect perl Test:: based tests
+ elif os.path.exists(os.path.join(srcdir, "t")) and any(filename.endswith('.t') for filename in os.listdir(os.path.join(srcdir, 't'))):
+ oe.qa.handle_error("unimplemented-ptest", "%s: perl Test:: based tests detected" % d.getVar('PN'), d)
+
+ # Detect pytest-based tests
+ elif match_line_in_files(srcdir, "**/*.py", r'\s*(?:import\s*pytest|from\s*pytest)'):
+ oe.qa.handle_error("unimplemented-ptest", "%s: pytest-based tests detected" % d.getVar('PN'), d)
+
+ # Detect meson-based tests
+ elif os.path.exists(os.path.join(srcdir, "meson.build")) and match_line_in_files(srcdir, "**/meson.build", r'\s*test\s*\('):
+ oe.qa.handle_error("unimplemented-ptest", "%s: meson-based tests detected" % d.getVar('PN'), d)
+
+ # Detect cmake-based tests
+ elif os.path.exists(os.path.join(srcdir, "CMakeLists.txt")) and match_line_in_files(srcdir, "**/CMakeLists.txt", r'\s*(?:add_test|enable_testing)\s*\('):
+ oe.qa.handle_error("unimplemented-ptest", "%s: cmake-based tests detected" % d.getVar('PN'), d)
+
+ # Detect autotools-based·tests
+ elif os.path.exists(os.path.join(srcdir, "Makefile.in")) and (match_line_in_files(srcdir, "**/Makefile.in", r'\s*TESTS\s*\+?=') or match_line_in_files(srcdir,"**/*.at",r'.*AT_INIT')):
+ oe.qa.handle_error("unimplemented-ptest", "%s: autotools-based tests detected" % d.getVar('PN'), d)
+
+ # Last resort, detect a test directory in sources
+ elif any(filename.lower() in ["test", "tests"] for filename in os.listdir(srcdir)):
+ oe.qa.handle_error("unimplemented-ptest", "%s: test subdirectory detected" % d.getVar('PN'), d)
+
oe.qa.exit_if_errors(d)
}
@@ -1443,35 +1502,18 @@ Rerun configure task after fixing this."""
oe.qa.exit_if_errors(d)
}
-def unpack_check_src_uri(pn, d):
- import re
-
- skip = (d.getVar('INSANE_SKIP') or "").split()
- if 'src-uri-bad' in skip:
- bb.note("Recipe %s skipping qa checking: src-uri-bad" % d.getVar('PN'))
- return
-
- if "${PN}" in d.getVar("SRC_URI", False):
- oe.qa.handle_error("src-uri-bad", "%s: SRC_URI uses PN not BPN" % pn, d)
-
- for url in d.getVar("SRC_URI").split():
- # Search for github and gitlab URLs that pull unstable archives (comment for future greppers)
- if re.search(r"git(hu|la)b\.com/.+/.+/archive/.+", url) or "//codeload.github.com/" in url:
- oe.qa.handle_error("src-uri-bad", "%s: SRC_URI uses unstable GitHub/GitLab archives, convert recipe to use git protocol" % pn, d)
-
python do_qa_unpack() {
src_uri = d.getVar('SRC_URI')
s_dir = d.getVar('S')
if src_uri and not os.path.exists(s_dir):
bb.warn('%s: the directory %s (%s) pointed to by the S variable doesn\'t exist - please set S within the recipe to point to where the source has been unpacked to' % (d.getVar('PN'), d.getVar('S', False), s_dir))
-
- unpack_check_src_uri(d.getVar('PN'), d)
}
python do_recipe_qa() {
- def test_missing_metadata(d):
+ import re
+
+ def test_missing_metadata(pn, d):
fn = d.getVar("FILE")
- pn = d.getVar('BPN')
srcfile = d.getVar('SRC_URI').split()
# Check that SUMMARY is not the same as the default from bitbake.conf
if d.getVar('SUMMARY') == d.expand("${PN} version ${PV}-${PR}"):
@@ -1483,16 +1525,31 @@ python do_recipe_qa() {
else:
oe.qa.handle_error("missing-metadata", "Recipe {} in {} does not contain a HOMEPAGE. Please add an entry.".format(pn, fn), d)
- def test_missing_maintainer(d):
+ def test_missing_maintainer(pn, d):
fn = d.getVar("FILE")
- pn = d.getVar("PN")
if pn.endswith("-native") or pn.startswith("nativesdk-") or "packagegroup-" in pn or "core-image-ptest-" in pn:
return
if not d.getVar('RECIPE_MAINTAINER'):
oe.qa.handle_error("missing-maintainer", "Recipe {} in {} does not have an assigned maintainer. Please add an entry into meta/conf/distro/include/maintainers.inc.".format(pn, fn), d)
- test_missing_metadata(d)
- test_missing_maintainer(d)
+ def test_srcuri(pn, d):
+ skip = (d.getVar('INSANE_SKIP') or "").split()
+ if 'src-uri-bad' in skip:
+ bb.note("Recipe %s skipping qa checking: src-uri-bad" % pn)
+ return
+
+ if "${PN}" in d.getVar("SRC_URI", False):
+ oe.qa.handle_error("src-uri-bad", "%s: SRC_URI uses PN not BPN" % pn, d)
+
+ for url in d.getVar("SRC_URI").split():
+ # Search for github and gitlab URLs that pull unstable archives (comment for future greppers)
+ if re.search(r"git(hu|la)b\.com/.+/.+/archive/.+", url) or "//codeload.github.com/" in url:
+ oe.qa.handle_error("src-uri-bad", "%s: SRC_URI uses unstable GitHub/GitLab archives, convert recipe to use git protocol" % pn, d)
+
+ pn = d.getVar('PN')
+ test_missing_metadata(pn, d)
+ test_missing_maintainer(pn, d)
+ test_srcuri(pn, d)
oe.qa.exit_if_errors(d)
}
diff --git a/poky/meta/classes-global/package.bbclass b/poky/meta/classes-global/package.bbclass
index 7787042e21..2ad820a81f 100644
--- a/poky/meta/classes-global/package.bbclass
+++ b/poky/meta/classes-global/package.bbclass
@@ -60,7 +60,6 @@ ALL_MULTILIB_PACKAGE_ARCHS = "${@all_multilib_tune_values(d, 'PACKAGE_ARCHS')}"
# dwarfsrcfiles is used to determine the list of debug source files
PACKAGE_DEPENDS += "rpm-native dwarfsrcfiles-native"
-
# If your postinstall can execute at rootfs creation time rather than on
# target but depends on a native/cross tool in order to execute, you need to
# list that tool in PACKAGE_WRITE_DEPS. Target package dependencies belong
diff --git a/poky/meta/classes-global/package_deb.bbclass b/poky/meta/classes-global/package_deb.bbclass
index 5aba3837bd..1f10b15a00 100644
--- a/poky/meta/classes-global/package_deb.bbclass
+++ b/poky/meta/classes-global/package_deb.bbclass
@@ -313,6 +313,10 @@ python () {
deps = ' dpkg-native:do_populate_sysroot virtual/fakeroot-native:do_populate_sysroot'
d.appendVarFlag('do_package_write_deb', 'depends', deps)
d.setVarFlag('do_package_write_deb', 'fakeroot', "1")
+
+ # Needed to ensure PKG_xxx renaming of dependency packages works
+ d.setVarFlag('do_package_write_deb', 'deptask', "do_packagedata")
+ d.setVarFlag('do_package_write_deb', 'rdeptask', "do_packagedata")
}
python do_package_write_deb () {
diff --git a/poky/meta/classes-global/package_ipk.bbclass b/poky/meta/classes-global/package_ipk.bbclass
index b4b7bc9ac2..71ffdd522a 100644
--- a/poky/meta/classes-global/package_ipk.bbclass
+++ b/poky/meta/classes-global/package_ipk.bbclass
@@ -47,6 +47,10 @@ python do_package_ipk () {
do_package_ipk[vardeps] += "ipk_write_pkg"
do_package_ipk[vardepsexclude] = "BB_NUMBER_THREADS"
+# FILE isn't included by default but we want the recipe to change if basename() changes
+IPK_RECIPE_FILE = "${@os.path.basename(d.getVar('FILE'))}"
+IPK_RECIPE_FILE[vardepvalue] = "${IPK_RECIPE_FILE}"
+
def ipk_write_pkg(pkg, d):
import re, copy
import subprocess
@@ -62,7 +66,7 @@ def ipk_write_pkg(pkg, d):
outdir = d.getVar('PKGWRITEDIRIPK')
pkgdest = d.getVar('PKGDEST')
- recipesource = os.path.basename(d.getVar('FILE'))
+ recipesource = d.getVar('IPK_RECIPE_FILE')
localdata = bb.data.createCopy(d)
root = "%s/%s" % (pkgdest, pkg)
@@ -276,6 +280,10 @@ python () {
deps = ' opkg-utils-native:do_populate_sysroot virtual/fakeroot-native:do_populate_sysroot xz-native:do_populate_sysroot'
d.appendVarFlag('do_package_write_ipk', 'depends', deps)
d.setVarFlag('do_package_write_ipk', 'fakeroot', "1")
+
+ # Needed to ensure PKG_xxx renaming of dependency packages works
+ d.setVarFlag('do_package_write_ipk', 'deptask', "do_packagedata")
+ d.setVarFlag('do_package_write_ipk', 'rdeptask', "do_packagedata")
}
python do_package_write_ipk () {
diff --git a/poky/meta/classes-global/package_rpm.bbclass b/poky/meta/classes-global/package_rpm.bbclass
index 85d0bd7fce..2fc18fe98c 100644
--- a/poky/meta/classes-global/package_rpm.bbclass
+++ b/poky/meta/classes-global/package_rpm.bbclass
@@ -8,12 +8,13 @@ inherit package
IMAGE_PKGTYPE ?= "rpm"
-RPM="rpm"
-RPMBUILD="rpmbuild"
+RPM = "rpm"
+RPMBUILD = "rpmbuild"
+RPMBUILD_COMPMODE ?= "${@'w19T%d.zstdio' % int(d.getVar('ZSTD_THREADS'))}"
PKGWRITEDIRRPM = "${WORKDIR}/deploy-rpms"
-# Maintaining the perfile dependencies has singificant overhead when writing the
+# Maintaining the perfile dependencies has significant overhead when writing the
# packages. When set, this value merges them for efficiency.
MERGEPERFILEDEPS = "1"
@@ -62,8 +63,8 @@ def write_rpm_perfiledata(srcname, d):
for dep in depends_dict:
ver = depends_dict[dep]
if dep and ver:
- ver = ver.replace("(","")
- ver = ver.replace(")","")
+ ver = ver.replace("(", "")
+ ver = ver.replace(")", "")
outfile.write(dep + " " + ver + " ")
else:
outfile.write(dep + " ")
@@ -104,9 +105,9 @@ python write_specfile () {
import oe.packagedata
# append information for logs and patches to %prep
- def add_prep(d,spec_files_bottom):
+ def add_prep(d, spec_files_bottom):
if d.getVarFlag('ARCHIVER_MODE', 'srpm') == '1' and bb.data.inherits_class('archiver', d):
- spec_files_bottom.append('%%prep -n %s' % d.getVar('PN') )
+ spec_files_bottom.append('%%prep -n %s' % d.getVar('PN'))
spec_files_bottom.append('%s' % "echo \"include logs and patches, Please check them in SOURCES\"")
spec_files_bottom.append('')
@@ -119,7 +120,7 @@ python write_specfile () {
source_list = os.listdir(ar_outdir)
source_number = 0
for source in source_list:
- # do_deploy_archives may have already run (from sstate) meaning a .src.rpm may already
+ # do_deploy_archives may have already run (from sstate) meaning a .src.rpm may already
# exist in ARCHIVER_OUTDIR so skip if present.
if source.endswith(".src.rpm"):
continue
@@ -191,7 +192,7 @@ python write_specfile () {
def walk_files(walkpath, target, conffiles, dirfiles):
# We can race against the ipk/deb backends which create CONTROL or DEBIAN directories
- # when packaging. We just ignore these files which are created in
+ # when packaging. We just ignore these files which are created in
# packages-split/ and not package/
# We have the odd situation where the CONTROL/DEBIAN directory can be removed in the middle of
# of the walk, the isdir() test would then fail and the walk code would assume its a file
@@ -445,9 +446,9 @@ python write_specfile () {
rprovides = bb.utils.explode_dep_versions2(splitrprovides)
rreplaces = bb.utils.explode_dep_versions2(splitrreplaces)
for dep in rreplaces:
- if not dep in robsoletes:
+ if dep not in robsoletes:
robsoletes[dep] = rreplaces[dep]
- if not dep in rprovides:
+ if dep not in rprovides:
rprovides[dep] = rreplaces[dep]
splitrobsoletes = bb.utils.join_deps(robsoletes, commasep=False)
splitrprovides = bb.utils.join_deps(rprovides, commasep=False)
@@ -517,8 +518,8 @@ python write_specfile () {
spec_files_bottom.append('')
del localdata
-
- add_prep(d,spec_files_bottom)
+
+ add_prep(d, spec_files_bottom)
spec_preamble_top.append('Summary: %s' % srcsummary)
spec_preamble_top.append('Name: %s' % srcname)
spec_preamble_top.append('Version: %s' % srcversion)
@@ -539,9 +540,9 @@ python write_specfile () {
rprovides = bb.utils.explode_dep_versions2(srcrprovides)
rreplaces = bb.utils.explode_dep_versions2(srcrreplaces)
for dep in rreplaces:
- if not dep in robsoletes:
+ if dep not in robsoletes:
robsoletes[dep] = rreplaces[dep]
- if not dep in rprovides:
+ if dep not in rprovides:
rprovides[dep] = rreplaces[dep]
srcrobsoletes = bb.utils.join_deps(robsoletes, commasep=False)
srcrprovides = bb.utils.join_deps(rprovides, commasep=False)
@@ -633,7 +634,6 @@ python do_package_rpm () {
workdir = d.getVar('WORKDIR')
tmpdir = d.getVar('TMPDIR')
pkgd = d.getVar('PKGD')
- pkgdest = d.getVar('PKGDEST')
if not workdir or not pkgd or not tmpdir:
bb.error("Variables incorrectly set, unable to package")
return
@@ -644,7 +644,7 @@ python do_package_rpm () {
return
# Construct the spec file...
- # If the spec file already exist, and has not been stored into
+ # If the spec file already exist, and has not been stored into
# pseudo's files.db, it maybe cause rpmbuild src.rpm fail,
# so remove it before doing rpmbuild src.rpm.
srcname = d.getVar('PN')
@@ -660,8 +660,7 @@ python do_package_rpm () {
# Setup the rpmbuild arguments...
rpmbuild = d.getVar('RPMBUILD')
- targetsys = d.getVar('TARGET_SYS')
- targetvendor = d.getVar('HOST_VENDOR')
+ rpmbuild_compmode = d.getVar('RPMBUILD_COMPMODE')
# Too many places in dnf stack assume that arch-independent packages are "noarch".
# Let's not fight against this.
@@ -669,7 +668,6 @@ python do_package_rpm () {
if package_arch == "all":
package_arch = "noarch"
- sdkpkgsuffix = (d.getVar('SDKPKGSUFFIX') or "nativesdk").replace("-", "_")
d.setVar('PACKAGE_ARCH_EXTEND', package_arch)
pkgwritedir = d.expand('${PKGWRITEDIRRPM}/${PACKAGE_ARCH_EXTEND}')
d.setVar('RPM_PKGWRITEDIR', pkgwritedir)
@@ -686,8 +684,8 @@ python do_package_rpm () {
cmd = cmd + " --define '_use_internal_dependency_generator 0'"
cmd = cmd + " --define '_binaries_in_noarch_packages_terminate_build 0'"
cmd = cmd + " --define '_build_id_links none'"
- cmd = cmd + " --define '_binary_payload w19T%d.zstdio'" % int(d.getVar("ZSTD_THREADS"))
- cmd = cmd + " --define '_source_payload w19T%d.zstdio'" % int(d.getVar("ZSTD_THREADS"))
+ cmd = cmd + " --define '_source_payload %s'" % rpmbuild_compmode
+ cmd = cmd + " --define '_binary_payload %s'" % rpmbuild_compmode
cmd = cmd + " --define 'clamp_mtime_to_source_date_epoch 1'"
cmd = cmd + " --define 'use_source_date_epoch_as_buildtime 1'"
cmd = cmd + " --define '_buildhost reproducible'"
@@ -728,6 +726,10 @@ python () {
deps = ' rpm-native:do_populate_sysroot virtual/fakeroot-native:do_populate_sysroot'
d.appendVarFlag('do_package_write_rpm', 'depends', deps)
d.setVarFlag('do_package_write_rpm', 'fakeroot', '1')
+
+ # Needed to ensure PKG_xxx renaming of dependency packages works
+ d.setVarFlag('do_package_write_rpm', 'deptask', "do_packagedata")
+ d.setVarFlag('do_package_write_rpm', 'rdeptask', "do_packagedata")
}
SSTATETASKS += "do_package_write_rpm"
diff --git a/poky/meta/classes-global/sstate.bbclass b/poky/meta/classes-global/sstate.bbclass
index 2676f18e0a..5b27a1f0f9 100644
--- a/poky/meta/classes-global/sstate.bbclass
+++ b/poky/meta/classes-global/sstate.bbclass
@@ -937,6 +937,7 @@ def sstate_checkhashes(sq_data, d, siginfo=False, currentcount=0, summary=True,
sstatefile = d.expand("${SSTATE_DIR}/" + getsstatefile(tid, siginfo, d))
if os.path.exists(sstatefile):
+ oe.utils.touch(sstatefile)
found.add(tid)
bb.debug(2, "SState: Found valid sstate file %s" % sstatefile)
else:
@@ -1183,16 +1184,7 @@ python sstate_eventhandler() {
if not os.path.exists(siginfo):
bb.siggen.dump_this_task(siginfo, d)
else:
- try:
- os.utime(siginfo, None)
- except PermissionError:
- pass
- except OSError as e:
- # Handle read-only file systems gracefully
- import errno
- if e.errno != errno.EROFS:
- raise e
-
+ oe.utils.touch(siginfo)
}
SSTATE_PRUNE_OBSOLETEWORKDIR ?= "1"
diff --git a/poky/meta/classes-global/staging.bbclass b/poky/meta/classes-global/staging.bbclass
index d229f40107..cf1e4600fd 100644
--- a/poky/meta/classes-global/staging.bbclass
+++ b/poky/meta/classes-global/staging.bbclass
@@ -521,7 +521,7 @@ python extend_recipe_sysroot() {
binfiles = {}
# Now handle installs
- for dep in configuredeps:
+ for dep in sorted(configuredeps):
c = setscenedeps[dep][0]
if c not in installed:
continue
diff --git a/poky/meta/classes-global/uninative.bbclass b/poky/meta/classes-global/uninative.bbclass
index 9630726f33..9b8b4565dd 100644
--- a/poky/meta/classes-global/uninative.bbclass
+++ b/poky/meta/classes-global/uninative.bbclass
@@ -4,7 +4,7 @@
# SPDX-License-Identifier: MIT
#
-UNINATIVE_LOADER ?= "${UNINATIVE_STAGING_DIR}-uninative/${BUILD_ARCH}-linux/lib/${@bb.utils.contains('BUILD_ARCH', 'x86_64', 'ld-linux-x86-64.so.2', '', d)}${@bb.utils.contains('BUILD_ARCH', 'i686', 'ld-linux.so.2', '', d)}${@bb.utils.contains('BUILD_ARCH', 'aarch64', 'ld-linux-aarch64.so.1', '', d)}${@bb.utils.contains('BUILD_ARCH', 'ppc64le', 'ld64.so.2', '', d)}"
+UNINATIVE_LOADER ?= "${UNINATIVE_STAGING_DIR}-uninative/${BUILD_ARCH}-linux/lib/${@bb.utils.contains('BUILD_ARCH', 'x86_64', 'ld-linux-x86-64.so.2', '', d)}${@bb.utils.contains('BUILD_ARCH', 'i686', 'ld-linux.so.2', '', d)}${@bb.utils.contains('BUILD_ARCH', 'aarch64', 'ld-linux-aarch64.so.1', '', d)}${@bb.utils.contains('BUILD_ARCH', 'ppc64le', 'ld64.so.2', '', d)}${@bb.utils.contains('BUILD_ARCH', 'riscv64', 'ld-linux-riscv64-lp64d.so.1', '', d)}"
UNINATIVE_STAGING_DIR ?= "${STAGING_DIR}"
UNINATIVE_URL ?= "unset"
diff --git a/poky/meta/classes-recipe/autotools.bbclass b/poky/meta/classes-recipe/autotools.bbclass
index 5ed21a3d68..1663307b06 100644
--- a/poky/meta/classes-recipe/autotools.bbclass
+++ b/poky/meta/classes-recipe/autotools.bbclass
@@ -76,7 +76,7 @@ CONFIGUREOPTS = " --build=${BUILD_SYS} \
--localstatedir=${localstatedir} \
--libdir=${libdir} \
--includedir=${includedir} \
- --oldincludedir=${oldincludedir} \
+ --oldincludedir=${includedir} \
--infodir=${infodir} \
--mandir=${mandir} \
--disable-silent-rules \
diff --git a/poky/meta/classes-recipe/bin_package.bbclass b/poky/meta/classes-recipe/bin_package.bbclass
index 9dd2489725..3a1befc29c 100644
--- a/poky/meta/classes-recipe/bin_package.bbclass
+++ b/poky/meta/classes-recipe/bin_package.bbclass
@@ -20,9 +20,6 @@
# they would be in ${WORKDIR}.
#
-# Nothing is being built so there is no need for the cross-compiler.
-INHIBIT_DEFAULT_DEPS = "1"
-
# Skip the unwanted steps
do_configure[noexec] = "1"
do_compile[noexec] = "1"
diff --git a/poky/meta/classes-recipe/gnomebase.bbclass b/poky/meta/classes-recipe/gnomebase.bbclass
index 5e72f549a3..a12e9f31a9 100644
--- a/poky/meta/classes-recipe/gnomebase.bbclass
+++ b/poky/meta/classes-recipe/gnomebase.bbclass
@@ -27,7 +27,7 @@ FILES:${PN} += "${datadir}/application-registry \
FILES:${PN}-doc += "${datadir}/devhelp"
-GNOMEBASEBUILDCLASS ??= "autotools"
+GNOMEBASEBUILDCLASS ??= "meson"
inherit ${GNOMEBASEBUILDCLASS} pkgconfig
do_install:append() {
diff --git a/poky/meta/classes-recipe/go-mod.bbclass b/poky/meta/classes-recipe/go-mod.bbclass
index 61571596bc..ca3a690d05 100644
--- a/poky/meta/classes-recipe/go-mod.bbclass
+++ b/poky/meta/classes-recipe/go-mod.bbclass
@@ -24,3 +24,7 @@ inherit go
GO_WORKDIR ?= "${GO_IMPORT}"
do_compile[dirs] += "${B}/src/${GO_WORKDIR}"
+
+export GOMODCACHE = "${B}/.mod"
+
+do_compile[cleandirs] += "${B}/.mod"
diff --git a/poky/meta/classes-recipe/goarch.bbclass b/poky/meta/classes-recipe/goarch.bbclass
index 5fb6051bde..1ebe03864f 100644
--- a/poky/meta/classes-recipe/goarch.bbclass
+++ b/poky/meta/classes-recipe/goarch.bbclass
@@ -68,33 +68,10 @@ SECURITY_NOPIE_CFLAGS ??= ""
CCACHE_DISABLE ?= "1"
def go_map_arch(a, d):
- import re
- if re.match('i.86', a):
- return '386'
- elif a == 'x86_64':
- return 'amd64'
- elif re.match('arm.*', a):
- return 'arm'
- elif re.match('aarch64.*', a):
- return 'arm64'
- elif re.match('mips64el.*', a):
- return 'mips64le'
- elif re.match('mips64.*', a):
- return 'mips64'
- elif a == 'mips':
- return 'mips'
- elif a == 'mipsel':
- return 'mipsle'
- elif re.match('p(pc|owerpc)(64le)', a):
- return 'ppc64le'
- elif re.match('p(pc|owerpc)(64)', a):
- return 'ppc64'
- elif a == 'riscv64':
- return 'riscv64'
- elif a == 'loongarch64':
- return 'loong64'
- else:
+ arch = oe.go.map_arch(a)
+ if not arch:
raise bb.parse.SkipRecipe("Unsupported CPU architecture: %s" % a)
+ return arch
def go_map_arm(a, d):
if a.startswith("arm"):
diff --git a/poky/meta/classes-recipe/image_types.bbclass b/poky/meta/classes-recipe/image_types.bbclass
index 4aed64e27f..d615b41ed1 100644
--- a/poky/meta/classes-recipe/image_types.bbclass
+++ b/poky/meta/classes-recipe/image_types.bbclass
@@ -54,7 +54,7 @@ def imagetypes_getdepends(d):
# Sort the set so that ordering is consistant
return " ".join(sorted(deps))
-XZ_COMPRESSION_LEVEL ?= "-9"
+XZ_COMPRESSION_LEVEL ?= "-6"
XZ_INTEGRITY_CHECK ?= "crc32"
ZIP_COMPRESSION_LEVEL ?= "-9"
diff --git a/poky/meta/classes-recipe/kernel-arch.bbclass b/poky/meta/classes-recipe/kernel-arch.bbclass
index b0db99faa3..404f2e7061 100644
--- a/poky/meta/classes-recipe/kernel-arch.bbclass
+++ b/poky/meta/classes-recipe/kernel-arch.bbclass
@@ -74,8 +74,8 @@ TARGET_STRIP_KERNEL_ARCH ?= ""
HOST_STRIP_KERNEL_ARCH ?= "${TARGET_STRIP_KERNEL_ARCH}"
KERNEL_CC = "${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_KERNEL_ARCH} -fuse-ld=bfd ${DEBUG_PREFIX_MAP} -fdebug-prefix-map=${STAGING_KERNEL_DIR}=${KERNEL_SRC_PATH} -fdebug-prefix-map=${STAGING_KERNEL_BUILDDIR}=${KERNEL_SRC_PATH}"
-KERNEL_LD = "${CCACHE}${HOST_PREFIX}ld.bfd ${HOST_LD_KERNEL_ARCH}"
-KERNEL_AR = "${CCACHE}${HOST_PREFIX}ar ${HOST_AR_KERNEL_ARCH}"
-KERNEL_OBJCOPY = "${CCACHE}${HOST_PREFIX}objcopy ${HOST_OBJCOPY_KERNEL_ARCH}"
-KERNEL_STRIP = "${CCACHE}${HOST_PREFIX}strip ${HOST_STRIP_KERNEL_ARCH}"
+KERNEL_LD = "${HOST_PREFIX}ld.bfd ${HOST_LD_KERNEL_ARCH}"
+KERNEL_AR = "${HOST_PREFIX}ar ${HOST_AR_KERNEL_ARCH}"
+KERNEL_OBJCOPY = "${HOST_PREFIX}objcopy ${HOST_OBJCOPY_KERNEL_ARCH}"
+KERNEL_STRIP = "${HOST_PREFIX}strip ${HOST_STRIP_KERNEL_ARCH}"
TOOLCHAIN ?= "gcc"
diff --git a/poky/meta/classes-recipe/kernel-yocto.bbclass b/poky/meta/classes-recipe/kernel-yocto.bbclass
index 4ac977b122..9a86616dad 100644
--- a/poky/meta/classes-recipe/kernel-yocto.bbclass
+++ b/poky/meta/classes-recipe/kernel-yocto.bbclass
@@ -176,12 +176,32 @@ do_kernel_metadata() {
# kernel source tree, where they'll be used later.
check_git_config
patches="${@" ".join(find_patches(d,'kernel-meta'))}"
- for p in $patches; do
+ if [ -n "$patches" ]; then
(
- cd ${WORKDIR}/kernel-meta
- git am -s $p
- )
- done
+ cd ${WORKDIR}/kernel-meta
+
+ # take the SRC_URI patches, and create a series file
+ # this is required to support some better processing
+ # of issues with the patches
+ rm -f series
+ for p in $patches; do
+ cp $p .
+ echo "$(basename $p)" >> series
+ done
+
+ # process the series with kgit-s2q, which is what is
+ # handling the rest of the kernel. This allows us
+ # more flexibility for handling failures or advanced
+ # mergeing functinoality
+ message=$(kgit-s2q --gen -v --patches ${WORKDIR}/kernel-meta 2>&1)
+ if [ $? -ne 0 ]; then
+ # setup to try the patch again
+ kgit-s2q --prev
+ bberror "Problem applying patches to: ${WORKDIR}/kernel-meta"
+ bbfatal_log "\n($message)"
+ fi
+ )
+ fi
fi
sccs_from_src_uri="${@" ".join(find_sccs(d))}"
@@ -408,7 +428,7 @@ do_kernel_checkout() {
git init
check_git_config
git add .
- git commit -q -m "baseline commit: creating repo for ${PN}-${PV}"
+ git commit -q -n -m "baseline commit: creating repo for ${PN}-${PV}"
git clean -d -f
fi
diff --git a/poky/meta/classes-recipe/kernel.bbclass b/poky/meta/classes-recipe/kernel.bbclass
index 2ec9ea2091..9ff37f5c38 100644
--- a/poky/meta/classes-recipe/kernel.bbclass
+++ b/poky/meta/classes-recipe/kernel.bbclass
@@ -111,7 +111,7 @@ python __anonymous () {
d.appendVar('RDEPENDS:%s-image' % kname, ' %s-modules (= ${EXTENDPKGV})' % kname)
d.appendVar('RDEPENDS:%s-image-%s' % (kname, typelower), ' %s-modules-${KERNEL_VERSION_PKG_NAME} (= ${EXTENDPKGV})' % kname)
d.setVar('PKG:%s-modules' % kname, '%s-modules-${KERNEL_VERSION_PKG_NAME}' % kname)
- d.appendVar('RPROVIDES:%s-modules' % kname, '%s-modules-${KERNEL_VERSION_PKG_NAME}' % kname)
+ d.appendVar('RPROVIDES:%s-modules' % kname, ' %s-modules-${KERNEL_VERSION_PKG_NAME}' % kname)
d.setVar('PKG:%s-image-%s' % (kname,typelower), '%s-image-%s-${KERNEL_VERSION_PKG_NAME}' % (kname, typelower))
d.setVar('ALLOW_EMPTY:%s-image-%s' % (kname, typelower), '1')
@@ -336,7 +336,7 @@ kernel_do_transform_bundled_initramfs() {
do_transform_bundled_initramfs[dirs] = "${B}"
python do_package:prepend () {
- os.environ['STRIP'] = d.getVar('KERNEL_STRIP')
+ d.setVar('STRIP', d.getVar('KERNEL_STRIP').strip())
}
python do_devshell:prepend () {
diff --git a/poky/meta/classes-recipe/meson.bbclass b/poky/meta/classes-recipe/meson.bbclass
index d08a83d555..a85d120d77 100644
--- a/poky/meta/classes-recipe/meson.bbclass
+++ b/poky/meta/classes-recipe/meson.bbclass
@@ -79,7 +79,7 @@ llvm-config = 'llvm-config'
cups-config = 'cups-config'
g-ir-scanner = '${STAGING_BINDIR}/g-ir-scanner-wrapper'
g-ir-compiler = '${STAGING_BINDIR}/g-ir-compiler-wrapper'
-${@rust_tool(d, "HOST_SYS")}
+${@rust_tool(d, "RUST_HOST_SYS")}
${@"exe_wrapper = '${WORKDIR}/meson-qemuwrapper'" if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ""}
[built-in options]
@@ -116,7 +116,7 @@ readelf = ${@meson_array('BUILD_READELF', d)}
objcopy = ${@meson_array('BUILD_OBJCOPY', d)}
llvm-config = '${STAGING_BINDIR_NATIVE}/llvm-config'
pkgconfig = 'pkg-config-native'
-${@rust_tool(d, "BUILD_SYS")}
+${@rust_tool(d, "RUST_BUILD_SYS")}
[built-in options]
c_args = ${@meson_array('BUILD_CFLAGS', d)}
diff --git a/poky/meta/classes-recipe/populate_sdk_ext.bbclass b/poky/meta/classes-recipe/populate_sdk_ext.bbclass
index 028d0c1ff5..f209becae1 100644
--- a/poky/meta/classes-recipe/populate_sdk_ext.bbclass
+++ b/poky/meta/classes-recipe/populate_sdk_ext.bbclass
@@ -186,12 +186,7 @@ def create_filtered_tasklist(d, sdkbasepath, tasklistfile, conf_initpath):
if os.path.exists(localconf + '.bak'):
os.replace(localconf + '.bak', localconf)
-python copy_buildsystem () {
- import re
- import shutil
- import glob
- import oe.copy_buildsystem
-
+def copy_bitbake_and_layers(d, baseoutpath, derivative):
oe_init_env_script = d.getVar('OE_INIT_ENV_SCRIPT')
conf_bbpath = ''
@@ -200,13 +195,7 @@ python copy_buildsystem () {
# Copy in all metadata layers + bitbake (as repositories)
buildsystem = oe.copy_buildsystem.BuildSystem('extensible SDK', d)
- baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
- #check if custome templateconf path is set
- use_custom_templateconf = d.getVar('SDK_CUSTOM_TEMPLATECONF')
-
- # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
- derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
if derivative:
workspace_name = 'orig-workspace'
else:
@@ -220,17 +209,20 @@ python copy_buildsystem () {
if os.path.exists(os.path.join(baseoutpath, relpath)):
conf_initpath = relpath
- relpath = os.path.join('layers', path, 'scripts', 'devtool')
+ relpath = os.path.join('layers', path, 'scripts', 'esdk-tools', 'devtool')
if os.path.exists(os.path.join(baseoutpath, relpath)):
- scriptrelpath = os.path.dirname(relpath)
+ esdk_tools_path = os.path.dirname(relpath)
relpath = os.path.join('layers', path, 'meta')
if os.path.exists(os.path.join(baseoutpath, relpath, 'lib', 'oe')):
core_meta_subdir = relpath
d.setVar('oe_init_build_env_path', conf_initpath)
- d.setVar('scriptrelpath', scriptrelpath)
+ d.setVar('esdk_tools_path', esdk_tools_path)
+ return (conf_initpath, conf_bbpath, core_meta_subdir, sdkbblayers)
+
+def write_devtool_config(d, baseoutpath, conf_bbpath, conf_initpath, core_meta_subdir):
# Write out config file for devtool
import configparser
config = configparser.ConfigParser()
@@ -247,10 +239,12 @@ python copy_buildsystem () {
with open(os.path.join(baseoutpath, 'conf', 'devtool.conf'), 'w') as f:
config.write(f)
+def write_unlocked_sigs(d, baseoutpath):
unlockedsigs = os.path.join(baseoutpath, 'conf', 'unlocked-sigs.inc')
with open(unlockedsigs, 'w') as f:
pass
+def write_bblayers_conf(d, baseoutpath, sdkbblayers):
# Create a layer for new recipes / appends
bbpath = d.getVar('BBPATH')
env = os.environ.copy()
@@ -279,6 +273,9 @@ python copy_buildsystem () {
f.write(' $' + '{SDKBASEMETAPATH}/workspace \\\n')
f.write(' "\n')
+def copy_uninative(d, baseoutpath):
+ import shutil
+
# Copy uninative tarball
# For now this is where uninative.bbclass expects the tarball
if bb.data.inherits_class('uninative', d):
@@ -288,6 +285,12 @@ python copy_buildsystem () {
bb.utils.mkdirhier(uninative_outdir)
shutil.copy(uninative_file, uninative_outdir)
+ return uninative_checksum
+
+def write_local_conf(d, baseoutpath, derivative, core_meta_subdir, uninative_checksum):
+ #check if custome templateconf path is set
+ use_custom_templateconf = d.getVar('SDK_CUSTOM_TEMPLATECONF')
+
env_passthrough = (d.getVar('BB_ENV_PASSTHROUGH_ADDITIONS') or '').split()
env_passthrough_values = {}
@@ -457,6 +460,9 @@ python copy_buildsystem () {
f.write(line)
f.write('\n')
+def prepare_locked_cache(d, baseoutpath, derivative, conf_initpath):
+ import shutil
+
# Filter the locked signatures file to just the sstate tasks we are interested in
excluded_targets = get_sdk_install_targets(d, images_only=True)
sigfile = d.getVar('WORKDIR') + '/locked-sigs.inc'
@@ -560,6 +566,9 @@ python copy_buildsystem () {
f = os.path.join(root, name)
os.remove(f)
+def write_manifest(d, baseoutpath):
+ import glob
+
# Write manifest file
# Note: at the moment we cannot include the env setup script here to keep
# it updated, since it gets modified during SDK installation (see
@@ -583,6 +592,32 @@ python copy_buildsystem () {
continue
chksum = bb.utils.sha256_file(fn)
f.write('%s\t%s\n' % (chksum, os.path.relpath(fn, baseoutpath)))
+
+
+python copy_buildsystem () {
+ import oe.copy_buildsystem
+
+ baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
+
+ # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
+ derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
+
+ conf_initpath, conf_bbpath, core_meta_subdir, sdkbblayers = copy_bitbake_and_layers(d, baseoutpath, derivative)
+
+ write_devtool_config(d, baseoutpath, conf_bbpath, conf_initpath, core_meta_subdir)
+
+ write_unlocked_sigs(d, baseoutpath)
+
+ write_bblayers_conf(d, baseoutpath, sdkbblayers)
+
+ uninative_checksum = copy_uninative(d, baseoutpath)
+
+ write_local_conf(d, baseoutpath, derivative, core_meta_subdir, uninative_checksum)
+
+ prepare_locked_cache(d, baseoutpath, derivative, conf_initpath)
+
+ write_manifest(d, baseoutpath)
+
}
def get_current_buildtools(d):
@@ -627,21 +662,6 @@ def get_sdk_required_utilities(buildtools_fn, d):
return ' '.join(sanity_required_utilities)
install_tools() {
- install -d ${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}
- scripts="devtool recipetool oe-find-native-sysroot runqemu* wic"
- for script in $scripts; do
- for scriptfn in `find ${SDK_OUTPUT}/${SDKPATH}/${scriptrelpath} -maxdepth 1 -executable -name "$script"`; do
- targetscriptfn="${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}/$(basename $scriptfn)"
- test -e ${targetscriptfn} || ln -rs ${scriptfn} ${targetscriptfn}
- done
- done
- # We can't use the same method as above because files in the sysroot won't exist at this point
- # (they get populated from sstate on installation)
- unfsd_path="${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}/unfsd"
- if [ "${SDK_INCLUDE_TOOLCHAIN}" = "1" -a ! -e $unfsd_path ] ; then
- binrelpath=${@os.path.relpath(d.getVar('STAGING_BINDIR_NATIVE'), d.getVar('TMPDIR'))}
- ln -rs ${SDK_OUTPUT}/${SDKPATH}/tmp/$binrelpath/unfsd $unfsd_path
- fi
touch ${SDK_OUTPUT}/${SDKPATH}/.devtoolbase
# find latest buildtools-tarball and install it
@@ -720,7 +740,7 @@ sdk_ext_postinst() {
# A bit of another hack, but we need this in the path only for devtool
# so put it at the end of $PATH.
- echo "export PATH=\"$target_sdk_dir/sysroots/${SDK_SYS}${bindir_nativesdk}:\$PATH\"" >> $env_setup_script
+ echo "export PATH=\"$target_sdk_dir/${esdk_tools_path}:\$PATH\"" >> $env_setup_script
echo "printf 'SDK environment now set up; additionally you may now run devtool to perform development tasks.\nRun devtool --help for further details.\n'" >> $env_setup_script
diff --git a/poky/meta/classes-recipe/qemuboot.bbclass b/poky/meta/classes-recipe/qemuboot.bbclass
index 5c4bbd6737..ff32aac902 100644
--- a/poky/meta/classes-recipe/qemuboot.bbclass
+++ b/poky/meta/classes-recipe/qemuboot.bbclass
@@ -62,8 +62,8 @@
# QB_SLIRP_OPT: network option for SLIRP mode, e.g., -netdev user,id=net0"
#
# QB_CMDLINE_IP_SLIRP: If QB_NETWORK_DEVICE adds more than one network interface to qemu, usually the
-# ip= kernel comand line argument needs to be changed accordingly. Details are documented
-# in the kernel docuemntation https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt
+# ip= kernel command line argument needs to be changed accordingly. Details are documented
+# in the kernel documentation https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt
# Example to configure only the first interface: "ip=eth0:dhcp"
# QB_CMDLINE_IP_TAP: This parameter is similar to the QB_CMDLINE_IP_SLIRP parameter. Since the tap interface requires
# static IP configuration @CLIENT@ and @GATEWAY@ place holders are replaced by the IP and the gateway
diff --git a/poky/meta/classes-recipe/rootfs-postcommands.bbclass b/poky/meta/classes-recipe/rootfs-postcommands.bbclass
index 06388b72fb..29ee74932a 100644
--- a/poky/meta/classes-recipe/rootfs-postcommands.bbclass
+++ b/poky/meta/classes-recipe/rootfs-postcommands.bbclass
@@ -241,10 +241,10 @@ read_only_rootfs_hook () {
#
zap_empty_root_password () {
if [ -e ${IMAGE_ROOTFS}/etc/shadow ]; then
- sed -i 's%^root::%root:*:%' ${IMAGE_ROOTFS}/etc/shadow
+ sed --follow-symlinks -i 's%^root::%root:*:%' ${IMAGE_ROOTFS}/etc/shadow
fi
if [ -e ${IMAGE_ROOTFS}/etc/passwd ]; then
- sed -i 's%^root::%root:*:%' ${IMAGE_ROOTFS}/etc/passwd
+ sed --follow-symlinks -i 's%^root::%root:*:%' ${IMAGE_ROOTFS}/etc/passwd
fi
}
diff --git a/poky/meta/classes-recipe/rust-common.bbclass b/poky/meta/classes-recipe/rust-common.bbclass
index 878272721c..3d73a370ec 100644
--- a/poky/meta/classes-recipe/rust-common.bbclass
+++ b/poky/meta/classes-recipe/rust-common.bbclass
@@ -14,7 +14,7 @@ FILES:${PN}-dev += "${rustlibdir}/*.rlib ${rustlibdir}/*.rmeta"
FILES:${PN}-dbg += "${rustlibdir}/.debug"
RUSTLIB = "-L ${STAGING_DIR_HOST}${rustlibdir}"
-RUST_DEBUG_REMAP = "--remap-path-prefix=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}"
+RUST_DEBUG_REMAP = "--remap-path-prefix=${WORKDIR}=${TARGET_DBGSRC_DIR}"
RUSTFLAGS += "${RUSTLIB} ${RUST_DEBUG_REMAP}"
RUSTLIB_DEP ?= "libstd-rs"
RUST_PANIC_STRATEGY ?= "unwind"
diff --git a/poky/meta/classes/cve-check.bbclass b/poky/meta/classes/cve-check.bbclass
index b55f4299da..5191d04303 100644
--- a/poky/meta/classes/cve-check.bbclass
+++ b/poky/meta/classes/cve-check.bbclass
@@ -138,6 +138,8 @@ def generate_json_report(d, out_path, link_path):
cve_check_merge_jsons(summary, data)
filename = f.readline()
+ summary["package"].sort(key=lambda d: d['name'])
+
with open(out_path, "w") as f:
json.dump(summary, f, indent=2)
diff --git a/poky/meta/classes/go-vendor.bbclass b/poky/meta/classes/go-vendor.bbclass
new file mode 100644
index 0000000000..2426bddfba
--- /dev/null
+++ b/poky/meta/classes/go-vendor.bbclass
@@ -0,0 +1,196 @@
+#
+# Copyright 2023 (C) Weidmueller GmbH & Co KG
+# Author: Lukas Funke <lukas.funke@weidmueller.com>
+#
+# Handle Go vendor support for offline builds
+#
+# When importing Go modules, Go downloads the imported modules using
+# a network (proxy) connection ahead of the compile stage. This contradicts
+# the yocto build concept of fetching every source ahead of build-time
+# and supporting offline builds.
+#
+# To support offline builds, we use Go 'vendoring': module dependencies are
+# downloaded during the fetch-phase and unpacked into the modules 'vendor'
+# folder. Additionally a manifest file is generated for the 'vendor' folder
+#
+
+inherit go-mod
+
+def go_src_uri(repo, version, path=None, subdir=None, \
+ vcs='git', replaces=None, pathmajor=None):
+
+ destsuffix = "git/src/import/vendor.fetch"
+ module_path = repo if not path else path
+
+ src_uri = "{}://{};name={}".format(vcs, repo, module_path.replace('/', '.'))
+ src_uri += ";destsuffix={}/{}@{}".format(destsuffix, repo, version)
+
+ if vcs == "git":
+ src_uri += ";nobranch=1;protocol=https"
+
+ src_uri += ";go_module_path={}".format(module_path)
+
+ if replaces:
+ src_uri += ";go_module_replacement={}".format(replaces)
+ if subdir:
+ src_uri += ";go_subdir={}".format(subdir)
+ if pathmajor:
+ src_uri += ";go_pathmajor={}".format(pathmajor)
+ src_uri += ";is_go_dependency=1"
+
+ return src_uri
+
+python do_vendor_unlink() {
+ go_import = d.getVar('GO_IMPORT')
+ source_dir = d.getVar('S')
+ linkname = os.path.join(source_dir, *['src', go_import, 'vendor'])
+
+ os.unlink(linkname)
+}
+
+addtask vendor_unlink before do_install after do_compile
+
+python do_go_vendor() {
+ import shutil
+
+ src_uri = (d.getVar('SRC_URI') or "").split()
+
+ if not src_uri:
+ bb.fatal("SRC_URI is empty")
+
+ default_destsuffix = "git/src/import/vendor.fetch"
+ fetcher = bb.fetch2.Fetch(src_uri, d)
+ go_import = d.getVar('GO_IMPORT')
+ source_dir = d.getVar('S')
+
+ linkname = os.path.join(source_dir, *['src', go_import, 'vendor'])
+ vendor_dir = os.path.join(source_dir, *['src', 'import', 'vendor'])
+ import_dir = os.path.join(source_dir, *['src', 'import', 'vendor.fetch'])
+
+ if os.path.exists(vendor_dir):
+ # Nothing to do except re-establish link to actual vendor folder
+ if not os.path.exists(linkname):
+ os.symlink(vendor_dir, linkname)
+ return
+
+ bb.utils.mkdirhier(vendor_dir)
+
+ modules = {}
+
+ for url in fetcher.urls:
+ srcuri = fetcher.ud[url].host + fetcher.ud[url].path
+
+ # Skip non Go module src uris
+ if not fetcher.ud[url].parm.get('is_go_dependency'):
+ continue
+
+ destsuffix = fetcher.ud[url].parm.get('destsuffix')
+ # We derive the module repo / version in the following manner (exmaple):
+ #
+ # destsuffix = git/src/import/vendor.fetch/github.com/foo/bar@v1.2.3
+ # p = github.com/foo/bar@v1.2.3
+ # repo = github.com/foo/bar
+ # version = v1.2.3
+
+ p = destsuffix[len(default_destsuffix)+1:]
+ repo, version = p.split('@')
+
+ module_path = fetcher.ud[url].parm.get('go_module_path')
+
+ subdir = fetcher.ud[url].parm.get('go_subdir')
+ subdir = None if not subdir else subdir
+
+ pathMajor = fetcher.ud[url].parm.get('go_pathmajor')
+ pathMajor = None if not pathMajor else pathMajor.strip('/')
+
+ if not repo in modules:
+ modules[repo] = { "version": version,
+ "repo_path": os.path.join(import_dir, p),
+ "module_path": module_path,
+ "subdir": subdir,
+ "pathMajor": pathMajor }
+
+ for module_key in sorted(modules):
+
+ # only take the version which is explicitly listed
+ # as a dependency in the go.mod
+ module = modules[module_key]
+ module_path = module['module_path']
+ rootdir = module['repo_path']
+ subdir = module['subdir']
+ pathMajor = module['pathMajor']
+
+ src = rootdir
+
+ if subdir:
+ src = os.path.join(rootdir, subdir)
+
+ # If the module is released at major version 2 or higher, the module
+ # path must end with a major version suffix like /v2.
+ # This may or may not be part of the subdirectory name
+ #
+ # https://go.dev/ref/mod#modules-overview
+ if pathMajor:
+ tmp = os.path.join(src, pathMajor)
+ # source directory including major version path may or may not exist
+ if os.path.exists(tmp):
+ src = tmp
+
+ dst = os.path.join(vendor_dir, module_path)
+
+ bb.debug(1, "cp %s --> %s" % (src, dst))
+ shutil.copytree(src, dst, symlinks=True, \
+ ignore=shutil.ignore_patterns(".git", \
+ "vendor", \
+ "*._test.go"))
+
+ # If the root directory has a LICENSE file but not the subdir
+ # we copy the root license to the sub module since the license
+ # applies to all modules in the repository
+ # see https://go.dev/ref/mod#vcs-license
+ if subdir:
+ rootdirLicese = os.path.join(rootdir, "LICENSE")
+ subdirLicense = os.path.join(src, "LICENSE")
+
+ if not os.path.exists(subdir) and \
+ os.path.exists(rootdirLicese):
+ shutil.copy2(rootdirLicese, subdirLicense)
+
+ # Copy vendor manifest
+ modules_txt_src = os.path.join(d.getVar('WORKDIR'), "modules.txt")
+ bb.debug(1, "cp %s --> %s" % (modules_txt_src, vendor_dir))
+ shutil.copy2(modules_txt_src, vendor_dir)
+
+ # Clean up vendor dir
+ # We only require the modules in the modules_txt file
+ fetched_paths = set([os.path.relpath(x[0], vendor_dir) for x in os.walk(vendor_dir)])
+
+ # Remove toplevel dir
+ fetched_paths.remove('.')
+
+ vendored_paths = set()
+ with open(modules_txt_src) as f:
+ for line in f:
+ if not line.startswith("#"):
+ line = line.strip()
+ vendored_paths.add(line)
+
+ # Add toplevel dirs into vendored dir, as we want to keep them
+ topdir = os.path.dirname(line)
+ while len(topdir):
+ if not topdir in vendored_paths:
+ vendored_paths.add(topdir)
+
+ topdir = os.path.dirname(topdir)
+
+ for path in fetched_paths:
+ if path not in vendored_paths:
+ realpath = os.path.join(vendor_dir, path)
+ if os.path.exists(realpath):
+ shutil.rmtree(realpath)
+
+ # Create a symlink the the actual directory
+ os.symlink(vendor_dir, linkname)
+}
+
+addtask go_vendor before do_patch after do_unpack
diff --git a/poky/meta/classes/useradd_base.bbclass b/poky/meta/classes/useradd_base.bbclass
index 863cb7b76c..5e1c699118 100644
--- a/poky/meta/classes/useradd_base.bbclass
+++ b/poky/meta/classes/useradd_base.bbclass
@@ -160,7 +160,7 @@ perform_passwd_expire () {
local username=`echo "$opts" | awk '{ print $NF }'`
local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
if test "x$user_exists" != "x"; then
- eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO sed -i \''s/^\('$username':[^:]*\):[^:]*:/\1:0:/'\' $rootdir/etc/shadow \" || true
+ eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO sed --follow-symlinks -i \''s/^\('$username':[^:]*\):[^:]*:/\1:0:/'\' $rootdir/etc/shadow \" || true
local passwd_lastchanged="`grep "^$username:" $rootdir/etc/shadow | cut -d: -f3`"
if test "x$passwd_lastchanged" != "x0"; then
bbfatal "${PN}: passwd --expire operation did not succeed."
diff --git a/poky/meta/conf/bitbake.conf b/poky/meta/conf/bitbake.conf
index 77ff494523..983987cf7e 100644
--- a/poky/meta/conf/bitbake.conf
+++ b/poky/meta/conf/bitbake.conf
@@ -46,7 +46,6 @@ export sbindir = "${exec_prefix}/sbin"
export libdir = "${exec_prefix}/${baselib}"
export libexecdir = "${exec_prefix}/libexec"
export includedir = "${exec_prefix}/include"
-export oldincludedir = "${exec_prefix}/include"
localedir = "${libdir}/locale"
# Linkage between native/cross/nativesdk layouts
@@ -444,7 +443,6 @@ STAGING_DIR_TARGET = "${RECIPE_SYSROOT}"
# Setting DEPLOY_DIR outside of TMPDIR is helpful, when you are using
# packaged staging and/or multimachine.
DEPLOY_DIR ?= "${TMPDIR}/deploy"
-DEPLOY_DIR_TAR = "${DEPLOY_DIR}/tar"
DEPLOY_DIR_IPK = "${DEPLOY_DIR}/ipk"
DEPLOY_DIR_RPM = "${DEPLOY_DIR}/rpm"
DEPLOY_DIR_DEB = "${DEPLOY_DIR}/deb"
@@ -554,7 +552,7 @@ TOOLCHAIN_OPTIONS = " --sysroot=${STAGING_DIR_TARGET}"
export CC = "${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}"
export CXX = "${CCACHE}${HOST_PREFIX}g++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}"
-export FC = "${CCACHE}${HOST_PREFIX}gfortran ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}"
+export FC = "${HOST_PREFIX}gfortran ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}"
export CPP = "${HOST_PREFIX}gcc -E${TOOLCHAIN_OPTIONS} ${HOST_CC_ARCH}"
export LD = "${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}"
export CCLD = "${CC}"
@@ -571,7 +569,7 @@ PYTHON = "${@sys.executable}"
export BUILD_CC = "${CCACHE}${BUILD_PREFIX}gcc ${BUILD_CC_ARCH}"
export BUILD_CXX = "${CCACHE}${BUILD_PREFIX}g++ ${BUILD_CC_ARCH}"
-export BUILD_FC = "${CCACHE}${BUILD_PREFIX}gfortran ${BUILD_CC_ARCH}"
+export BUILD_FC = "${BUILD_PREFIX}gfortran ${BUILD_CC_ARCH}"
export BUILD_CPP = "${BUILD_PREFIX}gcc ${BUILD_CC_ARCH} -E"
export BUILD_LD = "${BUILD_PREFIX}ld ${BUILD_LD_ARCH}"
export BUILD_CCLD = "${BUILD_PREFIX}gcc ${BUILD_CC_ARCH}"
@@ -647,12 +645,13 @@ EXTRA_OEMAKE:prepend:task-install = "${PARALLEL_MAKEINST} "
##################################################################
# Optimization flags.
##################################################################
+TARGET_DBGSRC_DIR ?= "/usr/src/debug/${PN}/${PV}"
# Beware: applied last to first
DEBUG_PREFIX_MAP ?= "-fcanon-prefix-map \
- -fmacro-prefix-map=${S}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} \
- -fdebug-prefix-map=${S}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} \
- -fmacro-prefix-map=${B}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} \
- -fdebug-prefix-map=${B}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} \
+ -fmacro-prefix-map=${S}=${TARGET_DBGSRC_DIR} \
+ -fdebug-prefix-map=${S}=${TARGET_DBGSRC_DIR} \
+ -fmacro-prefix-map=${B}=${TARGET_DBGSRC_DIR} \
+ -fdebug-prefix-map=${B}=${TARGET_DBGSRC_DIR} \
-fdebug-prefix-map=${STAGING_DIR_HOST}= \
-fmacro-prefix-map=${STAGING_DIR_HOST}= \
-fdebug-prefix-map=${STAGING_DIR_NATIVE}= \
@@ -935,6 +934,7 @@ BB_DEFAULT_UMASK ??= "022"
# Complete output from bitbake
BB_CONSOLELOG ?= "${LOG_DIR}/cooker/${MACHINE}/${DATETIME}.log"
+BB_DEFAULT_EVENTLOG ?= "${LOG_DIR}/eventlog/${DATETIME}.json"
# Setup our default hash policy
BB_SIGNATURE_HANDLER ?= "OEBasicHash"
diff --git a/poky/meta/conf/ccache.conf b/poky/meta/conf/ccache.conf
index 931012dec9..4406ae561b 100644
--- a/poky/meta/conf/ccache.conf
+++ b/poky/meta/conf/ccache.conf
@@ -1,2 +1 @@
max_size = 0
-cache_dir_levels = 1
diff --git a/poky/meta/conf/distro/include/maintainers.inc b/poky/meta/conf/distro/include/maintainers.inc
index b2579fc44c..2c59db56ac 100644
--- a/poky/meta/conf/distro/include/maintainers.inc
+++ b/poky/meta/conf/distro/include/maintainers.inc
@@ -320,7 +320,6 @@ RECIPE_MAINTAINER:pn-libcgroup = "Alexander Kanavin <alex.kanavin@gmail.com>"
RECIPE_MAINTAINER:pn-libcheck = "Yi Zhao <yi.zhao@windriver.com>"
RECIPE_MAINTAINER:pn-libcomps = "Alexander Kanavin <alex.kanavin@gmail.com>"
RECIPE_MAINTAINER:pn-libconvert-asn1-perl = "Tim Orling <tim.orling@konsulko.com>"
-RECIPE_MAINTAINER:pn-libcroco = "Anuj Mittal <anuj.mittal@intel.com>"
RECIPE_MAINTAINER:pn-libdaemon = "Alexander Kanavin <alex.kanavin@gmail.com>"
RECIPE_MAINTAINER:pn-libdazzle = "Alexander Kanavin <alex.kanavin@gmail.com>"
RECIPE_MAINTAINER:pn-libdnf = "Alexander Kanavin <alex.kanavin@gmail.com>"
@@ -838,6 +837,7 @@ RECIPE_MAINTAINER:pn-vulkan-headers = "Anuj Mittal <anuj.mittal@intel.com>"
RECIPE_MAINTAINER:pn-vulkan-loader = "Anuj Mittal <anuj.mittal@intel.com>"
RECIPE_MAINTAINER:pn-vulkan-samples = "Ross Burton <ross.burton@arm.com>"
RECIPE_MAINTAINER:pn-vulkan-tools = "Anuj Mittal <anuj.mittal@intel.com>"
+RECIPE_MAINTAINER:pn-vulkan-utility-libraries = "Anuj Mittal <anuj.mittal@intel.com>"
RECIPE_MAINTAINER:pn-vulkan-validation-layers = "Vincent Davis Jr <vince@underview.tech>"
RECIPE_MAINTAINER:pn-waffle = "Ross Burton <ross.burton@arm.com>"
RECIPE_MAINTAINER:pn-watchdog = "Alexander Kanavin <alex.kanavin@gmail.com>"
diff --git a/poky/meta/conf/distro/include/ptest-packagelists.inc b/poky/meta/conf/distro/include/ptest-packagelists.inc
index fc42f95de2..7ca23cb4f0 100644
--- a/poky/meta/conf/distro/include/ptest-packagelists.inc
+++ b/poky/meta/conf/distro/include/ptest-packagelists.inc
@@ -121,6 +121,8 @@ PTESTS_SLOW = "\
PTESTS_SLOW:remove:riscv64 = "valgrind"
PTESTS_PROBLEMS:append:riscv64 = " valgrind"
+PTESTS_SLOW:remove:riscv32 = "lttng-tools strace valgrind"
+PTESTS_PROBLEMS:append:riscv32 = " lttng-tools strace valgrind"
PTESTS_SLOW:append:libc-musl = " libc-test"
PTESTS_SLOW:remove:x86 = "valgrind"
PTESTS_PROBLEMS:append:x86 = " valgrind"
diff --git a/poky/meta/conf/distro/include/security_flags.inc b/poky/meta/conf/distro/include/security_flags.inc
index 2972f05b4e..d97a6edb0f 100644
--- a/poky/meta/conf/distro/include/security_flags.inc
+++ b/poky/meta/conf/distro/include/security_flags.inc
@@ -69,4 +69,3 @@ SECURITY_LDFLAGS:pn-xserver-xorg = "${SECURITY_X_LDFLAGS}"
TARGET_CC_ARCH:append:pn-binutils = " ${SELECTED_OPTIMIZATION}"
TARGET_CC_ARCH:append:pn-gcc = " ${SELECTED_OPTIMIZATION}"
TARGET_CC_ARCH:append:pn-gdb = " ${SELECTED_OPTIMIZATION}"
-TARGET_CC_ARCH:append:pn-perf = " ${SELECTED_OPTIMIZATION}"
diff --git a/poky/meta/conf/documentation.conf b/poky/meta/conf/documentation.conf
index 23a9c0fe7b..d03c497c0e 100644
--- a/poky/meta/conf/documentation.conf
+++ b/poky/meta/conf/documentation.conf
@@ -379,7 +379,6 @@ SDKMACHINE[doc] = "Specifies the architecture (i.e. i686 or x86_64) for which to
SECTION[doc] = "The section in which packages should be categorized. Package management utilities can make use of this variable."
SELECTED_OPTIMIZATION[doc] = "The variable takes the value of FULL_OPTIMIZATION unless DEBUG_BUILD = '1'. In this case, the value of DEBUG_OPTIMIZATION is used."
SERIAL_CONSOLES[doc] = "Defines the serial consoles (TTYs) to enable using getty."
-SERIAL_CONSOLES_CHECK[doc] = "Similar to SERIAL_CONSOLES except the device is checked for existence before attempting to enable it. Supported only by SysVinit."
SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS[doc] = "A list of recipe dependencies that should not be used to determine signatures of tasks from one recipe when they depend on tasks from another recipe."
SIGGEN_EXCLUDERECIPES_ABISAFE[doc] = "A list of recipes that are completely stable and will never change."
SITEINFO_BITS[doc] = "Specifies the number of bits for the target system CPU."
diff --git a/poky/meta/conf/layer.conf b/poky/meta/conf/layer.conf
index 9b94bbd8b3..bb8b1c81b1 100644
--- a/poky/meta/conf/layer.conf
+++ b/poky/meta/conf/layer.conf
@@ -7,7 +7,7 @@ BBFILE_COLLECTIONS += "core"
BBFILE_PATTERN_core = "^${LAYERDIR}/"
BBFILE_PRIORITY_core = "5"
-LAYERSERIES_CORENAMES = "nanbield mickledore"
+LAYERSERIES_CORENAMES = "nanbield"
# This should only be incremented on significant changes that will
# cause compatibility issues with other layers
diff --git a/poky/meta/conf/machine-sdk/riscv64.conf b/poky/meta/conf/machine-sdk/riscv64.conf
new file mode 100644
index 0000000000..3f4a5af0af
--- /dev/null
+++ b/poky/meta/conf/machine-sdk/riscv64.conf
@@ -0,0 +1,2 @@
+SDK_ARCH = "riscv64"
+ABIEXTENSION:class-nativesdk = ""
diff --git a/poky/meta/conf/machine/include/riscv/qemuriscv.inc b/poky/meta/conf/machine/include/riscv/qemuriscv.inc
index 46ae66b9e5..7024bd0a4e 100644
--- a/poky/meta/conf/machine/include/riscv/qemuriscv.inc
+++ b/poky/meta/conf/machine/include/riscv/qemuriscv.inc
@@ -3,7 +3,7 @@ PREFERRED_PROVIDER_virtual/bootloader ?= "u-boot"
require conf/machine/include/qemu.inc
require conf/machine/include/riscv/tune-riscv.inc
-MACHINE_FEATURES = "screen keyboard ext2 ext3 serial"
+MACHINE_FEATURES += "keyboard ext2 ext3 serial"
KERNEL_IMAGETYPE = "Image"
KERNEL_IMAGETYPES += "uImage"
diff --git a/poky/meta/conf/machine/qemuarmv5.conf b/poky/meta/conf/machine/qemuarmv5.conf
index f0a86f1e4c..ecd2873d91 100644
--- a/poky/meta/conf/machine/qemuarmv5.conf
+++ b/poky/meta/conf/machine/qemuarmv5.conf
@@ -14,6 +14,6 @@ QB_SYSTEM_NAME = "qemu-system-arm"
QB_MACHINE = "-machine versatilepb"
QB_GRAPHICS = "-device virtio-gpu-pci"
QB_OPT_APPEND = "-device qemu-xhci -device usb-tablet -device usb-kbd"
-QB_DTB = "${@oe.utils.version_less_or_equal('PREFERRED_VERSION_linux-yocto', '4.7', '', 'zImage-versatile-pb.dtb', d)}"
+QB_DTB ?= "zImage-versatile-pb.dtb"
KMACHINE:qemuarmv5 = "arm-versatile-926ejs"
diff --git a/poky/meta/files/fs-perms-persistent-log.txt b/poky/meta/files/fs-perms-persistent-log.txt
index 518c1be3c9..61f0a6e26a 100644
--- a/poky/meta/files/fs-perms-persistent-log.txt
+++ b/poky/meta/files/fs-perms-persistent-log.txt
@@ -38,7 +38,6 @@ ${datadir}/locale 0755 root root true 0644 root root
# Cleanup headers
${includedir} 0755 root root true 0644 root root
-${oldincludedir} 0755 root root true 0644 root root
# Cleanup debug src
/usr/src/debug 0755 root root true 0644 root root
diff --git a/poky/meta/files/fs-perms.txt b/poky/meta/files/fs-perms.txt
index daa4aed840..48191f504c 100644
--- a/poky/meta/files/fs-perms.txt
+++ b/poky/meta/files/fs-perms.txt
@@ -38,7 +38,6 @@ ${datadir}/locale 0755 root root true 0644 root root
# Cleanup headers
${includedir} 0755 root root true 0644 root root
-${oldincludedir} 0755 root root true 0644 root root
# Cleanup debug src
/usr/src/debug 0755 root root true 0644 root root
diff --git a/poky/meta/lib/bblayers/setupwriters/oe-setup-layers.py b/poky/meta/lib/bblayers/setupwriters/oe-setup-layers.py
index d5bc19a8cb..bd71ca1f51 100644
--- a/poky/meta/lib/bblayers/setupwriters/oe-setup-layers.py
+++ b/poky/meta/lib/bblayers/setupwriters/oe-setup-layers.py
@@ -45,7 +45,7 @@ class OeSetupLayersWriter():
logger.info('Created {}.json'.format(output))
if not args.json_only:
self._write_python(os.path.join(os.path.dirname(__file__),'../../../../scripts/oe-setup-layers'), output)
- logger.info('Created {}'.format(output))
+ logger.info('Created {}'.format(output))
def register_arguments(self, parser):
parser.add_argument('--json-only', action='store_true',
diff --git a/poky/meta/lib/oe/__init__.py b/poky/meta/lib/oe/__init__.py
index da7cbab308..6eb536ad28 100644
--- a/poky/meta/lib/oe/__init__.py
+++ b/poky/meta/lib/oe/__init__.py
@@ -9,4 +9,4 @@ __path__ = extend_path(__path__, __name__)
BBIMPORTS = ["data", "path", "utils", "types", "package", "packagedata", \
"packagegroup", "sstatesig", "lsb", "cachedpath", "license", \
- "qa", "reproducible", "rust", "buildcfg"]
+ "qa", "reproducible", "rust", "buildcfg", "go"]
diff --git a/poky/meta/lib/oe/buildcfg.py b/poky/meta/lib/oe/buildcfg.py
index 90f5e05715..b3fe510309 100644
--- a/poky/meta/lib/oe/buildcfg.py
+++ b/poky/meta/lib/oe/buildcfg.py
@@ -1,26 +1,27 @@
+import os
import subprocess
import bb.process
def detect_revision(d):
path = get_scmbasepath(d)
- return get_metadata_git_revision(path, d)
+ return get_metadata_git_revision(path)
def detect_branch(d):
path = get_scmbasepath(d)
- return get_metadata_git_branch(path, d)
+ return get_metadata_git_branch(path)
def get_scmbasepath(d):
return os.path.join(d.getVar('COREBASE'), 'meta')
-def get_metadata_git_branch(path, d):
+def get_metadata_git_branch(path):
try:
rev, _ = bb.process.run('git rev-parse --abbrev-ref HEAD', cwd=path)
except bb.process.ExecutionError:
rev = '<unknown>'
return rev.strip()
-def get_metadata_git_revision(path, d):
+def get_metadata_git_revision(path):
try:
rev, _ = bb.process.run('git rev-parse HEAD', cwd=path)
except bb.process.ExecutionError:
@@ -45,5 +46,5 @@ def get_layer_revisions(d):
layers = (d.getVar("BBLAYERS") or "").split()
revisions = []
for i in layers:
- revisions.append((i, os.path.basename(i), get_metadata_git_branch(i, None).strip(), get_metadata_git_revision(i, None), is_layer_modified(i)))
+ revisions.append((i, os.path.basename(i), get_metadata_git_branch(i).strip(), get_metadata_git_revision(i), is_layer_modified(i)))
return revisions
diff --git a/poky/meta/lib/oe/copy_buildsystem.py b/poky/meta/lib/oe/copy_buildsystem.py
index a0d829054e..81abfbf9e2 100644
--- a/poky/meta/lib/oe/copy_buildsystem.py
+++ b/poky/meta/lib/oe/copy_buildsystem.py
@@ -22,7 +22,7 @@ def _smart_copy(src, dest):
mode = os.stat(src).st_mode
if stat.S_ISDIR(mode):
bb.utils.mkdirhier(dest)
- cmd = "tar --exclude='.git' --exclude='__pycache__' --xattrs --xattrs-include='*' -chf - -C %s -p . \
+ cmd = "tar --exclude='.git' --exclude='__pycache__' --xattrs --xattrs-include='*' -cf - -C %s -p . \
| tar --xattrs --xattrs-include='*' -xf - -C %s" % (src, dest)
subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
else:
diff --git a/poky/meta/lib/oe/cve_check.py b/poky/meta/lib/oe/cve_check.py
index 3979d521d1..3fa77bf9a7 100644
--- a/poky/meta/lib/oe/cve_check.py
+++ b/poky/meta/lib/oe/cve_check.py
@@ -95,11 +95,6 @@ def get_patched_cves(d):
for url in oe.patch.src_patches(d):
patch_file = bb.fetch.decodeurl(url)[2]
- # Remote compressed patches may not be unpacked, so silently ignore them
- if not os.path.isfile(patch_file):
- bb.warn("%s does not exist, cannot extract CVE list" % patch_file)
- continue
-
# Check patch file name for CVE ID
fname_match = cve_file_name_match.search(patch_file)
if fname_match:
@@ -107,6 +102,12 @@ def get_patched_cves(d):
patched_cves.add(cve)
bb.debug(2, "Found CVE %s from patch file name %s" % (cve, patch_file))
+ # Remote patches won't be present and compressed patches won't be
+ # unpacked, so say we're not scanning them
+ if not os.path.isfile(patch_file):
+ bb.note("%s is remote or compressed, not scanning content" % patch_file)
+ continue
+
with open(patch_file, "r", encoding="utf-8") as f:
try:
patch_text = f.read()
@@ -172,7 +173,7 @@ def cve_check_merge_jsons(output, data):
for product in output["package"]:
if product["name"] == data["package"][0]["name"]:
- bb.error("Error adding the same package twice")
+ bb.error("Error adding the same package %s twice" % product["name"])
return
output["package"].append(data["package"][0])
diff --git a/poky/meta/lib/oe/go.py b/poky/meta/lib/oe/go.py
new file mode 100644
index 0000000000..dfd957d157
--- /dev/null
+++ b/poky/meta/lib/oe/go.py
@@ -0,0 +1,34 @@
+#
+# Copyright OpenEmbedded Contributors
+#
+# SPDX-License-Identifier: MIT
+#
+
+import re
+
+def map_arch(a):
+ if re.match('i.86', a):
+ return '386'
+ elif a == 'x86_64':
+ return 'amd64'
+ elif re.match('arm.*', a):
+ return 'arm'
+ elif re.match('aarch64.*', a):
+ return 'arm64'
+ elif re.match('mips64el.*', a):
+ return 'mips64le'
+ elif re.match('mips64.*', a):
+ return 'mips64'
+ elif a == 'mips':
+ return 'mips'
+ elif a == 'mipsel':
+ return 'mipsle'
+ elif re.match('p(pc|owerpc)(64le)', a):
+ return 'ppc64le'
+ elif re.match('p(pc|owerpc)(64)', a):
+ return 'ppc64'
+ elif a == 'riscv64':
+ return 'riscv64'
+ elif a == 'loongarch64':
+ return 'loong64'
+ return ''
diff --git a/poky/meta/lib/oe/package.py b/poky/meta/lib/oe/package.py
index 1dd20f85eb..f69bf9c353 100644
--- a/poky/meta/lib/oe/package.py
+++ b/poky/meta/lib/oe/package.py
@@ -456,8 +456,7 @@ def fixup_perms(d):
'sbindir',
'libexecdir',
'libdir',
- 'includedir',
- 'oldincludedir' ]
+ 'includedir' ]
for path in target_path_vars:
dir = d.getVar(path) or ""
diff --git a/poky/meta/lib/oe/patch.py b/poky/meta/lib/oe/patch.py
index ff9afc9df9..9b480b2b28 100644
--- a/poky/meta/lib/oe/patch.py
+++ b/poky/meta/lib/oe/patch.py
@@ -772,8 +772,9 @@ class NOOPResolver(Resolver):
self.patchset.Push()
except Exception:
import sys
- os.chdir(olddir)
raise
+ finally:
+ os.chdir(olddir)
# Patch resolver which relies on the user doing all the work involved in the
# resolution, with the exception of refreshing the remote copy of the patch
@@ -833,9 +834,9 @@ class UserResolver(Resolver):
# User did not fix the problem. Abort.
raise PatchError("Patch application failed, and user did not fix and refresh the patch.")
except Exception:
- os.chdir(olddir)
raise
- os.chdir(olddir)
+ finally:
+ os.chdir(olddir)
def patch_path(url, fetch, workdir, expand=True):
diff --git a/poky/meta/lib/oe/path.py b/poky/meta/lib/oe/path.py
index 0dc8f172d5..e2f1913a35 100644
--- a/poky/meta/lib/oe/path.py
+++ b/poky/meta/lib/oe/path.py
@@ -125,7 +125,8 @@ def copyhardlinktree(src, dst):
if os.path.isdir(src):
if len(glob.glob('%s/.??*' % src)) > 0:
source = './.??* '
- source += './*'
+ if len(glob.glob('%s/**' % src)) > 0:
+ source += './*'
s_dir = src
else:
source = src
diff --git a/poky/meta/lib/oe/sstatesig.py b/poky/meta/lib/oe/sstatesig.py
index 5bf1697e72..e250f51c12 100644
--- a/poky/meta/lib/oe/sstatesig.py
+++ b/poky/meta/lib/oe/sstatesig.py
@@ -142,9 +142,10 @@ class SignatureGeneratorOEBasicHashMixIn(object):
super().set_taskdata(data[3:])
def dump_sigs(self, dataCache, options):
- sigfile = os.getcwd() + "/locked-sigs.inc"
- bb.plain("Writing locked sigs to %s" % sigfile)
- self.dump_lockedsigs(sigfile)
+ if 'lockedsigs' in options:
+ sigfile = os.getcwd() + "/locked-sigs.inc"
+ bb.plain("Writing locked sigs to %s" % sigfile)
+ self.dump_lockedsigs(sigfile)
return super(bb.siggen.SignatureGeneratorBasicHash, self).dump_sigs(dataCache, options)
@@ -598,9 +599,9 @@ def OEOuthashBasic(path, sigfile, task, d):
update_hash(" %10s" % pwd.getpwuid(s.st_uid).pw_name)
update_hash(" %10s" % grp.getgrgid(s.st_gid).gr_name)
except KeyError as e:
- bb.warn("KeyError in %s" % path)
msg = ("KeyError: %s\nPath %s is owned by uid %d, gid %d, which doesn't match "
- "any user/group on target. This may be due to host contamination." % (e, path, s.st_uid, s.st_gid))
+ "any user/group on target. This may be due to host contamination." %
+ (e, os.path.abspath(path), s.st_uid, s.st_gid))
raise Exception(msg).with_traceback(e.__traceback__)
if include_timestamps:
diff --git a/poky/meta/lib/oe/utils.py b/poky/meta/lib/oe/utils.py
index a3b1bb1087..14a7d07ef0 100644
--- a/poky/meta/lib/oe/utils.py
+++ b/poky/meta/lib/oe/utils.py
@@ -7,6 +7,7 @@
import subprocess
import multiprocessing
import traceback
+import errno
def read_file(filename):
try:
@@ -528,3 +529,14 @@ def directory_size(root, blocksize=4096):
total += sum(roundup(getsize(os.path.join(root, name))) for name in files)
total += roundup(getsize(root))
return total
+
+# Update the mtime of a file, skip if permission/read-only issues
+def touch(filename):
+ try:
+ os.utime(filename, None)
+ except PermissionError:
+ pass
+ except OSError as e:
+ # Handle read-only file systems gracefully
+ if e.errno != errno.EROFS:
+ raise e
diff --git a/poky/meta/lib/oeqa/core/target/ssh.py b/poky/meta/lib/oeqa/core/target/ssh.py
index f22836d390..f4dd0ca417 100644
--- a/poky/meta/lib/oeqa/core/target/ssh.py
+++ b/poky/meta/lib/oeqa/core/target/ssh.py
@@ -232,11 +232,12 @@ def SSHCall(command, logger, timeout=None, **opts):
output_raw = b''
starttime = time.time()
process = subprocess.Popen(command, **options)
+ has_timeout = False
if timeout:
endtime = starttime + timeout
eof = False
os.set_blocking(process.stdout.fileno(), False)
- while time.time() < endtime and not eof:
+ while not has_timeout and not eof:
try:
logger.debug('Waiting for process output: time: %s, endtime: %s' % (time.time(), endtime))
if select.select([process.stdout], [], [], 5)[0] != []:
@@ -257,6 +258,10 @@ def SSHCall(command, logger, timeout=None, **opts):
logger.debug('BlockingIOError')
continue
+ if time.time() >= endtime:
+ logger.debug('SSHCall has timeout! Time: %s, endtime: %s' % (time.time(), endtime))
+ has_timeout = True
+
process.stdout.close()
# process hasn't returned yet
@@ -293,6 +298,16 @@ def SSHCall(command, logger, timeout=None, **opts):
pass
process.wait()
+ if has_timeout:
+ # Version of openssh before 8.6_p1 returns error code 0 when killed
+ # by a signal, when the timeout occurs we will receive a 0 error
+ # code because the process is been terminated and it's wrong because
+ # that value means success, but the process timed out.
+ # Afterwards, from version 8.6_p1 onwards, the returned code is 255.
+ # Fix this behaviour by checking the return code
+ if process.returncode == 0:
+ process.returncode = 255
+
options = {
"stdout": subprocess.PIPE,
"stderr": subprocess.STDOUT,
diff --git a/poky/meta/lib/oeqa/runtime/cases/parselogs.py b/poky/meta/lib/oeqa/runtime/cases/parselogs.py
index a805edd79d..cddb846bdf 100644
--- a/poky/meta/lib/oeqa/runtime/cases/parselogs.py
+++ b/poky/meta/lib/oeqa/runtime/cases/parselogs.py
@@ -180,12 +180,6 @@ ignore_errors = {
'Failed to load DMC firmware',
'The driver is built-in, so to load the firmware you need to',
] + x86_common,
- 'edgerouter' : [
- 'not creating \'/sys/firmware/fdt\'',
- 'Failed to find cpu0 device node',
- 'Fatal server error:',
- 'Server terminated with error',
- ] + common_errors,
'beaglebone-yocto' : [
'Direct firmware load for regulatory.db',
'failed to load regulatory.db',
diff --git a/poky/meta/lib/oeqa/runtime/cases/ssh.py b/poky/meta/lib/oeqa/runtime/cases/ssh.py
index 13aac54396..cdbef59500 100644
--- a/poky/meta/lib/oeqa/runtime/cases/ssh.py
+++ b/poky/meta/lib/oeqa/runtime/cases/ssh.py
@@ -13,6 +13,9 @@ class SSHTest(OERuntimeTestCase):
@OETestDepends(['ping.PingTest.test_ping'])
@OEHasPackage(['dropbear', 'openssh-sshd'])
def test_ssh(self):
+ (status, output) = self.target.run('sleep 20', timeout=2)
+ msg='run() timed out but return code was zero.'
+ self.assertNotEqual(status, 0, msg=msg)
(status, output) = self.target.run('uname -a')
self.assertEqual(status, 0, msg='SSH Test failed: %s' % output)
(status, output) = self.target.run('cat /etc/controllerimage')
diff --git a/poky/meta/lib/oeqa/sdk/cases/rust.py b/poky/meta/lib/oeqa/sdk/cases/rust.py
index 31036f0f14..f5d437bb19 100644
--- a/poky/meta/lib/oeqa/sdk/cases/rust.py
+++ b/poky/meta/lib/oeqa/sdk/cases/rust.py
@@ -33,3 +33,25 @@ class RustCompileTest(OESDKTestCase):
def test_cargo_build(self):
self._run('cd %s/hello; cargo build' % self.tc.sdk_dir)
+
+class RustHostCompileTest(OESDKTestCase):
+ td_vars = ['MACHINE', 'SDK_SYS']
+
+ @classmethod
+ def setUpClass(self):
+ targetdir = os.path.join(self.tc.sdk_dir, "hello")
+ try:
+ shutil.rmtree(targetdir)
+ except FileNotFoundError:
+ pass
+ shutil.copytree(os.path.join(self.tc.sdk_files_dir, "rust/hello"), targetdir)
+
+ def setUp(self):
+ machine = self.td.get("MACHINE")
+ if not self.tc.hasHostPackage("packagegroup-rust-cross-canadian-%s" % machine):
+ raise unittest.SkipTest("RustCompileTest class: SDK doesn't contain a Rust cross-canadian toolchain")
+
+ def test_cargo_build(self):
+ sdksys = self.td.get("SDK_SYS")
+ self._run('cd %s/hello; cargo build --target %s-gnu' % (self.tc.sdk_dir, sdksys))
+ self._run('cd %s/hello; cargo run --target %s-gnu' % (self.tc.sdk_dir, sdksys))
diff --git a/poky/meta/lib/oeqa/selftest/case.py b/poky/meta/lib/oeqa/selftest/case.py
index 54d90c78ac..da35b25f68 100644
--- a/poky/meta/lib/oeqa/selftest/case.py
+++ b/poky/meta/lib/oeqa/selftest/case.py
@@ -117,10 +117,6 @@ class OESelftestTestCase(OETestCase):
if e.errno != errno.ENOENT:
raise
- if self.tc.custommachine:
- machine_conf = 'MACHINE ??= "%s"\n' % self.tc.custommachine
- self.set_machine_config(machine_conf)
-
# tests might need their own setup
# but if they overwrite this one they have to call
# super each time, so let's give them an alternative
@@ -178,19 +174,11 @@ class OESelftestTestCase(OETestCase):
self.logger.debug("Writing to: %s\n%s\n" % (dest_path, data))
ftools.write_file(dest_path, data)
- if not multiconfig and self.tc.custommachine and 'MACHINE' in data:
- machine = get_bb_var('MACHINE')
- self.logger.warning('MACHINE overridden: %s' % machine)
-
def append_config(self, data):
"""Append to <builddir>/conf/selftest.inc"""
self.logger.debug("Appending to: %s\n%s\n" % (self.testinc_path, data))
ftools.append_file(self.testinc_path, data)
- if self.tc.custommachine and 'MACHINE' in data:
- machine = get_bb_var('MACHINE')
- self.logger.warning('MACHINE overridden: %s' % machine)
-
def remove_config(self, data):
"""Remove data from <builddir>/conf/selftest.inc"""
self.logger.debug("Removing from: %s\n%s\n" % (self.testinc_path, data))
diff --git a/poky/meta/lib/oeqa/selftest/cases/archiver.py b/poky/meta/lib/oeqa/selftest/cases/archiver.py
index 3fa59fff51..3cb888c506 100644
--- a/poky/meta/lib/oeqa/selftest/cases/archiver.py
+++ b/poky/meta/lib/oeqa/selftest/cases/archiver.py
@@ -141,7 +141,7 @@ class Archiver(OESelftestTestCase):
pn = 'gcc-source-%s' % get_bb_vars(['PV'], 'gcc')['PV']
# Generate the tasks signatures
- bitbake('mc:mc1:%s mc:mc2:%s -c %s -S none' % (pn, pn, task))
+ bitbake('mc:mc1:%s mc:mc2:%s -c %s -S lockedsigs' % (pn, pn, task))
# Check the tasks signatures
# To be machine agnostic the tasks needs to generate the same signature for each machine
diff --git a/poky/meta/lib/oeqa/selftest/cases/buildoptions.py b/poky/meta/lib/oeqa/selftest/cases/buildoptions.py
index 104448442a..31dafaa9c5 100644
--- a/poky/meta/lib/oeqa/selftest/cases/buildoptions.py
+++ b/poky/meta/lib/oeqa/selftest/cases/buildoptions.py
@@ -14,6 +14,7 @@ from oeqa.selftest.cases.buildhistory import BuildhistoryBase
from oeqa.core.decorator.data import skipIfMachine
from oeqa.utils.commands import bitbake, get_bb_var, get_bb_vars
import oeqa.utils.ftools as ftools
+from oeqa.core.decorator import OETestTag
class ImageOptionsTests(OESelftestTestCase):
@@ -204,6 +205,7 @@ class ToolchainOptions(OESelftestTestCase):
self.write_config(features)
bitbake('fortran-helloworld')
+@OETestTag("yocto-mirrors")
class SourceMirroring(OESelftestTestCase):
# Can we download everything from the Yocto Sources Mirror over http only
def test_yocto_source_mirror(self):
diff --git a/poky/meta/lib/oeqa/selftest/cases/debuginfod.py b/poky/meta/lib/oeqa/selftest/cases/debuginfod.py
index 37f51760fb..505b4be837 100644
--- a/poky/meta/lib/oeqa/selftest/cases/debuginfod.py
+++ b/poky/meta/lib/oeqa/selftest/cases/debuginfod.py
@@ -6,7 +6,11 @@
import os
import socketserver
import subprocess
+import time
+import urllib
+import pathlib
+from oeqa.core.decorator import OETestTag
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake, get_bb_var, runqemu
@@ -21,39 +25,54 @@ class Debuginfod(OESelftestTestCase):
Request the metrics endpoint periodically and wait for there to be no
busy scanning threads.
- Returns True if debuginfod is ready, False if we timed out
+ Returns if debuginfod is ready, raises an exception if not within the
+ timeout.
"""
- import time, urllib
- # Wait a minute
- countdown = 6
- delay = 10
+ # Wait two minutes
+ countdown = 24
+ delay = 5
+ latest = None
while countdown:
+ self.logger.info("waiting...")
time.sleep(delay)
+
+ self.logger.info("polling server")
+ if self.debuginfod.poll():
+ self.logger.info("server dead")
+ self.debuginfod.communicate()
+ self.fail("debuginfod terminated unexpectedly")
+ self.logger.info("server alive")
+
try:
- with urllib.request.urlopen("http://localhost:%d/metrics" % port) as f:
- lines = f.read().decode("ascii").splitlines()
- if "thread_busy{role=\"scan\"} 0" in lines:
- return True
+ with urllib.request.urlopen("http://localhost:%d/metrics" % port, timeout=10) as f:
+ for line in f.read().decode("ascii").splitlines():
+ key, value = line.rsplit(" ", 1)
+ if key == "thread_busy{role=\"scan\"}":
+ latest = int(value)
+ self.logger.info("Waiting for %d scan jobs to finish" % latest)
+ if latest == 0:
+ return
except urllib.error.URLError as e:
+ # TODO: how to catch just timeouts?
self.logger.error(e)
+
countdown -= 1
- return False
+ raise TimeoutError("Cannot connect debuginfod, still %d scan jobs running" % latest)
- def test_debuginfod(self):
- self.write_config(
- """
-DISTRO_FEATURES:append = " debuginfod"
-CORE_IMAGE_EXTRA_INSTALL += "elfutils"
- """
- )
- bitbake("core-image-minimal elfutils-native:do_addto_recipe_sysroot")
+ def start_debuginfod(self):
+ # We assume that the caller has already bitbake'd elfutils-native:do_addto_recipe_sysroot
+
+ # Save some useful paths for later
+ native_sysroot = pathlib.Path(get_bb_var("RECIPE_SYSROOT_NATIVE", "elfutils-native"))
+ native_bindir = native_sysroot / "usr" / "bin"
+ self.debuginfod = native_bindir / "debuginfod"
+ self.debuginfod_find = native_bindir / "debuginfod-find"
- native_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "elfutils-native")
cmd = [
- os.path.join(native_sysroot, "usr", "bin", "debuginfod"),
+ self.debuginfod,
"--verbose",
# In-memory database, this is a one-shot test
"--database=:memory:",
@@ -76,31 +95,64 @@ CORE_IMAGE_EXTRA_INSTALL += "elfutils"
else:
self.fail("Unknown package class %s" % format)
- # Find a free port
+ # Find a free port. Racey but the window is small.
with socketserver.TCPServer(("localhost", 0), None) as s:
- port = s.server_address[1]
- cmd.append("--port=%d" % port)
+ self.port = s.server_address[1]
+ cmd.append("--port=%d" % self.port)
+
+ self.logger.info(f"Starting server {cmd}")
+ self.debuginfod = subprocess.Popen(cmd, env={})
+ self.wait_for_debuginfod(self.port)
+
+
+ def test_debuginfod_native(self):
+ """
+ Test debuginfod outside of qemu, by building a package and looking up a
+ binary's debuginfo using elfutils-native.
+ """
+
+ self.write_config("""
+TMPDIR = "${TOPDIR}/tmp-debuginfod"
+DISTRO_FEATURES:append = " debuginfod"
+""")
+ bitbake("elfutils-native:do_addto_recipe_sysroot xz xz:do_package")
try:
- # Remove DEBUGINFOD_URLS from the environment so we don't try
- # looking in the distro debuginfod
+ self.start_debuginfod()
+
env = os.environ.copy()
- if "DEBUGINFOD_URLS" in env:
- del env["DEBUGINFOD_URLS"]
+ env["DEBUGINFOD_URLS"] = "http://localhost:%d/" % self.port
+
+ pkgs = pathlib.Path(get_bb_var("PKGDEST", "xz"))
+ cmd = (self.debuginfod_find, "debuginfo", pkgs / "xz" / "usr" / "bin" / "xz.xz")
+ self.logger.info(f"Starting client {cmd}")
+ output = subprocess.check_output(cmd, env=env, text=True)
+ # This should be more comprehensive
+ self.assertIn("/.cache/debuginfod_client/", output)
+ finally:
+ self.debuginfod.kill()
+
+ @OETestTag("runqemu")
+ def test_debuginfod_qemu(self):
+ """
+ Test debuginfod-find inside a qemu, talking to a debuginfod on the host.
+ """
+
+ self.write_config("""
+TMPDIR = "${TOPDIR}/tmp-debuginfod"
+DISTRO_FEATURES:append = " debuginfod"
+CORE_IMAGE_EXTRA_INSTALL += "elfutils xz"
+ """)
+ bitbake("core-image-minimal elfutils-native:do_addto_recipe_sysroot")
- self.logger.info(f"Starting server {cmd}")
- debuginfod = subprocess.Popen(cmd, env=env)
+ try:
+ self.start_debuginfod()
with runqemu("core-image-minimal", runqemuparams="nographic") as qemu:
- self.assertTrue(self.wait_for_debuginfod(port))
-
- cmd = (
- "DEBUGINFOD_URLS=http://%s:%d/ debuginfod-find debuginfo /usr/bin/debuginfod"
- % (qemu.server_ip, port)
- )
+ cmd = "DEBUGINFOD_URLS=http://%s:%d/ debuginfod-find debuginfo /usr/bin/xz" % (qemu.server_ip, self.port)
self.logger.info(f"Starting client {cmd}")
status, output = qemu.run_serial(cmd)
# This should be more comprehensive
self.assertIn("/.cache/debuginfod_client/", output)
finally:
- debuginfod.kill()
+ self.debuginfod.kill()
diff --git a/poky/meta/lib/oeqa/selftest/cases/devtool.py b/poky/meta/lib/oeqa/selftest/cases/devtool.py
index b577f6d62a..ab58971fec 100644
--- a/poky/meta/lib/oeqa/selftest/cases/devtool.py
+++ b/poky/meta/lib/oeqa/selftest/cases/devtool.py
@@ -27,6 +27,9 @@ def setUpModule():
corecopydir = os.path.join(templayerdir, 'core-copy')
bblayers_conf = os.path.join(os.environ['BUILDDIR'], 'conf', 'bblayers.conf')
edited_layers = []
+ # make sure user doesn't have a local workspace
+ result = runCmd('bitbake-layers show-layers')
+ assert "workspacelayer" not in result.output, "Devtool test suite cannot be run with a local workspace directory"
# We need to take a copy of the meta layer so we can modify it and not
# have any races against other tests that might be running in parallel
@@ -572,7 +575,7 @@ class DevtoolAddTests(DevtoolBase):
checkvars['S'] = '${WORKDIR}/MarkupSafe-%s' % testver
checkvars['SRC_URI'] = url
self._test_recipe_contents(recipefile, checkvars, [])
-
+
def test_devtool_add_fetch_git(self):
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
@@ -1072,7 +1075,12 @@ class DevtoolModifyTests(DevtoolBase):
with open(source, "rt") as f:
content = f.read()
self.assertEquals(content, expected)
- check('devtool', 'This is a test for something\n')
+ if self.td["MACHINE"] == "qemux86":
+ check('devtool', 'This is a test for qemux86\n')
+ elif self.td["MACHINE"] == "qemuarm":
+ check('devtool', 'This is a test for qemuarm\n')
+ else:
+ check('devtool', 'This is a test for something\n')
check('devtool-no-overrides', 'This is a test for something\n')
check('devtool-override-qemuarm', 'This is a test for qemuarm\n')
check('devtool-override-qemux86', 'This is a test for qemux86\n')
diff --git a/poky/meta/lib/oeqa/selftest/cases/recipetool.py b/poky/meta/lib/oeqa/selftest/cases/recipetool.py
index 48661bee6f..55cbba9ca7 100644
--- a/poky/meta/lib/oeqa/selftest/cases/recipetool.py
+++ b/poky/meta/lib/oeqa/selftest/cases/recipetool.py
@@ -445,7 +445,7 @@ class RecipetoolCreateTests(RecipetoolBase):
# Basic test to see if github URL mangling works
temprecipe = os.path.join(self.tempdir, 'recipe')
os.makedirs(temprecipe)
- recipefile = os.path.join(temprecipe, 'meson_git.bb')
+ recipefile = os.path.join(temprecipe, 'python3-meson_git.bb')
srcuri = 'https://github.com/mesonbuild/meson;rev=0.32.0'
result = runCmd(['recipetool', 'create', '-o', temprecipe, srcuri])
self.assertTrue(os.path.isfile(recipefile))
@@ -474,12 +474,149 @@ class RecipetoolCreateTests(RecipetoolBase):
inherits = ['setuptools3']
self._test_recipe_contents(recipefile, checkvars, inherits)
+ def test_recipetool_create_python3_pep517_setuptools_build_meta(self):
+ # This test require python 3.11 or above for the tomllib module
+ # or tomli module to be installed
+ try:
+ import tomllib
+ except ImportError:
+ try:
+ import tomli
+ except ImportError:
+ self.skipTest('Test requires python 3.11 or above for tomllib module or tomli module')
+
+ # Test creating python3 package from tarball (using setuptools.build_meta class)
+ temprecipe = os.path.join(self.tempdir, 'recipe')
+ os.makedirs(temprecipe)
+ pn = 'webcolors'
+ pv = '1.13'
+ recipefile = os.path.join(temprecipe, 'python3-%s_%s.bb' % (pn, pv))
+ srcuri = 'https://files.pythonhosted.org/packages/a1/fb/f95560c6a5d4469d9c49e24cf1b5d4d21ffab5608251c6020a965fb7791c/%s-%s.tar.gz' % (pn, pv)
+ result = runCmd('recipetool create -o %s %s' % (temprecipe, srcuri))
+ self.assertTrue(os.path.isfile(recipefile))
+ checkvars = {}
+ checkvars['SUMMARY'] = 'A library for working with the color formats defined by HTML and CSS.'
+ checkvars['LICENSE'] = set(['BSD-3-Clause'])
+ checkvars['LIC_FILES_CHKSUM'] = 'file://LICENSE;md5=702b1ef12cf66832a88f24c8f2ee9c19'
+ checkvars['SRC_URI'] = 'https://files.pythonhosted.org/packages/a1/fb/f95560c6a5d4469d9c49e24cf1b5d4d21ffab5608251c6020a965fb7791c/webcolors-${PV}.tar.gz'
+ checkvars['SRC_URI[md5sum]'] = 'c9be30c5b0cf1cad32e4cbacbb2229e9'
+ checkvars['SRC_URI[sha1sum]'] = 'c90b84fb65eed9b4c9dea7f08c657bfac0e820a5'
+ checkvars['SRC_URI[sha256sum]'] = 'c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a'
+ checkvars['SRC_URI[sha384sum]'] = '45652af349660f19f68d01361dd5bda287789e5ea63608f52a8cea526ac04465614db2ea236103fb8456b1fcaea96ed7'
+ checkvars['SRC_URI[sha512sum]'] = '074aaf135ac6b0025b88b731d1d6dfa4c539b4fff7195658cc58a4326bb9f0449a231685d312b4a1ec48ca535a838bfa5c680787fe0e61473a2a092c448937d0'
+ inherits = ['python_setuptools_build_meta']
+
+ self._test_recipe_contents(recipefile, checkvars, inherits)
+
+ def test_recipetool_create_python3_pep517_poetry_core_masonry_api(self):
+ # This test require python 3.11 or above for the tomllib module
+ # or tomli module to be installed
+ try:
+ import tomllib
+ except ImportError:
+ try:
+ import tomli
+ except ImportError:
+ self.skipTest('Test requires python 3.11 or above for tomllib module or tomli module')
+
+ # Test creating python3 package from tarball (using poetry.core.masonry.api class)
+ temprecipe = os.path.join(self.tempdir, 'recipe')
+ os.makedirs(temprecipe)
+ pn = 'iso8601'
+ pv = '2.1.0'
+ recipefile = os.path.join(temprecipe, 'python3-%s_%s.bb' % (pn, pv))
+ srcuri = 'https://files.pythonhosted.org/packages/b9/f3/ef59cee614d5e0accf6fd0cbba025b93b272e626ca89fb70a3e9187c5d15/%s-%s.tar.gz' % (pn, pv)
+ result = runCmd('recipetool create -o %s %s' % (temprecipe, srcuri))
+ self.assertTrue(os.path.isfile(recipefile))
+ checkvars = {}
+ checkvars['SUMMARY'] = 'Simple module to parse ISO 8601 dates'
+ checkvars['LICENSE'] = set(['MIT'])
+ checkvars['LIC_FILES_CHKSUM'] = 'file://LICENSE;md5=aab31f2ef7ba214a5a341eaa47a7f367'
+ checkvars['SRC_URI'] = 'https://files.pythonhosted.org/packages/b9/f3/ef59cee614d5e0accf6fd0cbba025b93b272e626ca89fb70a3e9187c5d15/iso8601-${PV}.tar.gz'
+ checkvars['SRC_URI[md5sum]'] = '6e33910eba87066b3be7fcf3d59d16b5'
+ checkvars['SRC_URI[sha1sum]'] = 'efd225b2c9fa7d9e4a1ec6ad94f3295cee982e61'
+ checkvars['SRC_URI[sha256sum]'] = '6b1d3829ee8921c4301998c909f7829fa9ed3cbdac0d3b16af2d743aed1ba8df'
+ checkvars['SRC_URI[sha384sum]'] = '255002433fe65c19adfd6b91494271b613cb25ef6a35ac77436de1e03d60cc07bf89fd716451b917f1435e4384860ef6'
+ checkvars['SRC_URI[sha512sum]'] = 'db57ab2a25ef91e3bc479c8539d27e853cf1fbf60986820b8999ae15d7e566425a1e0cfba47d0f3b23aa703db0576db368e6c110ba2a2f46c9a34e8ee3611fb7'
+ inherits = ['python_poetry_core']
+
+ self._test_recipe_contents(recipefile, checkvars, inherits)
+
+ def test_recipetool_create_python3_pep517_flit_core_buildapi(self):
+ # This test require python 3.11 or above for the tomllib module
+ # or tomli module to be installed
+ try:
+ import tomllib
+ except ImportError:
+ try:
+ import tomli
+ except ImportError:
+ self.skipTest('Test requires python 3.11 or above for tomllib module or tomli module')
+
+ # Test creating python3 package from tarball (using flit_core.buildapi class)
+ temprecipe = os.path.join(self.tempdir, 'recipe')
+ os.makedirs(temprecipe)
+ pn = 'typing-extensions'
+ pv = '4.8.0'
+ recipefile = os.path.join(temprecipe, 'python3-%s_%s.bb' % (pn, pv))
+ srcuri = 'https://files.pythonhosted.org/packages/1f/7a/8b94bb016069caa12fc9f587b28080ac33b4fbb8ca369b98bc0a4828543e/typing_extensions-%s.tar.gz' % pv
+ result = runCmd('recipetool create -o %s %s' % (temprecipe, srcuri))
+ self.assertTrue(os.path.isfile(recipefile))
+ checkvars = {}
+ checkvars['SUMMARY'] = 'Backported and Experimental Type Hints for Python 3.8+'
+ checkvars['LICENSE'] = set(['PSF-2.0'])
+ checkvars['LIC_FILES_CHKSUM'] = 'file://LICENSE;md5=fcf6b249c2641540219a727f35d8d2c2'
+ checkvars['SRC_URI'] = 'https://files.pythonhosted.org/packages/1f/7a/8b94bb016069caa12fc9f587b28080ac33b4fbb8ca369b98bc0a4828543e/typing_extensions-${PV}.tar.gz'
+ checkvars['SRC_URI[md5sum]'] = '74bafe841fbd1c27324afdeb099babdf'
+ checkvars['SRC_URI[sha1sum]'] = 'f8bed69cbad4a57a1a67bf8a31b62b657b47f7a3'
+ checkvars['SRC_URI[sha256sum]'] = 'df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef'
+ checkvars['SRC_URI[sha384sum]'] = '0bd0112234134d965c6884f3c1f95d27b6ae49cfb08108101158e31dff33c2dce729331628b69818850f1acb68f6c8d0'
+ checkvars['SRC_URI[sha512sum]'] = '5fbff10e085fbf3ac2e35d08d913608d8c8bca66903435ede91cdc7776d775689a53d64f5f0615fe687c6c228ac854c8651d99eb1cb96ec61c56b7ca01fdd440'
+ inherits = ['python_flit_core']
+
+ self._test_recipe_contents(recipefile, checkvars, inherits)
+
+ def test_recipetool_create_python3_pep517_hatchling(self):
+ # This test require python 3.11 or above for the tomllib module
+ # or tomli module to be installed
+ try:
+ import tomllib
+ except ImportError:
+ try:
+ import tomli
+ except ImportError:
+ self.skipTest('Test requires python 3.11 or above for tomllib module or tomli module')
+
+ # Test creating python3 package from tarball (using hatchling class)
+ temprecipe = os.path.join(self.tempdir, 'recipe')
+ os.makedirs(temprecipe)
+ pn = 'jsonschema'
+ pv = '4.19.1'
+ recipefile = os.path.join(temprecipe, 'python3-%s_%s.bb' % (pn, pv))
+ srcuri = 'https://files.pythonhosted.org/packages/e4/43/087b24516db11722c8687e0caf0f66c7785c0b1c51b0ab951dfde924e3f5/jsonschema-%s.tar.gz' % pv
+ result = runCmd('recipetool create -o %s %s' % (temprecipe, srcuri))
+ self.assertTrue(os.path.isfile(recipefile))
+ checkvars = {}
+ checkvars['SUMMARY'] = 'An implementation of JSON Schema validation for Python'
+ checkvars['HOMEPAGE'] = 'https://github.com/python-jsonschema/jsonschema'
+ checkvars['LICENSE'] = set(['MIT'])
+ checkvars['LIC_FILES_CHKSUM'] = 'file://COPYING;md5=7a60a81c146ec25599a3e1dabb8610a8 file://json/LICENSE;md5=9d4de43111d33570c8fe49b4cb0e01af'
+ checkvars['SRC_URI'] = 'https://files.pythonhosted.org/packages/e4/43/087b24516db11722c8687e0caf0f66c7785c0b1c51b0ab951dfde924e3f5/jsonschema-${PV}.tar.gz'
+ checkvars['SRC_URI[md5sum]'] = '4d6667ce76f820c35082c2d60a4896ab'
+ checkvars['SRC_URI[sha1sum]'] = '9173714cb88964d07f3a3f4fcaaef638b8ceac0c'
+ checkvars['SRC_URI[sha256sum]'] = 'ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf'
+ checkvars['SRC_URI[sha384sum]'] = '7a53181f0e679aa3dc3eb4d05a420877b7b9bff2d02e81f5c289a37ed1127d6c0cca1f5a5f9e4e166f089ab36bcc2be9'
+ checkvars['SRC_URI[sha512sum]'] = '60fa769faf6e3fc2c14eb9acd189c86e9d366b157230a5681d36552af0c159cb1ad33fd920668a36afdab98bc97253f91501704c5c07b5009fdaf9d29b52060d'
+ inherits = ['python_hatchling']
+
+ self._test_recipe_contents(recipefile, checkvars, inherits)
+
def test_recipetool_create_github_tarball(self):
# Basic test to ensure github URL mangling doesn't apply to release tarballs
temprecipe = os.path.join(self.tempdir, 'recipe')
os.makedirs(temprecipe)
pv = '0.32.0'
- recipefile = os.path.join(temprecipe, 'meson_%s.bb' % pv)
+ recipefile = os.path.join(temprecipe, 'python3-meson_%s.bb' % pv)
srcuri = 'https://github.com/mesonbuild/meson/releases/download/%s/meson-%s.tar.gz' % (pv, pv)
result = runCmd('recipetool create -o %s %s' % (temprecipe, srcuri))
self.assertTrue(os.path.isfile(recipefile))
@@ -532,6 +669,191 @@ class RecipetoolTests(RecipetoolBase):
libpath = os.path.join(get_bb_var('COREBASE'), 'scripts', 'lib', 'recipetool')
sys.path.insert(0, libpath)
+ def test_recipetool_create_go(self):
+ # Basic test to check go recipe generation
+ def urifiy(url, version, modulepath = None, pathmajor = None, subdir = None):
+ modulepath = ",path='%s'" % modulepath if len(modulepath) else ''
+ pathmajor = ",pathmajor='%s'" % pathmajor if len(pathmajor) else ''
+ subdir = ",subdir='%s'" % subdir if len(subdir) else ''
+ return "${@go_src_uri('%s','%s'%s%s%s)}" % (url, version, modulepath, pathmajor, subdir)
+
+ temprecipe = os.path.join(self.tempdir, 'recipe')
+ os.makedirs(temprecipe)
+
+ recipefile = os.path.join(temprecipe, 'edgex-go_git.bb')
+ deps_require_file = os.path.join(temprecipe, 'edgex-go', 'edgex-go-modules.inc')
+ lics_require_file = os.path.join(temprecipe, 'edgex-go', 'edgex-go-licenses.inc')
+ modules_txt_file = os.path.join(temprecipe, 'edgex-go', 'modules.txt')
+
+ srcuri = 'https://github.com/edgexfoundry/edgex-go.git'
+ srcrev = "v3.0.0"
+ srcbranch = "main"
+
+ result = runCmd('recipetool create -o %s %s -S %s -B %s' % (temprecipe, srcuri, srcrev, srcbranch))
+
+ self.maxDiff = None
+ inherits = ['go-vendor']
+
+ checkvars = {}
+ checkvars['GO_IMPORT'] = "github.com/edgexfoundry/edgex-go"
+ checkvars['SRC_URI'] = {'git://${GO_IMPORT};destsuffix=git/src/${GO_IMPORT};nobranch=1;name=${BPN};protocol=https',
+ 'file://modules.txt'}
+ checkvars['LIC_FILES_CHKSUM'] = {'file://src/${GO_IMPORT}/LICENSE;md5=8f8bc924cf73f6a32381e5fd4c58d603'}
+
+ self.assertTrue(os.path.isfile(recipefile))
+ self._test_recipe_contents(recipefile, checkvars, inherits)
+
+ checkvars = {}
+ checkvars['VENDORED_LIC_FILES_CHKSUM'] = set(
+ ['file://src/${GO_IMPORT}/vendor/github.com/Microsoft/go-winio/LICENSE;md5=69205ff73858f2c22b2ca135b557e8ef',
+ 'file://src/${GO_IMPORT}/vendor/github.com/armon/go-metrics/LICENSE;md5=d2d77030c0183e3d1e66d26dc1f243be',
+ 'file://src/${GO_IMPORT}/vendor/github.com/cenkalti/backoff/LICENSE;md5=1571d94433e3f3aa05267efd4dbea68b',
+ 'file://src/${GO_IMPORT}/vendor/github.com/davecgh/go-spew/LICENSE;md5=c06795ed54b2a35ebeeb543cd3a73e56',
+ 'file://src/${GO_IMPORT}/vendor/github.com/eclipse/paho.mqtt.golang/LICENSE;md5=dcdb33474b60c38efd27356d8f2edec7',
+ 'file://src/${GO_IMPORT}/vendor/github.com/eclipse/paho.mqtt.golang/edl-v10;md5=3adfcc70f5aeb7a44f3f9b495aa1fbf3',
+ 'file://src/${GO_IMPORT}/vendor/github.com/edgexfoundry/go-mod-bootstrap/v3/LICENSE;md5=0d6dae39976133b2851fba4c1e1275ff',
+ 'file://src/${GO_IMPORT}/vendor/github.com/edgexfoundry/go-mod-configuration/v3/LICENSE;md5=0d6dae39976133b2851fba4c1e1275ff',
+ 'file://src/${GO_IMPORT}/vendor/github.com/edgexfoundry/go-mod-core-contracts/v3/LICENSE;md5=0d6dae39976133b2851fba4c1e1275ff',
+ 'file://src/${GO_IMPORT}/vendor/github.com/edgexfoundry/go-mod-messaging/v3/LICENSE;md5=0d6dae39976133b2851fba4c1e1275ff',
+ 'file://src/${GO_IMPORT}/vendor/github.com/edgexfoundry/go-mod-registry/v3/LICENSE;md5=0d6dae39976133b2851fba4c1e1275ff',
+ 'file://src/${GO_IMPORT}/vendor/github.com/edgexfoundry/go-mod-secrets/v3/LICENSE;md5=f9fa2f4f8e0ef8cc7b5dd150963eb457',
+ 'file://src/${GO_IMPORT}/vendor/github.com/fatih/color/LICENSE.md;md5=316e6d590bdcde7993fb175662c0dd5a',
+ 'file://src/${GO_IMPORT}/vendor/github.com/fxamacker/cbor/v2/LICENSE;md5=827f5a2fa861382d35a3943adf9ebb86',
+ 'file://src/${GO_IMPORT}/vendor/github.com/go-jose/go-jose/v3/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57',
+ 'file://src/${GO_IMPORT}/vendor/github.com/go-jose/go-jose/v3/json/LICENSE;md5=591778525c869cdde0ab5a1bf283cd81',
+ 'file://src/${GO_IMPORT}/vendor/github.com/go-kit/log/LICENSE;md5=5b7c15ad5fffe2ff6e9d58a6c161f082',
+ 'file://src/${GO_IMPORT}/vendor/github.com/go-logfmt/logfmt/LICENSE;md5=98e39517c38127f969de33057067091e',
+ 'file://src/${GO_IMPORT}/vendor/github.com/go-playground/locales/LICENSE;md5=3ccbda375ee345400ad1da85ba522301',
+ 'file://src/${GO_IMPORT}/vendor/github.com/go-playground/universal-translator/LICENSE;md5=2e2b21ef8f61057977d27c727c84bef1',
+ 'file://src/${GO_IMPORT}/vendor/github.com/go-playground/validator/v10/LICENSE;md5=a718a0f318d76f7c5d510cbae84f0b60',
+ 'file://src/${GO_IMPORT}/vendor/github.com/go-redis/redis/v7/LICENSE;md5=58103aa5ea1ee9b7a369c9c4a95ef9b5',
+ 'file://src/${GO_IMPORT}/vendor/github.com/golang/protobuf/LICENSE;md5=939cce1ec101726fa754e698ac871622',
+ 'file://src/${GO_IMPORT}/vendor/github.com/gomodule/redigo/LICENSE;md5=2ee41112a44fe7014dce33e26468ba93',
+ 'file://src/${GO_IMPORT}/vendor/github.com/google/uuid/LICENSE;md5=88073b6dd8ec00fe09da59e0b6dfded1',
+ 'file://src/${GO_IMPORT}/vendor/github.com/gorilla/mux/LICENSE;md5=33fa1116c45f9e8de714033f99edde13',
+ 'file://src/${GO_IMPORT}/vendor/github.com/gorilla/websocket/LICENSE;md5=c007b54a1743d596f46b2748d9f8c044',
+ 'file://src/${GO_IMPORT}/vendor/github.com/hashicorp/consul/api/LICENSE;md5=b8a277a612171b7526e9be072f405ef4',
+ 'file://src/${GO_IMPORT}/vendor/github.com/hashicorp/errwrap/LICENSE;md5=b278a92d2c1509760384428817710378',
+ 'file://src/${GO_IMPORT}/vendor/github.com/hashicorp/go-cleanhttp/LICENSE;md5=65d26fcc2f35ea6a181ac777e42db1ea',
+ 'file://src/${GO_IMPORT}/vendor/github.com/hashicorp/go-hclog/LICENSE;md5=ec7f605b74b9ad03347d0a93a5cc7eb8',
+ 'file://src/${GO_IMPORT}/vendor/github.com/hashicorp/go-immutable-radix/LICENSE;md5=65d26fcc2f35ea6a181ac777e42db1ea',
+ 'file://src/${GO_IMPORT}/vendor/github.com/hashicorp/go-multierror/LICENSE;md5=d44fdeb607e2d2614db9464dbedd4094',
+ 'file://src/${GO_IMPORT}/vendor/github.com/hashicorp/go-rootcerts/LICENSE;md5=65d26fcc2f35ea6a181ac777e42db1ea',
+ 'file://src/${GO_IMPORT}/vendor/github.com/hashicorp/golang-lru/LICENSE;md5=f27a50d2e878867827842f2c60e30bfc',
+ 'file://src/${GO_IMPORT}/vendor/github.com/hashicorp/serf/LICENSE;md5=b278a92d2c1509760384428817710378',
+ 'file://src/${GO_IMPORT}/vendor/github.com/leodido/go-urn/LICENSE;md5=8f50db5538ec1148a9b3d14ed96c3418',
+ 'file://src/${GO_IMPORT}/vendor/github.com/mattn/go-colorable/LICENSE;md5=24ce168f90aec2456a73de1839037245',
+ 'file://src/${GO_IMPORT}/vendor/github.com/mattn/go-isatty/LICENSE;md5=f509beadd5a11227c27b5d2ad6c9f2c6',
+ 'file://src/${GO_IMPORT}/vendor/github.com/mitchellh/consulstructure/LICENSE;md5=96ada10a9e51c98c4656f2cede08c673',
+ 'file://src/${GO_IMPORT}/vendor/github.com/mitchellh/copystructure/LICENSE;md5=56da355a12d4821cda57b8f23ec34bc4',
+ 'file://src/${GO_IMPORT}/vendor/github.com/mitchellh/go-homedir/LICENSE;md5=3f7765c3d4f58e1f84c4313cecf0f5bd',
+ 'file://src/${GO_IMPORT}/vendor/github.com/mitchellh/mapstructure/LICENSE;md5=3f7765c3d4f58e1f84c4313cecf0f5bd',
+ 'file://src/${GO_IMPORT}/vendor/github.com/mitchellh/reflectwalk/LICENSE;md5=3f7765c3d4f58e1f84c4313cecf0f5bd',
+ 'file://src/${GO_IMPORT}/vendor/github.com/nats-io/nats.go/LICENSE;md5=86d3f3a95c324c9479bd8986968f4327',
+ 'file://src/${GO_IMPORT}/vendor/github.com/nats-io/nkeys/LICENSE;md5=86d3f3a95c324c9479bd8986968f4327',
+ 'file://src/${GO_IMPORT}/vendor/github.com/nats-io/nuid/LICENSE;md5=86d3f3a95c324c9479bd8986968f4327',
+ 'file://src/${GO_IMPORT}/vendor/github.com/pmezard/go-difflib/LICENSE;md5=e9a2ebb8de779a07500ddecca806145e',
+ 'file://src/${GO_IMPORT}/vendor/github.com/rcrowley/go-metrics/LICENSE;md5=1bdf5d819f50f141366dabce3be1460f',
+ 'file://src/${GO_IMPORT}/vendor/github.com/spiffe/go-spiffe/v2/LICENSE;md5=86d3f3a95c324c9479bd8986968f4327',
+ 'file://src/${GO_IMPORT}/vendor/github.com/stretchr/objx/LICENSE;md5=d023fd31d3ca39ec61eec65a91732735',
+ 'file://src/${GO_IMPORT}/vendor/github.com/stretchr/testify/LICENSE;md5=188f01994659f3c0d310612333d2a26f',
+ 'file://src/${GO_IMPORT}/vendor/github.com/x448/float16/LICENSE;md5=de8f8e025d57fe7ee0b67f30d571323b',
+ 'file://src/${GO_IMPORT}/vendor/github.com/zeebo/errs/LICENSE;md5=84914ab36fc0eb48edbaa53e66e8d326',
+ 'file://src/${GO_IMPORT}/vendor/golang.org/x/crypto/LICENSE;md5=5d4950ecb7b26d2c5e4e7b4e0dd74707',
+ 'file://src/${GO_IMPORT}/vendor/golang.org/x/mod/LICENSE;md5=5d4950ecb7b26d2c5e4e7b4e0dd74707',
+ 'file://src/${GO_IMPORT}/vendor/golang.org/x/net/LICENSE;md5=5d4950ecb7b26d2c5e4e7b4e0dd74707',
+ 'file://src/${GO_IMPORT}/vendor/golang.org/x/sync/LICENSE;md5=5d4950ecb7b26d2c5e4e7b4e0dd74707',
+ 'file://src/${GO_IMPORT}/vendor/golang.org/x/sys/LICENSE;md5=5d4950ecb7b26d2c5e4e7b4e0dd74707',
+ 'file://src/${GO_IMPORT}/vendor/golang.org/x/text/LICENSE;md5=5d4950ecb7b26d2c5e4e7b4e0dd74707',
+ 'file://src/${GO_IMPORT}/vendor/golang.org/x/tools/LICENSE;md5=5d4950ecb7b26d2c5e4e7b4e0dd74707',
+ 'file://src/${GO_IMPORT}/vendor/google.golang.org/genproto/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57',
+ 'file://src/${GO_IMPORT}/vendor/google.golang.org/grpc/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57',
+ 'file://src/${GO_IMPORT}/vendor/google.golang.org/protobuf/LICENSE;md5=02d4002e9171d41a8fad93aa7faf3956',
+ 'file://src/${GO_IMPORT}/vendor/gopkg.in/eapache/queue.v1/LICENSE;md5=1bfd4408d3de090ef6b908b0cc45a316',
+ 'file://src/${GO_IMPORT}/vendor/gopkg.in/yaml.v3/LICENSE;md5=3c91c17266710e16afdbb2b6d15c761c'])
+
+ self.assertTrue(os.path.isfile(lics_require_file))
+ self._test_recipe_contents(lics_require_file, checkvars, [])
+
+ dependencies = \
+ [ ('github.com/eclipse/paho.mqtt.golang','v1.4.2', '', '', ''),
+ ('github.com/edgexfoundry/go-mod-bootstrap','v3.0.1','github.com/edgexfoundry/go-mod-bootstrap/v3','/v3', ''),
+ ('github.com/edgexfoundry/go-mod-configuration','v3.0.0','github.com/edgexfoundry/go-mod-configuration/v3','/v3', ''),
+ ('github.com/edgexfoundry/go-mod-core-contracts','v3.0.0','github.com/edgexfoundry/go-mod-core-contracts/v3','/v3', ''),
+ ('github.com/edgexfoundry/go-mod-messaging','v3.0.0','github.com/edgexfoundry/go-mod-messaging/v3','/v3', ''),
+ ('github.com/edgexfoundry/go-mod-secrets','v3.0.1','github.com/edgexfoundry/go-mod-secrets/v3','/v3', ''),
+ ('github.com/fxamacker/cbor','v2.4.0','github.com/fxamacker/cbor/v2','/v2', ''),
+ ('github.com/gomodule/redigo','v1.8.9', '', '', ''),
+ ('github.com/google/uuid','v1.3.0', '', '', ''),
+ ('github.com/gorilla/mux','v1.8.0', '', '', ''),
+ ('github.com/rcrowley/go-metrics','v0.0.0-20201227073835-cf1acfcdf475', '', '', ''),
+ ('github.com/spiffe/go-spiffe','v2.1.4','github.com/spiffe/go-spiffe/v2','/v2', ''),
+ ('github.com/stretchr/testify','v1.8.2', '', '', ''),
+ ('go.googlesource.com/crypto','v0.8.0','golang.org/x/crypto', '', ''),
+ ('gopkg.in/eapache/queue.v1','v1.1.0', '', '', ''),
+ ('gopkg.in/yaml.v3','v3.0.1', '', '', ''),
+ ('github.com/microsoft/go-winio','v0.6.0','github.com/Microsoft/go-winio', '', ''),
+ ('github.com/hashicorp/go-metrics','v0.3.10','github.com/armon/go-metrics', '', ''),
+ ('github.com/cenkalti/backoff','v2.2.1+incompatible', '', '', ''),
+ ('github.com/davecgh/go-spew','v1.1.1', '', '', ''),
+ ('github.com/edgexfoundry/go-mod-registry','v3.0.0','github.com/edgexfoundry/go-mod-registry/v3','/v3', ''),
+ ('github.com/fatih/color','v1.9.0', '', '', ''),
+ ('github.com/go-jose/go-jose','v3.0.0','github.com/go-jose/go-jose/v3','/v3', ''),
+ ('github.com/go-kit/log','v0.2.1', '', '', ''),
+ ('github.com/go-logfmt/logfmt','v0.5.1', '', '', ''),
+ ('github.com/go-playground/locales','v0.14.1', '', '', ''),
+ ('github.com/go-playground/universal-translator','v0.18.1', '', '', ''),
+ ('github.com/go-playground/validator','v10.13.0','github.com/go-playground/validator/v10','/v10', ''),
+ ('github.com/go-redis/redis','v7.3.0','github.com/go-redis/redis/v7','/v7', ''),
+ ('github.com/golang/protobuf','v1.5.2', '', '', ''),
+ ('github.com/gorilla/websocket','v1.4.2', '', '', ''),
+ ('github.com/hashicorp/consul','v1.20.0','github.com/hashicorp/consul/api', '', 'api'),
+ ('github.com/hashicorp/errwrap','v1.0.0', '', '', ''),
+ ('github.com/hashicorp/go-cleanhttp','v0.5.1', '', '', ''),
+ ('github.com/hashicorp/go-hclog','v0.14.1', '', '', ''),
+ ('github.com/hashicorp/go-immutable-radix','v1.3.0', '', '', ''),
+ ('github.com/hashicorp/go-multierror','v1.1.1', '', '', ''),
+ ('github.com/hashicorp/go-rootcerts','v1.0.2', '', '', ''),
+ ('github.com/hashicorp/golang-lru','v0.5.4', '', '', ''),
+ ('github.com/hashicorp/serf','v0.10.1', '', '', ''),
+ ('github.com/leodido/go-urn','v1.2.3', '', '', ''),
+ ('github.com/mattn/go-colorable','v0.1.12', '', '', ''),
+ ('github.com/mattn/go-isatty','v0.0.14', '', '', ''),
+ ('github.com/mitchellh/consulstructure','v0.0.0-20190329231841-56fdc4d2da54', '', '', ''),
+ ('github.com/mitchellh/copystructure','v1.2.0', '', '', ''),
+ ('github.com/mitchellh/go-homedir','v1.1.0', '', '', ''),
+ ('github.com/mitchellh/mapstructure','v1.5.0', '', '', ''),
+ ('github.com/mitchellh/reflectwalk','v1.0.2', '', '', ''),
+ ('github.com/nats-io/nats.go','v1.25.0', '', '', ''),
+ ('github.com/nats-io/nkeys','v0.4.4', '', '', ''),
+ ('github.com/nats-io/nuid','v1.0.1', '', '', ''),
+ ('github.com/pmezard/go-difflib','v1.0.0', '', '', ''),
+ ('github.com/stretchr/objx','v0.5.0', '', '', ''),
+ ('github.com/x448/float16','v0.8.4', '', '', ''),
+ ('github.com/zeebo/errs','v1.3.0', '', '', ''),
+ ('go.googlesource.com/mod','v0.8.0','golang.org/x/mod', '', ''),
+ ('go.googlesource.com/net','v0.9.0','golang.org/x/net', '', ''),
+ ('go.googlesource.com/sync','v0.1.0','golang.org/x/sync', '', ''),
+ ('go.googlesource.com/sys','v0.7.0','golang.org/x/sys', '', ''),
+ ('go.googlesource.com/text','v0.9.0','golang.org/x/text', '', ''),
+ ('go.googlesource.com/tools','v0.6.0','golang.org/x/tools', '', ''),
+ ('github.com/googleapis/go-genproto','v0.0.0-20230223222841-637eb2293923','google.golang.org/genproto', '', ''),
+ ('github.com/grpc/grpc-go','v1.53.0','google.golang.org/grpc', '', ''),
+ ('go.googlesource.com/protobuf','v1.28.1','google.golang.org/protobuf', '', ''),
+ ]
+
+ src_uri = set()
+ for d in dependencies:
+ src_uri.add(urifiy(*d))
+
+ checkvars = {}
+ checkvars['GO_DEPENDENCIES_SRC_URI'] = src_uri
+
+ self.assertTrue(os.path.isfile(deps_require_file))
+ self._test_recipe_contents(deps_require_file, checkvars, [])
+
+
+
def _copy_file_with_cleanup(self, srcfile, basedstdir, *paths):
dstdir = basedstdir
self.assertTrue(os.path.exists(dstdir))
diff --git a/poky/meta/lib/oeqa/selftest/cases/reproducible.py b/poky/meta/lib/oeqa/selftest/cases/reproducible.py
index 9b4a0887dd..029b6af331 100644
--- a/poky/meta/lib/oeqa/selftest/cases/reproducible.py
+++ b/poky/meta/lib/oeqa/selftest/cases/reproducible.py
@@ -16,6 +16,8 @@ import os
import datetime
exclude_packages = [
+ 'rust',
+ 'rust-dbg'
]
def is_excluded(package):
@@ -43,13 +45,14 @@ class CompareResult(object):
return (self.status, self.test) < (other.status, other.test)
class PackageCompareResults(object):
- def __init__(self):
+ def __init__(self, exclusions):
self.total = []
self.missing = []
self.different = []
self.different_excluded = []
self.same = []
self.active_exclusions = set()
+ exclude_packages.extend((exclusions or "").split())
def add_result(self, r):
self.total.append(r)
@@ -151,7 +154,16 @@ class ReproducibleTests(OESelftestTestCase):
def setUpLocal(self):
super().setUpLocal()
- needed_vars = ['TOPDIR', 'TARGET_PREFIX', 'BB_NUMBER_THREADS', 'BB_HASHSERVE', 'OEQA_REPRODUCIBLE_TEST_PACKAGE', 'OEQA_REPRODUCIBLE_TEST_TARGET', 'OEQA_REPRODUCIBLE_TEST_SSTATE_TARGETS']
+ needed_vars = [
+ 'TOPDIR',
+ 'TARGET_PREFIX',
+ 'BB_NUMBER_THREADS',
+ 'BB_HASHSERVE',
+ 'OEQA_REPRODUCIBLE_TEST_PACKAGE',
+ 'OEQA_REPRODUCIBLE_TEST_TARGET',
+ 'OEQA_REPRODUCIBLE_TEST_SSTATE_TARGETS',
+ 'OEQA_REPRODUCIBLE_EXCLUDED_PACKAGES',
+ ]
bb_vars = get_bb_vars(needed_vars)
for v in needed_vars:
setattr(self, v.lower(), bb_vars[v])
@@ -173,7 +185,7 @@ class ReproducibleTests(OESelftestTestCase):
self.extraresults['reproducible.rawlogs']['log'] += msg
def compare_packages(self, reference_dir, test_dir, diffutils_sysroot):
- result = PackageCompareResults()
+ result = PackageCompareResults(self.oeqa_reproducible_excluded_packages)
old_cwd = os.getcwd()
try:
diff --git a/poky/meta/lib/oeqa/selftest/cases/signing.py b/poky/meta/lib/oeqa/selftest/cases/signing.py
index 322e753ed3..18cce0ba25 100644
--- a/poky/meta/lib/oeqa/selftest/cases/signing.py
+++ b/poky/meta/lib/oeqa/selftest/cases/signing.py
@@ -191,7 +191,7 @@ class LockedSignatures(OESelftestTestCase):
bitbake(test_recipe)
# Generate locked sigs include file
- bitbake('-S none %s' % test_recipe)
+ bitbake('-S lockedsigs %s' % test_recipe)
feature = 'require %s\n' % locked_sigs_file
feature += 'SIGGEN_LOCKEDSIGS_TASKSIG_CHECK = "warn"\n'
diff --git a/poky/meta/lib/oeqa/selftest/cases/sstatetests.py b/poky/meta/lib/oeqa/selftest/cases/sstatetests.py
index bdad9088d3..7c2b14e95f 100644
--- a/poky/meta/lib/oeqa/selftest/cases/sstatetests.py
+++ b/poky/meta/lib/oeqa/selftest/cases/sstatetests.py
@@ -14,6 +14,7 @@ import re
from oeqa.utils.commands import runCmd, bitbake, get_bb_var, create_temp_layer, get_bb_vars
from oeqa.selftest.case import OESelftestTestCase
+from oeqa.core.decorator import OETestTag
import oe
import bb.siggen
@@ -773,3 +774,159 @@ addtask tmptask2 before do_tmptask1
latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-2:]
bb.siggen.compare_sigfiles(latestfiles[-2], latestfiles[-1], recursecb)
self.assertEqual(recursecb_count,1)
+
+class SStatePrintdiff(SStateBase):
+ def run_test_printdiff_changerecipe(self, target, change_recipe, change_bbtask, change_content, expected_sametmp_output, expected_difftmp_output):
+ self.write_config("""
+TMPDIR = "${TOPDIR}/tmp-sstateprintdiff"
+""")
+ self.track_for_cleanup(self.topdir + "/tmp-sstateprintdiff")
+ # Use runall do_build to ensure any indirect sstate is created, e.g. tzcode-native on both x86 and
+ # aarch64 hosts since only allarch target recipes depend upon it and it may not be built otherwise.
+ # A bitbake -c cleansstate tzcode-native would cause some of these tests to error for example.
+ bitbake("--runall build --runall deploy_source_date_epoch {}".format(target))
+ bitbake("-S none {}".format(target))
+ bitbake(change_bbtask)
+ self.write_recipeinc(change_recipe, change_content)
+ result_sametmp = bitbake("-S printdiff {}".format(target))
+
+ self.write_config("""
+TMPDIR = "${TOPDIR}/tmp-sstateprintdiff-2"
+""")
+ self.track_for_cleanup(self.topdir + "/tmp-sstateprintdiff-2")
+ result_difftmp = bitbake("-S printdiff {}".format(target))
+
+ self.delete_recipeinc(change_recipe)
+ for item in expected_sametmp_output:
+ self.assertIn(item, result_sametmp.output)
+ for item in expected_difftmp_output:
+ self.assertIn(item, result_difftmp.output)
+
+ def run_test_printdiff_changeconfig(self, target, change_content, expected_sametmp_output, expected_difftmp_output):
+ self.write_config("""
+TMPDIR = "${TOPDIR}/tmp-sstateprintdiff"
+""")
+ self.track_for_cleanup(self.topdir + "/tmp-sstateprintdiff")
+ bitbake("--runall build --runall deploy_source_date_epoch {}".format(target))
+ bitbake("-S none {}".format(target))
+ self.append_config(change_content)
+ result_sametmp = bitbake("-S printdiff {}".format(target))
+
+ self.write_config("""
+TMPDIR = "${TOPDIR}/tmp-sstateprintdiff-2"
+""")
+ self.append_config(change_content)
+ self.track_for_cleanup(self.topdir + "/tmp-sstateprintdiff-2")
+ result_difftmp = bitbake("-S printdiff {}".format(target))
+
+ for item in expected_sametmp_output:
+ self.assertIn(item, result_sametmp.output)
+ for item in expected_difftmp_output:
+ self.assertIn(item, result_difftmp.output)
+
+
+ # Check if printdiff walks the full dependency chain from the image target to where the change is in a specific recipe
+ def test_image_minimal_vs_quilt(self):
+ expected_output = ("Task quilt-native:do_install couldn't be used from the cache because:",
+"We need hash",
+"most recent matching task was")
+ expected_sametmp_output = expected_output + ("Variable do_install value changed",'+ echo "this changes the task signature"')
+ expected_difftmp_output = expected_output
+
+ self.run_test_printdiff_changerecipe("core-image-minimal", "quilt-native", "-c do_install quilt-native",
+"""
+do_install:append() {
+ echo "this changes the task signature"
+}
+""",
+expected_sametmp_output, expected_difftmp_output)
+
+ # Check if changes to gcc-source (which uses tmp/work-shared) are correctly discovered
+ def test_gcc_runtime_vs_gcc_source(self):
+ gcc_source_pn = 'gcc-source-%s' % get_bb_vars(['PV'], 'gcc')['PV']
+
+ expected_output = ("Task {}:do_preconfigure couldn't be used from the cache because:".format(gcc_source_pn),
+"We need hash",
+"most recent matching task was")
+ expected_sametmp_output = expected_output + ("Variable do_preconfigure value changed",'+ print("this changes the task signature")')
+ #FIXME: printdiff is supposed to find at least one preconfigure task signature in the sstate cache, but isn't able to
+ #expected_difftmp_output = expected_output
+ expected_difftmp_output = ()
+
+ self.run_test_printdiff_changerecipe("gcc-runtime", "gcc-source", "-c do_preconfigure {}".format(gcc_source_pn),
+"""
+python do_preconfigure:append() {
+ print("this changes the task signature")
+}
+""",
+expected_sametmp_output, expected_difftmp_output)
+
+ # Check if changing a really base task definiton is reported against multiple core recipes using it
+ def test_image_minimal_vs_base_do_configure(self):
+ expected_output = ("Task zstd-native:do_configure couldn't be used from the cache because:",
+"Task texinfo-dummy-native:do_configure couldn't be used from the cache because:",
+"Task ldconfig-native:do_configure couldn't be used from the cache because:",
+"Task gettext-minimal-native:do_configure couldn't be used from the cache because:",
+"Task tzcode-native:do_configure couldn't be used from the cache because:",
+"Task makedevs-native:do_configure couldn't be used from the cache because:",
+"Task pigz-native:do_configure couldn't be used from the cache because:",
+"Task update-rc.d-native:do_configure couldn't be used from the cache because:",
+"Task unzip-native:do_configure couldn't be used from the cache because:",
+"Task gnu-config-native:do_configure couldn't be used from the cache because:",
+"We need hash",
+"most recent matching task was")
+ expected_sametmp_output = expected_output + ("Variable base_do_configure value changed",'+ echo "this changes base_do_configure() definiton "')
+ expected_difftmp_output = expected_output
+
+ self.run_test_printdiff_changeconfig("core-image-minimal",
+"""
+INHERIT += "base-do-configure-modified"
+""",
+expected_sametmp_output, expected_difftmp_output)
+
+@OETestTag("yocto-mirrors")
+class SStateMirrors(SStateBase):
+ def check_bb_output(self, output, exceptions):
+ in_tasks = False
+ missing_objects = []
+ checked_urls = []
+ for l in output.splitlines():
+ if "Testing URL" in l:
+ checked_urls.append(l.split()[3])
+ if "The differences between the current build and any cached tasks start at the following tasks" in l:
+ in_tasks = True
+ continue
+ if "Writing task signature files" in l:
+ in_tasks = False
+ continue
+ if in_tasks:
+ recipe_task = l.split("/")[-1]
+ recipe, task = recipe_task.split(":")
+ for e in exceptions:
+ if e[0] in recipe and task == e[1]:
+ break
+ else:
+ missing_objects.append(recipe_task)
+ self.assertTrue(len(missing_objects) == 0, "URLs checked:\n{}\nMissing objects in the cache:\n{}".format("\n".join(checked_urls), "\n".join(missing_objects)))
+
+ def run_test_cdn_mirror(self, machine, targets, exceptions):
+ exceptions = exceptions + [[t, "do_deploy_source_date_epoch"] for t in targets.split()]
+ exceptions = exceptions + [[t, "do_image_qa"] for t in targets.split()]
+ self.config_sstate(True)
+ self.append_config("""
+MACHINE = "{}"
+BB_HASHSERVE_UPSTREAM = "hashserv.yocto.io:8687"
+SSTATE_MIRRORS ?= "file://.* http://cdn.jsdelivr.net/yocto/sstate/all/PATH;downloadfilename=PATH"
+""".format(machine))
+ result = bitbake("-D -S printdiff {}".format(targets))
+ self.check_bb_output(result.output, exceptions)
+
+ def test_cdn_mirror_qemux86_64(self):
+ # Example:
+ # exceptions = [ ["packagegroup-core-sdk","do_package"] ]
+ exceptions = []
+ self.run_test_cdn_mirror("qemux86-64", "core-image-minimal core-image-full-cmdline core-image-sato-sdk", exceptions)
+
+ def test_cdn_mirror_qemuarm64(self):
+ exceptions = []
+ self.run_test_cdn_mirror("qemuarm64", "core-image-minimal core-image-full-cmdline core-image-sato-sdk", exceptions)
diff --git a/poky/meta/lib/oeqa/selftest/cases/tinfoil.py b/poky/meta/lib/oeqa/selftest/cases/tinfoil.py
index dd13c20402..21c8686b2a 100644
--- a/poky/meta/lib/oeqa/selftest/cases/tinfoil.py
+++ b/poky/meta/lib/oeqa/selftest/cases/tinfoil.py
@@ -48,6 +48,17 @@ class TinfoilTests(OESelftestTestCase):
rd = tinfoil.parse_recipe_file(best[3])
self.assertEqual(testrecipe, rd.getVar('PN'))
+ def test_parse_virtual_recipe(self):
+ with bb.tinfoil.Tinfoil() as tinfoil:
+ tinfoil.prepare(config_only=False, quiet=2)
+ testrecipe = 'nativesdk-gcc'
+ best = tinfoil.find_best_provider(testrecipe)
+ if not best:
+ self.fail('Unable to find recipe providing %s' % testrecipe)
+ rd = tinfoil.parse_recipe_file(best[3])
+ self.assertEqual(testrecipe, rd.getVar('PN'))
+ self.assertIsNotNone(rd.getVar('FILE_LAYERNAME'))
+
def test_parse_recipe_copy_expand(self):
with bb.tinfoil.Tinfoil() as tinfoil:
tinfoil.prepare(config_only=False, quiet=2)
@@ -66,7 +77,7 @@ class TinfoilTests(OESelftestTestCase):
localdata.setVar('PN', 'hello')
self.assertEqual('hello', localdata.getVar('BPN'))
- # The config_data API tp parse_recipe_file is used by:
+ # The config_data API to parse_recipe_file is used by:
# layerindex-web layerindex/update_layer.py
def test_parse_recipe_custom_data(self):
with bb.tinfoil.Tinfoil() as tinfoil:
@@ -80,6 +91,18 @@ class TinfoilTests(OESelftestTestCase):
rd = tinfoil.parse_recipe_file(best[3], config_data=localdata)
self.assertEqual("testval", rd.getVar('TESTVAR'))
+ def test_parse_virtual_recipe_custom_data(self):
+ with bb.tinfoil.Tinfoil() as tinfoil:
+ tinfoil.prepare(config_only=False, quiet=2)
+ localdata = bb.data.createCopy(tinfoil.config_data)
+ localdata.setVar("TESTVAR", "testval")
+ testrecipe = 'nativesdk-gcc'
+ best = tinfoil.find_best_provider(testrecipe)
+ if not best:
+ self.fail('Unable to find recipe providing %s' % testrecipe)
+ rd = tinfoil.parse_recipe_file(best[3], config_data=localdata)
+ self.assertEqual("testval", rd.getVar('TESTVAR'))
+
def test_list_recipes(self):
with bb.tinfoil.Tinfoil() as tinfoil:
tinfoil.prepare(config_only=False, quiet=2)
diff --git a/poky/meta/lib/oeqa/selftest/context.py b/poky/meta/lib/oeqa/selftest/context.py
index 5a09aeedff..57844b289a 100644
--- a/poky/meta/lib/oeqa/selftest/context.py
+++ b/poky/meta/lib/oeqa/selftest/context.py
@@ -70,8 +70,6 @@ class OESelftestTestContext(OETestContext):
def __init__(self, td=None, logger=None, machines=None, config_paths=None, newbuilddir=None, keep_builddir=None):
super(OESelftestTestContext, self).__init__(td, logger)
- self.machines = machines
- self.custommachine = None
self.config_paths = config_paths
self.newbuilddir = newbuilddir
@@ -160,12 +158,6 @@ class OESelftestTestContext(OETestContext):
return NonConcurrentTestSuite(suites, processes, self.setup_builddir, self.removebuilddir, self.bb_vars)
def runTests(self, processes=None, machine=None, skips=[]):
- if machine:
- self.custommachine = machine
- if machine == 'random':
- self.custommachine = choice(self.machines)
- self.logger.info('Run tests with custom MACHINE set to: %s' % \
- self.custommachine)
return super(OESelftestTestContext, self).runTests(processes, skips)
def listTests(self, display_type, machine=None):
@@ -205,9 +197,6 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
parser.add_argument('-j', '--num-processes', dest='processes', action='store',
type=int, help="number of processes to execute in parallel with")
- parser.add_argument('--machine', required=False, choices=['random', 'all'],
- help='Run tests on different machines (random/all).')
-
parser.add_argument('-t', '--select-tag', dest="select_tags",
action='append', default=None,
help='Filter all (unhidden) tests to any that match any of the specified tag(s).')
@@ -222,20 +211,6 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
parser.add_argument('-v', '--verbose', action='store_true')
parser.set_defaults(func=self.run)
- def _get_available_machines(self):
- machines = []
-
- bbpath = self.tc_kwargs['init']['td']['BBPATH'].split(':')
-
- for path in bbpath:
- found_machines = glob.glob(os.path.join(path, 'conf', 'machine', '*.conf'))
- if found_machines:
- for i in found_machines:
- # eg: '/home/<user>/poky/meta-intel/conf/machine/intel-core2-32.conf'
- machines.append(os.path.splitext(os.path.basename(i))[0])
-
- return machines
-
def _get_cases_paths(self, bbpath):
cases_paths = []
for layer in bbpath:
@@ -266,7 +241,6 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
args.list_tests = 'name'
self.tc_kwargs['init']['td'] = bbvars
- self.tc_kwargs['init']['machines'] = self._get_available_machines()
builddir = os.environ.get("BUILDDIR")
self.tc_kwargs['init']['config_paths'] = {}
@@ -414,30 +388,7 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
rc = None
try:
- if args.machine:
- logger.info('Custom machine mode enabled. MACHINE set to %s' %
- args.machine)
-
- if args.machine == 'all':
- results = []
- for m in self.tc_kwargs['init']['machines']:
- self.tc_kwargs['run']['machine'] = m
- results.append(self._internal_run(logger, args))
-
- # XXX: the oe-selftest script only needs to know if one
- # machine run fails
- for r in results:
- rc = r
- if not r.wasSuccessful():
- break
-
- else:
- self.tc_kwargs['run']['machine'] = args.machine
- return self._internal_run(logger, args)
-
- else:
- self.tc_kwargs['run']['machine'] = args.machine
- rc = self._internal_run(logger, args)
+ rc = self._internal_run(logger, args)
finally:
config_paths = self.tc_kwargs['init']['config_paths']
diff --git a/poky/meta/lib/oeqa/utils/qemurunner.py b/poky/meta/lib/oeqa/utils/qemurunner.py
index a52fa41768..29fe271976 100644
--- a/poky/meta/lib/oeqa/utils/qemurunner.py
+++ b/poky/meta/lib/oeqa/utils/qemurunner.py
@@ -445,11 +445,9 @@ class QemuRunner:
self.logger.debug("Waiting at most %d seconds for login banner (%s)" %
(self.boottime, time.strftime("%D %H:%M:%S")))
endtime = time.time() + self.boottime
- newlinetime = time.time() + 120
filelist = [self.server_socket, self.runqemu.stdout]
reachedlogin = False
stopread = False
- sentnewlines = False
qemusock = None
bootlog = b''
data = b''
@@ -458,16 +456,6 @@ class QemuRunner:
sread, swrite, serror = select.select(filelist, [], [], 5)
except InterruptedError:
continue
- # With the 6.5 kernel, the serial port getty sometimes fails to appear, the data
- # appears lost in some buffer somewhere. Wait two minutes, then if we've not had a login,
- # try and provoke one. This is a workaround until we can work out the root cause.
- if time.time() > newlinetime and not sentnewlines:
- self.logger.warning('Probing the serial port to wake it up!')
- try:
- self.server_socket.sendall(bytes("\n\n", "utf-8"))
- sentnewlines = True
- except BrokenPipeError as e:
- self.logger.debug('Probe failed %s' % repr(e))
for file in sread:
if file is self.server_socket:
qemusock, addr = self.server_socket.accept()
diff --git a/poky/meta/lib/patchtest/data.py b/poky/meta/lib/patchtest/data.py
new file mode 100644
index 0000000000..356259921d
--- /dev/null
+++ b/poky/meta/lib/patchtest/data.py
@@ -0,0 +1,86 @@
+# ex:ts=4:sw=4:sts=4:et
+# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
+#
+# patchtestdata: module used to share command line arguments between
+# patchtest & test suite and a data store between test cases
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# NOTE: Strictly speaking, unit test should be isolated from outside,
+# but patchtest test suites uses command line input data and
+# pretest and test test cases may use the datastore defined
+# on this module
+
+import os
+import argparse
+import collections
+import logging
+
+logger=logging.getLogger('patchtest')
+info=logger.info
+
+default_testdir = os.path.abspath(os.path.dirname(__file__) + "/tests")
+default_repodir = os.path.abspath(os.path.dirname(__file__) + "/../../..")
+
+# Data store commonly used to share values between pre and post-merge tests
+PatchTestDataStore = collections.defaultdict(str)
+
+class PatchTestInput(object):
+ """Abstract the patchtest argument parser"""
+
+ @classmethod
+ def set_namespace(cls):
+ parser = cls.get_parser()
+ parser.parse_args(namespace=cls)
+
+ @classmethod
+ def get_parser(cls):
+ parser = argparse.ArgumentParser()
+
+ target_patch_group = parser.add_mutually_exclusive_group(required=True)
+
+ target_patch_group.add_argument('--patch', metavar='PATCH', dest='patch_path',
+ help='The patch to be tested')
+
+ target_patch_group.add_argument('--directory', metavar='DIRECTORY', dest='patch_path',
+ help='The directory containing patches to be tested')
+
+ parser.add_argument('--repodir', metavar='REPO',
+ default=default_repodir,
+ help="Name of the repository where patch is merged")
+
+ parser.add_argument('--testdir', metavar='TESTDIR',
+ default=default_testdir,
+ help="Directory where test cases are located")
+
+ parser.add_argument('--top-level-directory', '-t',
+ dest='topdir',
+ default=None,
+ help="Top level directory of project (defaults to start directory)")
+
+ parser.add_argument('--pattern', '-p',
+ dest='pattern',
+ default='test*.py',
+ help="Pattern to match test files")
+
+ parser.add_argument('--base-branch', '-b',
+ dest='basebranch',
+ help="Branch name used by patchtest to branch from. By default, it uses the current one.")
+
+ parser.add_argument('--base-commit', '-c',
+ dest='basecommit',
+ help="Commit ID used by patchtest to branch from. By default, it uses HEAD.")
+
+ parser.add_argument('--debug', '-d',
+ action='store_true',
+ help='Enable debug output')
+
+ parser.add_argument('--log-results',
+ action='store_true',
+ help='Enable logging to a file matching the target patch name with ".testresult" appended')
+
+
+ return parser
+
diff --git a/poky/meta/lib/patchtest/patch.py b/poky/meta/lib/patchtest/patch.py
new file mode 100644
index 0000000000..baf6283873
--- /dev/null
+++ b/poky/meta/lib/patchtest/patch.py
@@ -0,0 +1,62 @@
+# ex:ts=4:sw=4:sts=4:et
+# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
+#
+# patchtestpatch: PatchTestPatch class which abstracts a patch file
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+import logging
+import utils
+
+logger = logging.getLogger('patchtest')
+
+class PatchTestPatch(object):
+ MERGE_STATUS_INVALID = 'INVALID'
+ MERGE_STATUS_NOT_MERGED = 'NOTMERGED'
+ MERGE_STATUS_MERGED_SUCCESSFULL = 'PASS'
+ MERGE_STATUS_MERGED_FAIL = 'FAIL'
+ MERGE_STATUS = (MERGE_STATUS_INVALID,
+ MERGE_STATUS_NOT_MERGED,
+ MERGE_STATUS_MERGED_SUCCESSFULL,
+ MERGE_STATUS_MERGED_FAIL)
+
+ def __init__(self, path, forcereload=False):
+ self._path = path
+ self._forcereload = forcereload
+
+ self._contents = None
+ self._branch = None
+ self._merge_status = PatchTestPatch.MERGE_STATUS_NOT_MERGED
+
+ @property
+ def contents(self):
+ if self._forcereload or (not self._contents):
+ logger.debug('Reading %s contents' % self._path)
+ try:
+ with open(self._path, newline='') as _f:
+ self._contents = _f.read()
+ except IOError:
+ logger.warn("Reading the mbox %s failed" % self.resource)
+ return self._contents
+
+ @property
+ def path(self):
+ return self._path
+
+ @property
+ def branch(self):
+ if not self._branch:
+ self._branch = utils.get_branch(self._path)
+ return self._branch
+
+ def setmergestatus(self, status):
+ self._merge_status = status
+
+ def getmergestatus(self):
+ return self._merge_status
+
+ merge_status = property(getmergestatus, setmergestatus)
+
diff --git a/poky/meta/lib/patchtest/repo.py b/poky/meta/lib/patchtest/repo.py
new file mode 100644
index 0000000000..d3788f466d
--- /dev/null
+++ b/poky/meta/lib/patchtest/repo.py
@@ -0,0 +1,174 @@
+# ex:ts=4:sw=4:sts=4:et
+# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
+#
+# patchtestrepo: PatchTestRepo class used mainly to control a git repo from patchtest
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+import os
+import utils
+import logging
+from patch import PatchTestPatch
+
+logger = logging.getLogger('patchtest')
+info=logger.info
+
+class PatchTestRepo(object):
+
+ # prefixes used for temporal branches/stashes
+ prefix = 'patchtest'
+
+ def __init__(self, patch, repodir, commit=None, branch=None):
+ self._repodir = repodir
+ self._patch = PatchTestPatch(patch)
+ self._current_branch = self._get_current_branch()
+
+ # targeted branch defined on the patch may be invalid, so make sure there
+ # is a corresponding remote branch
+ valid_patch_branch = None
+ if self._patch.branch in self.upstream_branches():
+ valid_patch_branch = self._patch.branch
+
+ # Target Branch
+ # Priority (top has highest priority):
+ # 1. branch given at cmd line
+ # 2. branch given at the patch
+ # 3. current branch
+ self._branch = branch or valid_patch_branch or self._current_branch
+
+ # Target Commit
+ # Priority (top has highest priority):
+ # 1. commit given at cmd line
+ # 2. branch given at cmd line
+ # 3. branch given at the patch
+ # 3. current HEAD
+ self._commit = self._get_commitid(commit) or \
+ self._get_commitid(branch) or \
+ self._get_commitid(valid_patch_branch) or \
+ self._get_commitid('HEAD')
+
+ self._workingbranch = "%s_%s" % (PatchTestRepo.prefix, os.getpid())
+
+ # create working branch
+ self._exec({'cmd': ['git', 'checkout', '-b', self._workingbranch, self._commit]})
+
+ self._patchmerged = False
+
+ # Check if patch can be merged using git-am
+ self._patchcanbemerged = True
+ try:
+ self._exec({'cmd': ['git', 'am', '--keep-cr'], 'input': self._patch.contents})
+ except utils.CmdException as ce:
+ self._exec({'cmd': ['git', 'am', '--abort']})
+ self._patchcanbemerged = False
+ finally:
+ # if patch was applied, remove it
+ if self._patchcanbemerged:
+ self._exec({'cmd':['git', 'reset', '--hard', self._commit]})
+
+ # for debugging purposes, print all repo parameters
+ logger.debug("Parameters")
+ logger.debug("\tRepository : %s" % self._repodir)
+ logger.debug("\tTarget Commit : %s" % self._commit)
+ logger.debug("\tTarget Branch : %s" % self._branch)
+ logger.debug("\tWorking branch : %s" % self._workingbranch)
+ logger.debug("\tPatch : %s" % self._patch)
+
+ @property
+ def patch(self):
+ return self._patch.path
+
+ @property
+ def branch(self):
+ return self._branch
+
+ @property
+ def commit(self):
+ return self._commit
+
+ @property
+ def ismerged(self):
+ return self._patchmerged
+
+ @property
+ def canbemerged(self):
+ return self._patchcanbemerged
+
+ def _exec(self, cmds):
+ _cmds = []
+ if isinstance(cmds, dict):
+ _cmds.append(cmds)
+ elif isinstance(cmds, list):
+ _cmds = cmds
+ else:
+ raise utils.CmdException({'cmd':str(cmds)})
+
+ results = []
+ cmdfailure = False
+ try:
+ results = utils.exec_cmds(_cmds, self._repodir)
+ except utils.CmdException as ce:
+ cmdfailure = True
+ raise ce
+ finally:
+ if cmdfailure:
+ for cmd in _cmds:
+ logger.debug("CMD: %s" % ' '.join(cmd['cmd']))
+ else:
+ for result in results:
+ cmd, rc, stdout, stderr = ' '.join(result['cmd']), result['returncode'], result['stdout'], result['stderr']
+ logger.debug("CMD: %s RCODE: %s STDOUT: %s STDERR: %s" % (cmd, rc, stdout, stderr))
+
+ return results
+
+ def _get_current_branch(self, commit='HEAD'):
+ cmd = {'cmd':['git', 'rev-parse', '--abbrev-ref', commit]}
+ cb = self._exec(cmd)[0]['stdout']
+ if cb == commit:
+ logger.warning('You may be detached so patchtest will checkout to master after execution')
+ cb = 'master'
+ return cb
+
+ def _get_commitid(self, commit):
+
+ if not commit:
+ return None
+
+ try:
+ cmd = {'cmd':['git', 'rev-parse', '--short', commit]}
+ return self._exec(cmd)[0]['stdout']
+ except utils.CmdException as ce:
+ # try getting the commit under any remotes
+ cmd = {'cmd':['git', 'remote']}
+ remotes = self._exec(cmd)[0]['stdout']
+ for remote in remotes.splitlines():
+ cmd = {'cmd':['git', 'rev-parse', '--short', '%s/%s' % (remote, commit)]}
+ try:
+ return self._exec(cmd)[0]['stdout']
+ except utils.CmdException:
+ pass
+
+ return None
+
+ def upstream_branches(self):
+ cmd = {'cmd':['git', 'branch', '--remotes']}
+ remote_branches = self._exec(cmd)[0]['stdout']
+
+ # just get the names, without the remote name
+ branches = set(branch.split('/')[-1] for branch in remote_branches.splitlines())
+ return branches
+
+ def merge(self):
+ if self._patchcanbemerged:
+ self._exec({'cmd': ['git', 'am', '--keep-cr'],
+ 'input': self._patch.contents,
+ 'updateenv': {'PTRESOURCE':self._patch.path}})
+ self._patchmerged = True
+
+ def clean(self):
+ self._exec({'cmd':['git', 'checkout', '%s' % self._current_branch]})
+ self._exec({'cmd':['git', 'branch', '-D', self._workingbranch]})
+ self._patchmerged = False
diff --git a/poky/meta/lib/patchtest/requirements.txt b/poky/meta/lib/patchtest/requirements.txt
index 785aa469f6..ba55ff905e 100644
--- a/poky/meta/lib/patchtest/requirements.txt
+++ b/poky/meta/lib/patchtest/requirements.txt
@@ -1,3 +1,5 @@
+boto3
+git-pw>=2.5.0
jinja2
pylint
pyparsing>=3.0.9
diff --git a/poky/meta/lib/patchtest/selftest/files/CVE.test_cve_presence_in_commit_message.fail b/poky/meta/lib/patchtest/selftest/files/CVE.test_cve_presence_in_commit_message.fail
deleted file mode 100644
index d40b8a936b..0000000000
--- a/poky/meta/lib/patchtest/selftest/files/CVE.test_cve_presence_in_commit_message.fail
+++ /dev/null
@@ -1,72 +0,0 @@
-From 14d72f6973270f78455a8628143f2cff90e8f41e Mon Sep 17 00:00:00 2001
-From: Trevor Gamblin <tgamblin@baylibre.com>
-Date: Tue, 29 Aug 2023 14:12:27 -0400
-Subject: [PATCH] selftest-hello: fix CVE-1234-56789
-
-This patch should fail the test for CVE presence in the mbox commit message.
-
-Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com>
----
- .../selftest-hello/files/CVE-1234-56789.patch | 27 +++++++++++++++++++
- .../selftest-hello/selftest-hello_1.0.bb | 6 +++--
- 2 files changed, 31 insertions(+), 2 deletions(-)
- create mode 100644 meta-selftest/recipes-test/selftest-hello/files/CVE-1234-56789.patch
-
-diff --git a/meta-selftest/recipes-test/selftest-hello/files/CVE-1234-56789.patch b/meta-selftest/recipes-test/selftest-hello/files/CVE-1234-56789.patch
-new file mode 100644
-index 0000000000..869cfb6fe5
---- /dev/null
-+++ b/meta-selftest/recipes-test/selftest-hello/files/CVE-1234-56789.patch
-@@ -0,0 +1,27 @@
-+From b26a31186e6ee2eb1f506d5f2f9394d327a0df2f Mon Sep 17 00:00:00 2001
-+From: Trevor Gamblin <tgamblin@baylibre.com>
-+Date: Tue, 29 Aug 2023 14:08:20 -0400
-+Subject: [PATCH] Fix CVE-NOT-REAL
-+
-+CVE: CVE-1234-56789
-+Upstream-Status: Backport(http://example.com/example)
-+
-+Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com>
-+---
-+ strlen.c | 1 +
-+ 1 file changed, 1 insertion(+)
-+
-+diff --git a/strlen.c b/strlen.c
-+index 1788f38..83d7918 100644
-+--- a/strlen.c
-++++ b/strlen.c
-+@@ -8,6 +8,7 @@ int main() {
-+
-+ printf("%d\n", str_len(string1));
-+ printf("%d\n", str_len(string2));
-++ printf("CVE FIXED!!!\n");
-+
-+ return 0;
-+ }
-+--
-+2.41.0
-diff --git a/meta-selftest/recipes-test/selftest-hello/selftest-hello_1.0.bb b/meta-selftest/recipes-test/selftest-hello/selftest-hello_1.0.bb
-index 547587bef4..76975a6729 100644
---- a/meta-selftest/recipes-test/selftest-hello/selftest-hello_1.0.bb
-+++ b/meta-selftest/recipes-test/selftest-hello/selftest-hello_1.0.bb
-@@ -3,7 +3,9 @@ SECTION = "examples"
- LICENSE = "MIT"
- LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
-
--SRC_URI = "file://helloworld.c"
-+SRC_URI = "file://helloworld.c \
-+ file://CVE-1234-56789.patch \
-+ "
-
- S = "${WORKDIR}"
-
-@@ -16,4 +18,4 @@ do_install() {
- install -m 0755 helloworld ${D}${bindir}
- }
-
--BBCLASSEXTEND = "native nativesdk"
-\ No newline at end of file
-+BBCLASSEXTEND = "native nativesdk"
---
-2.41.0
-
diff --git a/poky/meta/lib/patchtest/selftest/files/CVE.test_cve_presence_in_commit_message.pass b/poky/meta/lib/patchtest/selftest/files/CVE.test_cve_presence_in_commit_message.pass
deleted file mode 100644
index 433c7a450a..0000000000
--- a/poky/meta/lib/patchtest/selftest/files/CVE.test_cve_presence_in_commit_message.pass
+++ /dev/null
@@ -1,74 +0,0 @@
-From 14d72f6973270f78455a8628143f2cff90e8f41e Mon Sep 17 00:00:00 2001
-From: Trevor Gamblin <tgamblin@baylibre.com>
-Date: Tue, 29 Aug 2023 14:12:27 -0400
-Subject: [PATCH] selftest-hello: fix CVE-1234-56789
-
-This test should pass the mbox cve tag test.
-
-CVE: CVE-1234-56789
-
-Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com>
----
- .../selftest-hello/files/CVE-1234-56789.patch | 27 +++++++++++++++++++
- .../selftest-hello/selftest-hello_1.0.bb | 6 +++--
- 2 files changed, 31 insertions(+), 2 deletions(-)
- create mode 100644 meta-selftest/recipes-test/selftest-hello/files/CVE-1234-56789.patch
-
-diff --git a/meta-selftest/recipes-test/selftest-hello/files/CVE-1234-56789.patch b/meta-selftest/recipes-test/selftest-hello/files/CVE-1234-56789.patch
-new file mode 100644
-index 0000000000..869cfb6fe5
---- /dev/null
-+++ b/meta-selftest/recipes-test/selftest-hello/files/CVE-1234-56789.patch
-@@ -0,0 +1,27 @@
-+From b26a31186e6ee2eb1f506d5f2f9394d327a0df2f Mon Sep 17 00:00:00 2001
-+From: Trevor Gamblin <tgamblin@baylibre.com>
-+Date: Tue, 29 Aug 2023 14:08:20 -0400
-+Subject: [PATCH] Fix CVE-NOT-REAL
-+
-+CVE: CVE-1234-56789
-+Upstream-Status: Backport(http://example.com/example)
-+
-+Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com>
-+---
-+ strlen.c | 1 +
-+ 1 file changed, 1 insertion(+)
-+
-+diff --git a/strlen.c b/strlen.c
-+index 1788f38..83d7918 100644
-+--- a/strlen.c
-++++ b/strlen.c
-+@@ -8,6 +8,7 @@ int main() {
-+
-+ printf("%d\n", str_len(string1));
-+ printf("%d\n", str_len(string2));
-++ printf("CVE FIXED!!!\n");
-+
-+ return 0;
-+ }
-+--
-+2.41.0
-diff --git a/meta-selftest/recipes-test/selftest-hello/selftest-hello_1.0.bb b/meta-selftest/recipes-test/selftest-hello/selftest-hello_1.0.bb
-index 547587bef4..76975a6729 100644
---- a/meta-selftest/recipes-test/selftest-hello/selftest-hello_1.0.bb
-+++ b/meta-selftest/recipes-test/selftest-hello/selftest-hello_1.0.bb
-@@ -3,7 +3,9 @@ SECTION = "examples"
- LICENSE = "MIT"
- LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
-
--SRC_URI = "file://helloworld.c"
-+SRC_URI = "file://helloworld.c \
-+ file://CVE-1234-56789.patch \
-+ "
-
- S = "${WORKDIR}"
-
-@@ -16,4 +18,4 @@ do_install() {
- install -m 0755 helloworld ${D}${bindir}
- }
-
--BBCLASSEXTEND = "native nativesdk"
-\ No newline at end of file
-+BBCLASSEXTEND = "native nativesdk"
---
-2.41.0
-
diff --git a/poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.1.fail b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.1.fail
index 0c40cdc1b6..0c40cdc1b6 100644
--- a/poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.1.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.1.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.1.pass b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.1.pass
index cbb8ef2cef..cbb8ef2cef 100644
--- a/poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.1.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.1.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.2.fail b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.2.fail
index 3e2b81bca1..3e2b81bca1 100644
--- a/poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.2.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.2.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.2.pass b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.2.pass
index f84e1265a7..f84e1265a7 100644
--- a/poky/meta/lib/patchtest/selftest/files/Author.test_author_valid.2.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_author_valid.2.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/Bugzilla.test_bugzilla_entry_format.fail b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_bugzilla_entry_format.fail
index 80f409e952..80f409e952 100644
--- a/poky/meta/lib/patchtest/selftest/files/Bugzilla.test_bugzilla_entry_format.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_bugzilla_entry_format.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/Bugzilla.test_bugzilla_entry_format.pass b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_bugzilla_entry_format.pass
index 2648b03364..2648b03364 100644
--- a/poky/meta/lib/patchtest/selftest/files/Bugzilla.test_bugzilla_entry_format.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_bugzilla_entry_format.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/CommitMessage.test_commit_message_presence.fail b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_commit_message_presence.fail
index 93ca0f9119..93ca0f9119 100644
--- a/poky/meta/lib/patchtest/selftest/files/CommitMessage.test_commit_message_presence.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_commit_message_presence.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/CommitMessage.test_commit_message_presence.pass b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_commit_message_presence.pass
index 5e3dcbd58b..5e3dcbd58b 100644
--- a/poky/meta/lib/patchtest/selftest/files/CommitMessage.test_commit_message_presence.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_commit_message_presence.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/MboxFormat.test_mbox_format.1.fail b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_mbox_format.1.fail
index 9cc4aab38a..9cc4aab38a 100644
--- a/poky/meta/lib/patchtest/selftest/files/MboxFormat.test_mbox_format.1.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_mbox_format.1.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/MboxFormat.test_mbox_format.2.fail b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_mbox_format.2.fail
index eca1c60085..eca1c60085 100644
--- a/poky/meta/lib/patchtest/selftest/files/MboxFormat.test_mbox_format.2.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_mbox_format.2.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/MboxFormat.test_mbox_format.pass b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_mbox_format.pass
index 33940adffc..33940adffc 100644
--- a/poky/meta/lib/patchtest/selftest/files/MboxFormat.test_mbox_format.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_mbox_format.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/Merge.test_series_merge_on_head.pass b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_series_merge_on_head.1.skip
index 2a72457878..2a72457878 100644
--- a/poky/meta/lib/patchtest/selftest/files/Merge.test_series_merge_on_head.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_series_merge_on_head.1.skip
diff --git a/poky/meta/lib/patchtest/selftest/files/Merge.test_series_merge_on_head.fail b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_series_merge_on_head.2.skip
index 49bd1f8ede..49bd1f8ede 100644
--- a/poky/meta/lib/patchtest/selftest/files/Merge.test_series_merge_on_head.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_series_merge_on_head.2.skip
diff --git a/poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_format.fail b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_format.fail
index cdbbc61b61..cdbbc61b61 100644
--- a/poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_format.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_format.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/CVE.test_cve_tag_format.pass b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_format.pass
index ef6017037c..ef6017037c 100644
--- a/poky/meta/lib/patchtest/selftest/files/CVE.test_cve_tag_format.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_format.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_length.fail b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_length.fail
index 247b2a8a80..629e78540b 100644
--- a/poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_length.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_length.fail
@@ -56,7 +56,7 @@ index 547587bef4..76975a6729 100644
-SRC_URI = "file://helloworld.c"
+SRC_URI = "file://helloworld.c \
-+ file://CVE-1234-56789.patch \
++ file://0001-Fix-CVE-1234-56789.patch \
+ "
S = "${WORKDIR}"
diff --git a/poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_format.pass b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_length.pass
index ef6017037c..ef6017037c 100644
--- a/poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_format.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_shortlog_length.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/SignedOffBy.test_signed_off_by_presence.1.fail b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_signed_off_by_presence.1.fail
index 35d92aeed7..35d92aeed7 100644
--- a/poky/meta/lib/patchtest/selftest/files/SignedOffBy.test_signed_off_by_presence.1.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_signed_off_by_presence.1.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/SignedOffBy.test_signed_off_by_presence.2.fail b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_signed_off_by_presence.2.fail
index 68f38dee06..68f38dee06 100644
--- a/poky/meta/lib/patchtest/selftest/files/SignedOffBy.test_signed_off_by_presence.2.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_signed_off_by_presence.2.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/PatchSignedOffBy.test_signed_off_by_presence.pass b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_signed_off_by_presence.pass
index ea34c76f0d..ea34c76f0d 100644
--- a/poky/meta/lib/patchtest/selftest/files/PatchSignedOffBy.test_signed_off_by_presence.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMbox.test_signed_off_by_presence.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_modified_not_mentioned.fail b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_modified_not_mentioned.fail
index ab6c52c374..ab6c52c374 100644
--- a/poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_modified_not_mentioned.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_modified_not_mentioned.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_modified_not_mentioned.pass b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_modified_not_mentioned.pass
index 99d9f144da..99d9f144da 100644
--- a/poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_modified_not_mentioned.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_modified_not_mentioned.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_presence.fail b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_presence.fail
index e14d644bb2..e14d644bb2 100644
--- a/poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_presence.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_presence.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_presence.pass b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_presence.pass
index b8da16dfe5..b8da16dfe5 100644
--- a/poky/meta/lib/patchtest/selftest/files/LicFilesChkSum.test_lic_files_chksum_presence.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_lic_files_chksum_presence.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/SrcUri.test_src_uri_left_files.fail b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_src_uri_left_files.fail
index 983b6e0c2b..983b6e0c2b 100644
--- a/poky/meta/lib/patchtest/selftest/files/SrcUri.test_src_uri_left_files.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_src_uri_left_files.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/SrcUri.test_src_uri_left_files.pass b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_src_uri_left_files.pass
index 1f1a77e581..1f1a77e581 100644
--- a/poky/meta/lib/patchtest/selftest/files/SrcUri.test_src_uri_left_files.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_src_uri_left_files.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/Summary.test_summary_presence.fail b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_summary_presence.fail
index 2d2b4e683d..2d2b4e683d 100644
--- a/poky/meta/lib/patchtest/selftest/files/Summary.test_summary_presence.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_summary_presence.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/Summary.test_summary_presence.pass b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_summary_presence.pass
index 55f0309b3f..55f0309b3f 100644
--- a/poky/meta/lib/patchtest/selftest/files/Summary.test_summary_presence.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestMetadata.test_summary_presence.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/CVE.test_cve_tag_format.fail b/poky/meta/lib/patchtest/selftest/files/TestPatch.test_cve_tag_format.fail
index c763a7506e..c763a7506e 100644
--- a/poky/meta/lib/patchtest/selftest/files/CVE.test_cve_tag_format.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestPatch.test_cve_tag_format.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_length.pass b/poky/meta/lib/patchtest/selftest/files/TestPatch.test_cve_tag_format.pass
index ef6017037c..ef6017037c 100644
--- a/poky/meta/lib/patchtest/selftest/files/Shortlog.test_shortlog_length.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestPatch.test_cve_tag_format.pass
diff --git a/poky/meta/lib/patchtest/selftest/files/PatchSignedOffBy.test_signed_off_by_presence.fail b/poky/meta/lib/patchtest/selftest/files/TestPatch.test_signed_off_by_presence.fail
index ce8bf7b7d1..ce8bf7b7d1 100644
--- a/poky/meta/lib/patchtest/selftest/files/PatchSignedOffBy.test_signed_off_by_presence.fail
+++ b/poky/meta/lib/patchtest/selftest/files/TestPatch.test_signed_off_by_presence.fail
diff --git a/poky/meta/lib/patchtest/selftest/files/SignedOffBy.test_signed_off_by_presence.pass b/poky/meta/lib/patchtest/selftest/files/TestPatch.test_signed_off_by_presence.pass
index ea34c76f0d..ea34c76f0d 100644
--- a/poky/meta/lib/patchtest/selftest/files/SignedOffBy.test_signed_off_by_presence.pass
+++ b/poky/meta/lib/patchtest/selftest/files/TestPatch.test_signed_off_by_presence.pass
diff --git a/poky/meta/lib/patchtest/selftest/selftest b/poky/meta/lib/patchtest/selftest/selftest
index d2b61e951a..6fad50ce61 100755
--- a/poky/meta/lib/patchtest/selftest/selftest
+++ b/poky/meta/lib/patchtest/selftest/selftest
@@ -4,7 +4,7 @@
#
# Copyright (C) 2016 Intel Corporation
#
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0-only
import os
import subprocess
@@ -18,14 +18,15 @@ parentdir = os.path.dirname(topdir)
# path to the repo root
repodir = os.path.dirname(os.path.dirname(parentdir))
-def print_results(passcount, skipcount, failcount, xpasscount, xfailcount, errorcount):
- total = passcount + skipcount + failcount + xpasscount + xfailcount + errorcount
+def print_results(passcount, failcount, skipcount, xpasscount, xfailcount, xskipcount, errorcount):
+ total = passcount + skipcount + failcount + xpasscount + xfailcount + xskipcount + errorcount
print("============================================================================")
print("Testsuite summary for %s" % os.path.basename(topdir))
print("============================================================================")
print("# TOTAL: %s" % str(total))
print("# XPASS: %s" % str(xpasscount))
print("# XFAIL: %s" % str(xfailcount))
+ print("# XSKIP: %s" % str(xskipcount))
print("# PASS: %s" % str(passcount))
print("# FAIL: %s" % str(failcount))
print("# SKIP: %s" % str(skipcount))
@@ -37,7 +38,7 @@ def test(root, patch):
res = True
patchpath = os.path.abspath(os.path.join(root, patch))
- cmd = 'patchtest %s %s/tests --patch %s' % (repodir, topdir, patchpath)
+ cmd = 'patchtest --repodir %s --testdir %s/tests --patch %s' % (repodir, topdir, patchpath)
results = subprocess.check_output(cmd, stderr=subprocess.STDOUT, universal_newlines=True, shell=True)
return results
@@ -48,6 +49,7 @@ if __name__ == '__main__':
skipcount = 0
xpasscount = 0
xfailcount = 0
+ xskipcount = 0
errorcount = 0
results = None
@@ -63,7 +65,7 @@ if __name__ == '__main__':
for resultline in results.splitlines():
if testid in resultline:
- result, _ = resultline.split(' ', 1)
+ result, _ = resultline.split(':', 1)
if expected_result.upper() == "FAIL" and result.upper() == "FAIL":
xfailcount = xfailcount + 1
@@ -71,6 +73,9 @@ if __name__ == '__main__':
elif expected_result.upper() == "PASS" and result.upper() == "PASS":
xpasscount = xpasscount + 1
print("XPASS: %s (file: %s)" % (testid.strip("."), os.path.basename(patch)))
+ elif expected_result.upper() == "SKIP" and result.upper() == "SKIP":
+ xskipcount = xskipcount + 1
+ print("XSKIP: %s (file: %s)" % (testid.strip("."), os.path.basename(patch)))
else:
print("%s: %s (%s)" % (result.upper(), testid.strip("."), os.path.basename(patch)))
if result.upper() == "PASS":
@@ -86,4 +91,4 @@ if __name__ == '__main__':
else:
print ("No test for=%s" % patch)
- print_results(passcount, skipcount, failcount, xpasscount, xfailcount, errorcount)
+ print_results(passcount, failcount, skipcount, xpasscount, xfailcount, xskipcount, errorcount)
diff --git a/poky/meta/lib/patchtest/tests/base.py b/poky/meta/lib/patchtest/tests/base.py
index 27db380353..aecbbc4aae 100644
--- a/poky/meta/lib/patchtest/tests/base.py
+++ b/poky/meta/lib/patchtest/tests/base.py
@@ -2,7 +2,7 @@
#
# Copyright (C) 2016 Intel Corporation
#
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0-only
import unittest
import logging
diff --git a/poky/meta/lib/patchtest/tests/pyparsing/common.py b/poky/meta/lib/patchtest/tests/pyparsing/common.py
index 9d37b0403d..cbce4c38bc 100644
--- a/poky/meta/lib/patchtest/tests/pyparsing/common.py
+++ b/poky/meta/lib/patchtest/tests/pyparsing/common.py
@@ -2,7 +2,7 @@
#
# Copyright (C) 2016 Intel Corporation
#
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0-only
import pyparsing
diff --git a/poky/meta/lib/patchtest/tests/pyparsing/parse_cve_tags.py b/poky/meta/lib/patchtest/tests/pyparsing/parse_cve_tags.py
index dd7131a650..f7fb82ec2b 100644
--- a/poky/meta/lib/patchtest/tests/pyparsing/parse_cve_tags.py
+++ b/poky/meta/lib/patchtest/tests/pyparsing/parse_cve_tags.py
@@ -2,7 +2,7 @@
#
# Copyright (C) 2016 Intel Corporation
#
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0-only
import pyparsing
diff --git a/poky/meta/lib/patchtest/tests/pyparsing/parse_shortlog.py b/poky/meta/lib/patchtest/tests/pyparsing/parse_shortlog.py
index 26e9612c4a..30d3ab35b3 100644
--- a/poky/meta/lib/patchtest/tests/pyparsing/parse_shortlog.py
+++ b/poky/meta/lib/patchtest/tests/pyparsing/parse_shortlog.py
@@ -2,7 +2,7 @@
#
# Copyright (C) 2016 Intel Corporation
#
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0-only
# NOTE:This is an oversimplified syntax of the mbox's summary
diff --git a/poky/meta/lib/patchtest/tests/pyparsing/parse_signed_off_by.py b/poky/meta/lib/patchtest/tests/pyparsing/parse_signed_off_by.py
index c8a4351551..692ebec3ff 100644
--- a/poky/meta/lib/patchtest/tests/pyparsing/parse_signed_off_by.py
+++ b/poky/meta/lib/patchtest/tests/pyparsing/parse_signed_off_by.py
@@ -2,7 +2,7 @@
#
# Copyright (C) 2016 Intel Corporation
#
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0-only
import pyparsing
diff --git a/poky/meta/lib/patchtest/tests/pyparsing/parse_upstream_status.py b/poky/meta/lib/patchtest/tests/pyparsing/parse_upstream_status.py
index d63567efbe..bc6c427c4c 100644
--- a/poky/meta/lib/patchtest/tests/pyparsing/parse_upstream_status.py
+++ b/poky/meta/lib/patchtest/tests/pyparsing/parse_upstream_status.py
@@ -2,7 +2,7 @@
#
# Copyright (C) 2016 Intel Corporation
#
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0-only
import common
diff --git a/poky/meta/lib/patchtest/tests/test_mbox.py b/poky/meta/lib/patchtest/tests/test_mbox.py
new file mode 100644
index 0000000000..0b623b7d17
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_mbox.py
@@ -0,0 +1,159 @@
+# Checks related to the patch's author
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+import base
+import collections
+import parse_shortlog
+import parse_signed_off_by
+import pyparsing
+import subprocess
+from data import PatchTestInput
+
+def headlog():
+ output = subprocess.check_output(
+ "cd %s; git log --pretty='%%h#%%aN#%%cD:#%%s' -1" % PatchTestInput.repodir,
+ universal_newlines=True,
+ shell=True
+ )
+ return output.split('#')
+
+class TestMbox(base.Base):
+
+ auh_email = 'auh@auh.yoctoproject.org'
+
+ invalids = [pyparsing.Regex("^Upgrade Helper.+"),
+ pyparsing.Regex(auh_email),
+ pyparsing.Regex("uh@not\.set"),
+ pyparsing.Regex("\S+@example\.com")]
+
+ rexp_detect = pyparsing.Regex('\[\s?YOCTO.*\]')
+ rexp_validation = pyparsing.Regex('\[(\s?YOCTO\s?#\s?(\d+)\s?,?)+\]')
+ revert_shortlog_regex = pyparsing.Regex('Revert\s+".*"')
+ signoff_prog = parse_signed_off_by.signed_off_by
+ revert_shortlog_regex = pyparsing.Regex('Revert\s+".*"')
+ maxlength = 90
+
+ # base paths of main yocto project sub-projects
+ paths = {
+ 'oe-core': ['meta-selftest', 'meta-skeleton', 'meta', 'scripts'],
+ 'bitbake': ['bitbake'],
+ 'documentation': ['documentation'],
+ 'poky': ['meta-poky','meta-yocto-bsp'],
+ 'oe': ['meta-gpe', 'meta-gnome', 'meta-efl', 'meta-networking', 'meta-multimedia','meta-initramfs', 'meta-ruby', 'contrib', 'meta-xfce', 'meta-filesystems', 'meta-perl', 'meta-webserver', 'meta-systemd', 'meta-oe', 'meta-python']
+ }
+
+ # scripts folder is a mix of oe-core and poky, most is oe-core code except:
+ poky_scripts = ['scripts/yocto-bsp', 'scripts/yocto-kernel', 'scripts/yocto-layer', 'scripts/lib/bsp']
+
+ Project = collections.namedtuple('Project', ['name', 'listemail', 'gitrepo', 'paths'])
+
+ bitbake = Project(name='Bitbake', listemail='bitbake-devel@lists.openembedded.org', gitrepo='http://git.openembedded.org/bitbake/', paths=paths['bitbake'])
+ doc = Project(name='Documentantion', listemail='yocto@yoctoproject.org', gitrepo='http://git.yoctoproject.org/cgit/cgit.cgi/yocto-docs/', paths=paths['documentation'])
+ poky = Project(name='Poky', listemail='poky@yoctoproject.org', gitrepo='http://git.yoctoproject.org/cgit/cgit.cgi/poky/', paths=paths['poky'])
+ oe = Project(name='oe', listemail='openembedded-devel@lists.openembedded.org', gitrepo='http://git.openembedded.org/meta-openembedded/', paths=paths['oe'])
+
+
+ def test_signed_off_by_presence(self):
+ for commit in TestMbox.commits:
+ # skip those patches that revert older commits, these do not required the tag presence
+ if self.revert_shortlog_regex.search_string(commit.shortlog):
+ continue
+ if not self.signoff_prog.search_string(commit.payload):
+ self.fail('Mbox is missing Signed-off-by. Add it manually or with "git commit --amend -s"',
+ commit=commit)
+
+ def test_shortlog_format(self):
+ for commit in TestMbox.commits:
+ shortlog = commit.shortlog
+ if not shortlog.strip():
+ self.skip('Empty shortlog, no reason to execute shortlog format test')
+ else:
+ # no reason to re-check on revert shortlogs
+ if shortlog.startswith('Revert "'):
+ continue
+ try:
+ parse_shortlog.shortlog.parseString(shortlog)
+ except pyparsing.ParseException as pe:
+ self.fail('Commit shortlog (first line of commit message) should follow the format "<target>: <summary>"',
+ commit=commit)
+
+ def test_shortlog_length(self):
+ for commit in TestMbox.commits:
+ # no reason to re-check on revert shortlogs
+ shortlog = commit.shortlog
+ if shortlog.startswith('Revert "'):
+ continue
+ l = len(shortlog)
+ if l > self.maxlength:
+ self.fail('Edit shortlog so that it is %d characters or less (currently %d characters)' % (self.maxlength, l),
+ commit=commit)
+
+ def test_series_merge_on_head(self):
+ self.skip("Merge test is disabled for now")
+ if PatchTestInput.repo.branch != "master":
+ self.skip("Skipping merge test since patch is not intended for master branch. Target detected is %s" % PatchTestInput.repo.branch)
+ if not PatchTestInput.repo.ismerged:
+ commithash, author, date, shortlog = headlog()
+ self.fail('Series does not apply on top of target branch %s' % PatchTestInput.repo.branch,
+ data=[('Targeted branch', '%s (currently at %s)' % (PatchTestInput.repo.branch, commithash))])
+
+ def test_target_mailing_list(self):
+ """In case of merge failure, check for other targeted projects"""
+ if PatchTestInput.repo.ismerged:
+ self.skip('Series merged, no reason to check other mailing lists')
+
+ # a meta project may be indicted in the message subject, if this is the case, just fail
+ # TODO: there may be other project with no-meta prefix, we also need to detect these
+ project_regex = pyparsing.Regex("\[(?P<project>meta-.+)\]")
+ for commit in TestMbox.commits:
+ match = project_regex.search_string(commit.subject)
+ if match:
+ self.fail('Series sent to the wrong mailing list or some patches from the series correspond to different mailing lists',
+ commit=commit)
+
+ for patch in self.patchset:
+ folders = patch.path.split('/')
+ base_path = folders[0]
+ for project in [self.bitbake, self.doc, self.oe, self.poky]:
+ if base_path in project.paths:
+ self.fail('Series sent to the wrong mailing list or some patches from the series correspond to different mailing lists',
+ data=[('Suggested ML', '%s [%s]' % (project.listemail, project.gitrepo)),
+ ('Patch\'s path:', patch.path)])
+
+ # check for poky's scripts code
+ if base_path.startswith('scripts'):
+ for poky_file in self.poky_scripts:
+ if patch.path.startswith(poky_file):
+ self.fail('Series sent to the wrong mailing list or some patches from the series correspond to different mailing lists',
+ data=[('Suggested ML', '%s [%s]' % (self.poky.listemail, self.poky.gitrepo)),('Patch\'s path:', patch.path)])
+
+ def test_mbox_format(self):
+ if self.unidiff_parse_error:
+ self.fail('Series has malformed diff lines. Create the series again using git-format-patch and ensure it applies using git am',
+ data=[('Diff line',self.unidiff_parse_error)])
+
+ def test_commit_message_presence(self):
+ for commit in TestMbox.commits:
+ if not commit.commit_message.strip():
+ self.fail('Please include a commit message on your patch explaining the change', commit=commit)
+
+ def test_bugzilla_entry_format(self):
+ for commit in TestMbox.commits:
+ if not self.rexp_detect.search_string(commit.commit_message):
+ self.skip("No bug ID found")
+ elif not self.rexp_validation.search_string(commit.commit_message):
+ self.fail('Bugzilla issue ID is not correctly formatted - specify it with format: "[YOCTO #<bugzilla ID>]"', commit=commit)
+
+ def test_author_valid(self):
+ for commit in self.commits:
+ for invalid in self.invalids:
+ if invalid.search_string(commit.author):
+ self.fail('Invalid author %s. Resend the series with a valid patch author' % commit.author, commit=commit)
+
+ def test_non_auh_upgrade(self):
+ for commit in self.commits:
+ if self.auh_email in commit.payload:
+ self.fail('Invalid author %s. Resend the series with a valid patch author' % self.auh_email, commit=commit)
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_author.py b/poky/meta/lib/patchtest/tests/test_mbox_author.py
deleted file mode 100644
index 6c79f164d4..0000000000
--- a/poky/meta/lib/patchtest/tests/test_mbox_author.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Checks related to the patch's author
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import base
-import re
-
-class Author(base.Base):
-
- auh_email = '<auh@auh.yoctoproject.org>'
-
- invalids = [re.compile("^Upgrade Helper.+"),
- re.compile(re.escape(auh_email)),
- re.compile("uh@not\.set"),
- re.compile("\S+@example\.com")]
-
-
- def test_author_valid(self):
- for commit in self.commits:
- for invalid in self.invalids:
- if invalid.search(commit.author):
- self.fail('Invalid author %s' % commit.author, 'Resend the series with a valid patch\'s author', commit)
-
- def test_non_auh_upgrade(self):
- for commit in self.commits:
- if self.auh_email in commit.payload:
- self.fail('Invalid author %s in commit message' % self.auh_email, 'Resend the series with a valid patch\'s author', commit)
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_bugzilla.py b/poky/meta/lib/patchtest/tests/test_mbox_bugzilla.py
deleted file mode 100644
index e8de48bb8d..0000000000
--- a/poky/meta/lib/patchtest/tests/test_mbox_bugzilla.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Checks related to the patch's bugzilla tag
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import re
-import base
-
-class Bugzilla(base.Base):
- rexp_detect = re.compile("\[\s?YOCTO.*\]", re.IGNORECASE)
- rexp_validation = re.compile("\[(\s?YOCTO\s?#\s?(\d+)\s?,?)+\]", re.IGNORECASE)
-
- def test_bugzilla_entry_format(self):
- for commit in Bugzilla.commits:
- for line in commit.commit_message.splitlines():
- if self.rexp_detect.match(line):
- if not self.rexp_validation.match(line):
- self.fail('Yocto Project bugzilla tag is not correctly formatted',
- 'Specify bugzilla ID in commit description with format: "[YOCTO #<bugzilla ID>]"',
- commit)
-
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_cve.py b/poky/meta/lib/patchtest/tests/test_mbox_cve.py
deleted file mode 100644
index f99194c094..0000000000
--- a/poky/meta/lib/patchtest/tests/test_mbox_cve.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# Checks related to the patch's CVE lines
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2 as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# SPDX-License-Identifier: GPL-2.0-or-later
-
-import base
-import os
-import parse_cve_tags
-import re
-
-class CVE(base.Base):
-
- revert_shortlog_regex = re.compile('Revert\s+".*"')
- prog = parse_cve_tags.cve_tag
-
- def setUp(self):
- if self.unidiff_parse_error:
- self.skip('Parse error %s' % self.unidiff_parse_error)
-
- # we are just interested in series that introduce CVE patches, thus discard other
- # possibilities: modification to current CVEs, patch directly introduced into the
- # recipe, upgrades already including the CVE, etc.
- new_cves = [p for p in self.patchset if p.path.endswith('.patch') and p.is_added_file]
- if not new_cves:
- self.skip('No new CVE patches introduced')
-
- def test_cve_presence_in_commit_message(self):
- for commit in CVE.commits:
- # skip those patches that revert older commits, these do not required the tag presence
- if self.revert_shortlog_regex.match(commit.shortlog):
- continue
- if not self.prog.search_string(commit.payload):
- self.fail('Missing or incorrectly formatted CVE tag in mbox',
- 'Correct or include the CVE tag in the mbox with format: "CVE: CVE-YYYY-XXXX"',
- commit)
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_description.py b/poky/meta/lib/patchtest/tests/test_mbox_description.py
deleted file mode 100644
index 7addc6b5f7..0000000000
--- a/poky/meta/lib/patchtest/tests/test_mbox_description.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# Checks related to the patch's commit_message
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import base
-
-class CommitMessage(base.Base):
-
- def test_commit_message_presence(self):
- for commit in CommitMessage.commits:
- if not commit.commit_message.strip():
- self.fail('Patch is missing a descriptive commit message',
- 'Please include a commit message on your patch explaining the change (most importantly why the change is being made)',
- commit)
-
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_format.py b/poky/meta/lib/patchtest/tests/test_mbox_format.py
deleted file mode 100644
index 85c452ca0d..0000000000
--- a/poky/meta/lib/patchtest/tests/test_mbox_format.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Checks correct parsing of mboxes
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import base
-import re
-
-class MboxFormat(base.Base):
-
- def test_mbox_format(self):
- if self.unidiff_parse_error:
- self.fail('Series cannot be parsed correctly due to malformed diff lines',
- 'Create the series again using git-format-patch and ensure it can be applied using git am',
- data=[('Diff line', re.sub('^.+:\s(?<!$)','',self.unidiff_parse_error))])
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_mailinglist.py b/poky/meta/lib/patchtest/tests/test_mbox_mailinglist.py
deleted file mode 100644
index de38e205b1..0000000000
--- a/poky/meta/lib/patchtest/tests/test_mbox_mailinglist.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# Check if the series was intended for other project (not OE-Core)
-#
-# Copyright (C) 2017 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import subprocess
-import collections
-import base
-import re
-from data import PatchTestInput
-
-class MailingList(base.Base):
-
- # base paths of main yocto project sub-projects
- paths = {
- 'oe-core': ['meta-selftest', 'meta-skeleton', 'meta', 'scripts'],
- 'bitbake': ['bitbake'],
- 'documentation': ['documentation'],
- 'poky': ['meta-poky','meta-yocto-bsp'],
- 'oe': ['meta-gpe', 'meta-gnome', 'meta-efl', 'meta-networking', 'meta-multimedia','meta-initramfs', 'meta-ruby', 'contrib', 'meta-xfce', 'meta-filesystems', 'meta-perl', 'meta-webserver', 'meta-systemd', 'meta-oe', 'meta-python']
- }
-
- # scripts folder is a mix of oe-core and poky, most is oe-core code except:
- poky_scripts = ['scripts/yocto-bsp', 'scripts/yocto-kernel', 'scripts/yocto-layer', 'scripts/lib/bsp']
-
- Project = collections.namedtuple('Project', ['name', 'listemail', 'gitrepo', 'paths'])
-
- bitbake = Project(name='Bitbake', listemail='bitbake-devel@lists.openembedded.org', gitrepo='http://git.openembedded.org/bitbake/', paths=paths['bitbake'])
- doc = Project(name='Documentantion', listemail='yocto@yoctoproject.org', gitrepo='http://git.yoctoproject.org/cgit/cgit.cgi/yocto-docs/', paths=paths['documentation'])
- poky = Project(name='Poky', listemail='poky@yoctoproject.org', gitrepo='http://git.yoctoproject.org/cgit/cgit.cgi/poky/', paths=paths['poky'])
- oe = Project(name='oe', listemail='openembedded-devel@lists.openembedded.org', gitrepo='http://git.openembedded.org/meta-openembedded/', paths=paths['oe'])
-
-
- def test_target_mailing_list(self):
- """In case of merge failure, check for other targeted projects"""
- if PatchTestInput.repo.ismerged:
- self.skip('Series merged, no reason to check other mailing lists')
-
- # a meta project may be indicted in the message subject, if this is the case, just fail
- # TODO: there may be other project with no-meta prefix, we also need to detect these
- project_regex = re.compile("\[(?P<project>meta-.+)\]")
- for commit in MailingList.commits:
- match = project_regex.match(commit.subject)
- if match:
- self.fail('Series sent to the wrong mailing list',
- 'Check the project\'s README (%s) and send the patch to the indicated list' % match.group('project'),
- commit)
-
- for patch in self.patchset:
- folders = patch.path.split('/')
- base_path = folders[0]
- for project in [self.bitbake, self.doc, self.oe, self.poky]:
- if base_path in project.paths:
- self.fail('Series sent to the wrong mailing list or some patches from the series correspond to different mailing lists', 'Send the series again to the correct mailing list (ML)',
- data=[('Suggested ML', '%s [%s]' % (project.listemail, project.gitrepo)),
- ('Patch\'s path:', patch.path)])
-
- # check for poky's scripts code
- if base_path.startswith('scripts'):
- for poky_file in self.poky_scripts:
- if patch.path.startswith(poky_file):
- self.fail('Series sent to the wrong mailing list or some patches from the series correspond to different mailing lists', 'Send the series again to the correct mailing list (ML)',
- data=[('Suggested ML', '%s [%s]' % (self.poky.listemail, self.poky.gitrepo)),('Patch\'s path:', patch.path)])
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_merge.py b/poky/meta/lib/patchtest/tests/test_mbox_merge.py
deleted file mode 100644
index c8b6718d15..0000000000
--- a/poky/meta/lib/patchtest/tests/test_mbox_merge.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Check if mbox was merged by patchtest
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import subprocess
-import base
-from data import PatchTestInput
-
-def headlog():
- output = subprocess.check_output(
- "cd %s; git log --pretty='%%h#%%aN#%%cD:#%%s' -1" % PatchTestInput.repodir,
- universal_newlines=True,
- shell=True
- )
- return output.split('#')
-
-class Merge(base.Base):
- def test_series_merge_on_head(self):
- if not PatchTestInput.repo.ismerged:
- commithash, author, date, shortlog = headlog()
- self.fail('Series does not apply on top of target branch',
- 'Rebase your series on top of targeted branch',
- data=[('Targeted branch', '%s (currently at %s)' % (PatchTestInput.repo.branch, commithash))])
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_shortlog.py b/poky/meta/lib/patchtest/tests/test_mbox_shortlog.py
deleted file mode 100644
index b6c2a209ff..0000000000
--- a/poky/meta/lib/patchtest/tests/test_mbox_shortlog.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Checks related to the patch's summary
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import base
-import parse_shortlog
-import pyparsing
-
-maxlength = 90
-
-class Shortlog(base.Base):
-
- def test_shortlog_format(self):
- for commit in Shortlog.commits:
- shortlog = commit.shortlog
- if not shortlog.strip():
- self.skip('Empty shortlog, no reason to execute shortlog format test')
- else:
- # no reason to re-check on revert shortlogs
- if shortlog.startswith('Revert "'):
- continue
- try:
- parse_shortlog.shortlog.parseString(shortlog)
- except pyparsing.ParseException as pe:
- self.fail('Shortlog does not follow expected format',
- 'Commit shortlog (first line of commit message) should follow the format "<target>: <summary>"',
- commit)
-
- def test_shortlog_length(self):
- for commit in Shortlog.commits:
- # no reason to re-check on revert shortlogs
- shortlog = commit.shortlog
- if shortlog.startswith('Revert "'):
- continue
- l = len(shortlog)
- if l > maxlength:
- self.fail('Commit shortlog is too long',
- 'Edit shortlog so that it is %d characters or less (currently %d characters)' % (maxlength, l),
- commit)
diff --git a/poky/meta/lib/patchtest/tests/test_mbox_signed_off_by.py b/poky/meta/lib/patchtest/tests/test_mbox_signed_off_by.py
deleted file mode 100644
index 6458951f1c..0000000000
--- a/poky/meta/lib/patchtest/tests/test_mbox_signed_off_by.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Checks related to the patch's signed-off-by lines
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import base
-import parse_signed_off_by
-import re
-
-class SignedOffBy(base.Base):
-
- revert_shortlog_regex = re.compile('Revert\s+".*"')
-
- @classmethod
- def setUpClassLocal(cls):
- # match self.mark with no '+' preceding it
- cls.prog = parse_signed_off_by.signed_off_by
-
- def test_signed_off_by_presence(self):
- for commit in SignedOffBy.commits:
- # skip those patches that revert older commits, these do not required the tag presence
- if self.revert_shortlog_regex.match(commit.shortlog):
- continue
- if not SignedOffBy.prog.search_string(commit.payload):
- self.fail('Patch is missing Signed-off-by',
- 'Sign off the patch (either manually or with "git commit --amend -s")',
- commit)
diff --git a/poky/meta/lib/patchtest/tests/test_metadata.py b/poky/meta/lib/patchtest/tests/test_metadata.py
new file mode 100644
index 0000000000..b6f4456ad2
--- /dev/null
+++ b/poky/meta/lib/patchtest/tests/test_metadata.py
@@ -0,0 +1,180 @@
+# Checks related to the patch's LIC_FILES_CHKSUM metadata variable
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+import base
+import os
+import pyparsing
+from data import PatchTestInput, PatchTestDataStore
+
+class TestMetadata(base.Metadata):
+ metadata_lic = 'LICENSE'
+ invalid_license = 'PATCHTESTINVALID'
+ metadata_chksum = 'LIC_FILES_CHKSUM'
+ license_var = 'LICENSE'
+ closed = 'CLOSED'
+ lictag_re = pyparsing.AtLineStart("License-Update:")
+ lic_chksum_added = pyparsing.AtLineStart("+" + metadata_chksum)
+ lic_chksum_removed = pyparsing.AtLineStart("-" + metadata_chksum)
+ add_mark = pyparsing.Regex('\+ ')
+ max_length = 200
+ metadata_src_uri = 'SRC_URI'
+ md5sum = 'md5sum'
+ sha256sum = 'sha256sum'
+ git_regex = pyparsing.Regex('^git\:\/\/.*')
+ metadata_summary = 'SUMMARY'
+
+ def test_license_presence(self):
+ if not self.added:
+ self.skip('No added recipes, skipping test')
+
+ # TODO: this is a workaround so we can parse the recipe not
+ # containing the LICENSE var: add some default license instead
+ # of INVALID into auto.conf, then remove this line at the end
+ auto_conf = os.path.join(os.environ.get('BUILDDIR'), 'conf', 'auto.conf')
+ open_flag = 'w'
+ if os.path.exists(auto_conf):
+ open_flag = 'a'
+ with open(auto_conf, open_flag) as fd:
+ for pn in self.added:
+ fd.write('LICENSE ??= "%s"\n' % self.invalid_license)
+
+ no_license = False
+ for pn in self.added:
+ rd = self.tinfoil.parse_recipe(pn)
+ license = rd.getVar(self.metadata_lic)
+ if license == self.invalid_license:
+ no_license = True
+ break
+
+ # remove auto.conf line or the file itself
+ if open_flag == 'w':
+ os.remove(auto_conf)
+ else:
+ fd = open(auto_conf, 'r')
+ lines = fd.readlines()
+ fd.close()
+ with open(auto_conf, 'w') as fd:
+ fd.write(''.join(lines[:-1]))
+
+ if no_license:
+ self.fail('Recipe does not have the LICENSE field set.')
+
+ def test_lic_files_chksum_presence(self):
+ if not self.added:
+ self.skip('No added recipes, skipping test')
+
+ for pn in self.added:
+ rd = self.tinfoil.parse_recipe(pn)
+ pathname = rd.getVar('FILE')
+ # we are not interested in images
+ if '/images/' in pathname:
+ continue
+ lic_files_chksum = rd.getVar(self.metadata_chksum)
+ if rd.getVar(self.license_var) == self.closed:
+ continue
+ if not lic_files_chksum:
+ self.fail('%s is missing in newly added recipe' % self.metadata_chksum)
+
+ def test_lic_files_chksum_modified_not_mentioned(self):
+ if not self.modified:
+ self.skip('No modified recipes, skipping test')
+
+ for patch in self.patchset:
+ # for the moment, we are just interested in metadata
+ if patch.path.endswith('.patch'):
+ continue
+ payload = str(patch)
+ if (self.lic_chksum_added.search_string(payload) or self.lic_chksum_removed.search_string(payload)):
+ # if any patch on the series contain reference on the metadata, fail
+ for commit in self.commits:
+ if self.lictag_re.search_string(commit.commit_message):
+ break
+ else:
+ self.fail('LIC_FILES_CHKSUM changed without "License-Update:" tag and description in commit message')
+
+ def test_max_line_length(self):
+ for patch in self.patchset:
+ # for the moment, we are just interested in metadata
+ if patch.path.endswith('.patch'):
+ continue
+ payload = str(patch)
+ for line in payload.splitlines():
+ if self.add_mark.search_string(line):
+ current_line_length = len(line[1:])
+ if current_line_length > self.max_length:
+ self.fail('Patch line too long (current length %s, maximum is %s)' % (current_line_length, self.max_length),
+ data=[('Patch', patch.path), ('Line', '%s ...' % line[0:80])])
+
+ def pretest_src_uri_left_files(self):
+ # these tests just make sense on patches that can be merged
+ if not PatchTestInput.repo.canbemerged:
+ self.skip('Patch cannot be merged')
+ if not self.modified:
+ self.skip('No modified recipes, skipping pretest')
+
+ # get the proper metadata values
+ for pn in self.modified:
+ # we are not interested in images
+ if 'core-image' in pn:
+ continue
+ rd = self.tinfoil.parse_recipe(pn)
+ PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata_src_uri, pn)] = rd.getVar(self.metadata_src_uri)
+
+ def test_src_uri_left_files(self):
+ # these tests just make sense on patches that can be merged
+ if not PatchTestInput.repo.canbemerged:
+ self.skip('Patch cannot be merged')
+ if not self.modified:
+ self.skip('No modified recipes, skipping pretest')
+
+ # get the proper metadata values
+ for pn in self.modified:
+ # we are not interested in images
+ if 'core-image' in pn:
+ continue
+ rd = self.tinfoil.parse_recipe(pn)
+ PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata_src_uri, pn)] = rd.getVar(self.metadata_src_uri)
+
+ for pn in self.modified:
+ pretest_src_uri = PatchTestDataStore['pre%s-%s-%s' % (self.shortid(), self.metadata_src_uri, pn)].split()
+ test_src_uri = PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata_src_uri, pn)].split()
+
+ pretest_files = set([os.path.basename(patch) for patch in pretest_src_uri if patch.startswith('file://')])
+ test_files = set([os.path.basename(patch) for patch in test_src_uri if patch.startswith('file://')])
+
+ # check if files were removed
+ if len(test_files) < len(pretest_files):
+
+ # get removals from patchset
+ filesremoved_from_patchset = set()
+ for patch in self.patchset:
+ if patch.is_removed_file:
+ filesremoved_from_patchset.add(os.path.basename(patch.path))
+
+ # get the deleted files from the SRC_URI
+ filesremoved_from_usr_uri = pretest_files - test_files
+
+ # finally, get those patches removed at SRC_URI and not removed from the patchset
+ # TODO: we are not taking into account renames, so test may raise false positives
+ not_removed = filesremoved_from_usr_uri - filesremoved_from_patchset
+ if not_removed:
+ self.fail('Patches not removed from tree. Remove them and amend the submitted mbox',
+ data=[('Patch', f) for f in not_removed])
+
+ def test_summary_presence(self):
+ if not self.added:
+ self.skip('No added recipes, skipping test')
+
+ for pn in self.added:
+ # we are not interested in images
+ if 'core-image' in pn:
+ continue
+ rd = self.tinfoil.parse_recipe(pn)
+ summary = rd.getVar(self.metadata_summary)
+
+ # "${PN} version ${PN}-${PR}" is the default, so fail if default
+ if summary.startswith('%s version' % pn):
+ self.fail('%s is missing in newly added recipe' % self.metadata_summary)
diff --git a/poky/meta/lib/patchtest/tests/test_metadata_lic_files_chksum.py b/poky/meta/lib/patchtest/tests/test_metadata_lic_files_chksum.py
deleted file mode 100644
index e9a5b6bb4e..0000000000
--- a/poky/meta/lib/patchtest/tests/test_metadata_lic_files_chksum.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# Checks related to the patch's LIC_FILES_CHKSUM metadata variable
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import base
-import re
-from data import PatchTestInput, PatchTestDataStore
-
-class LicFilesChkSum(base.Metadata):
- metadata = 'LIC_FILES_CHKSUM'
- license = 'LICENSE'
- closed = 'CLOSED'
- lictag = 'License-Update'
- lictag_re = re.compile("^%s:" % lictag, re.MULTILINE)
-
- def setUp(self):
- # these tests just make sense on patches that can be merged
- if not PatchTestInput.repo.canbemerged:
- self.skip('Patch cannot be merged')
-
- def test_lic_files_chksum_presence(self):
- if not self.added:
- self.skip('No added recipes, skipping test')
-
- for pn in self.added:
- rd = self.tinfoil.parse_recipe(pn)
- pathname = rd.getVar('FILE')
- # we are not interested in images
- if '/images/' in pathname:
- continue
- lic_files_chksum = rd.getVar(self.metadata)
- if rd.getVar(self.license) == self.closed:
- continue
- if not lic_files_chksum:
- self.fail('%s is missing in newly added recipe' % self.metadata,
- 'Specify the variable %s in %s' % (self.metadata, pn))
-
- def pretest_lic_files_chksum_modified_not_mentioned(self):
- if not self.modified:
- self.skip('No modified recipes, skipping pretest')
- # get the proper metadata values
- for pn in self.modified:
- rd = self.tinfoil.parse_recipe(pn)
- pathname = rd.getVar('FILE')
- # we are not interested in images
- if '/images/' in pathname:
- continue
- PatchTestDataStore['%s-%s-%s' % (self.shortid(),self.metadata,pn)] = rd.getVar(self.metadata)
-
- def test_lic_files_chksum_modified_not_mentioned(self):
- if not self.modified:
- self.skip('No modified recipes, skipping test')
-
- # get the proper metadata values
- for pn in self.modified:
- rd = self.tinfoil.parse_recipe(pn)
- pathname = rd.getVar('FILE')
- # we are not interested in images
- if '/images/' in pathname:
- continue
- PatchTestDataStore['%s-%s-%s' % (self.shortid(),self.metadata,pn)] = rd.getVar(self.metadata)
- # compare if there were changes between pre-merge and merge
- for pn in self.modified:
- pretest = PatchTestDataStore['pre%s-%s-%s' % (self.shortid(),self.metadata, pn)]
- test = PatchTestDataStore['%s-%s-%s' % (self.shortid(),self.metadata, pn)]
-
- # TODO: this is workaround to avoid false-positives when pretest metadata is empty (not reason found yet)
- # For more info, check bug 12284
- if not pretest:
- return
-
- if pretest != test:
- # if any patch on the series contain reference on the metadata, fail
- for commit in self.commits:
- if self.lictag_re.search(commit.commit_message):
- break
- else:
- self.fail('LIC_FILES_CHKSUM changed on target %s but there is no "%s" tag in commit message' % (pn, self.lictag),
- 'Include "%s: <description>" into the commit message with a brief description' % self.lictag,
- data=[('Current checksum', pretest), ('New checksum', test)])
diff --git a/poky/meta/lib/patchtest/tests/test_metadata_license.py b/poky/meta/lib/patchtest/tests/test_metadata_license.py
deleted file mode 100644
index 16604dbfb1..0000000000
--- a/poky/meta/lib/patchtest/tests/test_metadata_license.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# Checks related to the patch's LIC_FILES_CHKSUM metadata variable
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import base
-import os
-from data import PatchTestInput
-
-class License(base.Metadata):
- metadata = 'LICENSE'
- invalid_license = 'PATCHTESTINVALID'
-
- def setUp(self):
- # these tests just make sense on patches that can be merged
- if not PatchTestInput.repo.canbemerged:
- self.skip('Patch cannot be merged')
-
- def test_license_presence(self):
- if not self.added:
- self.skip('No added recipes, skipping test')
-
- # TODO: this is a workaround so we can parse the recipe not
- # containing the LICENSE var: add some default license instead
- # of INVALID into auto.conf, then remove this line at the end
- auto_conf = os.path.join(os.environ.get('BUILDDIR'), 'conf', 'auto.conf')
- open_flag = 'w'
- if os.path.exists(auto_conf):
- open_flag = 'a'
- with open(auto_conf, open_flag) as fd:
- for pn in self.added:
- fd.write('LICENSE ??= "%s"\n' % self.invalid_license)
-
- no_license = False
- for pn in self.added:
- rd = self.tinfoil.parse_recipe(pn)
- license = rd.getVar(self.metadata)
- if license == self.invalid_license:
- no_license = True
- break
-
- # remove auto.conf line or the file itself
- if open_flag == 'w':
- os.remove(auto_conf)
- else:
- fd = open(auto_conf, 'r')
- lines = fd.readlines()
- fd.close()
- with open(auto_conf, 'w') as fd:
- fd.write(''.join(lines[:-1]))
-
- if no_license:
- self.fail('Recipe does not have the LICENSE field set', 'Include a LICENSE into the new recipe')
-
diff --git a/poky/meta/lib/patchtest/tests/test_metadata_max_length.py b/poky/meta/lib/patchtest/tests/test_metadata_max_length.py
deleted file mode 100644
index 04a5e23469..0000000000
--- a/poky/meta/lib/patchtest/tests/test_metadata_max_length.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Checks related to patch line lengths
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import base
-import re
-
-class MaxLength(base.Base):
- add_mark = re.compile('\+ ')
- max_length = 200
-
- def test_max_line_length(self):
- for patch in self.patchset:
- # for the moment, we are just interested in metadata
- if patch.path.endswith('.patch'):
- continue
- payload = str(patch)
- for line in payload.splitlines():
- if self.add_mark.match(line):
- current_line_length = len(line[1:])
- if current_line_length > self.max_length:
- self.fail('Patch line too long (current length %s)' % current_line_length,
- 'Shorten the corresponding patch line (max length supported %s)' % self.max_length,
- data=[('Patch', patch.path), ('Line', '%s ...' % line[0:80])])
diff --git a/poky/meta/lib/patchtest/tests/test_metadata_src_uri.py b/poky/meta/lib/patchtest/tests/test_metadata_src_uri.py
deleted file mode 100644
index 718229d7ad..0000000000
--- a/poky/meta/lib/patchtest/tests/test_metadata_src_uri.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# Checks related to the patch's SRC_URI metadata variable
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import subprocess
-import base
-import re
-import os
-from data import PatchTestInput, PatchTestDataStore
-
-class SrcUri(base.Metadata):
-
- metadata = 'SRC_URI'
- md5sum = 'md5sum'
- sha256sum = 'sha256sum'
- git_regex = re.compile('^git\:\/\/.*')
-
- def setUp(self):
- # these tests just make sense on patches that can be merged
- if not PatchTestInput.repo.canbemerged:
- self.skip('Patch cannot be merged')
-
- def pretest_src_uri_left_files(self):
- if not self.modified:
- self.skip('No modified recipes, skipping pretest')
-
- # get the proper metadata values
- for pn in self.modified:
- # we are not interested in images
- if 'core-image' in pn:
- continue
- rd = self.tinfoil.parse_recipe(pn)
- PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata, pn)] = rd.getVar(self.metadata)
-
- def test_src_uri_left_files(self):
- if not self.modified:
- self.skip('No modified recipes, skipping pretest')
-
- # get the proper metadata values
- for pn in self.modified:
- # we are not interested in images
- if 'core-image' in pn:
- continue
- rd = self.tinfoil.parse_recipe(pn)
- PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata, pn)] = rd.getVar(self.metadata)
-
- for pn in self.modified:
- pretest_src_uri = PatchTestDataStore['pre%s-%s-%s' % (self.shortid(), self.metadata, pn)].split()
- test_src_uri = PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata, pn)].split()
-
- pretest_files = set([os.path.basename(patch) for patch in pretest_src_uri if patch.startswith('file://')])
- test_files = set([os.path.basename(patch) for patch in test_src_uri if patch.startswith('file://')])
-
- # check if files were removed
- if len(test_files) < len(pretest_files):
-
- # get removals from patchset
- filesremoved_from_patchset = set()
- for patch in self.patchset:
- if patch.is_removed_file:
- filesremoved_from_patchset.add(os.path.basename(patch.path))
-
- # get the deleted files from the SRC_URI
- filesremoved_from_usr_uri = pretest_files - test_files
-
- # finally, get those patches removed at SRC_URI and not removed from the patchset
- # TODO: we are not taking into account renames, so test may raise false positives
- not_removed = filesremoved_from_usr_uri - filesremoved_from_patchset
- if not_removed:
- self.fail('Patches not removed from tree',
- 'Amend the patch containing the software patch file removal',
- data=[('Patch', f) for f in not_removed])
-
diff --git a/poky/meta/lib/patchtest/tests/test_metadata_summary.py b/poky/meta/lib/patchtest/tests/test_metadata_summary.py
deleted file mode 100644
index 931b26768e..0000000000
--- a/poky/meta/lib/patchtest/tests/test_metadata_summary.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Checks related to the patch's summary metadata variable
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import base
-from data import PatchTestInput
-
-class Summary(base.Metadata):
- metadata = 'SUMMARY'
-
- def setUp(self):
- # these tests just make sense on patches that can be merged
- if not PatchTestInput.repo.canbemerged:
- self.skip('Patch cannot be merged')
-
- def test_summary_presence(self):
- if not self.added:
- self.skip('No added recipes, skipping test')
-
- for pn in self.added:
- # we are not interested in images
- if 'core-image' in pn:
- continue
- rd = self.tinfoil.parse_recipe(pn)
- summary = rd.getVar(self.metadata)
-
- # "${PN} version ${PN}-${PR}" is the default, so fail if default
- if summary.startswith('%s version' % pn):
- self.fail('%s is missing in newly added recipe' % self.metadata,
- 'Specify the variable %s in %s' % (self.metadata, pn))
diff --git a/poky/meta/lib/patchtest/tests/test_patch_upstream_status.py b/poky/meta/lib/patchtest/tests/test_patch.py
index eda5353c66..65d0f930b0 100644
--- a/poky/meta/lib/patchtest/tests/test_patch_upstream_status.py
+++ b/poky/meta/lib/patchtest/tests/test_patch.py
@@ -1,16 +1,19 @@
-# Checks related to the patch's upstream-status lines
+# Checks related to the patch's CVE lines
#
# Copyright (C) 2016 Intel Corporation
#
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0-only
+#
import base
+import parse_signed_off_by
import parse_upstream_status
import pyparsing
-import os
-class PatchUpstreamStatus(base.Base):
+class TestPatch(base.Base):
+ re_cve_pattern = pyparsing.Regex("CVE\-\d{4}\-\d+")
+ re_cve_payload_tag = pyparsing.Regex("\+CVE:(\s+CVE\-\d{4}\-\d+)+")
upstream_status_regex = pyparsing.AtLineStart("+" + "Upstream-Status")
@classmethod
@@ -21,21 +24,33 @@ class PatchUpstreamStatus(base.Base):
if patch.path.endswith('.patch') and patch.is_added_file:
cls.newpatches.append(patch)
+ cls.mark = str(parse_signed_off_by.signed_off_by_mark).strip('"')
+
+ # match PatchSignedOffBy.mark with '+' preceding it
+ cls.prog = parse_signed_off_by.patch_signed_off_by
+
def setUp(self):
if self.unidiff_parse_error:
- self.skip('Python-unidiff parse error')
+ self.skip('Parse error %s' % self.unidiff_parse_error)
+
self.valid_status = ', '.join(parse_upstream_status.upstream_status_nonliteral_valid_status)
self.standard_format = 'Upstream-Status: <Valid status>'
+ # we are just interested in series that introduce CVE patches, thus discard other
+ # possibilities: modification to current CVEs, patch directly introduced into the
+ # recipe, upgrades already including the CVE, etc.
+ new_cves = [p for p in self.patchset if p.path.endswith('.patch') and p.is_added_file]
+ if not new_cves:
+ self.skip('No new CVE patches introduced')
+
def test_upstream_status_presence_format(self):
- if not PatchUpstreamStatus.newpatches:
+ if not TestPatch.newpatches:
self.skip("There are no new software patches, no reason to test Upstream-Status presence/format")
- for newpatch in PatchUpstreamStatus.newpatches:
+ for newpatch in TestPatch.newpatches:
payload = newpatch.__str__()
if not self.upstream_status_regex.search_string(payload):
- self.fail('Added patch file is missing Upstream-Status in the header',
- 'Add Upstream-Status: <Valid status> to the header of %s' % newpatch.path,
+ self.fail('Added patch file is missing Upstream-Status: <Valid status> in the commit message',
data=[('Standard format', self.standard_format), ('Valid status', self.valid_status)])
for line in payload.splitlines():
if self.patchmetadata_regex.match(line):
@@ -46,19 +61,42 @@ class PatchUpstreamStatus(base.Base):
parse_upstream_status.upstream_status_inappropriate_info.parseString(line.lstrip('+'))
except pyparsing.ParseException as pe:
self.fail('Upstream-Status is Inappropriate, but no reason was provided',
- 'Include a brief reason why %s is inappropriate' % os.path.basename(newpatch.path),
data=[('Current', pe.pstr), ('Standard format', 'Upstream-Status: Inappropriate [reason]')])
elif parse_upstream_status.submitted_status_mark.searchString(line):
try:
parse_upstream_status.upstream_status_submitted_info.parseString(line.lstrip('+'))
except pyparsing.ParseException as pe:
self.fail('Upstream-Status is Submitted, but it is not mentioned where',
- 'Include where %s was submitted' % os.path.basename(newpatch.path),
data=[('Current', pe.pstr), ('Standard format', 'Upstream-Status: Submitted [where]')])
else:
try:
parse_upstream_status.upstream_status.parseString(line.lstrip('+'))
except pyparsing.ParseException as pe:
self.fail('Upstream-Status is in incorrect format',
- 'Fix Upstream-Status format in %s' % os.path.basename(newpatch.path),
data=[('Current', pe.pstr), ('Standard format', self.standard_format), ('Valid status', self.valid_status)])
+
+ def test_signed_off_by_presence(self):
+ if not TestPatch.newpatches:
+ self.skip("There are no new software patches, no reason to test %s presence" % PatchSignedOffBy.mark)
+
+ for newpatch in TestPatch.newpatches:
+ payload = newpatch.__str__()
+ for line in payload.splitlines():
+ if self.patchmetadata_regex.match(line):
+ continue
+ if TestPatch.prog.search_string(payload):
+ break
+ else:
+ self.fail('A patch file has been added without a Signed-off-by tag. Sign off the added patch file (%s)' % newpatch.path)
+
+ def test_cve_tag_format(self):
+ for commit in TestPatch.commits:
+ if self.re_cve_pattern.search_string(commit.shortlog) or self.re_cve_pattern.search_string(commit.commit_message):
+ tag_found = False
+ for line in commit.payload.splitlines():
+ if self.re_cve_payload_tag.search_string(line):
+ tag_found = True
+ break
+ if not tag_found:
+ self.fail('Missing or incorrectly formatted CVE tag in patch file. Correct or include the CVE tag in the patch with format: "CVE: CVE-YYYY-XXXX"',
+ commit=commit)
diff --git a/poky/meta/lib/patchtest/tests/test_patch_cve.py b/poky/meta/lib/patchtest/tests/test_patch_cve.py
deleted file mode 100644
index 46ed9ef791..0000000000
--- a/poky/meta/lib/patchtest/tests/test_patch_cve.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# Checks related to the patch's CVE lines
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2 as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# SPDX-License-Identifier: GPL-2.0-or-later
-
-import base
-import os
-import re
-
-class CVE(base.Base):
-
- re_cve_pattern = re.compile("CVE\-\d{4}\-\d+", re.IGNORECASE)
- re_cve_payload_tag = re.compile("\+CVE:(\s+CVE\-\d{4}\-\d+)+")
-
- def setUp(self):
- if self.unidiff_parse_error:
- self.skip('Parse error %s' % self.unidiff_parse_error)
-
- # we are just interested in series that introduce CVE patches, thus discard other
- # possibilities: modification to current CVEs, patch directly introduced into the
- # recipe, upgrades already including the CVE, etc.
- new_cves = [p for p in self.patchset if p.path.endswith('.patch') and p.is_added_file]
- if not new_cves:
- self.skip('No new CVE patches introduced')
-
- def test_cve_tag_format(self):
- for commit in CVE.commits:
- if self.re_cve_pattern.search(commit.shortlog) or self.re_cve_pattern.search(commit.commit_message):
- tag_found = False
- for line in commit.payload.splitlines():
- if self.re_cve_payload_tag.match(line):
- tag_found = True
- break
- if not tag_found:
- self.fail('Missing or incorrectly formatted CVE tag in included patch file',
- 'Correct or include the CVE tag on cve patch with format: "CVE: CVE-YYYY-XXXX"',
- commit)
diff --git a/poky/meta/lib/patchtest/tests/test_patch_signed_off_by.py b/poky/meta/lib/patchtest/tests/test_patch_signed_off_by.py
deleted file mode 100644
index 4855d6daf7..0000000000
--- a/poky/meta/lib/patchtest/tests/test_patch_signed_off_by.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Checks related to the patch's signed-off-by lines
-#
-# Copyright (C) 2016 Intel Corporation
-#
-# SPDX-License-Identifier: GPL-2.0
-
-import base
-import parse_signed_off_by
-import re
-
-class PatchSignedOffBy(base.Base):
-
- @classmethod
- def setUpClassLocal(cls):
- cls.newpatches = []
- # get just those relevant patches: new software patches
- for patch in cls.patchset:
- if patch.path.endswith('.patch') and patch.is_added_file:
- cls.newpatches.append(patch)
-
- cls.mark = str(parse_signed_off_by.signed_off_by_mark).strip('"')
-
- # match PatchSignedOffBy.mark with '+' preceding it
- cls.prog = parse_signed_off_by.patch_signed_off_by
-
- def setUp(self):
- if self.unidiff_parse_error:
- self.skip('Parse error %s' % self.unidiff_parse_error)
-
- def test_signed_off_by_presence(self):
- if not PatchSignedOffBy.newpatches:
- self.skip("There are no new software patches, no reason to test %s presence" % PatchSignedOffBy.mark)
-
- for newpatch in PatchSignedOffBy.newpatches:
- payload = newpatch.__str__()
- for line in payload.splitlines():
- if self.patchmetadata_regex.match(line):
- continue
- if PatchSignedOffBy.prog.search_string(payload):
- break
- else:
- self.fail('A patch file has been added, but does not have a Signed-off-by tag',
- 'Sign off the added patch file (%s)' % newpatch.path)
diff --git a/poky/meta/lib/patchtest/tests/test_python_pylint.py b/poky/meta/lib/patchtest/tests/test_python_pylint.py
index ea8efb7c2a..ef315e591c 100644
--- a/poky/meta/lib/patchtest/tests/test_python_pylint.py
+++ b/poky/meta/lib/patchtest/tests/test_python_pylint.py
@@ -2,11 +2,14 @@
#
# Copyright (C) 2016 Intel Corporation
#
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0-only
import base
+from io import StringIO
from data import PatchTestInput
-import pylint.epylint as lint
+from pylint.reporters.text import TextReporter
+import pylint.lint as lint
+
class PyLint(base.Base):
pythonpatches = []
@@ -26,16 +29,16 @@ class PyLint(base.Base):
def setUp(self):
if self.unidiff_parse_error:
self.skip('Python-unidiff parse error')
- if not PatchTestInput.repo.canbemerged:
- self.skip('Patch cannot be merged, no reason to execute the test method')
if not PyLint.pythonpatches:
self.skip('No python related patches, skipping test')
def pretest_pylint(self):
for pythonpatch in self.pythonpatches:
if pythonpatch.is_modified_file:
- (pylint_stdout, pylint_stderr) = lint.py_run(command_options = pythonpatch.path + self.pylint_options, return_std=True)
- for line in pylint_stdout.readlines():
+ pylint_output = StringIO()
+ reporter = TextReporter(pylint_output)
+ lint.Run([self.pylint_options, pythonpatch.path], reporter=reporter, exit=False)
+ for line in pylint_output.readlines():
if not '*' in line:
if line.strip():
self.pylint_pretest[line.strip().split(' ',1)[0]] = line.strip().split(' ',1)[1]
@@ -48,14 +51,15 @@ class PyLint(base.Base):
path = pythonpatch.target_file[2:]
else:
path = pythonpatch.path
- (pylint_stdout, pylint_stderr) = lint.py_run(command_options = path + self.pylint_options, return_std=True)
- for line in pylint_stdout.readlines():
+ pylint_output = StringIO()
+ reporter = TextReporter(pylint_output)
+ lint.Run([self.pylint_options, pythonpatch.path], reporter=reporter, exit=False)
+ for line in pylint_output.readlines():
if not '*' in line:
if line.strip():
self.pylint_test[line.strip().split(' ',1)[0]] = line.strip().split(' ',1)[1]
for issue in self.pylint_test:
if self.pylint_test[issue] not in self.pylint_pretest.values():
- self.fail('Errors in your Python code were encountered',
- 'Correct the lines introduced by your patch',
+ self.fail('Errors in your Python code were encountered. Please check your code with a linter and resubmit',
data=[('Output', 'Please, fix the listed issues:'), ('', issue + ' ' + self.pylint_test[issue])])
diff --git a/poky/meta/lib/patchtest/utils.py b/poky/meta/lib/patchtest/utils.py
new file mode 100644
index 0000000000..a4a523b4e2
--- /dev/null
+++ b/poky/meta/lib/patchtest/utils.py
@@ -0,0 +1,168 @@
+# ex:ts=4:sw=4:sts=4:et
+# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
+#
+# utils: common methods used by the patchtest framework
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+import os
+import subprocess
+import logging
+import re
+import mailbox
+
+class CmdException(Exception):
+ """ Simple exception class where its attributes are the ones passed when instantiated """
+ def __init__(self, cmd):
+ self._cmd = cmd
+ def __getattr__(self, name):
+ value = None
+ if self._cmd.has_key(name):
+ value = self._cmd[name]
+ return value
+
+def exec_cmd(cmd, cwd, ignore_error=False, input=None, strip=True, updateenv={}):
+ """
+ Input:
+
+ cmd: dict containing the following keys:
+
+ cmd : the command itself as an array of strings
+ ignore_error: if False, no exception is raised
+ strip: indicates if strip is done on the output (stdout and stderr)
+ input: input data to the command (stdin)
+ updateenv: environment variables to be appended to the current
+ process environment variables
+
+ NOTE: keys 'ignore_error' and 'input' are optional; if not included,
+ the defaults are the ones specify in the arguments
+ cwd: directory where commands are executed
+ ignore_error: raise CmdException if command fails to execute and
+ this value is False
+ input: input data (stdin) for the command
+
+ Output: dict containing the following keys:
+
+ cmd: the same as input
+ ignore_error: the same as input
+ strip: the same as input
+ input: the same as input
+ stdout: Standard output after command's execution
+ stderr: Standard error after command's execution
+ returncode: Return code after command's execution
+
+ """
+ cmddefaults = {
+ 'cmd':'',
+ 'ignore_error':ignore_error,
+ 'strip':strip,
+ 'input':input,
+ 'updateenv':updateenv,
+ }
+
+ # update input values if necessary
+ cmddefaults.update(cmd)
+
+ _cmd = cmddefaults
+
+ if not _cmd['cmd']:
+ raise CmdException({'cmd':None, 'stderr':'no command given'})
+
+ # update the environment
+ env = os.environ
+ env.update(_cmd['updateenv'])
+
+ _command = [e for e in _cmd['cmd']]
+ p = subprocess.Popen(_command,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ universal_newlines=True,
+ cwd=cwd,
+ env=env)
+
+ # execute the command and strip output
+ (_stdout, _stderr) = p.communicate(_cmd['input'])
+ if _cmd['strip']:
+ _stdout, _stderr = map(str.strip, [_stdout, _stderr])
+
+ # generate the result
+ result = _cmd
+ result.update({'cmd':_command,'stdout':_stdout,'stderr':_stderr,'returncode':p.returncode})
+
+ # launch exception if necessary
+ if not _cmd['ignore_error'] and p.returncode:
+ raise CmdException(result)
+
+ return result
+
+def exec_cmds(cmds, cwd):
+ """ Executes commands
+
+ Input:
+ cmds: Array of commands
+ cwd: directory where commands are executed
+
+ Output: Array of output commands
+ """
+ results = []
+ _cmds = cmds
+
+ for cmd in _cmds:
+ result = exec_cmd(cmd, cwd)
+ results.append(result)
+
+ return results
+
+def logger_create(name):
+ logger = logging.getLogger(name)
+ loggerhandler = logging.StreamHandler()
+ loggerhandler.setFormatter(logging.Formatter("%(message)s"))
+ logger.addHandler(loggerhandler)
+ logger.setLevel(logging.INFO)
+ return logger
+
+def get_subject_prefix(path):
+ prefix = ""
+ mbox = mailbox.mbox(path)
+
+ if len(mbox):
+ subject = mbox[0]['subject']
+ if subject:
+ pattern = re.compile("(\[.*\])", re.DOTALL)
+ match = pattern.search(subject)
+ if match:
+ prefix = match.group(1)
+
+ return prefix
+
+def valid_branch(branch):
+ """ Check if branch is valid name """
+ lbranch = branch.lower()
+
+ invalid = lbranch.startswith('patch') or \
+ lbranch.startswith('rfc') or \
+ lbranch.startswith('resend') or \
+ re.search('^v\d+', lbranch) or \
+ re.search('^\d+/\d+', lbranch)
+
+ return not invalid
+
+def get_branch(path):
+ """ Get the branch name from mbox """
+ fullprefix = get_subject_prefix(path)
+ branch, branches, valid_branches = None, [], []
+
+ if fullprefix:
+ prefix = fullprefix.strip('[]')
+ branches = [ b.strip() for b in prefix.split(',')]
+ valid_branches = [b for b in branches if valid_branch(b)]
+
+ if len(valid_branches):
+ branch = valid_branches[0]
+
+ return branch
+
diff --git a/poky/meta/recipes-bsp/grub/files/CVE-2023-4692.patch b/poky/meta/recipes-bsp/grub/files/CVE-2023-4692.patch
new file mode 100644
index 0000000000..305fcc93d8
--- /dev/null
+++ b/poky/meta/recipes-bsp/grub/files/CVE-2023-4692.patch
@@ -0,0 +1,98 @@
+From 43651027d24e62a7a463254165e1e46e42aecdea Mon Sep 17 00:00:00 2001
+From: Maxim Suhanov <dfirblog@gmail.com>
+Date: Mon, 28 Aug 2023 16:31:57 +0300
+Subject: [PATCH] fs/ntfs: Fix an OOB write when parsing the $ATTRIBUTE_LIST attribute
+ for the $MFT file
+
+When parsing an extremely fragmented $MFT file, i.e., the file described
+using the $ATTRIBUTE_LIST attribute, current NTFS code will reuse a buffer
+containing bytes read from the underlying drive to store sector numbers,
+which are consumed later to read data from these sectors into another buffer.
+
+These sectors numbers, two 32-bit integers, are always stored at predefined
+offsets, 0x10 and 0x14, relative to first byte of the selected entry within
+the $ATTRIBUTE_LIST attribute. Usually, this won't cause any problem.
+
+However, when parsing a specially-crafted file system image, this may cause
+the NTFS code to write these integers beyond the buffer boundary, likely
+causing the GRUB memory allocator to misbehave or fail. These integers contain
+values which are controlled by on-disk structures of the NTFS file system.
+
+Such modification and resulting misbehavior may touch a memory range not
+assigned to the GRUB and owned by firmware or another EFI application/driver.
+
+This fix introduces checks to ensure that these sector numbers are never
+written beyond the boundary.
+
+Fixes: CVE-2023-4692
+
+Upstream-Status: Backport from
+[https://git.savannah.gnu.org/cgit/grub.git/commit/?id=43651027d24e62a7a463254165e1e46e42aecdea]
+CVE: CVE-2023-4692
+
+Reported-by: Maxim Suhanov <dfirblog@gmail.com>
+Signed-off-by: Maxim Suhanov <dfirblog@gmail.com>
+Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
+Signed-off-by: Xiangyu Chen <xiangyu.chen@windriver.com>
+---
+ grub-core/fs/ntfs.c | 18 +++++++++++++++++-
+ 1 file changed, 17 insertions(+), 1 deletion(-)
+
+diff --git a/grub-core/fs/ntfs.c b/grub-core/fs/ntfs.c
+index bbdbe24..c3c4db1 100644
+--- a/grub-core/fs/ntfs.c
++++ b/grub-core/fs/ntfs.c
+@@ -184,7 +184,7 @@ find_attr (struct grub_ntfs_attr *at, grub_uint8_t attr)
+ }
+ if (at->attr_end)
+ {
+- grub_uint8_t *pa;
++ grub_uint8_t *pa, *pa_end;
+
+ at->emft_buf = grub_malloc (at->mft->data->mft_size << GRUB_NTFS_BLK_SHR);
+ if (at->emft_buf == NULL)
+@@ -209,11 +209,13 @@ find_attr (struct grub_ntfs_attr *at, grub_uint8_t attr)
+ }
+ at->attr_nxt = at->edat_buf;
+ at->attr_end = at->edat_buf + u32at (pa, 0x30);
++ pa_end = at->edat_buf + n;
+ }
+ else
+ {
+ at->attr_nxt = at->attr_end + u16at (pa, 0x14);
+ at->attr_end = at->attr_end + u32at (pa, 4);
++ pa_end = at->mft->buf + (at->mft->data->mft_size << GRUB_NTFS_BLK_SHR);
+ }
+ at->flags |= GRUB_NTFS_AF_ALST;
+ while (at->attr_nxt < at->attr_end)
+@@ -230,6 +232,13 @@ find_attr (struct grub_ntfs_attr *at, grub_uint8_t attr)
+ at->flags |= GRUB_NTFS_AF_GPOS;
+ at->attr_cur = at->attr_nxt;
+ pa = at->attr_cur;
++
++ if ((pa >= pa_end) || (pa_end - pa < 0x18))
++ {
++ grub_error (GRUB_ERR_BAD_FS, "can\'t parse attribute list");
++ return NULL;
++ }
++
+ grub_set_unaligned32 ((char *) pa + 0x10,
+ grub_cpu_to_le32 (at->mft->data->mft_start));
+ grub_set_unaligned32 ((char *) pa + 0x14,
+@@ -240,6 +249,13 @@ find_attr (struct grub_ntfs_attr *at, grub_uint8_t attr)
+ {
+ if (*pa != attr)
+ break;
++
++ if ((pa >= pa_end) || (pa_end - pa < 0x18))
++ {
++ grub_error (GRUB_ERR_BAD_FS, "can\'t parse attribute list");
++ return NULL;
++ }
++
+ if (read_attr
+ (at, pa + 0x10,
+ u32at (pa, 0x10) * (at->mft->data->mft_size << GRUB_NTFS_BLK_SHR),
+--
+cgit v1.1
+
diff --git a/poky/meta/recipes-bsp/grub/files/CVE-2023-4693.patch b/poky/meta/recipes-bsp/grub/files/CVE-2023-4693.patch
new file mode 100644
index 0000000000..420fe92ac3
--- /dev/null
+++ b/poky/meta/recipes-bsp/grub/files/CVE-2023-4693.patch
@@ -0,0 +1,63 @@
+From 0ed2458cc4eff6d9a9199527e2a0b6d445802f94 Mon Sep 17 00:00:00 2001
+From: Maxim Suhanov <dfirblog@...>
+Date: Mon, 28 Aug 2023 16:32:33 +0300
+Subject: fs/ntfs: Fix an OOB read when reading data from the resident $DATA
+ attribute
+
+When reading a file containing resident data, i.e., the file data is stored in
+the $DATA attribute within the NTFS file record, not in external clusters,
+there are no checks that this resident data actually fits the corresponding
+file record segment.
+
+When parsing a specially-crafted file system image, the current NTFS code will
+read the file data from an arbitrary, attacker-chosen memory offset and of
+arbitrary, attacker-chosen length.
+
+This allows an attacker to display arbitrary chunks of memory, which could
+contain sensitive information like password hashes or even plain-text,
+obfuscated passwords from BS EFI variables.
+
+This fix implements a check to ensure that resident data is read from the
+corresponding file record segment only.
+
+Fixes: CVE-2023-4693
+
+Upstream-Status: Backport from
+[https://git.savannah.gnu.org/cgit/grub.git/commit/?id=0ed2458cc4eff6d9a9199527e2a0b6d445802f94]
+CVE: CVE-2023-4693
+
+Reported-by: Maxim Suhanov <dfirblog@...>
+Signed-off-by: Maxim Suhanov <dfirblog@...>
+Reviewed-by: Daniel Kiper <daniel.kiper@...>
+Signed-off-by: Xiangyu Chen <xiangyu.chen@...>
+---
+ grub-core/fs/ntfs.c | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/grub-core/fs/ntfs.c b/grub-core/fs/ntfs.c
+index c3c4db1..a68e173 100644
+--- a/grub-core/fs/ntfs.c
++++ b/grub-core/fs/ntfs.c
+@@ -401,7 +401,18 @@ read_data (struct grub_ntfs_attr *at, grub_uint8_t *pa, grub_uint8_t *dest,
+ {
+ if (ofs + len > u32at (pa, 0x10))
+ return grub_error (GRUB_ERR_BAD_FS, "read out of range");
+- grub_memcpy (dest, pa + u32at (pa, 0x14) + ofs, len);
++
++ if (u32at (pa, 0x10) > (at->mft->data->mft_size << GRUB_NTFS_BLK_SHR))
++ return grub_error (GRUB_ERR_BAD_FS, "resident attribute too large");
++
++ if (pa >= at->mft->buf + (at->mft->data->mft_size << GRUB_NTFS_BLK_SHR))
++ return grub_error (GRUB_ERR_BAD_FS, "resident attribute out of range");
++
++ if (u16at (pa, 0x14) + u32at (pa, 0x10) >
++ (grub_addr_t) at->mft->buf + (at->mft->data->mft_size << GRUB_NTFS_BLK_SHR) - (grub_addr_t) pa)
++ return grub_error (GRUB_ERR_BAD_FS, "resident attribute out of range");
++
++ grub_memcpy (dest, pa + u16at (pa, 0x14) + ofs, len);
+ return 0;
+ }
+
+--
+cgit v1.1
+
diff --git a/poky/meta/recipes-bsp/grub/grub2.inc b/poky/meta/recipes-bsp/grub/grub2.inc
index 41839698dc..f594e7d3a4 100644
--- a/poky/meta/recipes-bsp/grub/grub2.inc
+++ b/poky/meta/recipes-bsp/grub/grub2.inc
@@ -42,6 +42,8 @@ SRC_URI = "${GNU_MIRROR}/grub/grub-${PV}.tar.gz \
file://CVE-2022-3775.patch \
file://0001-risc-v-Handle-R_RISCV_CALL_PLT-reloc.patch \
file://0001-fs-ext2-Ignore-checksum-seed-incompat-feature.patch \
+ file://CVE-2023-4692.patch \
+ file://CVE-2023-4693.patch \
"
SRC_URI[sha256sum] = "23b64b4c741569f9426ed2e3d0e6780796fca081bee4c99f62aa3f53ae803f5f"
diff --git a/poky/meta/recipes-bsp/opensbi/opensbi_1.2.bb b/poky/meta/recipes-bsp/opensbi/opensbi_1.3.bb
index a088fef419..f01cae34d1 100644
--- a/poky/meta/recipes-bsp/opensbi/opensbi_1.2.bb
+++ b/poky/meta/recipes-bsp/opensbi/opensbi_1.3.bb
@@ -8,8 +8,8 @@ require opensbi-payloads.inc
inherit autotools-brokensep deploy
-SRCREV = "6b5188ca14e59ce7bf71afe4e7d3d557c3d31bf8"
-SRC_URI = "git://github.com/riscv/opensbi.git;branch=master;protocol=https"
+SRCREV = "057eb10b6d523540012e6947d5c9f63e95244e94"
+SRC_URI = "git://github.com/riscv/opensbi.git;branch=release-1.3.x;protocol=https"
S = "${WORKDIR}/git"
diff --git a/poky/meta/recipes-bsp/u-boot/libubootenv_0.3.4.bb b/poky/meta/recipes-bsp/u-boot/libubootenv_0.3.5.bb
index ac1e03b8e9..b68bbb430a 100644
--- a/poky/meta/recipes-bsp/u-boot/libubootenv_0.3.4.bb
+++ b/poky/meta/recipes-bsp/u-boot/libubootenv_0.3.5.bb
@@ -11,7 +11,7 @@ LIC_FILES_CHKSUM = "file://LICENSES/LGPL-2.1-or-later.txt;md5=4fbd65380cdd255951
SECTION = "libs"
SRC_URI = "git://github.com/sbabic/libubootenv;protocol=https;branch=master"
-SRCREV = "4dfb5254fc0540a36e87914bc14644c047ea7678"
+SRCREV = "3f4d15e36ceb58085b08dd13f3f2788e9299877b"
S = "${WORKDIR}/git"
diff --git a/poky/meta/recipes-connectivity/avahi/avahi_0.8.bb b/poky/meta/recipes-connectivity/avahi/avahi_0.8.bb
index 4c830cc058..910da3c9cc 100644
--- a/poky/meta/recipes-connectivity/avahi/avahi_0.8.bb
+++ b/poky/meta/recipes-connectivity/avahi/avahi_0.8.bb
@@ -26,6 +26,11 @@ SRC_URI = "${GITHUB_BASE_URI}/download/v${PV}/avahi-${PV}.tar.gz \
file://handle-hup.patch \
file://local-ping.patch \
file://invalid-service.patch \
+ file://CVE-2023-38469.patch \
+ file://CVE-2023-38470.patch \
+ file://CVE-2023-38471.patch \
+ file://CVE-2023-38472.patch \
+ file://CVE-2023-38473.patch \
"
GITHUB_BASE_URI = "https://github.com/lathiat/avahi/releases/"
diff --git a/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38469.patch b/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38469.patch
new file mode 100644
index 0000000000..a078f66102
--- /dev/null
+++ b/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38469.patch
@@ -0,0 +1,48 @@
+From 72842945085cc3adaccfdfa2853771b0e75ef991 Mon Sep 17 00:00:00 2001
+From: Evgeny Vereshchagin <evvers@ya.ru>
+Date: Mon, 23 Oct 2023 20:29:31 +0000
+Subject: [PATCH] avahi: core: reject overly long TXT resource records
+
+Closes https://github.com/lathiat/avahi/issues/455
+
+Upstream-Status: Backport [https://github.com/lathiat/avahi/commit/a337a1ba7d15853fb56deef1f464529af6e3a1cf]
+CVE: CVE-2023-38469
+
+Signed-off-by: Meenali Gupta <meenali.gupta@windriver.com>
+---
+ avahi-core/rr.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/avahi-core/rr.c b/avahi-core/rr.c
+index 7fa0bee..b03a24c 100644
+--- a/avahi-core/rr.c
++++ b/avahi-core/rr.c
+@@ -32,6 +32,7 @@
+ #include <avahi-common/malloc.h>
+ #include <avahi-common/defs.h>
+
++#include "dns.h"
+ #include "rr.h"
+ #include "log.h"
+ #include "util.h"
+@@ -688,11 +689,17 @@ int avahi_record_is_valid(AvahiRecord *r) {
+ case AVAHI_DNS_TYPE_TXT: {
+
+ AvahiStringList *strlst;
++ size_t used = 0;
+
+- for (strlst = r->data.txt.string_list; strlst; strlst = strlst->next)
++ for (strlst = r->data.txt.string_list; strlst; strlst = strlst->next) {
+ if (strlst->size > 255 || strlst->size <= 0)
+ return 0;
+
++ used += 1+strlst->size;
++ if (used > AVAHI_DNS_RDATA_MAX)
++ return 0;
++ }
++
+ return 1;
+ }
+ }
+--
+2.40.0
diff --git a/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38470.patch b/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38470.patch
new file mode 100644
index 0000000000..91f9e677ac
--- /dev/null
+++ b/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38470.patch
@@ -0,0 +1,59 @@
+From af7bfad67ca53a7c4042a4a2d85456b847e9f249 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= <pemensik@redhat.com>
+Date: Tue, 11 Apr 2023 15:29:59 +0200
+Subject: [PATCH] avahi: Ensure each label is at least one byte long
+
+The only allowed exception is single dot, where it should return empty
+string.
+
+Fixes #454.
+
+Upstream-Status: Backport [https://github.com/lathiat/avahi/commit/94cb6489114636940ac683515417990b55b5d66c]
+CVE: CVE-2023-38470
+
+Signed-off-by: Meenali Gupta <meenali.gupta@windriver.com>
+---
+ avahi-common/domain-test.c | 14 ++++++++++++++
+ avahi-common/domain.c | 2 +-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/avahi-common/domain-test.c b/avahi-common/domain-test.c
+index cf763ec..3acc1c1 100644
+--- a/avahi-common/domain-test.c
++++ b/avahi-common/domain-test.c
+@@ -45,6 +45,20 @@ int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char *argv[]) {
+ printf("%s\n", s = avahi_normalize_name_strdup("fo\\\\o\\..f oo."));
+ avahi_free(s);
+
++ printf("%s\n", s = avahi_normalize_name_strdup("."));
++ avahi_free(s);
++
++ s = avahi_normalize_name_strdup(",.=.}.=.?-.}.=.?.?.}.}.?.?.?.z.?.?.}.}."
++ "}.?.?.?.r.=.=.}.=.?.}}.}.?.?.?.zM.=.=.?.?.}.}.?.?.}.}.}"
++ ".?.?.?.r.=.=.}.=.?.}}.}.?.?.?.zM.=.=.?.?.}.}.?.?.?.zM.?`"
++ "?.}.}.}.?.?.?.r.=.?.}.=.?.?.}.?.?.?.}.=.?.?.}??.}.}.?.?."
++ "?.z.?.?.}.}.}.?.?.?.r.=.=.}.=.?.}}.}.?.?.?.zM.?`?.}.}.}."
++ "??.?.zM.?`?.}.}.}.?.?.?.r.=.?.}.=.?.?.}.?.?.?.}.=.?.?.}?"
++ "?.}.}.?.?.?.z.?.?.}.}.}.?.?.?.r.=.=.}.=.?.}}.}.?.?.?.zM."
++ "?`?.}.}.}.?.?.?.r.=.=.?.?`.?.?}.}.}.?.?.?.r.=.?.}.=.?.?."
++ "}.?.?.?.}.=.?.?.}");
++ assert(s == NULL);
++
+ printf("%i\n", avahi_domain_equal("\\065aa bbb\\.\\046cc.cc\\\\.dee.fff.", "Aaa BBB\\.\\.cc.cc\\\\.dee.fff"));
+ printf("%i\n", avahi_domain_equal("A", "a"));
+
+diff --git a/avahi-common/domain.c b/avahi-common/domain.c
+index 3b1ab68..e66d241 100644
+--- a/avahi-common/domain.c
++++ b/avahi-common/domain.c
+@@ -201,7 +201,7 @@ char *avahi_normalize_name(const char *s, char *ret_s, size_t size) {
+ }
+
+ if (!empty) {
+- if (size < 1)
++ if (size < 2)
+ return NULL;
+
+ *(r++) = '.';
+--
+2.40.0
diff --git a/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38471.patch b/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38471.patch
new file mode 100644
index 0000000000..b3f716495d
--- /dev/null
+++ b/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38471.patch
@@ -0,0 +1,73 @@
+From 48d745db7fd554fc33e96ec86d3675ebd530bb8e Mon Sep 17 00:00:00 2001
+From: Michal Sekletar <msekleta@redhat.com>
+Date: Mon, 23 Oct 2023 13:38:35 +0200
+Subject: [PATCH] avahi: core: extract host name using avahi_unescape_label()
+
+Previously we could create invalid escape sequence when we split the
+string on dot. For example, from valid host name "foo\\.bar" we have
+created invalid name "foo\\" and tried to set that as the host name
+which crashed the daemon.
+
+Fixes #453
+
+Upstream-Status: Backport [https://github.com/lathiat/avahi/commit/894f085f402e023a98cbb6f5a3d117bd88d93b09]
+CVE: CVE-2023-38471
+
+Signed-off-by: Meenali Gupta <meenali.gupta@windriver.com>
+---
+ avahi-core/server.c | 27 +++++++++++++++++++++------
+ 1 file changed, 21 insertions(+), 6 deletions(-)
+
+diff --git a/avahi-core/server.c b/avahi-core/server.c
+index e507750..40f1d68 100644
+--- a/avahi-core/server.c
++++ b/avahi-core/server.c
+@@ -1295,7 +1295,11 @@ static void update_fqdn(AvahiServer *s) {
+ }
+
+ int avahi_server_set_host_name(AvahiServer *s, const char *host_name) {
+- char *hn = NULL;
++ char label_escaped[AVAHI_LABEL_MAX*4+1];
++ char label[AVAHI_LABEL_MAX];
++ char *hn = NULL, *h;
++ size_t len;
++
+ assert(s);
+
+ AVAHI_CHECK_VALIDITY(s, !host_name || avahi_is_valid_host_name(host_name), AVAHI_ERR_INVALID_HOST_NAME);
+@@ -1305,17 +1309,28 @@ int avahi_server_set_host_name(AvahiServer *s, const char *host_name) {
+ else
+ hn = avahi_normalize_name_strdup(host_name);
+
+- hn[strcspn(hn, ".")] = 0;
++ h = hn;
++ if (!avahi_unescape_label((const char **)&hn, label, sizeof(label))) {
++ avahi_free(h);
++ return AVAHI_ERR_INVALID_HOST_NAME;
++ }
++
++ avahi_free(h);
++
++ h = label_escaped;
++ len = sizeof(label_escaped);
++ if (!avahi_escape_label(label, strlen(label), &h, &len))
++ return AVAHI_ERR_INVALID_HOST_NAME;
+
+- if (avahi_domain_equal(s->host_name, hn) && s->state != AVAHI_SERVER_COLLISION) {
+- avahi_free(hn);
++ if (avahi_domain_equal(s->host_name, label_escaped) && s->state != AVAHI_SERVER_COLLISION)
+ return avahi_server_set_errno(s, AVAHI_ERR_NO_CHANGE);
+- }
+
+ withdraw_host_rrs(s);
+
+ avahi_free(s->host_name);
+- s->host_name = hn;
++ s->host_name = avahi_strdup(label_escaped);
++ if (!s->host_name)
++ return AVAHI_ERR_NO_MEMORY;
+
+ update_fqdn(s);
+
+--
+2.40.0
diff --git a/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38472.patch b/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38472.patch
new file mode 100644
index 0000000000..a1de8e2a5a
--- /dev/null
+++ b/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38472.patch
@@ -0,0 +1,46 @@
+From 8cf606779dc356768afc6b70e53f2808a9655143 Mon Sep 17 00:00:00 2001
+From: Michal Sekletar <msekleta@redhat.com>
+Date: Thu, 19 Oct 2023 17:36:44 +0200
+Subject: [PATCH] avahi: core: make sure there is rdata to process before
+ parsing it
+
+Fixes #452
+
+Upstream-Status: Backport [https://github.com/lathiat/avahi/commit/b024ae5749f4aeba03478e6391687c3c9c8dee40]
+CVE: CVE-2023-38472
+
+Signed-off-by: Meenali Gupta <meenali.gupta@windriver.com>
+---
+ avahi-client/client-test.c | 3 +++
+ avahi-daemon/dbus-entry-group.c | 2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/avahi-client/client-test.c b/avahi-client/client-test.c
+index 7d04a6a..57750a4 100644
+--- a/avahi-client/client-test.c
++++ b/avahi-client/client-test.c
+@@ -258,6 +258,9 @@ int main (AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char *argv[]) {
+ printf("%s\n", avahi_strerror(avahi_entry_group_add_service (group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, "Lathiat's Site", "_http._tcp", NULL, NULL, 80, "foo=bar", NULL)));
+ printf("add_record: %d\n", avahi_entry_group_add_record (group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, "TestX", 0x01, 0x10, 120, "\5booya", 6));
+
++ error = avahi_entry_group_add_record (group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, "TestX", 0x01, 0x10, 120, "", 0);
++ assert(error != AVAHI_OK);
++
+ avahi_entry_group_commit (group);
+
+ domain = avahi_domain_browser_new (avahi, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, NULL, AVAHI_DOMAIN_BROWSER_BROWSE, 0, avahi_domain_browser_callback, (char*) "omghai3u");
+diff --git a/avahi-daemon/dbus-entry-group.c b/avahi-daemon/dbus-entry-group.c
+index 4e879a5..aa23d4b 100644
+--- a/avahi-daemon/dbus-entry-group.c
++++ b/avahi-daemon/dbus-entry-group.c
+@@ -340,7 +340,7 @@ DBusHandlerResult avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage
+ if (!(r = avahi_record_new_full (name, clazz, type, ttl)))
+ return avahi_dbus_respond_error(c, m, AVAHI_ERR_NO_MEMORY, NULL);
+
+- if (avahi_rdata_parse (r, rdata, size) < 0) {
++ if (!rdata || avahi_rdata_parse (r, rdata, size) < 0) {
+ avahi_record_unref (r);
+ return avahi_dbus_respond_error(c, m, AVAHI_ERR_INVALID_RDATA, NULL);
+ }
+--
+2.40.0
diff --git a/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38473.patch b/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38473.patch
new file mode 100644
index 0000000000..707acb60fe
--- /dev/null
+++ b/poky/meta/recipes-connectivity/avahi/files/CVE-2023-38473.patch
@@ -0,0 +1,110 @@
+From 88cbbc48d5efff9726694557ca6c3f698f3affe4 Mon Sep 17 00:00:00 2001
+From: Michal Sekletar <msekleta@redhat.com>
+Date: Wed, 11 Oct 2023 17:45:44 +0200
+Subject: [PATCH] avahi: common: derive alternative host name from its
+ unescaped version
+
+Normalization of input makes sure we don't have to deal with special
+cases like unescaped dot at the end of label.
+
+Fixes #451 #487
+
+Upstream-Status: Backport [https://github.com/lathiat/avahi/commit/b448c9f771bada14ae8de175695a9729f8646797]
+CVE: CVE-2023-38473
+
+Signed-off-by: Meenali Gupta <meenali.gupta@windriver.com>
+---
+ avahi-common/alternative-test.c | 3 +++
+ avahi-common/alternative.c | 27 +++++++++++++++++++--------
+ 2 files changed, 22 insertions(+), 8 deletions(-)
+
+diff --git a/avahi-common/alternative-test.c b/avahi-common/alternative-test.c
+index 9255435..681fc15 100644
+--- a/avahi-common/alternative-test.c
++++ b/avahi-common/alternative-test.c
+@@ -31,6 +31,9 @@ int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char *argv[]) {
+ const char* const test_strings[] = {
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXüüüüüüü",
++ ").",
++ "\\.",
++ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\\",
+ "gurke",
+ "-",
+ " #",
+diff --git a/avahi-common/alternative.c b/avahi-common/alternative.c
+index b3d39f0..a094e6d 100644
+--- a/avahi-common/alternative.c
++++ b/avahi-common/alternative.c
+@@ -49,15 +49,20 @@ static void drop_incomplete_utf8(char *c) {
+ }
+
+ char *avahi_alternative_host_name(const char *s) {
++ char label[AVAHI_LABEL_MAX], alternative[AVAHI_LABEL_MAX*4+1];
++ char *alt, *r, *ret;
+ const char *e;
+- char *r;
++ size_t len;
+
+ assert(s);
+
+ if (!avahi_is_valid_host_name(s))
+ return NULL;
+
+- if ((e = strrchr(s, '-'))) {
++ if (!avahi_unescape_label(&s, label, sizeof(label)))
++ return NULL;
++
++ if ((e = strrchr(label, '-'))) {
+ const char *p;
+
+ e++;
+@@ -74,19 +79,18 @@ char *avahi_alternative_host_name(const char *s) {
+
+ if (e) {
+ char *c, *m;
+- size_t l;
+ int n;
+
+ n = atoi(e)+1;
+ if (!(m = avahi_strdup_printf("%i", n)))
+ return NULL;
+
+- l = e-s-1;
++ len = e-label-1;
+
+- if (l >= AVAHI_LABEL_MAX-1-strlen(m)-1)
+- l = AVAHI_LABEL_MAX-1-strlen(m)-1;
++ if (len >= AVAHI_LABEL_MAX-1-strlen(m)-1)
++ len = AVAHI_LABEL_MAX-1-strlen(m)-1;
+
+- if (!(c = avahi_strndup(s, l))) {
++ if (!(c = avahi_strndup(label, len))) {
+ avahi_free(m);
+ return NULL;
+ }
+@@ -100,7 +104,7 @@ char *avahi_alternative_host_name(const char *s) {
+ } else {
+ char *c;
+
+- if (!(c = avahi_strndup(s, AVAHI_LABEL_MAX-1-2)))
++ if (!(c = avahi_strndup(label, AVAHI_LABEL_MAX-1-2)))
+ return NULL;
+
+ drop_incomplete_utf8(c);
+@@ -109,6 +113,13 @@ char *avahi_alternative_host_name(const char *s) {
+ avahi_free(c);
+ }
+
++ alt = alternative;
++ len = sizeof(alternative);
++ ret = avahi_escape_label(r, strlen(r), &alt, &len);
++
++ avahi_free(r);
++ r = avahi_strdup(ret);
++
+ assert(avahi_is_valid_host_name(r));
+
+ return r;
+--
+2.40.0
diff --git a/poky/meta/recipes-connectivity/bluez5/bluez5_5.69.bb b/poky/meta/recipes-connectivity/bluez5/bluez5_5.70.bb
index 4673000f60..2e3b782e6e 100644
--- a/poky/meta/recipes-connectivity/bluez5/bluez5_5.69.bb
+++ b/poky/meta/recipes-connectivity/bluez5/bluez5_5.70.bb
@@ -1,6 +1,6 @@
require bluez5.inc
-SRC_URI[sha256sum] = "bc5a35ddc7c72d0d3999a0d7b2175c8b7d57ab670774f8b5b4900ff38a2627fc"
+SRC_URI[sha256sum] = "37e372e916955e144cb882f888e4be40898f10ae3b7c213ddcdd55ee9c009278"
CVE_STATUS[CVE-2020-24490] = "cpe-incorrect: This issue has kernel fixes rather than bluez fixes"
diff --git a/poky/meta/recipes-connectivity/dhcpcd/dhcpcd_10.0.2.bb b/poky/meta/recipes-connectivity/dhcpcd/dhcpcd_10.0.5.bb
index 0966edd1b8..c2dee267ba 100644
--- a/poky/meta/recipes-connectivity/dhcpcd/dhcpcd_10.0.2.bb
+++ b/poky/meta/recipes-connectivity/dhcpcd/dhcpcd_10.0.5.bb
@@ -15,10 +15,9 @@ SRC_URI = "git://github.com/NetworkConfiguration/dhcpcd;protocol=https;branch=ma
file://dhcpcd.service \
file://dhcpcd@.service \
file://0001-dhcpcd.8-Fix-conflict-error-when-enable-multilib.patch \
- file://0001-privsep-fix-strlcpy-overflow-in-psp_ifname-239.patch \
"
-SRCREV = "d2fbde99cf2d0072016af9dfe6a77032a5a9fc30"
+SRCREV = "6baf4df467aaae89b026a089122d155c6eec3f19"
S = "${WORKDIR}/git"
inherit pkgconfig autotools-brokensep systemd useradd
diff --git a/poky/meta/recipes-connectivity/dhcpcd/files/0001-privsep-fix-strlcpy-overflow-in-psp_ifname-239.patch b/poky/meta/recipes-connectivity/dhcpcd/files/0001-privsep-fix-strlcpy-overflow-in-psp_ifname-239.patch
deleted file mode 100644
index d4fb1737a6..0000000000
--- a/poky/meta/recipes-connectivity/dhcpcd/files/0001-privsep-fix-strlcpy-overflow-in-psp_ifname-239.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 1bd8fc7d4b34f752a32709d277a897e5ad202d97 Mon Sep 17 00:00:00 2001
-From: Tobias Heider <tobhe@users.noreply.github.com>
-Date: Tue, 15 Aug 2023 18:06:48 +0200
-Subject: [PATCH] privsep: fix strlcpy overflow in psp_ifname (#239)
-
-When running our Ubuntu tests with libc6 and strlcpy overflow checks
-enabled we found that the wrong size is passed to strlcpy resulting
-in a crash because of an overflow.
-
-Upstream-Status: Backport
-[https://github.com/NetworkConfiguration/dhcpcd/commit/1bd8fc7d4b34f752a32709d277a897e5ad202d97]
-
-Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
----
- src/privsep.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/privsep.c b/src/privsep.c
-index b11c0351..cfe54742 100644
---- a/src/privsep.c
-+++ b/src/privsep.c
-@@ -1200,7 +1200,7 @@ ps_newprocess(struct dhcpcd_ctx *ctx, struct ps_id *psid)
- #endif
-
- if (!(ctx->options & DHCPCD_MANAGER))
-- strlcpy(psp->psp_ifname, ctx->ifv[0], sizeof(psp->psp_name));
-+ strlcpy(psp->psp_ifname, ctx->ifv[0], sizeof(psp->psp_ifname));
- TAILQ_INSERT_TAIL(&ctx->ps_processes, psp, next);
- return psp;
- }
---
-2.25.1
-
diff --git a/poky/meta/recipes-connectivity/iproute2/iproute2_6.5.0.bb b/poky/meta/recipes-connectivity/iproute2/iproute2_6.6.0.bb
index 2b28b10c20..417702e627 100644
--- a/poky/meta/recipes-connectivity/iproute2/iproute2_6.5.0.bb
+++ b/poky/meta/recipes-connectivity/iproute2/iproute2_6.6.0.bb
@@ -15,7 +15,7 @@ SRC_URI = "${KERNELORG_MIRROR}/linux/utils/net/${BPN}/${BP}.tar.xz \
file://0001-libc-compat.h-add-musl-workaround.patch \
"
-SRC_URI[sha256sum] = "a70179085fa1b96d3c33b040c809b75e2b57563adc505a4ad05e2609df373463"
+SRC_URI[sha256sum] = "8738c804afd09f0bf756937f0c3de23117832a98d8cbbf50386cf5005cd613ce"
inherit update-alternatives bash-completion pkgconfig
diff --git a/poky/meta/recipes-connectivity/kea/files/kea-dhcp-ddns.service b/poky/meta/recipes-connectivity/kea/files/kea-dhcp-ddns.service
index 91aa2eb14f..f6059d73cb 100644
--- a/poky/meta/recipes-connectivity/kea/files/kea-dhcp-ddns.service
+++ b/poky/meta/recipes-connectivity/kea/files/kea-dhcp-ddns.service
@@ -6,7 +6,6 @@ After=time-sync.target
[Service]
ExecStartPre=@BASE_BINDIR@/mkdir -p @LOCALSTATEDIR@/run/kea/
-ExecStartPre=@BASE_BINDIR@/mkdir -p @LOCALSTATEDIR@/kea
ExecStart=@SBINDIR@/kea-dhcp-ddns -c @SYSCONFDIR@/kea/kea-dhcp-ddns.conf
[Install]
diff --git a/poky/meta/recipes-connectivity/libuv/libuv_1.46.0.bb b/poky/meta/recipes-connectivity/libuv/libuv_1.47.0.bb
index c9aa25c518..50ad6ba5eb 100644
--- a/poky/meta/recipes-connectivity/libuv/libuv_1.46.0.bb
+++ b/poky/meta/recipes-connectivity/libuv/libuv_1.47.0.bb
@@ -6,7 +6,7 @@ LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=74b6f2f7818a4e3a80d03556f71b129b \
file://LICENSE-extra;md5=f9307417749e19bd1d6d68a394b49324"
-SRCREV = "f0bb7e40f0508bedf6fad33769b3f87bb8aedfa6"
+SRCREV = "be6b81a352d17513c95be153afcb3148f1a451cd"
SRC_URI = "git://github.com/libuv/libuv.git;branch=v1.x;protocol=https"
UPSTREAM_CHECK_GITTAGREGEX = "v(?P<pver>\d+(\.\d+)+)"
diff --git a/poky/meta/recipes-connectivity/openssh/openssh/0001-systemd-Add-optional-support-for-systemd-sd_notify.patch b/poky/meta/recipes-connectivity/openssh/openssh/0001-systemd-Add-optional-support-for-systemd-sd_notify.patch
new file mode 100644
index 0000000000..acda8f1ce9
--- /dev/null
+++ b/poky/meta/recipes-connectivity/openssh/openssh/0001-systemd-Add-optional-support-for-systemd-sd_notify.patch
@@ -0,0 +1,99 @@
+From be187435911cde6cc3cef6982a508261074f1e56 Mon Sep 17 00:00:00 2001
+From: Matt Jolly <Matt.Jolly@footclan.ninja>
+Date: Thu, 2 Feb 2023 21:05:40 +1100
+Subject: [PATCH] systemd: Add optional support for systemd `sd_notify`
+
+This is a rebase of Dennis Lamm's <expeditioneer@gentoo.org>
+patch based on Jakub Jelen's <jjelen@redhat.com> original patch
+
+Upstream-Status: Submitted [https://github.com/openssh/openssh-portable/pull/375/commits/be187435911cde6cc3cef6982a508261074f1e56]
+
+Signed-off-by: Xiangyu Chen <xiangyu.chen@windriver.com>
+---
+ configure.ac | 24 ++++++++++++++++++++++++
+ sshd.c | 13 +++++++++++++
+ 2 files changed, 37 insertions(+)
+
+diff --git a/configure.ac b/configure.ac
+index 22fee70f..486c189f 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -4835,6 +4835,29 @@ AC_SUBST([GSSLIBS])
+ AC_SUBST([K5LIBS])
+ AC_SUBST([CHANNELLIBS])
+
++# Check whether user wants systemd support
++SYSTEMD_MSG="no"
++AC_ARG_WITH(systemd,
++ [ --with-systemd Enable systemd support],
++ [ if test "x$withval" != "xno" ; then
++ AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no])
++ if test "$PKGCONFIG" != "no"; then
++ AC_MSG_CHECKING([for libsystemd])
++ if $PKGCONFIG --exists libsystemd; then
++ SYSTEMD_CFLAGS=`$PKGCONFIG --cflags libsystemd`
++ SYSTEMD_LIBS=`$PKGCONFIG --libs libsystemd`
++ CPPFLAGS="$CPPFLAGS $SYSTEMD_CFLAGS"
++ SSHDLIBS="$SSHDLIBS $SYSTEMD_LIBS"
++ AC_MSG_RESULT([yes])
++ AC_DEFINE(HAVE_SYSTEMD, 1, [Define if you want systemd support.])
++ SYSTEMD_MSG="yes"
++ else
++ AC_MSG_RESULT([no])
++ fi
++ fi
++ fi ]
++)
++
+ # Looking for programs, paths and files
+
+ PRIVSEP_PATH=/var/empty
+@@ -5634,6 +5657,7 @@ echo " libldns support: $LDNS_MSG"
+ echo " Solaris process contract support: $SPC_MSG"
+ echo " Solaris project support: $SP_MSG"
+ echo " Solaris privilege support: $SPP_MSG"
++echo " systemd support: $SYSTEMD_MSG"
+ echo " IP address in \$DISPLAY hack: $DISPLAY_HACK_MSG"
+ echo " Translate v4 in v6 hack: $IPV4_IN6_HACK_MSG"
+ echo " BSD Auth support: $BSD_AUTH_MSG"
+diff --git a/sshd.c b/sshd.c
+index 6321936c..859d6a0b 100644
+--- a/sshd.c
++++ b/sshd.c
+@@ -88,6 +88,10 @@
+ #include <prot.h>
+ #endif
+
++#ifdef HAVE_SYSTEMD
++#include <systemd/sd-daemon.h>
++#endif
++
+ #include "xmalloc.h"
+ #include "ssh.h"
+ #include "ssh2.h"
+@@ -310,6 +314,10 @@ static void
+ sighup_restart(void)
+ {
+ logit("Received SIGHUP; restarting.");
++#ifdef HAVE_SYSTEMD
++ /* Signal systemd that we are reloading */
++ sd_notify(0, "RELOADING=1");
++#endif
+ if (options.pid_file != NULL)
+ unlink(options.pid_file);
+ platform_pre_restart();
+@@ -2086,6 +2094,11 @@ main(int ac, char **av)
+ }
+ }
+
++#ifdef HAVE_SYSTEMD
++ /* Signal systemd that we are ready to accept connections */
++ sd_notify(0, "READY=1");
++#endif
++
+ /* Accept a connection and return in a forked child */
+ server_accept_loop(&sock_in, &sock_out,
+ &newsock, config_s);
+--
+2.25.1
+
diff --git a/poky/meta/recipes-connectivity/openssh/openssh/sshd.service b/poky/meta/recipes-connectivity/openssh/openssh/sshd.service
new file mode 100644
index 0000000000..2a997b656a
--- /dev/null
+++ b/poky/meta/recipes-connectivity/openssh/openssh/sshd.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=OpenSSH server daemon
+Wants=sshdgenkeys.service
+After=sshdgenkeys.service
+
+[Service]
+Environment="SSHD_OPTS="
+EnvironmentFile=-/etc/default/ssh
+ExecStartPre=@BASE_BINDIR@/mkdir -p /var/run/sshd
+ExecStart=-@SBINDIR@/sshd -D $SSHD_OPTS
+ExecReload=@BASE_BINDIR@/kill -HUP $MAINPID
+KillMode=process
+Restart=on-failure
+RestartSec=42s
+
+[Install]
+WantedBy=multi-user.target
diff --git a/poky/meta/recipes-connectivity/openssh/openssh_9.4p1.bb b/poky/meta/recipes-connectivity/openssh/openssh_9.5p1.bb
index e2508aa63a..bbb8fb091a 100644
--- a/poky/meta/recipes-connectivity/openssh/openssh_9.4p1.bb
+++ b/poky/meta/recipes-connectivity/openssh/openssh_9.5p1.bb
@@ -16,6 +16,7 @@ SRC_URI = "http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${PV}.tar
file://ssh_config \
file://init \
${@bb.utils.contains('DISTRO_FEATURES', 'pam', '${PAM_SRC_URI}', '', d)} \
+ file://sshd.service \
file://sshd.socket \
file://sshd@.service \
file://sshdgenkeys.service \
@@ -25,8 +26,9 @@ SRC_URI = "http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${PV}.tar
file://sshd_check_keys \
file://add-test-support-for-busybox.patch \
file://0001-regress-banner.sh-log-input-and-output-files-on-erro.patch \
+ file://0001-systemd-Add-optional-support-for-systemd-sd_notify.patch \
"
-SRC_URI[sha256sum] = "3608fd9088db2163ceb3e600c85ab79d0de3d221e59192ea1923e23263866a85"
+SRC_URI[sha256sum] = "f026e7b79ba7fb540f75182af96dc8a8f1db395f922bbc9f6ca603672686086b"
CVE_STATUS[CVE-2007-2768] = "not-applicable-config: This CVE is specific to OpenSSH with the pam opie which we don't build/use here."
@@ -48,9 +50,10 @@ INITSCRIPT_NAME:${PN}-sshd = "sshd"
INITSCRIPT_PARAMS:${PN}-sshd = "defaults 9"
SYSTEMD_PACKAGES = "${PN}-sshd"
-SYSTEMD_SERVICE:${PN}-sshd = "sshd.socket"
+SYSTEMD_SERVICE:${PN}-sshd = "sshd.socket sshd.service"
-inherit autotools-brokensep ptest
+inherit autotools-brokensep ptest pkgconfig
+DEPENDS += "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)}"
PACKAGECONFIG ??= ""
PACKAGECONFIG[kerberos] = "--with-kerberos5,--without-kerberos5,krb5"
@@ -68,6 +71,7 @@ EXTRA_OECONF = "'LOGIN_PROGRAM=${base_bindir}/login' \
--sysconfdir=${sysconfdir}/ssh \
--with-xauth=${bindir}/xauth \
--disable-strip \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '--with-systemd', '--without-systemd', d)} \
"
# musl doesn't implement wtmp/utmp and logwtmp
@@ -122,6 +126,7 @@ do_install:append () {
install -d ${D}${systemd_system_unitdir}
install -c -m 0644 ${WORKDIR}/sshd.socket ${D}${systemd_system_unitdir}
+ install -c -m 0644 ${WORKDIR}/sshd.service ${D}${systemd_system_unitdir}
install -c -m 0644 ${WORKDIR}/sshd@.service ${D}${systemd_system_unitdir}
install -c -m 0644 ${WORKDIR}/sshdgenkeys.service ${D}${systemd_system_unitdir}
sed -i -e 's,@BASE_BINDIR@,${base_bindir},g' \
diff --git a/poky/meta/recipes-connectivity/openssl/openssl/0001-Added-handshake-history-reporting-when-test-fails.patch b/poky/meta/recipes-connectivity/openssl/openssl/0001-Added-handshake-history-reporting-when-test-fails.patch
new file mode 100644
index 0000000000..aa2e5bb800
--- /dev/null
+++ b/poky/meta/recipes-connectivity/openssl/openssl/0001-Added-handshake-history-reporting-when-test-fails.patch
@@ -0,0 +1,374 @@
+From 5ba65051fea0513db0d997f0ab7cafb9826ed74a Mon Sep 17 00:00:00 2001
+From: William Lyu <William.Lyu@windriver.com>
+Date: Fri, 20 Oct 2023 16:22:37 -0400
+Subject: [PATCH] Added handshake history reporting when test fails
+
+Upstream-Status: Submitted [https://github.com/openssl/openssl/pull/22481]
+
+Signed-off-by: William Lyu <William.Lyu@windriver.com>
+---
+ test/helpers/handshake.c | 139 +++++++++++++++++++++++++++++----------
+ test/helpers/handshake.h | 70 +++++++++++++++++++-
+ test/ssl_test.c | 44 +++++++++++++
+ 3 files changed, 218 insertions(+), 35 deletions(-)
+
+diff --git a/test/helpers/handshake.c b/test/helpers/handshake.c
+index e0422469e4..ae2ad59dd4 100644
+--- a/test/helpers/handshake.c
++++ b/test/helpers/handshake.c
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2016-2022 The OpenSSL Project Authors. All Rights Reserved.
++ * Copyright 2016-2023 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+@@ -24,6 +24,102 @@
+ #include <netinet/sctp.h>
+ #endif
+
++/* Shamelessly copied from test/helpers/ssl_test_ctx.c */
++/* Maps string names to various enumeration type */
++typedef struct {
++ const char *name;
++ int value;
++} enum_name_map;
++
++static const enum_name_map connect_phase_names[] = {
++ {"Handshake", HANDSHAKE},
++ {"RenegAppData", RENEG_APPLICATION_DATA},
++ {"RenegSetup", RENEG_SETUP},
++ {"RenegHandshake", RENEG_HANDSHAKE},
++ {"AppData", APPLICATION_DATA},
++ {"Shutdown", SHUTDOWN},
++ {"ConnectionDone", CONNECTION_DONE}
++};
++
++static const enum_name_map peer_status_names[] = {
++ {"PeerSuccess", PEER_SUCCESS},
++ {"PeerRetry", PEER_RETRY},
++ {"PeerError", PEER_ERROR},
++ {"PeerWaiting", PEER_WAITING},
++ {"PeerTestFail", PEER_TEST_FAILURE}
++};
++
++static const enum_name_map handshake_status_names[] = {
++ {"HandshakeSuccess", HANDSHAKE_SUCCESS},
++ {"ClientError", CLIENT_ERROR},
++ {"ServerError", SERVER_ERROR},
++ {"InternalError", INTERNAL_ERROR},
++ {"HandshakeRetry", HANDSHAKE_RETRY}
++};
++
++/* Shamelessly copied from test/helpers/ssl_test_ctx.c */
++static const char *enum_name(const enum_name_map *enums, size_t num_enums,
++ int value)
++{
++ size_t i;
++ for (i = 0; i < num_enums; i++) {
++ if (enums[i].value == value) {
++ return enums[i].name;
++ }
++ }
++ return "InvalidValue";
++}
++
++const char *handshake_connect_phase_name(connect_phase_t phase)
++{
++ return enum_name(connect_phase_names, OSSL_NELEM(connect_phase_names),
++ (int)phase);
++}
++
++const char *handshake_status_name(handshake_status_t handshake_status)
++{
++ return enum_name(handshake_status_names, OSSL_NELEM(handshake_status_names),
++ (int)handshake_status);
++}
++
++const char *handshake_peer_status_name(peer_status_t peer_status)
++{
++ return enum_name(peer_status_names, OSSL_NELEM(peer_status_names),
++ (int)peer_status);
++}
++
++static void save_loop_history(HANDSHAKE_HISTORY *history,
++ connect_phase_t phase,
++ handshake_status_t handshake_status,
++ peer_status_t server_status,
++ peer_status_t client_status,
++ int client_turn_count,
++ int is_client_turn)
++{
++ HANDSHAKE_HISTORY_ENTRY *new_entry = NULL;
++
++ /*
++ * Create a new history entry for a handshake loop with statuses given in
++ * the arguments. Potentially evicting the oldest entry when the
++ * ring buffer is full.
++ */
++ ++(history->last_idx);
++ history->last_idx &= MAX_HANDSHAKE_HISTORY_ENTRY_IDX_MASK;
++
++ new_entry = &((history->entries)[history->last_idx]);
++ new_entry->phase = phase;
++ new_entry->handshake_status = handshake_status;
++ new_entry->server_status = server_status;
++ new_entry->client_status = client_status;
++ new_entry->client_turn_count = client_turn_count;
++ new_entry->is_client_turn = is_client_turn;
++
++ /* Evict the oldest handshake loop entry when the ring buffer is full. */
++ if (history->entry_count < MAX_HANDSHAKE_HISTORY_ENTRY) {
++ ++(history->entry_count);
++ }
++}
++
+ HANDSHAKE_RESULT *HANDSHAKE_RESULT_new(void)
+ {
+ HANDSHAKE_RESULT *ret;
+@@ -719,15 +815,6 @@ static void configure_handshake_ssl(SSL *server, SSL *client,
+ SSL_set_post_handshake_auth(client, 1);
+ }
+
+-/* The status for each connection phase. */
+-typedef enum {
+- PEER_SUCCESS,
+- PEER_RETRY,
+- PEER_ERROR,
+- PEER_WAITING,
+- PEER_TEST_FAILURE
+-} peer_status_t;
+-
+ /* An SSL object and associated read-write buffers. */
+ typedef struct peer_st {
+ SSL *ssl;
+@@ -1074,17 +1161,6 @@ static void do_shutdown_step(PEER *peer)
+ }
+ }
+
+-typedef enum {
+- HANDSHAKE,
+- RENEG_APPLICATION_DATA,
+- RENEG_SETUP,
+- RENEG_HANDSHAKE,
+- APPLICATION_DATA,
+- SHUTDOWN,
+- CONNECTION_DONE
+-} connect_phase_t;
+-
+-
+ static int renegotiate_op(const SSL_TEST_CTX *test_ctx)
+ {
+ switch (test_ctx->handshake_mode) {
+@@ -1162,19 +1238,6 @@ static void do_connect_step(const SSL_TEST_CTX *test_ctx, PEER *peer,
+ }
+ }
+
+-typedef enum {
+- /* Both parties succeeded. */
+- HANDSHAKE_SUCCESS,
+- /* Client errored. */
+- CLIENT_ERROR,
+- /* Server errored. */
+- SERVER_ERROR,
+- /* Peers are in inconsistent state. */
+- INTERNAL_ERROR,
+- /* One or both peers not done. */
+- HANDSHAKE_RETRY
+-} handshake_status_t;
+-
+ /*
+ * Determine the handshake outcome.
+ * last_status: the status of the peer to have acted last.
+@@ -1539,6 +1602,10 @@ static HANDSHAKE_RESULT *do_handshake_internal(
+
+ start = time(NULL);
+
++ save_loop_history(&(ret->history),
++ phase, status, server.status, client.status,
++ client_turn_count, client_turn);
++
+ /*
+ * Half-duplex handshake loop.
+ * Client and server speak to each other synchronously in the same process.
+@@ -1560,6 +1627,10 @@ static HANDSHAKE_RESULT *do_handshake_internal(
+ 0 /* server went last */);
+ }
+
++ save_loop_history(&(ret->history),
++ phase, status, server.status, client.status,
++ client_turn_count, client_turn);
++
+ switch (status) {
+ case HANDSHAKE_SUCCESS:
+ client_turn_count = 0;
+diff --git a/test/helpers/handshake.h b/test/helpers/handshake.h
+index 78b03f9f4b..b9967c2623 100644
+--- a/test/helpers/handshake.h
++++ b/test/helpers/handshake.h
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved.
++ * Copyright 2016-2023 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+@@ -12,6 +12,11 @@
+
+ #include "ssl_test_ctx.h"
+
++#define MAX_HANDSHAKE_HISTORY_ENTRY_BIT 4
++#define MAX_HANDSHAKE_HISTORY_ENTRY (1 << MAX_HANDSHAKE_HISTORY_ENTRY_BIT)
++#define MAX_HANDSHAKE_HISTORY_ENTRY_IDX_MASK \
++ ((1 << MAX_HANDSHAKE_HISTORY_ENTRY_BIT) - 1)
++
+ typedef struct ctx_data_st {
+ unsigned char *npn_protocols;
+ size_t npn_protocols_len;
+@@ -22,6 +27,63 @@ typedef struct ctx_data_st {
+ char *session_ticket_app_data;
+ } CTX_DATA;
+
++typedef enum {
++ HANDSHAKE,
++ RENEG_APPLICATION_DATA,
++ RENEG_SETUP,
++ RENEG_HANDSHAKE,
++ APPLICATION_DATA,
++ SHUTDOWN,
++ CONNECTION_DONE
++} connect_phase_t;
++
++/* The status for each connection phase. */
++typedef enum {
++ PEER_SUCCESS,
++ PEER_RETRY,
++ PEER_ERROR,
++ PEER_WAITING,
++ PEER_TEST_FAILURE
++} peer_status_t;
++
++typedef enum {
++ /* Both parties succeeded. */
++ HANDSHAKE_SUCCESS,
++ /* Client errored. */
++ CLIENT_ERROR,
++ /* Server errored. */
++ SERVER_ERROR,
++ /* Peers are in inconsistent state. */
++ INTERNAL_ERROR,
++ /* One or both peers not done. */
++ HANDSHAKE_RETRY
++} handshake_status_t;
++
++/* Stores the various status information in a handshake loop. */
++typedef struct handshake_history_entry_st {
++ connect_phase_t phase;
++ handshake_status_t handshake_status;
++ peer_status_t server_status;
++ peer_status_t client_status;
++ int client_turn_count;
++ int is_client_turn;
++} HANDSHAKE_HISTORY_ENTRY;
++
++typedef struct handshake_history_st {
++ /* Implemented using ring buffer. */
++ /*
++ * The valid entries are |entries[last_idx]|, |entries[last_idx-1]|,
++ * ..., etc., going up to |entry_count| number of entries. Note that when
++ * the index into the array |entries| becomes < 0, we wrap around to
++ * the end of |entries|.
++ */
++ HANDSHAKE_HISTORY_ENTRY entries[MAX_HANDSHAKE_HISTORY_ENTRY];
++ /* The number of valid entries in |entries| array. */
++ size_t entry_count;
++ /* The index of the last valid entry in the |entries| array. */
++ size_t last_idx;
++} HANDSHAKE_HISTORY;
++
+ typedef struct handshake_result {
+ ssl_test_result_t result;
+ /* These alerts are in the 2-byte format returned by the info_callback. */
+@@ -77,6 +139,8 @@ typedef struct handshake_result {
+ char *cipher;
+ /* session ticket application data */
+ char *result_session_ticket_app_data;
++ /* handshake loop history */
++ HANDSHAKE_HISTORY history;
+ } HANDSHAKE_RESULT;
+
+ HANDSHAKE_RESULT *HANDSHAKE_RESULT_new(void);
+@@ -95,4 +159,8 @@ int configure_handshake_ctx_for_srp(SSL_CTX *server_ctx, SSL_CTX *server2_ctx,
+ CTX_DATA *server2_ctx_data,
+ CTX_DATA *client_ctx_data);
+
++const char *handshake_connect_phase_name(connect_phase_t phase);
++const char *handshake_status_name(handshake_status_t handshake_status);
++const char *handshake_peer_status_name(peer_status_t peer_status);
++
+ #endif /* OSSL_TEST_HANDSHAKE_HELPER_H */
+diff --git a/test/ssl_test.c b/test/ssl_test.c
+index ea608518f9..9d6b093c81 100644
+--- a/test/ssl_test.c
++++ b/test/ssl_test.c
+@@ -26,6 +26,44 @@ static OSSL_LIB_CTX *libctx = NULL;
+ /* Currently the section names are of the form test-<number>, e.g. test-15. */
+ #define MAX_TESTCASE_NAME_LENGTH 100
+
++static void print_handshake_history(const HANDSHAKE_HISTORY *history)
++{
++ size_t first_idx;
++ size_t i;
++ size_t cur_idx;
++ const HANDSHAKE_HISTORY_ENTRY *cur_entry;
++ const char header_template[] = "|%14s|%16s|%16s|%16s|%17s|%14s|";
++ const char body_template[] = "|%14s|%16s|%16s|%16s|%17d|%14s|";
++
++ TEST_info("The following is the server/client state "
++ "in the most recent %d handshake loops.",
++ MAX_HANDSHAKE_HISTORY_ENTRY);
++
++ TEST_note("=================================================="
++ "==================================================");
++ TEST_note(header_template,
++ "phase", "handshake status", "server status",
++ "client status", "client turn count", "is client turn");
++ TEST_note("+--------------+----------------+----------------"
++ "+----------------+-----------------+--------------+");
++
++ first_idx = (history->last_idx - history->entry_count + 1) &
++ MAX_HANDSHAKE_HISTORY_ENTRY_IDX_MASK;
++ for (i = 0; i < history->entry_count; ++i) {
++ cur_idx = (first_idx + i) & MAX_HANDSHAKE_HISTORY_ENTRY_IDX_MASK;
++ cur_entry = &(history->entries)[cur_idx];
++ TEST_note(body_template,
++ handshake_connect_phase_name(cur_entry->phase),
++ handshake_status_name(cur_entry->handshake_status),
++ handshake_peer_status_name(cur_entry->server_status),
++ handshake_peer_status_name(cur_entry->client_status),
++ cur_entry->client_turn_count,
++ cur_entry->is_client_turn ? "true" : "false");
++ }
++ TEST_note("=================================================="
++ "==================================================");
++}
++
+ static const char *print_alert(int alert)
+ {
+ return alert ? SSL_alert_desc_string_long(alert) : "no alert";
+@@ -388,6 +426,12 @@ static int check_test(HANDSHAKE_RESULT *result, SSL_TEST_CTX *test_ctx)
+ ret &= check_client_sign_type(result, test_ctx);
+ ret &= check_client_ca_names(result, test_ctx);
+ }
++
++ /* Print handshake loop history if any check fails. */
++ if (!ret) {
++ print_handshake_history(&(result->history));
++ }
++
+ return ret;
+ }
+
+--
+2.25.1
+
diff --git a/poky/meta/recipes-connectivity/openssl/openssl/0001-Link-libatomic-on-riscv32.patch b/poky/meta/recipes-connectivity/openssl/openssl/0001-Link-libatomic-on-riscv32.patch
new file mode 100644
index 0000000000..2c54d8f685
--- /dev/null
+++ b/poky/meta/recipes-connectivity/openssl/openssl/0001-Link-libatomic-on-riscv32.patch
@@ -0,0 +1,35 @@
+From 73266b8573c71e6720453c4c5a9e6e8fa4daec65 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 21 Oct 2023 13:03:52 -0700
+Subject: [PATCH] Link libatomic on riscv32
+
+GCC toolchains on linux are not able to build libcrypto without linking
+to libatomic as it does not have all needed atomics implemented as
+intrinsics
+
+Fixes errors like
+
+| ld: ./libcrypto.so: undefined reference to `__atomic_is_lock_free'
+
+Upstream-Status: Submitted [https://github.com/openssl/openssl/pull/22460]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ Configurations/10-main.conf | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf
+index 46094f59c2..d1a15a1152 100644
+--- a/Configurations/10-main.conf
++++ b/Configurations/10-main.conf
+@@ -816,7 +816,7 @@ my %targets = (
+ },
+
+ "linux32-riscv32" => {
+- inherit_from => [ "linux-generic32"],
++ inherit_from => [ "linux-latomic" ],
+ perlasm_scheme => "linux32",
+ asm_arch => 'riscv32',
+ },
+--
+2.42.0
+
diff --git a/poky/meta/recipes-connectivity/openssl/openssl_3.1.3.bb b/poky/meta/recipes-connectivity/openssl/openssl_3.1.4.bb
index cc9452c8ab..c6c70a1213 100644
--- a/poky/meta/recipes-connectivity/openssl/openssl_3.1.3.bb
+++ b/poky/meta/recipes-connectivity/openssl/openssl_3.1.4.bb
@@ -12,13 +12,15 @@ SRC_URI = "http://www.openssl.org/source/openssl-${PV}.tar.gz \
file://0001-buildinfo-strip-sysroot-and-debug-prefix-map-from-co.patch \
file://0001-Configure-do-not-tweak-mips-cflags.patch \
file://fix_random_labels.patch \
+ file://0001-Link-libatomic-on-riscv32.patch \
+ file://0001-Added-handshake-history-reporting-when-test-fails.patch \
"
SRC_URI:append:class-nativesdk = " \
file://environment.d-openssl.sh \
"
-SRC_URI[sha256sum] = "f0316a2ebd89e7f2352976445458689f80302093788c466692fb2a188b2eacf6"
+SRC_URI[sha256sum] = "840af5366ab9b522bde525826be3ef0fb0af81c6a9ebd84caa600fea1731eee3"
inherit lib_package multilib_header multilib_script ptest perlnative manpages
MULTILIB_SCRIPTS = "${PN}-bin:${bindir}/c_rehash"
@@ -119,10 +121,10 @@ do_configure () {
target=linux-ppc64le
;;
linux-riscv32)
- target=linux-latomic
+ target=linux32-riscv32
;;
linux-riscv64)
- target=linux-generic64
+ target=linux64-riscv64
;;
linux-sparc | linux-supersparc)
target=linux-sparcv9
diff --git a/poky/meta/recipes-core/base-files/base-files/0001-add-nss-resolve-to-nsswitch.patch b/poky/meta/recipes-core/base-files/base-files/0001-add-nss-resolve-to-nsswitch.patch
new file mode 100644
index 0000000000..a6e39e0956
--- /dev/null
+++ b/poky/meta/recipes-core/base-files/base-files/0001-add-nss-resolve-to-nsswitch.patch
@@ -0,0 +1,31 @@
+From 830abe652428d9d31780c3ace121635ad7b64274 Mon Sep 17 00:00:00 2001
+From: Eero Aaltonen <eero.aaltonen@vaisala.com>
+Date: Wed Sep 27 15:50:48 2023 +0300
+Subject: [PATCH] Add nss-resolve to the Name Service Switch (NSS)
+
+Add `nss-resolve` so that `systemd-resolved` is used for name
+resolution with glibc `gethostbyname` calls.
+
+Upstream-Status: Inappropriate [no upstream, configuration].
+
+Signed-off-by: Eero Aaltonen <eero.aaltonen@vaisala.com>
+---
+ nsswitch.conf | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/nsswitch.conf b/nsswitch.conf
+index 06f03d2..34b165c 100644
+--- a/nsswitch.conf
++++ b/nsswitch.conf
+@@ -8,7 +8,7 @@ passwd: compat
+ group: compat
+ shadow: compat
+
+-hosts: files dns
++hosts: resolve [!UNAVAIL=return] files dns
+ networks: files
+
+ protocols: db files
+--
+2.25.1
+
diff --git a/poky/meta/recipes-core/base-files/base-files/profile b/poky/meta/recipes-core/base-files/base-files/profile
index cc37e1ba77..bded3757cc 100644
--- a/poky/meta/recipes-core/base-files/base-files/profile
+++ b/poky/meta/recipes-core/base-files/base-files/profile
@@ -10,6 +10,12 @@ PATH="/usr/local/bin:/usr/bin:/bin"
# Set the prompt for bash and ash (no other shells known to be in use here)
[ -z "$PS1" ] || PS1='\u@\h:\w\$ '
+# Use the EDITOR not being set as a trigger to call resize later on
+FIRSTTIMESETUP=0
+if [ -z "$EDITOR" ] ; then
+ FIRSTTIMESETUP=1
+fi
+
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -f $i -a -r $i ]; then
@@ -50,17 +56,19 @@ resize() {
}
fi
fi
- # Use the EDITOR not being set as a trigger to call resize
- # and only do this for /dev/tty[A-z] which are typically
+ # only do this for /dev/tty[A-z] which are typically
# serial ports
- if [ -z "$EDITOR" -a "$SHLVL" = 1 ] ; then
+ if [ $FIRSTTIMESETUP -eq 1 -a $SHLVL -eq 1 ] ; then
case $(tty 2>/dev/null) in
/dev/tty[A-z]*) resize >/dev/null;;
esac
fi
fi
-EDITOR="vi" # needed for packages like cron, git-commit
+if [ -z "$EDITOR" ]; then
+ EDITOR="vi" # needed for packages like cron, git-commit
+fi
+
export PATH PS1 OPIEDIR QPEDIR QTDIR EDITOR TERM
umask 022
diff --git a/poky/meta/recipes-core/base-files/base-files_3.0.14.bb b/poky/meta/recipes-core/base-files/base-files_3.0.14.bb
index 6ba3971e32..9fab53ce63 100644
--- a/poky/meta/recipes-core/base-files/base-files_3.0.14.bb
+++ b/poky/meta/recipes-core/base-files/base-files_3.0.14.bb
@@ -23,6 +23,8 @@ SRC_URI = "file://rotation \
file://share/dot.profile \
file://licenses/GPL-2 \
"
+SRC_URI:append:libc-glibc = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd systemd-resolved', ' file://0001-add-nss-resolve-to-nsswitch.patch', '', d)}"
+
S = "${WORKDIR}"
INHIBIT_DEFAULT_DEPS = "1"
@@ -136,6 +138,10 @@ do_install () {
echo ${hostname} > ${D}${sysconfdir}/hostname
echo "127.0.1.1 ${hostname}" >> ${D}${sysconfdir}/hosts
fi
+
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'ipv6', 'false', 'true', d)}; then
+ sed -i '/^::1/s/ localhost//' ${D}${sysconfdir}/hosts
+ fi
}
do_install:append:libc-glibc () {
diff --git a/poky/meta/recipes-core/base-passwd/base-passwd/0006-Make-it-possible-to-configure-whether-to-use-SELinux.patch b/poky/meta/recipes-core/base-passwd/base-passwd/0006-Make-it-possible-to-configure-whether-to-use-SELinux.patch
deleted file mode 100644
index 2cc6174e2a..0000000000
--- a/poky/meta/recipes-core/base-passwd/base-passwd/0006-Make-it-possible-to-configure-whether-to-use-SELinux.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 25e3bf09bbbb04aa930ea0fd9f28809a24fb7194 Mon Sep 17 00:00:00 2001
-From: Peter Kjellerstedt <pkj@axis.com>
-Date: Sun, 2 Oct 2022 17:47:29 +0200
-Subject: [PATCH] Make it possible to configure whether to use SELinux or not
-
-Upstream-Status: Backport [https://salsa.debian.org/debian/base-passwd/-/commit/396c41bb35e03c5dcc727aa9f74218a45874ac1f]
-Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
----
- configure.ac | 13 ++++++++++++-
- 1 file changed, 12 insertions(+), 1 deletion(-)
-
-diff --git a/configure.ac b/configure.ac
-index 589df88..e46403b 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -13,7 +13,18 @@ AC_SYS_LARGEFILE
-
- dnl Scan for things we need
- AC_CHECK_FUNCS([putgrent])
--AC_CHECK_LIB([selinux], [is_selinux_enabled])
-+
-+dnl Check for SELinux
-+AC_MSG_CHECKING([whether to enable SELinux support])
-+AC_ARG_ENABLE([selinux],
-+ [AS_HELP_STRING([--disable-selinux], [disable support for SELinux])],
-+ [],
-+ [enable_selinux=yes])
-+AC_MSG_RESULT($enable_selinux)
-+AS_IF([test "x$enable_selinux" != xno],
-+ [AC_CHECK_LIB([selinux], [is_selinux_enabled], [],
-+ [AC_MSG_ERROR(
-+ [SELinux support not available (use --disable-selinux to disable)])])])
-
- dnl Check for debconf
- AC_MSG_CHECKING([whether to enable debconf support])
diff --git a/poky/meta/recipes-core/base-passwd/base-passwd_3.6.1.bb b/poky/meta/recipes-core/base-passwd/base-passwd_3.6.2.bb
index 44bcfb0199..bb4b49e6ab 100644
--- a/poky/meta/recipes-core/base-passwd/base-passwd_3.6.1.bb
+++ b/poky/meta/recipes-core/base-passwd/base-passwd_3.6.2.bb
@@ -11,12 +11,11 @@ SRC_URI = "https://launchpad.net/debian/+archive/primary/+files/${BPN}_${PV}.tar
file://0003-Remove-for-root-since-we-do-not-have-an-etc-shadow.patch \
file://0004-Add-an-input-group-for-the-dev-input-devices.patch \
file://0005-Add-kvm-group.patch \
- file://0006-Make-it-possible-to-configure-whether-to-use-SELinux.patch \
file://0007-Add-wheel-group.patch \
file://0001-base-passwd-Add-the-sgx-group.patch \
"
-SRC_URI[sha256sum] = "6ff369be59d586ba63c0c5fcb00f75f9953fe49db88bc6c6428f2c92866f79af"
+SRC_URI[sha256sum] = "06dc78352bf38a8df76ff295e15ab5654cdefe41e62368b15bfcbbab8e4ec2a0"
# the package is taken from launchpad; that source is static and goes stale
# so we check the latest upstream from a directory that does get updated
diff --git a/poky/meta/recipes-core/ell/ell_0.58.bb b/poky/meta/recipes-core/ell/ell_0.59.bb
index 04e8566305..0483dbe582 100644
--- a/poky/meta/recipes-core/ell/ell_0.58.bb
+++ b/poky/meta/recipes-core/ell/ell_0.59.bb
@@ -15,7 +15,7 @@ DEPENDS = "dbus"
inherit autotools pkgconfig
SRC_URI = "https://mirrors.edge.kernel.org/pub/linux/libs/${BPN}/${BPN}-${PV}.tar.xz"
-SRC_URI[sha256sum] = "531a980589c8954ff12a3110b4d958fa75a74c88ddcc3e2ace4317e76a7c1e9b"
+SRC_URI[sha256sum] = "370dc2b7c73cd57856017180a2a70a15ca1b0183bfd453b3cffe2d707c37da3d"
do_configure:prepend () {
mkdir -p ${S}/build-aux
diff --git a/poky/meta/recipes-core/gettext/gettext/use-pkgconfig.patch b/poky/meta/recipes-core/gettext/gettext/use-pkgconfig.patch
index c12e0d3b88..f1fb61de4e 100644
--- a/poky/meta/recipes-core/gettext/gettext/use-pkgconfig.patch
+++ b/poky/meta/recipes-core/gettext/gettext/use-pkgconfig.patch
@@ -15,14 +15,9 @@ Signed-off-by: Ross Burton <ross.burton@intel.com>
---
gettext-tools/gnulib-m4/libxml.m4 | 105 +----------------
- .../gnulib-local/lib/term-styled-ostream.oo.c | 12 +-
- libtextstyle/gnulib-local/m4/libcroco.m4 | 98 +++-------------
libtextstyle/gnulib-local/m4/libglib.m4 | 106 +++---------------
- libtextstyle/gnulib-m4/libcroco.m4 | 98 +++-------------
libtextstyle/gnulib-m4/libglib.m4 | 106 +++---------------
- libtextstyle/lib/term-styled-ostream.c | 12 +-
- libtextstyle/lib/term-styled-ostream.oo.c | 12 +-
- 8 files changed, 79 insertions(+), 470 deletions(-)
+ 3 files changed, 79 insertions(+), 470 deletions(-)
diff --git a/gettext-tools/gnulib-m4/libxml.m4 b/gettext-tools/gnulib-m4/libxml.m4
index 0340490..0355388 100644
@@ -147,149 +142,6 @@ index 0340490..0355388 100644
fi
])
AC_SUBST([LIBXML])
-diff --git a/libtextstyle/gnulib-local/lib/term-styled-ostream.oo.c b/libtextstyle/gnulib-local/lib/term-styled-ostream.oo.c
-index 2ff978f..5ffb17a 100644
---- a/libtextstyle/gnulib-local/lib/term-styled-ostream.oo.c
-+++ b/libtextstyle/gnulib-local/lib/term-styled-ostream.oo.c
-@@ -22,15 +22,15 @@
-
- #include <stdlib.h>
-
--#include <cr-om-parser.h>
--#include <cr-sel-eng.h>
--#include <cr-style.h>
--#include <cr-rgb.h>
-+#include <libcroco/cr-om-parser.h>
-+#include <libcroco/cr-sel-eng.h>
-+#include <libcroco/cr-style.h>
-+#include <libcroco/cr-rgb.h>
- /* <cr-fonts.h> has a broken double-inclusion guard in libcroco-0.6.1. */
- #ifndef __CR_FONTS_H__
--# include <cr-fonts.h>
-+# include <libcroco/cr-fonts.h>
- #endif
--#include <cr-string.h>
-+#include <libcroco/cr-string.h>
-
- #include "term-ostream.h"
- #include "mem-hash-map.h"
-diff --git a/libtextstyle/gnulib-local/m4/libcroco.m4 b/libtextstyle/gnulib-local/m4/libcroco.m4
-index 39e72b1..042915a 100644
---- a/libtextstyle/gnulib-local/m4/libcroco.m4
-+++ b/libtextstyle/gnulib-local/m4/libcroco.m4
-@@ -6,97 +6,29 @@ dnl with or without modifications, as long as this notice is preserved.
-
- dnl From Bruno Haible.
-
--dnl gl_LIBCROCO
--dnl gives the user the option to decide whether to use the included or
--dnl an external libcroco.
--dnl gl_LIBCROCO(FORCE-INCLUDED)
--dnl forces the use of the included or an external libcroco.
- AC_DEFUN([gl_LIBCROCO],
- [
-- ifelse([$1], [yes], , [
-- dnl libcroco depends on libglib.
-- AC_REQUIRE([gl_LIBGLIB])
-- ])
-+ AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-+ dnl libcroco depends on libglib.
-+ AC_REQUIRE([gl_LIBGLIB])
-
-- ifelse([$1], , [
-- AC_MSG_CHECKING([whether included libcroco is requested])
-- AC_ARG_WITH([included-libcroco],
-- [ --with-included-libcroco use the libcroco included here],
-- [gl_cv_libcroco_force_included=$withval],
-- [gl_cv_libcroco_force_included=no])
-- AC_MSG_RESULT([$gl_cv_libcroco_force_included])
-- ], [gl_cv_libcroco_force_included=$1])
-+ AC_MSG_CHECKING([whether included libcroco is requested])
-+ AC_ARG_WITH([included-libcroco],
-+ [ --with-included-libcroco use the libcroco included here],
-+ [gl_cv_libcroco_force_included=$withval],
-+ [gl_cv_libcroco_force_included=no])
-+ AC_MSG_RESULT([$gl_cv_libcroco_force_included])
-
- gl_cv_libcroco_use_included="$gl_cv_libcroco_force_included"
- LIBCROCO=
- LTLIBCROCO=
- INCCROCO=
-- ifelse([$1], [yes], , [
-- if test "$gl_cv_libcroco_use_included" != yes; then
-- dnl Figure out whether we can use a preinstalled libcroco-0.6, or have to
-- dnl use the included one.
-- AC_CACHE_VAL([gl_cv_libcroco], [
-- gl_cv_libcroco=no
-- gl_cv_LIBCROCO=
-- gl_cv_LTLIBCROCO=
-- gl_cv_INCCROCO=
-- gl_save_LIBS="$LIBS"
-- dnl Search for libcroco and define LIBCROCO_0_6, LTLIBCROCO_0_6 and
-- dnl INCCROCO_0_6 accordingly.
-- dnl Don't use croco-0.6-config nor pkg-config, since it doesn't work when
-- dnl cross-compiling or when the C compiler in use is different from the
-- dnl one that built the library.
-- AC_LIB_LINKFLAGS_BODY([croco-0.6], [glib-2.0])
-- LIBS="$gl_save_LIBS $LIBCROCO_0_6"
-- AC_LINK_IFELSE(
-- [AC_LANG_PROGRAM([[#include <libcroco-config.h>]],
-- [[const char *version = LIBCROCO_VERSION; return !version;]])],
-- [gl_cv_libcroco=yes
-- gl_cv_LIBCROCO="$LIBCROCO_0_6"
-- gl_cv_LTLIBCROCO="$LTLIBCROCO_0_6"
-- ])
-- if test "$gl_cv_libcroco" != yes; then
-- gl_save_CPPFLAGS="$CPPFLAGS"
-- CPPFLAGS="$CPPFLAGS $INCCROCO_0_6"
-- AC_LINK_IFELSE(
-- [AC_LANG_PROGRAM([[#include <libcroco-config.h>]],
-- [[const char *version = LIBCROCO_VERSION; return !version;]])],
-- [gl_cv_libcroco=yes
-- gl_cv_LIBCROCO="$LIBCROCO_0_6"
-- gl_cv_LTLIBCROCO="$LTLIBCROCO_0_6"
-- gl_cv_INCCROCO="$INCCROCO_0_6"
-- ])
-- if test "$gl_cv_libcroco" != yes; then
-- dnl Often the include files are installed in
-- dnl /usr/include/libcroco-0.6/libcroco.
-- AC_LINK_IFELSE(
-- [AC_LANG_PROGRAM([[#include <libcroco-config.h>]],
-- [[const char *version = LIBCROCO_VERSION; return !version;]])],
-- [gl_ABSOLUTE_HEADER([libcroco-0.6/libcroco/libcroco-config.h])
-- libcroco_include_dir=`echo "$gl_cv_absolute_libcroco_0_6_libcroco_libcroco_config_h" | sed -e 's,.libcroco-config\.h$,,'`
-- if test -d "$libcroco_include_dir"; then
-- gl_cv_libcroco=yes
-- gl_cv_LIBCROCO="$LIBCROCO_0_6"
-- gl_cv_LTLIBCROCO="$LTLIBCROCO_0_6"
-- gl_cv_INCCROCO="-I$libcroco_include_dir"
-- fi
-- ])
-- fi
-- CPPFLAGS="$gl_save_CPPFLAGS"
-- fi
-- LIBS="$gl_save_LIBS"
-- ])
-- AC_MSG_CHECKING([for libcroco])
-- AC_MSG_RESULT([$gl_cv_libcroco])
-- if test $gl_cv_libcroco = yes; then
-- LIBCROCO="$gl_cv_LIBCROCO"
-- LTLIBCROCO="$gl_cv_LTLIBCROCO"
-- INCCROCO="$gl_cv_INCCROCO"
-- else
-- gl_cv_libcroco_use_included=yes
-- fi
-- fi
-- ])
-+ if test "$gl_cv_libcroco_use_included" != yes; then
-+ PKG_CHECK_MODULES([CROCO], [libcroco-0.6])
-+ LIBCROCO=$CROCO_LIBS
-+ LTLIBCROCO=$CROCO_LIBS
-+ INCCROCO=$CROCO_CFLAGS
-+ fi
- AC_SUBST([LIBCROCO])
- AC_SUBST([LTLIBCROCO])
- AC_SUBST([INCCROCO])
diff --git a/libtextstyle/gnulib-local/m4/libglib.m4 b/libtextstyle/gnulib-local/m4/libglib.m4
index 7ee5029..bb1e5e4 100644
--- a/libtextstyle/gnulib-local/m4/libglib.m4
@@ -414,123 +266,6 @@ index 7ee5029..bb1e5e4 100644
AC_SUBST([LIBGLIB])
AC_SUBST([LTLIBGLIB])
AC_SUBST([INCGLIB])
-diff --git a/libtextstyle/gnulib-m4/libcroco.m4 b/libtextstyle/gnulib-m4/libcroco.m4
-index 39e72b1..042915a 100644
---- a/libtextstyle/gnulib-m4/libcroco.m4
-+++ b/libtextstyle/gnulib-m4/libcroco.m4
-@@ -6,97 +6,29 @@ dnl with or without modifications, as long as this notice is preserved.
-
- dnl From Bruno Haible.
-
--dnl gl_LIBCROCO
--dnl gives the user the option to decide whether to use the included or
--dnl an external libcroco.
--dnl gl_LIBCROCO(FORCE-INCLUDED)
--dnl forces the use of the included or an external libcroco.
- AC_DEFUN([gl_LIBCROCO],
- [
-- ifelse([$1], [yes], , [
-- dnl libcroco depends on libglib.
-- AC_REQUIRE([gl_LIBGLIB])
-- ])
-+ AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-+ dnl libcroco depends on libglib.
-+ AC_REQUIRE([gl_LIBGLIB])
-
-- ifelse([$1], , [
-- AC_MSG_CHECKING([whether included libcroco is requested])
-- AC_ARG_WITH([included-libcroco],
-- [ --with-included-libcroco use the libcroco included here],
-- [gl_cv_libcroco_force_included=$withval],
-- [gl_cv_libcroco_force_included=no])
-- AC_MSG_RESULT([$gl_cv_libcroco_force_included])
-- ], [gl_cv_libcroco_force_included=$1])
-+ AC_MSG_CHECKING([whether included libcroco is requested])
-+ AC_ARG_WITH([included-libcroco],
-+ [ --with-included-libcroco use the libcroco included here],
-+ [gl_cv_libcroco_force_included=$withval],
-+ [gl_cv_libcroco_force_included=no])
-+ AC_MSG_RESULT([$gl_cv_libcroco_force_included])
-
- gl_cv_libcroco_use_included="$gl_cv_libcroco_force_included"
- LIBCROCO=
- LTLIBCROCO=
- INCCROCO=
-- ifelse([$1], [yes], , [
-- if test "$gl_cv_libcroco_use_included" != yes; then
-- dnl Figure out whether we can use a preinstalled libcroco-0.6, or have to
-- dnl use the included one.
-- AC_CACHE_VAL([gl_cv_libcroco], [
-- gl_cv_libcroco=no
-- gl_cv_LIBCROCO=
-- gl_cv_LTLIBCROCO=
-- gl_cv_INCCROCO=
-- gl_save_LIBS="$LIBS"
-- dnl Search for libcroco and define LIBCROCO_0_6, LTLIBCROCO_0_6 and
-- dnl INCCROCO_0_6 accordingly.
-- dnl Don't use croco-0.6-config nor pkg-config, since it doesn't work when
-- dnl cross-compiling or when the C compiler in use is different from the
-- dnl one that built the library.
-- AC_LIB_LINKFLAGS_BODY([croco-0.6], [glib-2.0])
-- LIBS="$gl_save_LIBS $LIBCROCO_0_6"
-- AC_LINK_IFELSE(
-- [AC_LANG_PROGRAM([[#include <libcroco-config.h>]],
-- [[const char *version = LIBCROCO_VERSION; return !version;]])],
-- [gl_cv_libcroco=yes
-- gl_cv_LIBCROCO="$LIBCROCO_0_6"
-- gl_cv_LTLIBCROCO="$LTLIBCROCO_0_6"
-- ])
-- if test "$gl_cv_libcroco" != yes; then
-- gl_save_CPPFLAGS="$CPPFLAGS"
-- CPPFLAGS="$CPPFLAGS $INCCROCO_0_6"
-- AC_LINK_IFELSE(
-- [AC_LANG_PROGRAM([[#include <libcroco-config.h>]],
-- [[const char *version = LIBCROCO_VERSION; return !version;]])],
-- [gl_cv_libcroco=yes
-- gl_cv_LIBCROCO="$LIBCROCO_0_6"
-- gl_cv_LTLIBCROCO="$LTLIBCROCO_0_6"
-- gl_cv_INCCROCO="$INCCROCO_0_6"
-- ])
-- if test "$gl_cv_libcroco" != yes; then
-- dnl Often the include files are installed in
-- dnl /usr/include/libcroco-0.6/libcroco.
-- AC_LINK_IFELSE(
-- [AC_LANG_PROGRAM([[#include <libcroco-config.h>]],
-- [[const char *version = LIBCROCO_VERSION; return !version;]])],
-- [gl_ABSOLUTE_HEADER([libcroco-0.6/libcroco/libcroco-config.h])
-- libcroco_include_dir=`echo "$gl_cv_absolute_libcroco_0_6_libcroco_libcroco_config_h" | sed -e 's,.libcroco-config\.h$,,'`
-- if test -d "$libcroco_include_dir"; then
-- gl_cv_libcroco=yes
-- gl_cv_LIBCROCO="$LIBCROCO_0_6"
-- gl_cv_LTLIBCROCO="$LTLIBCROCO_0_6"
-- gl_cv_INCCROCO="-I$libcroco_include_dir"
-- fi
-- ])
-- fi
-- CPPFLAGS="$gl_save_CPPFLAGS"
-- fi
-- LIBS="$gl_save_LIBS"
-- ])
-- AC_MSG_CHECKING([for libcroco])
-- AC_MSG_RESULT([$gl_cv_libcroco])
-- if test $gl_cv_libcroco = yes; then
-- LIBCROCO="$gl_cv_LIBCROCO"
-- LTLIBCROCO="$gl_cv_LTLIBCROCO"
-- INCCROCO="$gl_cv_INCCROCO"
-- else
-- gl_cv_libcroco_use_included=yes
-- fi
-- fi
-- ])
-+ if test "$gl_cv_libcroco_use_included" != yes; then
-+ PKG_CHECK_MODULES([CROCO], [libcroco-0.6])
-+ LIBCROCO=$CROCO_LIBS
-+ LTLIBCROCO=$CROCO_LIBS
-+ INCCROCO=$CROCO_CFLAGS
-+ fi
- AC_SUBST([LIBCROCO])
- AC_SUBST([LTLIBCROCO])
- AC_SUBST([INCCROCO])
diff --git a/libtextstyle/gnulib-m4/libglib.m4 b/libtextstyle/gnulib-m4/libglib.m4
index 7ee5029..bb1e5e4 100644
--- a/libtextstyle/gnulib-m4/libglib.m4
@@ -655,55 +390,3 @@ index 7ee5029..bb1e5e4 100644
AC_SUBST([LIBGLIB])
AC_SUBST([LTLIBGLIB])
AC_SUBST([INCGLIB])
-diff --git a/libtextstyle/lib/term-styled-ostream.c b/libtextstyle/lib/term-styled-ostream.c
-index 5484800..16793fa 100644
---- a/libtextstyle/lib/term-styled-ostream.c
-+++ b/libtextstyle/lib/term-styled-ostream.c
-@@ -28,15 +28,15 @@
-
- #include <stdlib.h>
-
--#include <cr-om-parser.h>
--#include <cr-sel-eng.h>
--#include <cr-style.h>
--#include <cr-rgb.h>
-+#include <libcroco/cr-om-parser.h>
-+#include <libcroco/cr-sel-eng.h>
-+#include <libcroco/cr-style.h>
-+#include <libcroco/cr-rgb.h>
- /* <cr-fonts.h> has a broken double-inclusion guard in libcroco-0.6.1. */
- #ifndef __CR_FONTS_H__
--# include <cr-fonts.h>
-+# include <libcroco/cr-fonts.h>
- #endif
--#include <cr-string.h>
-+#include <libcroco/cr-string.h>
-
- #include "term-ostream.h"
- #include "mem-hash-map.h"
-diff --git a/libtextstyle/lib/term-styled-ostream.oo.c b/libtextstyle/lib/term-styled-ostream.oo.c
-index 2ff978f..5ffb17a 100644
---- a/libtextstyle/lib/term-styled-ostream.oo.c
-+++ b/libtextstyle/lib/term-styled-ostream.oo.c
-@@ -22,15 +22,15 @@
-
- #include <stdlib.h>
-
--#include <cr-om-parser.h>
--#include <cr-sel-eng.h>
--#include <cr-style.h>
--#include <cr-rgb.h>
-+#include <libcroco/cr-om-parser.h>
-+#include <libcroco/cr-sel-eng.h>
-+#include <libcroco/cr-style.h>
-+#include <libcroco/cr-rgb.h>
- /* <cr-fonts.h> has a broken double-inclusion guard in libcroco-0.6.1. */
- #ifndef __CR_FONTS_H__
--# include <cr-fonts.h>
-+# include <libcroco/cr-fonts.h>
- #endif
--#include <cr-string.h>
-+#include <libcroco/cr-string.h>
-
- #include "term-ostream.h"
- #include "mem-hash-map.h"
diff --git a/poky/meta/recipes-core/gettext/gettext_0.22.bb b/poky/meta/recipes-core/gettext/gettext_0.22.bb
index f5290ac0e4..75474c8c30 100644
--- a/poky/meta/recipes-core/gettext/gettext_0.22.bb
+++ b/poky/meta/recipes-core/gettext/gettext_0.22.bb
@@ -10,8 +10,6 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=c678957b0c8e964aa6c70fd77641a71e"
# without libxml in PACKAGECONFIG vendor copy of the lib will be used
LICENSE:append = " ${@bb.utils.contains('PACKAGECONFIG', 'libxml', '', '& MIT', d)}"
LIC_FILES_CHKSUM:append = " ${@bb.utils.contains('PACKAGECONFIG', 'libxml', '', 'file://libtextstyle/lib/libxml/COPYING;md5=2044417e2e5006b65a8b9067b683fcf1', d)}"
-# without croco in PACKAGECONFIG vendor copy of the lib will be used
-LIC_FILES_CHKSUM:append = " ${@bb.utils.contains('PACKAGECONFIG', 'croco', '', 'file://libtextstyle/lib/libcroco/libcroco.h;md5=424013a9ed5401aa58cf83f3188c6865;beginline=10;endline=28', d)}"
# without glib in PACKAGECONFIG vendor copy of the lib will be used
LIC_FILES_CHKSUM:append = " ${@bb.utils.contains('PACKAGECONFIG', 'glib', '', 'file://libtextstyle/lib/glib/ghash.c;md5=e3159f5ac38dfe77af5cc0ee104dab2d;beginline=10;endline=27', d)}"
@@ -44,6 +42,7 @@ EXTRA_OECONF += "--without-lispdir \
--without-emacs \
--without-cvs \
--without-git \
+ --without-included-libcroco \
--cache-file=${B}/config.cache \
"
EXTRA_OECONF:append:class-target = " \
@@ -54,11 +53,10 @@ EXTRA_OECONF:append:class-target = " \
gt_cv_locale_de=de_DE.ISO-8859-1 \
"
-PACKAGECONFIG ??= "croco glib libxml"
+PACKAGECONFIG ??= "glib libxml"
PACKAGECONFIG:class-native = ""
PACKAGECONFIG:class-nativesdk = ""
-PACKAGECONFIG[croco] = "--without-included-libcroco,--with-included-libcroco,libcroco"
PACKAGECONFIG[glib] = "--without-included-glib,--with-included-glib,glib-2.0"
PACKAGECONFIG[libxml] = "--without-included-libxml,--with-included-libxml,libxml2"
# Need paths here to avoid host contamination but this can cause RPATH warnings
diff --git a/poky/meta/recipes-core/glib-2.0/glib-2.0_2.78.0.bb b/poky/meta/recipes-core/glib-2.0/glib-2.0_2.78.1.bb
index 500e4e873e..a490262112 100644
--- a/poky/meta/recipes-core/glib-2.0/glib-2.0_2.78.0.bb
+++ b/poky/meta/recipes-core/glib-2.0/glib-2.0_2.78.1.bb
@@ -19,7 +19,7 @@ SRC_URI:append:class-native = " file://relocate-modules.patch \
file://0001-meson.build-do-not-enable-pidfd-features-on-native-g.patch \
"
-SRC_URI[sha256sum] = "44eaab8b720877ce303c5540b657b126f12dc94972d9880b52959f43fb537b30"
+SRC_URI[sha256sum] = "915bc3d0f8507d650ead3832e2f8fb670fce59aac4d7754a7dab6f1e6fed78b2"
# Find any meson cross files in FILESPATH that are relevant for the current
# build (using siteinfo) and add them to EXTRA_OEMESON.
diff --git a/poky/meta/recipes-core/glib-2.0/glib.inc b/poky/meta/recipes-core/glib-2.0/glib.inc
index b946e798bb..cec06b2f88 100644
--- a/poky/meta/recipes-core/glib-2.0/glib.inc
+++ b/poky/meta/recipes-core/glib-2.0/glib.inc
@@ -57,11 +57,6 @@ FILES:${PN} = "${libdir}/lib*${SOLIBS} \
${datadir}/glib-2.0/dtds \
${datadir}/glib-2.0/schemas"
-FILES:${PN}-utils += "${bindir}/glib-genmarshal \
- ${bindir}/glib-gettextize \
- ${bindir}/glib-mkenums \
- ${bindir}/glib-compile-resources"
-
FILES:${PN}-dev += "${libdir}/glib-2.0/include \
${libdir}/gio/modules/lib*${SOLIBSDEV} \
${libdir}/gio/modules/*.la \
diff --git a/poky/meta/recipes-core/glib-networking/glib-networking_2.76.1.bb b/poky/meta/recipes-core/glib-networking/glib-networking_2.76.1.bb
index 3687123141..0f8822e160 100644
--- a/poky/meta/recipes-core/glib-networking/glib-networking_2.76.1.bb
+++ b/poky/meta/recipes-core/glib-networking/glib-networking_2.76.1.bb
@@ -27,7 +27,6 @@ PACKAGECONFIG[libproxy] = "-Dlibproxy=enabled,-Dlibproxy=disabled,libproxy"
PACKAGECONFIG[tests] = "-Dinstalled_tests=true,-Dinstalled_tests=false"
PACKAGECONFIG[gnomeproxy] = "-Dgnome_proxy=enabled,-Dgnome_proxy=disabled,gsettings-desktop-schemas"
-GNOMEBASEBUILDCLASS = "meson"
inherit gnomebase gettext upstream-version-is-even gio-module-cache ptest-gnome
SRC_URI += "file://run-ptest"
diff --git a/poky/meta/recipes-core/glibc/glibc-package.inc b/poky/meta/recipes-core/glibc/glibc-package.inc
index 1d4e4c5274..1ef987be0a 100644
--- a/poky/meta/recipes-core/glibc/glibc-package.inc
+++ b/poky/meta/recipes-core/glibc/glibc-package.inc
@@ -42,7 +42,7 @@ FILES_SOLIBSDEV = "${libdir}/lib*${SOLIBSDEV}"
FILES:${PN}-dev += "${libdir}/libpthread.a ${libdir}/libdl.a ${libdir}/libutil.a ${libdir}/libanl.a ${libdir}/*_nonshared.a ${base_libdir}/*_nonshared.a ${base_libdir}/*.o ${datadir}/aclocal"
RDEPENDS:${PN}-dev = "linux-libc-headers-dev"
FILES:${PN}-staticdev += "${libdir}/*.a ${base_libdir}/*.a"
-FILES:nscd = "${sbindir}/nscd* ${sysconfdir}/init.d/nscd ${systemd_system_unitdir}/nscd* ${sysconfdir}/tmpfiles.d/nscd.conf \
+FILES:nscd = "${sbindir}/nscd* ${sysconfdir}/init.d/nscd ${systemd_system_unitdir}/nscd* ${nonarch_libdir}/tmpfiles.d/nscd.conf \
${sysconfdir}/nscd.conf ${sysconfdir}/default/volatiles/98_nscd ${localstatedir}/db/nscd"
FILES:${PN}-mtrace = "${bindir}/mtrace"
FILES:tzcode = "${bindir}/tzselect ${sbindir}/zic ${bindir}/zdump"
@@ -132,9 +132,9 @@ def get_libc_fpu_setting(bb, d):
do_install:append:class-target() {
if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
- install -d ${D}${sysconfdir}/tmpfiles.d
+ install -d ${D}${nonarch_libdir}/tmpfiles.d
echo "d /run/nscd 755 root root -" \
- > ${D}${sysconfdir}/tmpfiles.d/nscd.conf
+ > ${D}${nonarch_libdir}/tmpfiles.d/nscd.conf
fi
if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then
@@ -280,7 +280,7 @@ python populate_packages:prepend () {
pkg_postinst:nscd () {
if [ -z "$D" ]; then
if command -v systemd-tmpfiles >/dev/null; then
- systemd-tmpfiles --create ${sysconfdir}/tmpfiles.d/nscd.conf
+ systemd-tmpfiles --create ${nonarch_libdir}/tmpfiles.d/nscd.conf
elif [ -e ${sysconfdir}/init.d/populate-volatile.sh ]; then
${sysconfdir}/init.d/populate-volatile.sh update
fi
diff --git a/poky/meta/recipes-core/images/build-appliance-image_15.0.0.bb b/poky/meta/recipes-core/images/build-appliance-image_15.0.0.bb
index 0394afc7e8..b4281ecf00 100644
--- a/poky/meta/recipes-core/images/build-appliance-image_15.0.0.bb
+++ b/poky/meta/recipes-core/images/build-appliance-image_15.0.0.bb
@@ -26,7 +26,7 @@ inherit core-image setuptools3 features_check
REQUIRED_DISTRO_FEATURES += "xattr"
-SRCREV ?= "71faadedb96a15a0748552b00dec032649adb71f"
+SRCREV ?= "dc262335f9e002bcfd84a71d41874beebdd84e9a"
SRC_URI = "git://git.yoctoproject.org/poky;branch=master \
file://Yocto_Build_Appliance.vmx \
file://Yocto_Build_Appliance.vmxf \
diff --git a/poky/meta/recipes-core/libxml/libxml2_2.11.5.bb b/poky/meta/recipes-core/libxml/libxml2_2.11.5.bb
index 4cf6dd09a9..319833f053 100644
--- a/poky/meta/recipes-core/libxml/libxml2_2.11.5.bb
+++ b/poky/meta/recipes-core/libxml/libxml2_2.11.5.bb
@@ -11,6 +11,7 @@ LIC_FILES_CHKSUM = "file://Copyright;md5=2044417e2e5006b65a8b9067b683fcf1 \
DEPENDS = "zlib virtual/libiconv"
+GNOMEBASEBUILDCLASS = "autotools"
inherit gnomebase
SRC_URI += "http://www.w3.org/XML/Test/xmlts20130923.tar;subdir=${BP};name=testtar \
@@ -21,6 +22,9 @@ SRC_URI += "http://www.w3.org/XML/Test/xmlts20130923.tar;subdir=${BP};name=testt
SRC_URI[archive.sha256sum] = "3727b078c360ec69fa869de14bd6f75d7ee8d36987b071e6928d4720a28df3a6"
SRC_URI[testtar.sha256sum] = "c6b2d42ee50b8b236e711a97d68e6c4b5c8d83e69a2be4722379f08702ea7273"
+# Disputed as a security issue, but fixed in d39f780
+CVE_STATUS[CVE-2023-45322] = "disputed: issue requires memory allocation to fail"
+
BINCONFIG = "${bindir}/xml2-config"
PACKAGECONFIG ??= "python \
diff --git a/poky/meta/recipes-core/musl/gcompat/0001-Add-fcntl64-wrapper.patch b/poky/meta/recipes-core/musl/gcompat/0001-Add-fcntl64-wrapper.patch
new file mode 100644
index 0000000000..3f265e273a
--- /dev/null
+++ b/poky/meta/recipes-core/musl/gcompat/0001-Add-fcntl64-wrapper.patch
@@ -0,0 +1,44 @@
+From 37f70f54c74c4ceeb089cbee88311ba00638f211 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Fri, 13 Oct 2023 21:02:23 -0700
+Subject: [PATCH] Add fcntl64 wrapper
+
+fixes loadtime errors with pvr precompiled driver for visionfive2
+
+load libpvr_dri_support.so: Error relocating /usr/lib/libpvr_dri_support.so: fcntl64: symbol not found
+
+Upstream-Status: Submitted [https://git.adelielinux.org/adelie/gcompat/-/merge_requests/28]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ libgcompat/unistd.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/libgcompat/unistd.c b/libgcompat/unistd.c
+index 011fba2..400abf3 100644
+--- a/libgcompat/unistd.c
++++ b/libgcompat/unistd.c
+@@ -1,6 +1,7 @@
+ #include <assert.h> /* assert */
+ #include <fcntl.h> /* O_CREAT */
+ #include <limits.h> /* NGROUPS_MAX */
++#include <stdarg.h> /* va_list, va_start, va_end */
+ #include <stddef.h> /* NULL, size_t */
+ #include <unistd.h> /* confstr, getcwd, getgroups, ... */
+ #include <errno.h> /* ENOSYS, ENOMEM */
+@@ -250,3 +251,13 @@ int __close(int fd)
+ {
+ return close(fd);
+ }
++
++int fcntl64 (int fd, int cmd, ...)
++{
++ int ret;
++ va_list ap;
++ va_start(ap, cmd);
++ ret = fcntl(fd, cmd, ap);
++ va_end(ap);
++ return ret;
++}
+--
+2.42.0
+
diff --git a/poky/meta/recipes-core/musl/gcompat/0001-auxv-new-module.patch b/poky/meta/recipes-core/musl/gcompat/0001-auxv-new-module.patch
deleted file mode 100644
index ee292f3841..0000000000
--- a/poky/meta/recipes-core/musl/gcompat/0001-auxv-new-module.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From aecd42801904462501a890d173648e4e826eda19 Mon Sep 17 00:00:00 2001
-From: "A. Wilcox" <AWilcox@Wilcox-Tech.com>
-Date: Sat, 23 Oct 2021 23:29:40 -0500
-Subject: [PATCH] auxv: new module
-
-Adds `__getauxval` wrapper, needed for Parallels Tools GUI installer.
-
-Upstream-Status: Submitted [https://git.adelielinux.org/adelie/gcompat/-/commit/e860a38a88c7ea148ee15976136a1f83ea13f8e0]
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- CHANGELOG.rst | 5 +++++
- Makefile | 1 +
- libgcompat/auxv.c | 6 ++++++
- 3 files changed, 12 insertions(+)
- create mode 100644 libgcompat/auxv.c
-
-diff --git a/CHANGELOG.rst b/CHANGELOG.rst
-index ce6859b..c3a9cee 100644
---- a/CHANGELOG.rst
-+++ b/CHANGELOG.rst
-@@ -11,6 +11,11 @@
- 1.1 (202?-??-??)
- ================
-
-+auxv
-+----
-+
-+* Add __getauxval wrapper for getauxval.
-+
- locale
- ------
-
-diff --git a/Makefile b/Makefile
-index cbb7634..1893cc1 100644
---- a/Makefile
-+++ b/Makefile
-@@ -2,6 +2,7 @@ LIBGCOMPAT_INCLUDE = \
- libgcompat/alias.h \
- libgcompat/internal.h
- LIBGCOMPAT_SRC = \
-+ libgcompat/auxv.c \
- libgcompat/ctype.c \
- libgcompat/cxx_thread.c \
- libgcompat/dlfcn.c \
-diff --git a/libgcompat/auxv.c b/libgcompat/auxv.c
-new file mode 100644
-index 0000000..01de376
---- /dev/null
-+++ b/libgcompat/auxv.c
-@@ -0,0 +1,6 @@
-+#include <sys/auxv.h> /* getauxval */
-+
-+unsigned long __getauxval(unsigned long value)
-+{
-+ return getauxval(value);
-+}
---
-2.37.3
-
diff --git a/poky/meta/recipes-core/musl/gcompat_git.bb b/poky/meta/recipes-core/musl/gcompat_git.bb
index ba802e3caa..40fe8c6a5f 100644
--- a/poky/meta/recipes-core/musl/gcompat_git.bb
+++ b/poky/meta/recipes-core/musl/gcompat_git.bb
@@ -5,16 +5,16 @@ SUMMARY = "A library which provides glibc-compatible APIs for use on musl libc s
HOMEPAGE = "https://git.adelielinux.org/adelie/gcompat"
LICENSE = "NCSA"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=eb33ef4af05a9c7602843afb7adfe792"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=802b1aed7330d90086be4de63a3188e3"
SRC_URI = "git://git.adelielinux.org/adelie/gcompat.git;protocol=https;branch=current \
- file://0001-auxv-new-module.patch \
+ file://0001-Add-fcntl64-wrapper.patch \
"
SRC_URI:append:powerpc = "\
file://0001-make-Static-PIE-does-not-work-on-musl-ppc.patch \
"
-PV = "1.0.0+1.1+git"
-SRCREV = "c6921a1aa454bb87671f9bd1ecfe47d80d1620aa"
+PV = "1.1.0"
+SRCREV = "b7bfe0b08c52fdc72e0c1d9d4dcb2129f1642bd6"
S = "${WORKDIR}/git"
diff --git a/poky/meta/recipes-core/ovmf/ovmf_git.bb b/poky/meta/recipes-core/ovmf/ovmf_git.bb
index 6bbe21ac5c..3dc031d3b6 100644
--- a/poky/meta/recipes-core/ovmf/ovmf_git.bb
+++ b/poky/meta/recipes-core/ovmf/ovmf_git.bb
@@ -122,7 +122,7 @@ fix_toolchain:append:class-native() {
# --debug-prefix-map to nasm (we carry a patch to nasm for this). The
# tools definitions are built by ovmf-native so we need to pass this in
# at target build time when we know the right values.
-export NASM_PREFIX_MAP = "--debug-prefix-map=${WORKDIR}=/usr/src/debug/ovmf/${EXTENDPE}${PV}-${PR}"
+export NASM_PREFIX_MAP = "--debug-prefix-map=${WORKDIR}=${TARGET_DBGSRC_DIR}"
export GCC_PREFIX_MAP = "${DEBUG_PREFIX_MAP} -Wno-stringop-overflow -Wno-maybe-uninitialized"
GCC_VER="$(${CC} -v 2>&1 | tail -n1 | awk '{print $3}')"
diff --git a/poky/meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb b/poky/meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb
index 62c22a35ab..b3a24b71de 100644
--- a/poky/meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb
+++ b/poky/meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb
@@ -9,16 +9,12 @@ PACKAGE_ARCH = "${MACHINE_ARCH}"
inherit packagegroup
-PROFILE_TOOLS_X = ""
# sysprof doesn't support aarch64 and nios2
-PROFILE_TOOLS_X:aarch64 = ""
-PROFILE_TOOLS_X:nios2 = ""
PROFILE_TOOLS_SYSTEMD = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd-analyze', '', d)}"
RRECOMMENDS:${PN} = "\
${PERF} \
blktrace \
- ${PROFILE_TOOLS_X} \
${PROFILE_TOOLS_SYSTEMD} \
"
diff --git a/poky/meta/recipes-core/systemd/systemd.inc b/poky/meta/recipes-core/systemd/systemd.inc
index 3ba0b5ffc5..ccc3236457 100644
--- a/poky/meta/recipes-core/systemd/systemd.inc
+++ b/poky/meta/recipes-core/systemd/systemd.inc
@@ -10,7 +10,8 @@ state, maintains mount and automount points and implements an \
elaborate transactional dependency-based service control logic. It can \
work as a drop-in replacement for sysvinit."
-LICENSE = "GPL-2.0-only & LGPL-2.1-only"
+LICENSE = "GPL-2.0-only & LGPL-2.1-or-later"
+LICENSE:libsystemd = "LGPL-2.1-or-later"
LIC_FILES_CHKSUM = "file://LICENSE.GPL2;md5=751419260aa954499f7abaabaa882bbe \
file://LICENSE.LGPL2.1;md5=4fbd65380cdd255951079008b364516c"
diff --git a/poky/meta/recipes-core/systemd/systemd_254.4.bb b/poky/meta/recipes-core/systemd/systemd_254.4.bb
index 77724eb822..ecf693ef92 100644
--- a/poky/meta/recipes-core/systemd/systemd_254.4.bb
+++ b/poky/meta/recipes-core/systemd/systemd_254.4.bb
@@ -135,6 +135,7 @@ PACKAGECONFIG[bzip2] = "-Dbzip2=true,-Dbzip2=false,bzip2"
PACKAGECONFIG[cgroupv2] = "-Ddefault-hierarchy=unified,-Ddefault-hierarchy=hybrid"
PACKAGECONFIG[coredump] = "-Dcoredump=true,-Dcoredump=false"
PACKAGECONFIG[cryptsetup] = "-Dlibcryptsetup=true,-Dlibcryptsetup=false,cryptsetup,,cryptsetup"
+PACKAGECONFIG[cryptsetup-plugins] = "-Dlibcryptsetup-plugins=true,-Dlibcryptsetup-plugins=false,cryptsetup,,cryptsetup"
PACKAGECONFIG[tpm2] = "-Dtpm2=true,-Dtpm2=false,tpm2-tss,tpm2-tss libtss2 libtss2-tcti-device"
# If multiple compression libraries are enabled, the format to use for compression is chosen implicitly,
# so if you want to compress with e.g. lz4 you cannot enable zstd, so you cannot read zstd-compressed journal files.
@@ -178,11 +179,13 @@ PACKAGECONFIG[microhttpd] = "-Dmicrohttpd=true,-Dmicrohttpd=false,libmicrohttpd"
PACKAGECONFIG[myhostname] = "-Dnss-myhostname=true,-Dnss-myhostname=false,,libnss-myhostname"
PACKAGECONFIG[networkd] = "-Dnetworkd=true,-Dnetworkd=false"
PACKAGECONFIG[no-dns-fallback] = "-Ddns-servers="
-PACKAGECONFIG[nss] = "-Dnss-systemd=true,-Dnss-systemd=false"
+PACKAGECONFIG[no-ntp-fallback] = "-Dntp-servers="
+PACKAGECONFIG[nss] = "-Dnss-systemd=true,-Dnss-systemd=false,,libnss-systemd"
PACKAGECONFIG[nss-mymachines] = "-Dnss-mymachines=true,-Dnss-mymachines=false"
PACKAGECONFIG[nss-resolve] = "-Dnss-resolve=true,-Dnss-resolve=false"
PACKAGECONFIG[oomd] = "-Doomd=true,-Doomd=false"
PACKAGECONFIG[openssl] = "-Dopenssl=true,-Dopenssl=false,openssl"
+PACKAGECONFIG[p11kit] = "-Dp11kit=true,-Dp11kit=false,p11-kit"
PACKAGECONFIG[pam] = "-Dpam=true,-Dpam=false,libpam,${PAM_PLUGINS}"
PACKAGECONFIG[pcre2] = "-Dpcre2=true,-Dpcre2=false,libpcre2"
PACKAGECONFIG[polkit] = "-Dpolkit=true,-Dpolkit=false"
@@ -225,6 +228,8 @@ PACKAGECONFIG[xz] = "-Dxz=true,-Dxz=false,xz"
PACKAGECONFIG[zlib] = "-Dzlib=true,-Dzlib=false,zlib"
PACKAGECONFIG[zstd] = "-Dzstd=true,-Dzstd=false,zstd"
+RESOLV_CONF ??= ""
+
# Helper variables to clarify locations. This mirrors the logic in systemd's
# build system.
rootprefix ?= "${root_prefix}"
@@ -277,12 +282,12 @@ do_install() {
[ ! -e ${D}/${base_sbindir}/udevd ] && ln -s ${rootlibexecdir}/systemd/systemd-udevd ${D}/${base_sbindir}/udevd
install -d ${D}${sysconfdir}/udev/rules.d/
- install -d ${D}${sysconfdir}/tmpfiles.d
+ install -d ${D}${nonarch_libdir}/tmpfiles.d
for rule in $(find ${WORKDIR} -maxdepth 1 -type f -name "*.rules"); do
install -m 0644 $rule ${D}${sysconfdir}/udev/rules.d/
done
- install -m 0644 ${WORKDIR}/00-create-volatile.conf ${D}${sysconfdir}/tmpfiles.d/
+ install -m 0644 ${WORKDIR}/00-create-volatile.conf ${D}${nonarch_libdir}/tmpfiles.d/
if ${@bb.utils.contains('DISTRO_FEATURES','sysvinit','true','false',d)}; then
install -d ${D}${sysconfdir}/init.d
@@ -336,8 +341,9 @@ do_install() {
echo 'f /run/systemd/resolve/resolv.conf 0644 root root' >>${D}${exec_prefix}/lib/tmpfiles.d/systemd.conf
ln -s ../run/systemd/resolve/resolv.conf ${D}${sysconfdir}/resolv-conf.systemd
else
- sed -i -e "s%^L! /etc/resolv.conf.*$%L! /etc/resolv.conf - - - - ../run/systemd/resolve/resolv.conf%g" ${D}${exec_prefix}/lib/tmpfiles.d/etc.conf
- ln -s ../run/systemd/resolve/resolv.conf ${D}${sysconfdir}/resolv-conf.systemd
+ resolv_conf="${@bb.utils.contains('RESOLV_CONF', 'stub-resolv', 'run/systemd/resolve/stub-resolv.conf', 'run/systemd/resolve/resolv.conf', d)}"
+ sed -i -e "s%^L! /etc/resolv.conf.*$%L! /etc/resolv.conf - - - - ../${resolv_conf}%g" ${D}${exec_prefix}/lib/tmpfiles.d/etc.conf
+ ln -s ../${resolv_conf} ${D}${sysconfdir}/resolv-conf.systemd
fi
if ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'false', 'true', d)}; then
rm ${D}${exec_prefix}/lib/tmpfiles.d/x11.conf
@@ -384,20 +390,21 @@ python populate_packages:prepend (){
PACKAGES_DYNAMIC += "^lib(udev|systemd|nss).*"
PACKAGE_BEFORE_PN = "\
- ${PN}-gui \
- ${PN}-vconsole-setup \
- ${PN}-initramfs \
${PN}-analyze \
- ${PN}-kernel-install \
- ${PN}-rpm-macros \
${PN}-binfmt \
- ${PN}-zsh-completion \
${PN}-container \
+ ${PN}-crypt \
+ ${PN}-extra-utils \
+ ${PN}-gui \
+ ${PN}-initramfs \
${PN}-journal-gatewayd \
${PN}-journal-upload \
${PN}-journal-remote \
- ${PN}-extra-utils \
+ ${PN}-kernel-install \
+ ${PN}-rpm-macros \
${PN}-udev-rules \
+ ${PN}-vconsole-setup \
+ ${PN}-zsh-completion \
libsystemd-shared \
udev \
udev-hwdb \
@@ -446,6 +453,11 @@ USERADD_PARAM:${PN}-journal-upload = "--system -d / -M --shell /sbin/nologin sys
FILES:${PN}-analyze = "${bindir}/systemd-analyze"
+FILES:${PN}-crypt = "${bindir}/systemd-cryptenroll \
+ ${libdir}/cryptsetup \
+ "
+RRECOMMENDS:${PN} += "${PN}-crypt"
+
FILES:${PN}-initramfs = "/init"
RDEPENDS:${PN}-initramfs = "${PN}"
@@ -523,7 +535,6 @@ FILES:${PN}-container = "${sysconfdir}/dbus-1/system.d/org.freedesktop.import1.c
${exec_prefix}/lib/tmpfiles.d/systemd-nspawn.conf \
${exec_prefix}/lib/tmpfiles.d/README \
${systemd_system_unitdir}/systemd-nspawn@.service \
- ${libdir}/libnss_mymachines.so.2 \
${datadir}/dbus-1/system-services/org.freedesktop.import1.service \
${datadir}/dbus-1/system-services/org.freedesktop.machine1.service \
${datadir}/dbus-1/system.d/org.freedesktop.import1.conf \
@@ -532,6 +543,8 @@ FILES:${PN}-container = "${sysconfdir}/dbus-1/system.d/org.freedesktop.import1.c
${datadir}/polkit-1/actions/org.freedesktop.machine1.policy \
"
+RDEPENDS:${PN}-container = "${@bb.utils.contains('PACKAGECONFIG', 'nss-mymachines', 'libnss-mymachines', '', d)}"
+
# "machinectl import-tar" uses "tar --numeric-owner", not supported by busybox.
RRECOMMENDS:${PN}-container += "\
${PN}-journal-gatewayd \
@@ -552,7 +565,6 @@ FILES:${PN}-extra-utils = "\
${bindir}/systemd-run \
${bindir}/systemd-cat \
${bindir}/systemd-creds \
- ${bindir}/systemd-cryptenroll \
${bindir}/systemd-delta \
${bindir}/systemd-cgls \
${bindir}/systemd-cgtop \
@@ -786,6 +798,9 @@ python __anonymous() {
if not bb.utils.contains('DISTRO_FEATURES', 'sysvinit', True, False, d):
d.setVar("INHIBIT_UPDATERCD_BBCLASS", "1")
+ if bb.utils.contains('DISTRO_FEATURES', 'systemd-resolved', True, False, d) and not bb.utils.contains('PACKAGECONFIG', 'nss-resolve resolved', True, False, d):
+ bb.error("DISTRO_FEATURES[systemd-resolved] requires PACKAGECONFIG[nss-resolve, resolved]")
+
if bb.utils.contains('PACKAGECONFIG', 'repart', True, False, d) and not bb.utils.contains('PACKAGECONFIG', 'openssl', True, False, d):
bb.error("PACKAGECONFIG[repart] requires PACKAGECONFIG[openssl]")
@@ -826,15 +841,31 @@ ALTERNATIVE_LINK_NAME[runlevel] = "${base_sbindir}/runlevel"
ALTERNATIVE_PRIORITY[runlevel] ?= "300"
pkg_postinst:${PN}:libc-glibc () {
- sed -e '/^hosts:/s/\s*\<myhostname\>//' \
- -e 's/\(^hosts:.*\)\(\<files\>\)\(.*\)\(\<dns\>\)\(.*\)/\1\2 myhostname \3\4\5/' \
- -i $D${sysconfdir}/nsswitch.conf
+ if ${@bb.utils.contains('PACKAGECONFIG', 'myhostname', 'true', 'false', d)}; then
+ sed -e '/^hosts:/s/\s*\<myhostname\>//' \
+ -e 's/\(^hosts:.*\)\(\<files\>\)\(.*\)\(\<dns\>\)\(.*\)/\1\2 myhostname \3\4\5/' \
+ -i $D${sysconfdir}/nsswitch.conf
+ fi
+ if ${@bb.utils.contains('PACKAGECONFIG', 'nss', 'true', 'false', d)}; then
+ sed -e 's#\(^passwd:.*\)#\1 systemd#' \
+ -e 's#\(^group:.*\)#\1 systemd#' \
+ -e 's#\(^shadow:.*\)#\1 systemd#' \
+ -i $D${sysconfdir}/nsswitch.conf
+ fi
}
pkg_prerm:${PN}:libc-glibc () {
- sed -e '/^hosts:/s/\s*\<myhostname\>//' \
- -e '/^hosts:/s/\s*myhostname//' \
- -i $D${sysconfdir}/nsswitch.conf
+ if ${@bb.utils.contains('PACKAGECONFIG', 'myhostname', 'true', 'false', d)}; then
+ sed -e '/^hosts:/s/\s*\<myhostname\>//' \
+ -e '/^hosts:/s/\s*myhostname//' \
+ -i $D${sysconfdir}/nsswitch.conf
+ fi
+ if ${@bb.utils.contains('PACKAGECONFIG', 'nss', 'true', 'false', d)}; then
+ sed -e '/^passwd:/s#\s*systemd##' \
+ -e '/^group:/s#\s*systemd##' \
+ -e '/^shadow:/s#\s*systemd##' \
+ -i $D${sysconfdir}/nsswitch.conf
+ fi
}
PACKAGE_WRITE_DEPS += "qemu-native"
diff --git a/poky/meta/recipes-core/udev/udev-extraconf/mount.sh b/poky/meta/recipes-core/udev/udev-extraconf/mount.sh
index b7e86dbc0e..0cd51fcde8 100644
--- a/poky/meta/recipes-core/udev/udev-extraconf/mount.sh
+++ b/poky/meta/recipes-core/udev/udev-extraconf/mount.sh
@@ -36,6 +36,16 @@ do
fi
done
+is_filesystem_supported() {
+ while read -r fs; do
+ if [ "${fs#nodev}" = "$1" ];
+ then
+ return 0
+ fi
+ done < "/proc/filesystems"
+ return 1
+}
+
automount_systemd() {
name="`basename "$DEVNAME"`"
@@ -64,6 +74,11 @@ automount_systemd() {
grep "^[[:space:]]*$tmp" /etc/fstab && return
done
+ if ! is_filesystem_supported $ID_FS_TYPE; then
+ logger "mount.sh/automount" "Filesystem '$ID_FS_TYPE' on '${DEVNAME}' is unsupported"
+ return
+ fi
+
[ -d "$MOUNT_BASE/$name" ] || mkdir -p "$MOUNT_BASE/$name"
MOUNT="$MOUNT -o silent"
diff --git a/poky/meta/recipes-core/volatile-binds/files/volatile-binds.service.in b/poky/meta/recipes-core/volatile-binds/files/volatile-binds.service.in
index 52384c8264..5a0055bec3 100644
--- a/poky/meta/recipes-core/volatile-binds/files/volatile-binds.service.in
+++ b/poky/meta/recipes-core/volatile-binds/files/volatile-binds.service.in
@@ -3,7 +3,8 @@ Description=Bind mount volatile @where@
DefaultDependencies=no
Before=local-fs.target
RequiresMountsFor=@whatparent@ @whereparent@
-ConditionPathIsReadWrite=@whatparent@
+ConditionPathIsReadWrite=|@whatparent@
+ConditionPathExists=|!@whatparent@
ConditionPathExists=@where@
ConditionPathIsReadWrite=!@where@
diff --git a/poky/meta/recipes-core/volatile-binds/volatile-binds.bb b/poky/meta/recipes-core/volatile-binds/volatile-binds.bb
index 3fefa9abde..cca8a65fb4 100644
--- a/poky/meta/recipes-core/volatile-binds/volatile-binds.bb
+++ b/poky/meta/recipes-core/volatile-binds/volatile-binds.bb
@@ -16,10 +16,10 @@ inherit allarch systemd features_check
REQUIRED_DISTRO_FEATURES = "systemd"
VOLATILE_BINDS ?= "\
- /var/volatile/lib /var/lib\n\
- /var/volatile/cache /var/cache\n\
- /var/volatile/spool /var/spool\n\
- /var/volatile/srv /srv\n\
+ ${localstatedir}/volatile/lib ${localstatedir}/lib\n\
+ ${localstatedir}/volatile/cache ${localstatedir}/cache\n\
+ ${localstatedir}/volatile/spool ${localstatedir}/spool\n\
+ ${localstatedir}/volatile/srv /srv\n\
"
VOLATILE_BINDS[type] = "list"
VOLATILE_BINDS[separator] = "\n"
@@ -46,8 +46,8 @@ do_compile () {
continue
fi
- servicefile="${spec#/}"
- servicefile="$(echo "$servicefile" | tr / -).service"
+ servicefile="$(echo "${spec#/}" | tr / -).service"
+ [ "$mountpoint" != ${localstatedir}/lib ] || var_lib_servicefile=$servicefile
sed -e "s#@what@#$spec#g; s#@where@#$mountpoint#g" \
-e "s#@whatparent@#${spec%/*}#g; s#@whereparent@#${mountpoint%/*}#g" \
-e "s#@avoid_overlayfs@#${@d.getVar('AVOID_OVERLAYFS')}#g" \
@@ -56,12 +56,12 @@ do_compile () {
${@d.getVar('VOLATILE_BINDS').replace("\\n", "\n")}
END
- if [ -e var-volatile-lib.service ]; then
+ if [ -e "$var_lib_servicefile" ]; then
# As the seed is stored under /var/lib, ensure that this service runs
# after the volatile /var/lib is mounted.
sed -i -e "/^Before=/s/\$/ systemd-random-seed.service/" \
-e "/^WantedBy=/s/\$/ systemd-random-seed.service/" \
- var-volatile-lib.service
+ "$var_lib_servicefile"
fi
}
do_compile[dirs] = "${WORKDIR}"
@@ -78,7 +78,7 @@ do_install () {
# Suppress attempts to process some tmpfiles that are not temporary.
#
- install -d ${D}${sysconfdir}/tmpfiles.d ${D}/var/cache
+ install -d ${D}${sysconfdir}/tmpfiles.d ${D}${localstatedir}/cache
ln -s /dev/null ${D}${sysconfdir}/tmpfiles.d/etc.conf
ln -s /dev/null ${D}${sysconfdir}/tmpfiles.d/home.conf
}
diff --git a/poky/meta/recipes-core/zlib/zlib_1.3.bb b/poky/meta/recipes-core/zlib/zlib_1.3.bb
index c8fd855ee6..1ed18172fa 100644
--- a/poky/meta/recipes-core/zlib/zlib_1.3.bb
+++ b/poky/meta/recipes-core/zlib/zlib_1.3.bb
@@ -45,3 +45,5 @@ do_install_ptest() {
}
BBCLASSEXTEND = "native nativesdk"
+
+CVE_STATUS[CVE-2023-45853] = "not-applicable-config: we don't build minizip"
diff --git a/poky/meta/recipes-devtools/btrfs-tools/btrfs-tools_6.5.1.bb b/poky/meta/recipes-devtools/btrfs-tools/btrfs-tools_6.5.3.bb
index 527e13d08e..873d5e7a14 100644
--- a/poky/meta/recipes-devtools/btrfs-tools/btrfs-tools_6.5.1.bb
+++ b/poky/meta/recipes-devtools/btrfs-tools/btrfs-tools_6.5.3.bb
@@ -18,7 +18,7 @@ DEPENDS = "util-linux zlib"
SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/kdave/btrfs-progs.git;branch=master;protocol=https \
file://0001-Add-a-possibility-to-specify-where-python-modules-ar.patch \
"
-SRCREV = "92d04d4780886a9850716e5529f1dace97779931"
+SRCREV = "a45c360b64660477c726e192d9e92ceb73a50f80"
S = "${WORKDIR}/git"
PACKAGECONFIG ??= " \
diff --git a/poky/meta/recipes-devtools/cdrtools/cdrtools-native_3.01.bb b/poky/meta/recipes-devtools/cdrtools/cdrtools-native_3.01.bb
index 757132eae6..bf8be1ad0c 100644
--- a/poky/meta/recipes-devtools/cdrtools/cdrtools-native_3.01.bb
+++ b/poky/meta/recipes-devtools/cdrtools/cdrtools-native_3.01.bb
@@ -8,9 +8,12 @@ SECTION = "console/utils"
LICENSE = "GPL-2.0-only & CDDL-1.0 & LGPL-2.1-or-later"
LIC_FILES_CHKSUM = "file://COPYING;md5=32f68170be424c2cd64804337726b312"
+DEPENDS += "gnu-config-native"
+
SRC_URI = " \
${SOURCEFORGE_MIRROR}/project/cdrtools/cdrtools-${PV}.tar.bz2 \
file://0001-Don-t-set-uid-gid-during-install.patch \
+ file://riscv64-linux-gcc.rul \
"
SRC_URI[md5sum] = "7d45c5b7e1f78d85d1583b361aee6e8b"
@@ -23,6 +26,12 @@ export ac_cv_prog_CC = "${CC}"
inherit native
+do_configure() {
+ install -m 0755 ${STAGING_DATADIR_NATIVE}/gnu-config/config.sub ${S}/autoconf
+ install -m 0755 ${STAGING_DATADIR_NATIVE}/gnu-config/config.guess ${S}/autoconf
+ install -m 0644 ${WORKDIR}/riscv64-linux-gcc.rul ${S}/RULES/
+}
+
do_install() {
make install GMAKE_NOWARN=true INS_BASE=${prefix} DESTDIR=${D}
}
diff --git a/poky/meta/recipes-devtools/cdrtools/cdrtools/riscv64-linux-gcc.rul b/poky/meta/recipes-devtools/cdrtools/cdrtools/riscv64-linux-gcc.rul
new file mode 100644
index 0000000000..3e930225dc
--- /dev/null
+++ b/poky/meta/recipes-devtools/cdrtools/cdrtools/riscv64-linux-gcc.rul
@@ -0,0 +1,65 @@
+#ident "@(#)i586-linux-gcc.rul 1.18 18/11/07 "
+###########################################################################
+# Written 1996-2018 by J. Schilling
+###########################################################################
+#
+# Platform dependent MACROS for Linux
+#
+###########################################################################
+# Copyright (c) J. Schilling
+###########################################################################
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# See the file CDDL.Schily.txt in this distribution for details.
+# A copy of the CDDL is also available via the Internet at
+# http://www.opensource.org/licenses/cddl1.txt
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file CDDL.Schily.txt from this distribution.
+###########################################################################
+include $(SRCROOT)/$(RULESDIR)/rules.prg
+###########################################################################
+include $(SRCROOT)/$(RULESDIR)/cc-$(C_ARCH).rul
+
+#
+# LINUX_SRC_INCLUDE is defined in DEFAULTS/Defaults.linux
+#
+INCDIRSX += $(LINUX_SRC_INCLUDE)
+OSDEFS +=
+
+KDEFINES= -DKERNEL -D_KERNEL
+
+LIB_PREFIX= lib
+LIB_SUFFIX= .a
+SHL_SUFFIX= .so.$(DYNMAJOR).$(DYNMINOR)
+
+LIB_SOCKET=
+LIB_MATH= -lm
+LIB_KVM=
+
+#
+# Sunpro C/C++ run on Solaris and Linux and both have linkers
+# that support mapfiles
+#
+MAPVERS= $(_MAPVERS) # This enables to use mapfiles
+#
+# The GNU linker is buggy and does not like the official order in linker map
+# files for symbol versioning. The following command reverses the order of
+# the version names in the linker map file.
+#
+MAPFILE_POST= | sed 's/^SCHILY/+SCHILY/' | tr '\012' '@' | tr '+' '\012' | sort -V | tr '@' '\012'
+
+#LDOPTS= $(LIBS_PATH) $(LDPATH) $(RUNPATH:-R%=-Wl,-R%)
+#
+# Uncomment the next line in case you are on an old Linux version that
+# does not support the -R linker flag.
+#
+#LDOPTS= $(LIBS_PATH) $(LDPATH)
+LDOPTMAP= $(PMAPVERS:%=-Wl,--version-script=%)
+LDOPTDYN= -shared -Wl,-soname,$(TARGET) $(LDOPTMAP)
+
+LORDER= echo
+TSORT= cat
diff --git a/poky/meta/recipes-devtools/createrepo-c/createrepo-c/0001-Move-cr_compress_groupfile-outside-WITH_LIBMODULEMD.patch b/poky/meta/recipes-devtools/createrepo-c/createrepo-c/0001-Move-cr_compress_groupfile-outside-WITH_LIBMODULEMD.patch
deleted file mode 100644
index ea768e06e6..0000000000
--- a/poky/meta/recipes-devtools/createrepo-c/createrepo-c/0001-Move-cr_compress_groupfile-outside-WITH_LIBMODULEMD.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 5326969acc0c7e9e3cabca202154e4120c0d2c2f Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Tue, 26 Sep 2023 14:52:11 -0700
-Subject: [PATCH] Move cr_compress_groupfile outside WITH_LIBMODULEMD
-
-This function is used in code which is not conditional under WITH_LIBMODULEMD
-therefore the declaration should also match its definition scope
-
-Fixes build issues flagged by clang
-
-src/createrepo_c.c:850:16: error: incompatible integer to pointer conversion initializing 'gchar *' (aka 'char *') with an
- expression of type 'int' [-Wint-conversion]
-| 850 | gchar *compressed_path = cr_compress_groupfile(cmd_options->groupfile_fullpath, tmp_out_repo, compression);
-| | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Upstream-Status: Submitted [https://github.com/rpm-software-management/createrepo_c/pull/387]
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- src/metadata_internal.h | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/src/metadata_internal.h b/src/metadata_internal.h
-index 8ba0576..ecfbac2 100644
---- a/src/metadata_internal.h
-+++ b/src/metadata_internal.h
-@@ -52,14 +52,14 @@ cr_metadata_load_modulemd(ModulemdModuleIndex **moduleindex,
- * @param dest_dir Path to directory where the compressed groupfile should be stored.
- * @return Path to the new compressed groupfile. Has to be freed by the caller.
- */
-+
-+#endif /* WITH_LIBMODULEMD */
-+
- gchar *
- cr_compress_groupfile(const char *groupfile,
- const char *dest_dir,
- cr_CompressionType compression);
-
--
--#endif /* WITH_LIBMODULEMD */
--
- #ifdef __cplusplus
- }
- #endif
---
-2.42.0
-
diff --git a/poky/meta/recipes-devtools/createrepo-c/createrepo-c/time64fix.patch b/poky/meta/recipes-devtools/createrepo-c/createrepo-c/time64fix.patch
deleted file mode 100644
index a63801ce26..0000000000
--- a/poky/meta/recipes-devtools/createrepo-c/createrepo-c/time64fix.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From 89e1c9415fb8438310036d5810cdb7da75ee3a7f Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Wed, 26 Jul 2023 12:27:14 -0700
-Subject: [PATCH] Adjust printf formats for 64bit time_t on 32bit systems
-
-Fixes format specifier mismatch warnings as well while here
-
-e.g.
-warning: format '%ld' expects argument of type 'long int', but argument 2 has type 'time_t'
-
-Upstream-Status: Submitted [https://github.com/rpm-software-management/createrepo_c/pull/376]
-
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- src/createrepo_c.c | 4 ++--
- src/misc.c | 4 ++--
- src/xml_dump_repomd.c | 2 +-
- 3 files changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/createrepo_c.c b/src/createrepo_c.c
-index 8681419..0f9048a 100644
---- a/src/createrepo_c.c
-+++ b/src/createrepo_c.c
-@@ -582,9 +582,9 @@ duplicates_warning(const char *nevra, GArray *locations, CmdDupNevra option)
- for (size_t i=0; i<locations->len; i++) {
- struct DuplicateLocation location = g_array_index(locations, struct
- DuplicateLocation, i);
-- g_warning(" Sourced from location: \'%s\', build timestamp: %ld%s",
-+ g_warning(" Sourced from location: \'%s\', build timestamp: %jd%s",
- location.location,
-- location.pkg->time_build,
-+ (intmax_t) location.pkg->time_build,
- location.pkg->skip_dump ? skip_reason : "");
-
- }
-diff --git a/src/misc.c b/src/misc.c
-index 8511ca2..7866c7b 100644
---- a/src/misc.c
-+++ b/src/misc.c
-@@ -1512,11 +1512,11 @@ cr_append_pid_and_datetime(const char *str, const char *suffix)
- gettimeofday(&tv, NULL);
- timeinfo = localtime (&(tv.tv_sec));
- strftime(datetime, 80, "%Y%m%d%H%M%S", timeinfo);
-- gchar *result = g_strdup_printf("%s%jd.%s.%ld%s",
-+ gchar *result = g_strdup_printf("%s%jd.%s.%jd%s",
- str ? str : "",
- (intmax_t) getpid(),
- datetime,
-- tv.tv_usec,
-+ (intmax_t) tv.tv_usec,
- suffix ? suffix : "");
- return result;
- }
-diff --git a/src/xml_dump_repomd.c b/src/xml_dump_repomd.c
-index 33b0e09..9d24249 100644
---- a/src/xml_dump_repomd.c
-+++ b/src/xml_dump_repomd.c
-@@ -143,7 +143,7 @@ cr_xml_dump_repomd_body(xmlNodePtr root, cr_Repomd *repomd)
- BAD_CAST repomd->revision);
- } else {
- // Use the current time if no revision was explicitly specified
-- gchar *rev = g_strdup_printf("%ld", time(NULL));
-+ gchar *rev = g_strdup_printf("%jd", (intmax_t) time(NULL));
- xmlNewChild(root, NULL, BAD_CAST "revision", BAD_CAST rev);
- g_free(rev);
- }
---
-2.41.0
-
diff --git a/poky/meta/recipes-devtools/createrepo-c/createrepo-c_1.0.0.bb b/poky/meta/recipes-devtools/createrepo-c/createrepo-c_1.0.2.bb
index f4e65492f8..49d29bcfb4 100644
--- a/poky/meta/recipes-devtools/createrepo-c/createrepo-c_1.0.0.bb
+++ b/poky/meta/recipes-devtools/createrepo-c/createrepo-c_1.0.2.bb
@@ -7,11 +7,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
SRC_URI = "git://github.com/rpm-software-management/createrepo_c;branch=master;protocol=https \
file://0001-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch \
file://0001-include-rpm-rpmstring.h.patch \
- file://time64fix.patch \
- file://0001-Move-cr_compress_groupfile-outside-WITH_LIBMODULEMD.patch \
"
-SRCREV = "0cc13920991b2fb8f87fb9d352bd3394c2983289"
+SRCREV = "e87636334a3bc5d6ddfdb6c0b34042e96987efb1"
S = "${WORKDIR}/git"
diff --git a/poky/meta/recipes-devtools/dnf/dnf_4.17.0.bb b/poky/meta/recipes-devtools/dnf/dnf_4.18.1.bb
index ec4e48d68b..f60b4794a6 100644
--- a/poky/meta/recipes-devtools/dnf/dnf_4.17.0.bb
+++ b/poky/meta/recipes-devtools/dnf/dnf_4.18.1.bb
@@ -19,7 +19,7 @@ SRC_URI = "git://github.com/rpm-software-management/dnf.git;branch=master;protoc
SRC_URI:append:class-native = "file://0001-dnf-write-the-log-lock-to-root.patch"
-SRCREV = "a31687c169095de1acb5c0a3762bf78993661776"
+SRCREV = "41a287e2bd60b4d1100c329a274776ff32ba8740"
UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+(\.\d+)+)"
S = "${WORKDIR}/git"
diff --git a/poky/meta/recipes-devtools/git/git_2.42.0.bb b/poky/meta/recipes-devtools/git/git_2.42.1.bb
index c417b11b1e..33269d39a9 100644
--- a/poky/meta/recipes-devtools/git/git_2.42.0.bb
+++ b/poky/meta/recipes-devtools/git/git_2.42.1.bb
@@ -160,4 +160,4 @@ EXTRA_OECONF += "ac_cv_snprintf_returns_bogus=no \
"
EXTRA_OEMAKE += "NO_GETTEXT=1"
-SRC_URI[tarball.sha256sum] = "34aedd54210d7216a55d642bbb4cfb22695b7610719a106bf0ddef4c82a8beed"
+SRC_URI[tarball.sha256sum] = "839d75c91ddfa9f7534f7b0888e462e3ad1422bb8ef12ec35f6261cea18efe33"
diff --git a/poky/meta/recipes-devtools/go/go-cross-canadian.inc b/poky/meta/recipes-devtools/go/go-cross-canadian.inc
index 45758f3361..8298fe31be 100644
--- a/poky/meta/recipes-devtools/go/go-cross-canadian.inc
+++ b/poky/meta/recipes-devtools/go/go-cross-canadian.inc
@@ -8,7 +8,7 @@ PN = "go-cross-canadian-${TRANSLATED_TARGET_ARCH}"
# it uses gcc on build machine during go-cross-canadian bootstrap, but
# the gcc version may be old and not support option '-fmacro-prefix-map'
# which is one of default values of DEBUG_PREFIX_MAP
-DEBUG_PREFIX_MAP = "-fdebug-prefix-map=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} \
+DEBUG_PREFIX_MAP = "-fdebug-prefix-map=${WORKDIR}=${TARGET_DBGSRC_DIR} \
-fdebug-prefix-map=${STAGING_DIR_HOST}= \
-fdebug-prefix-map=${STAGING_DIR_NATIVE}= \
"
diff --git a/poky/meta/recipes-devtools/libcomps/libcomps/0001-libcomps-Use-Py_hash_t-instead-of-long-in-PyCOMPS_ha.patch b/poky/meta/recipes-devtools/libcomps/libcomps/0001-libcomps-Use-Py_hash_t-instead-of-long-in-PyCOMPS_ha.patch
deleted file mode 100644
index dd9ebc8af4..0000000000
--- a/poky/meta/recipes-devtools/libcomps/libcomps/0001-libcomps-Use-Py_hash_t-instead-of-long-in-PyCOMPS_ha.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From 26a9647c832de15248ee649e5b77075521f3d4f0 Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Fri, 3 Mar 2023 08:37:35 -0800
-Subject: [PATCH] libcomps: Use Py_hash_t instead of long in PyCOMPS_hash()
-
-This function is used as a hashfunc callback in
-_typeobject defined python3.11/cpython/object.h
-compilers detect the protype mismatch for function pointers
-with clang16+
-
-Fixes
-libcomps/src/python/src/pycomps_sequence.c:667:5: error: incompatible function pointer types initializing 'hashfunc' (aka 'int (*)(struct _object *)') with an expression of type 'long (*)(PyObject *)' (aka 'long (*)(struct _object *)') [-Wincompatible-function-pointer-types]
- &PyCOMPS_hash, /*tp_hash */
-
-Upstream-Status: Submitted [https://github.com/rpm-software-management/libcomps/pull/101]
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- libcomps/src/python/src/pycomps_hash.c | 4 ++--
- libcomps/src/python/src/pycomps_hash.h | 2 +-
- libcomps/src/python/src/pycomps_utils.h | 2 +-
- 3 files changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/libcomps/src/python/src/pycomps_hash.c b/libcomps/src/python/src/pycomps_hash.c
-index 474afd5..4577769 100644
---- a/libcomps/src/python/src/pycomps_hash.c
-+++ b/libcomps/src/python/src/pycomps_hash.c
-@@ -20,9 +20,9 @@
- #include "pycomps_hash.h"
- #include "pycomps_utils.h"
-
--long PyCOMPS_hash(PyObject *self) {
-+Py_hash_t PyCOMPS_hash(PyObject *self) {
- char *cstr = NULL;
-- long crc;
-+ Py_hash_t crc;
-
- cstr = comps_object_tostr(((PyCompsObject*)self)->c_obj);
- crc = crc32(0, cstr, strlen(cstr));
-diff --git a/libcomps/src/python/src/pycomps_hash.h b/libcomps/src/python/src/pycomps_hash.h
-index b664cae..54e08d9 100644
---- a/libcomps/src/python/src/pycomps_hash.h
-+++ b/libcomps/src/python/src/pycomps_hash.h
-@@ -26,6 +26,6 @@
- #include "pycomps_utils.h"
-
-
--long PyCOMPS_hash(PyObject *self);
-+Py_hash_t PyCOMPS_hash(PyObject *self);
-
- #endif
-diff --git a/libcomps/src/python/src/pycomps_utils.h b/libcomps/src/python/src/pycomps_utils.h
-index ba9bc2f..b34e4dc 100644
---- a/libcomps/src/python/src/pycomps_utils.h
-+++ b/libcomps/src/python/src/pycomps_utils.h
-@@ -137,7 +137,7 @@ COMPS_Object* __pycomps_bytes_in(PyObject *pobj);
- PyObject* __pycomps_str_out(COMPS_Object *obj);
- PyObject *str_to_unicode(void* str);
-
--long PyCOMPS_hash(PyObject *self);
-+Py_hash_t PyCOMPS_hash(PyObject *self);
-
- PyObject* PyCOMPSSeq_extra_get(PyObject *self, PyObject *key);
-
---
-2.39.2
-
diff --git a/poky/meta/recipes-devtools/libcomps/libcomps_0.1.19.bb b/poky/meta/recipes-devtools/libcomps/libcomps_0.1.20.bb
index e362e8e108..1f59c5ea1e 100644
--- a/poky/meta/recipes-devtools/libcomps/libcomps_0.1.19.bb
+++ b/poky/meta/recipes-devtools/libcomps/libcomps_0.1.20.bb
@@ -5,11 +5,10 @@ LICENSE = "GPL-2.0-only"
LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
SRC_URI = "git://github.com/rpm-software-management/libcomps.git;branch=master;protocol=https \
- file://0001-libcomps-Use-Py_hash_t-instead-of-long-in-PyCOMPS_ha.patch \
file://0002-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch \
"
-SRCREV = "9322bdcf06630cc094f094f944d7d0e2cb798b73"
+SRCREV = "854fbb9fe733b774981e1ffcf825b2d2ce0f8072"
S = "${WORKDIR}/git"
diff --git a/poky/meta/recipes-devtools/libdnf/libdnf/armarch.patch b/poky/meta/recipes-devtools/libdnf/libdnf/armarch.patch
new file mode 100644
index 0000000000..99eaf1d521
--- /dev/null
+++ b/poky/meta/recipes-devtools/libdnf/libdnf/armarch.patch
@@ -0,0 +1,42 @@
+We change the way rpm architectures work, we make the machine name the default machine
+specific package architecture.
+
+This arm mapping code can work or in the case of qemuarmv5, it doesn't as it creates
+armv5hl which doesn't exist and causes errrors. We can simply remove it, we don't need it.
+
+Upstream-Status: Inappropriate [Relies on OE rpm config]
+
+Index: git/libdnf/hy-util.cpp
+===================================================================
+--- git.orig/libdnf/hy-util.cpp
++++ git/libdnf/hy-util.cpp
+@@ -117,29 +117,6 @@ hy_detect_arch(char **arch)
+ if (uname(&un) < 0)
+ return DNF_ERROR_FAILED;
+
+- if (!strncmp(un.machine, "armv", 4)) {
+- /* un.machine is armvXE, where X is version number and E is
+- * endianness (b or l); we need to add modifiers such as
+- * h (hardfloat), n (neon). Neon is a requirement of armv8 so
+- * as far as rpm is concerned armv8l is the equivilent of armv7hnl
+- * (or 7hnb) so we don't explicitly add 'n' for 8+ as it's expected. */
+- char endian = un.machine[strlen(un.machine)-1];
+- char *modifier = un.machine + 5;
+- while(isdigit(*modifier)) /* keep armv7, armv8, armv9, armv10, armv100, ... */
+- modifier++;
+- if (getauxval(AT_HWCAP) & HWCAP_ARM_VFP)
+- *modifier++ = 'h';
+- if ((atoi(un.machine+4) == 7) && (getauxval(AT_HWCAP) & HWCAP_ARM_NEON))
+- *modifier++ = 'n';
+- *modifier++ = endian;
+- *modifier = 0;
+- }
+-#ifdef __MIPSEL__
+- if (!strcmp(un.machine, "mips"))
+- strcpy(un.machine, "mipsel");
+- else if (!strcmp(un.machine, "mips64"))
+- strcpy(un.machine, "mips64el");
+-#endif
+ *arch = g_strdup(un.machine);
+ return 0;
+ }
diff --git a/poky/meta/recipes-devtools/libdnf/libdnf_0.71.0.bb b/poky/meta/recipes-devtools/libdnf/libdnf_0.72.0.bb
index 396a6664bc..a8685a1604 100644
--- a/poky/meta/recipes-devtools/libdnf/libdnf_0.71.0.bb
+++ b/poky/meta/recipes-devtools/libdnf/libdnf_0.72.0.bb
@@ -10,9 +10,10 @@ SRC_URI = "git://github.com/rpm-software-management/libdnf;branch=dnf-4-master;p
file://0001-Get-parameters-for-both-libsolv-and-libsolvext-libdn.patch \
file://enable_test_data_dir_set.patch \
file://0001-drop-FindPythonInstDir.cmake.patch \
+ file://armarch.patch \
"
-SRCREV = "39098f39806becdc87cf93e03a49ae89a33e7ede"
+SRCREV = "908dba63c9e18c86a2d81166ce7523559e65338c"
UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>(?!4\.90)\d+(\.\d+)+)"
S = "${WORKDIR}/git"
diff --git a/poky/meta/recipes-devtools/llvm/llvm_git.bb b/poky/meta/recipes-devtools/llvm/llvm_git.bb
index 934f842b90..de8d411686 100644
--- a/poky/meta/recipes-devtools/llvm/llvm_git.bb
+++ b/poky/meta/recipes-devtools/llvm/llvm_git.bb
@@ -14,14 +14,14 @@ RDEPENDS:${PN}:append:class-target = " ncurses-terminfo"
inherit cmake pkgconfig
-PV = "17.0.2"
+PV = "17.0.5"
MAJOR_VERSION = "${@oe.utils.trim_version("${PV}", 1)}"
LLVM_RELEASE = "${PV}"
BRANCH = "release/${MAJOR_VERSION}.x"
-SRCREV = "481358974fb0f732e33d503c224492a543f4d7bd"
+SRCREV = "98bfdac5ce82d1679f8af9a57501471812ab68d7"
SRC_URI = "git://github.com/llvm/llvm-project.git;branch=${BRANCH};protocol=https \
file://0007-llvm-allow-env-override-of-exe-path.patch;striplevel=2 \
file://0001-AsmMatcherEmitter-sort-ClassInfo-lists-by-name-as-we.patch;striplevel=2 \
diff --git a/poky/meta/recipes-devtools/meson/meson_1.2.2.bb b/poky/meta/recipes-devtools/meson/meson_1.2.2.bb
index 6a07168ee1..c38d88fe61 100644
--- a/poky/meta/recipes-devtools/meson/meson_1.2.2.bb
+++ b/poky/meta/recipes-devtools/meson/meson_1.2.2.bb
@@ -66,6 +66,8 @@ def generate_native_link_template(d):
loader = 'ld64.so.2'
elif 'loongarch64' in build_arch:
loader = 'ld-linux-loongarch-lp64d.so.1'
+ elif 'riscv64' in build_arch:
+ loader = 'ld-linux-riscv64-lp64d.so.1'
if loader:
val += ['-Wl,--dynamic-linker=@{OECORE_NATIVE_SYSROOT}${base_libdir_native}/' + loader]
diff --git a/poky/meta/recipes-devtools/mmc/mmc-utils_git.bb b/poky/meta/recipes-devtools/mmc/mmc-utils_git.bb
index 2d02927af7..a7e4d369ff 100644
--- a/poky/meta/recipes-devtools/mmc/mmc-utils_git.bb
+++ b/poky/meta/recipes-devtools/mmc/mmc-utils_git.bb
@@ -5,7 +5,7 @@ LICENSE = "GPL-2.0-only"
LIC_FILES_CHKSUM = "file://mmc.c;beginline=1;endline=20;md5=fae32792e20f4d27ade1c5a762d16b7d"
SRCBRANCH ?= "master"
-SRCREV = "613495ecaca97a19fa7f8f3ea23306472b36453c"
+SRCREV = "b5ca140312d279ad2f22068fd72a6230eea13436"
PV = "0.1+git"
diff --git a/poky/meta/recipes-devtools/perl/files/0001-Fix-intermittent-failure-of-test-t-op-sigsystem.t.patch b/poky/meta/recipes-devtools/perl/files/0001-Fix-intermittent-failure-of-test-t-op-sigsystem.t.patch
new file mode 100644
index 0000000000..86fd42cd3d
--- /dev/null
+++ b/poky/meta/recipes-devtools/perl/files/0001-Fix-intermittent-failure-of-test-t-op-sigsystem.t.patch
@@ -0,0 +1,77 @@
+From 75d974a58c461b3b5d35280e497810e46abae4ca Mon Sep 17 00:00:00 2001
+From: William Lyu <William.Lyu@windriver.com>
+Date: Wed, 4 Oct 2023 08:58:41 -0400
+Subject: [PATCH] Fix intermittent failure of test t/op/sigsystem.t
+
+[Perl issue #21546] -- https://github.com/Perl/perl5/issues/21546
+
+This fix addresses the intermittent failure of the test
+t/op/sigsystem.t by improving its robustness. Before the fix, this
+test waits a hard-coded amount of time in the parent process for the
+child process to exit, and the child process may not be able to exit
+soon enough. With this fix, the parent process in this test polls for
+whether the SIGCHLD handler reaped the child process for at most 25
+seconds.
+
+Upstream-Status: Backport [commit ID: 75d974a]
+
+Signed-off-by: William Lyu <William.Lyu@windriver.com>
+Signed-off-by: Randy MacLeod <randy.macleod@windriver.com>
+Reported-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+
+Committer: William Lyu is now a Perl author.
+---
+ AUTHORS | 1 +
+ t/op/sigsystem.t | 17 ++++++++++++++---
+ 2 files changed, 15 insertions(+), 3 deletions(-)
+
+diff --git a/AUTHORS b/AUTHORS
+index 21948bfdc7..527dd992fd 100644
+--- a/AUTHORS
++++ b/AUTHORS
+@@ -1443,6 +1443,7 @@ Wayne Scott <wscott@ichips.intel.com>
+ Wayne Thompson <Wayne.Thompson@Ebay.sun.com>
+ Wilfredo Sánchez <wsanchez@mit.edu>
+ William J. Middleton <William.Middleton@oslo.mobil.telenor.no>
++William Lyu <William.Lyu@windriver.com>
+ William Mann <wmann@avici.com>
+ William Middleton <wmiddlet@adobe.com>
+ William R Ward <hermit@BayView.COM>
+diff --git a/t/op/sigsystem.t b/t/op/sigsystem.t
+index 25da854902..831feefb0f 100644
+--- a/t/op/sigsystem.t
++++ b/t/op/sigsystem.t
+@@ -37,7 +37,15 @@ SKIP: {
+ test_system('with reaper');
+
+ note("Waiting briefly for SIGCHLD...");
+- Time::HiRes::sleep(0.500);
++
++ # Wait at most 50 * 0.500 = 25.0 seconds for the child process to be
++ # reaped. If the child process exits and gets reaped early, this polling
++ # loop will exit early.
++
++ for (1..50) {
++ last if @pids;
++ Time::HiRes::sleep(0.500);
++ }
+
+ ok(@pids == 1, 'Reaped only one process');
+ ok($pids[0] == $pid, "Reaped the right process.") or diag(Dumper(\@pids));
+@@ -50,8 +58,11 @@ sub test_system {
+ my $got_zeroes = 0;
+
+ # This test is looking for a race between system()'s waitpid() and a
+- # signal handler. Looping a few times increases the chances of
+- # catching the error.
++ # signal handler. The system() call is expected to not interfere with the
++ # SIGCHLD signal handler. In particular, the wait() called within system()
++ # is expected to reap the child process forked by system() before the
++ # SIGCHLD signal handler is called.
++ # Looping a few times increases the chances of catching the error.
+
+ for (1..$expected_zeroes) {
+ $got_zeroes++ unless system(TRUE);
+--
+2.25.1
+
diff --git a/poky/meta/recipes-devtools/perl/perl_5.38.0.bb b/poky/meta/recipes-devtools/perl/perl_5.38.0.bb
index 956e4d64d7..639664e355 100644
--- a/poky/meta/recipes-devtools/perl/perl_5.38.0.bb
+++ b/poky/meta/recipes-devtools/perl/perl_5.38.0.bb
@@ -17,6 +17,7 @@ SRC_URI = "https://www.cpan.org/src/5.0/perl-${PV}.tar.gz;name=perl \
file://0002-Constant-Fix-up-shebang.patch \
file://determinism.patch \
file://0001-cpan-Sys-Syslog-Makefile.PL-Fix-_PATH_LOG-for-determ.patch \
+ file://0001-Fix-intermittent-failure-of-test-t-op-sigsystem.t.patch \
"
SRC_URI:append:class-native = " \
file://perl-configpm-switch.patch \
diff --git a/poky/meta/recipes-devtools/python/python-testtools.inc b/poky/meta/recipes-devtools/python/python-testtools.inc
index e004d0eb0b..759166d63d 100644
--- a/poky/meta/recipes-devtools/python/python-testtools.inc
+++ b/poky/meta/recipes-devtools/python/python-testtools.inc
@@ -6,7 +6,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=e2c9d3e8ba7141c83bfef190e0b9379a"
inherit pypi
-SRC_URI[sha256sum] = "28b65e14c0f2d3ecbbfb5f55c9dcde5e4faa80ac16a37a823909a1fe3cbcb30a"
+SRC_URI[sha256sum] = "df6de96010e29ee21f637a147eabf30d50b25e3841dd1d68f93ee89ce77e366c"
DEPENDS += " \
${PYTHON_PN}-pbr \
diff --git a/poky/meta/recipes-devtools/python/python3-babel_2.12.1.bb b/poky/meta/recipes-devtools/python/python3-babel_2.13.1.bb
index 794e1652cd..6908d81326 100644
--- a/poky/meta/recipes-devtools/python/python3-babel_2.12.1.bb
+++ b/poky/meta/recipes-devtools/python/python3-babel_2.13.1.bb
@@ -3,7 +3,7 @@ HOMEPAGE = "http://babel.edgewall.org/"
LICENSE = "BSD-3-Clause"
LIC_FILES_CHKSUM = "file://LICENSE;md5=0f97d9a63e91407b4c0d01efde91cfc0"
-SRC_URI[sha256sum] = "cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"
+SRC_URI[sha256sum] = "33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"
PYPI_PACKAGE = "Babel"
diff --git a/poky/meta/recipes-devtools/python/python3-beartype_0.15.0.bb b/poky/meta/recipes-devtools/python/python3-beartype_0.16.4.bb
index 14eda1dd7d..ad4462e0e2 100644
--- a/poky/meta/recipes-devtools/python/python3-beartype_0.15.0.bb
+++ b/poky/meta/recipes-devtools/python/python3-beartype_0.16.4.bb
@@ -4,7 +4,7 @@ HOMEPAGE = "https://beartype.readthedocs.io"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=e40b52d8eb5553aa8f705cdd3f979d69"
-SRC_URI[sha256sum] = "2af6a8d8a7267ccf7d271e1a3bd908afbc025d2a09aa51123567d7d7b37438df"
+SRC_URI[sha256sum] = "1ada89cf2d6eb30eb6e156eed2eb5493357782937910d74380918e53c2eae0bf"
inherit setuptools3 pypi
diff --git a/poky/meta/recipes-devtools/python/python3-cffi_1.15.1.bb b/poky/meta/recipes-devtools/python/python3-cffi_1.16.0.bb
index daa290a54e..a351029ef2 100644
--- a/poky/meta/recipes-devtools/python/python3-cffi_1.15.1.bb
+++ b/poky/meta/recipes-devtools/python/python3-cffi_1.16.0.bb
@@ -4,7 +4,7 @@ LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=5677e2fdbf7cdda61d6dd2b57df547bf"
DEPENDS += "libffi ${PYTHON_PN}-pycparser"
-SRC_URI[sha256sum] = "d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"
+SRC_URI[sha256sum] = "bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"
inherit pypi setuptools3
diff --git a/poky/meta/recipes-devtools/python/python3-cryptography-vectors_41.0.4.bb b/poky/meta/recipes-devtools/python/python3-cryptography-vectors_41.0.5.bb
index 6b5d8adee9..44c67fdd76 100644
--- a/poky/meta/recipes-devtools/python/python3-cryptography-vectors_41.0.4.bb
+++ b/poky/meta/recipes-devtools/python/python3-cryptography-vectors_41.0.5.bb
@@ -9,7 +9,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=8c3617db4fb6fae01f1d253ab91511e4 \
# NOTE: Make sure to keep this recipe at the same version as python3-cryptography
# Upgrade both recipes at the same time
-SRC_URI[sha256sum] = "440af2813ea7aeb52181ec651a36d9ae8f0976e8b3a62b411a800fe6fa57a19e"
+SRC_URI[sha256sum] = "75e82aea2982729312af735adb2983f347bb21fff88ad5dda3673ed70e1d1caf"
PYPI_PACKAGE = "cryptography_vectors"
diff --git a/poky/meta/recipes-devtools/python/python3-cryptography_41.0.4.bb b/poky/meta/recipes-devtools/python/python3-cryptography_41.0.5.bb
index 94977789c8..17b08f05cd 100644
--- a/poky/meta/recipes-devtools/python/python3-cryptography_41.0.4.bb
+++ b/poky/meta/recipes-devtools/python/python3-cryptography_41.0.5.bb
@@ -8,7 +8,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=8c3617db4fb6fae01f1d253ab91511e4 \
"
LDSHARED += "-pthread"
-SRC_URI[sha256sum] = "7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a"
+SRC_URI[sha256sum] = "392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7"
SRC_URI += "file://0001-pyproject.toml-remove-benchmark-disable-option.patch \
file://0001-Fix-include-directory-when-cross-compiling-9129.patch \
diff --git a/poky/meta/recipes-devtools/python/python3-cython_0.29.36.bb b/poky/meta/recipes-devtools/python/python3-cython_0.29.36.bb
index 78be2b94ed..07638d7ad7 100644
--- a/poky/meta/recipes-devtools/python/python3-cython_0.29.36.bb
+++ b/poky/meta/recipes-devtools/python/python3-cython_0.29.36.bb
@@ -20,17 +20,17 @@ do_install:append() {
PACKAGESPLITFUNCS =+ "cython_fix_sources"
cython_fix_sources () {
- for f in ${PKGD}/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/Cython/Compiler/FlowControl.c \
- ${PKGD}/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/Cython/Compiler/FusedNode.c \
- ${PKGD}/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/Cython/Compiler/Scanning.c \
- ${PKGD}/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/Cython/Compiler/Visitor.c \
- ${PKGD}/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/Cython/Plex/Actions.c \
- ${PKGD}/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/Cython/Plex/Scanners.c \
- ${PKGD}/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/Cython/Runtime/refnanny.c \
- ${PKGD}/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/Cython/Tempita/_tempita.c \
+ for f in ${PKGD}${TARGET_DBGSRC_DIR}/Cython/Compiler/FlowControl.c \
+ ${PKGD}${TARGET_DBGSRC_DIR}/Cython/Compiler/FusedNode.c \
+ ${PKGD}${TARGET_DBGSRC_DIR}/Cython/Compiler/Scanning.c \
+ ${PKGD}${TARGET_DBGSRC_DIR}/Cython/Compiler/Visitor.c \
+ ${PKGD}${TARGET_DBGSRC_DIR}/Cython/Plex/Actions.c \
+ ${PKGD}${TARGET_DBGSRC_DIR}/Cython/Plex/Scanners.c \
+ ${PKGD}${TARGET_DBGSRC_DIR}/Cython/Runtime/refnanny.c \
+ ${PKGD}${TARGET_DBGSRC_DIR}/Cython/Tempita/_tempita.c \
${PKGD}${libdir}/${PYTHON_DIR}/site-packages/Cython*/SOURCES.txt; do
if [ -e $f ]; then
- sed -i -e 's#${WORKDIR}/Cython-${PV}#/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}#g' $f
+ sed -i -e 's#${WORKDIR}/Cython-${PV}#${TARGET_DBGSRC_DIR}#g' $f
fi
done
}
diff --git a/poky/meta/recipes-devtools/python/python3-git_3.1.36.bb b/poky/meta/recipes-devtools/python/python3-git_3.1.40.bb
index ab1b0f2353..47aa7f09ac 100644
--- a/poky/meta/recipes-devtools/python/python3-git_3.1.36.bb
+++ b/poky/meta/recipes-devtools/python/python3-git_3.1.40.bb
@@ -6,13 +6,13 @@ access with big-files support."
HOMEPAGE = "http://github.com/gitpython-developers/GitPython"
SECTION = "devel/python"
LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=8b8d26c37c1d5a04f9b0186edbebc183"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5279a7ab369ba336989dcf2a107e5c8e"
PYPI_PACKAGE = "GitPython"
inherit pypi python_setuptools_build_meta
-SRC_URI[sha256sum] = "4bb0c2a6995e85064140d31a33289aa5dce80133a23d36fcd372d716c54d3ebf"
+SRC_URI[sha256sum] = "22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"
DEPENDS += " ${PYTHON_PN}-gitdb"
diff --git a/poky/meta/recipes-devtools/python/python3-gitdb_4.0.10.bb b/poky/meta/recipes-devtools/python/python3-gitdb_4.0.11.bb
index 3a430c30f0..25e1a2df7e 100644
--- a/poky/meta/recipes-devtools/python/python3-gitdb_4.0.10.bb
+++ b/poky/meta/recipes-devtools/python/python3-gitdb_4.0.11.bb
@@ -10,7 +10,7 @@ inherit pypi setuptools3
PYPI_PACKAGE = "gitdb"
-SRC_URI[sha256sum] = "6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"
+SRC_URI[sha256sum] = "bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"
RDEPENDS:${PN} += "python3-compression \
python3-crypt \
diff --git a/poky/meta/recipes-devtools/python/python3-hatch-vcs_0.3.0.bb b/poky/meta/recipes-devtools/python/python3-hatch-vcs_0.4.0.bb
index b4db10e767..2e49aba469 100644
--- a/poky/meta/recipes-devtools/python/python3-hatch-vcs_0.3.0.bb
+++ b/poky/meta/recipes-devtools/python/python3-hatch-vcs_0.4.0.bb
@@ -7,7 +7,7 @@ inherit pypi python_hatchling
PYPI_PACKAGE = "hatch_vcs"
-SRC_URI[sha256sum] = "cec5107cfce482c67f8bc96f18bbc320c9aa0d068180e14ad317bbee5a153fee"
+SRC_URI[sha256sum] = "093810748fe01db0d451fabcf2c1ac2688caefd232d4ede967090b1c1b07d9f7"
BBCLASSEXTEND = "native nativesdk"
diff --git a/poky/meta/recipes-devtools/python/python3-hypothesis_6.86.2.bb b/poky/meta/recipes-devtools/python/python3-hypothesis_6.89.0.bb
index 6ec1457e46..035809c394 100644
--- a/poky/meta/recipes-devtools/python/python3-hypothesis_6.86.2.bb
+++ b/poky/meta/recipes-devtools/python/python3-hypothesis_6.89.0.bb
@@ -13,7 +13,7 @@ SRC_URI += " \
file://test_rle.py \
"
-SRC_URI[sha256sum] = "e5d75d70f5a4fc372cddf03ec6141237a0a270ed106aeb2156a4984f06d37b0f"
+SRC_URI[sha256sum] = "9168bb12cd29001067e66b5f25f1bbdeff08b80c29c3909e19fc8205d8b9aeed"
RDEPENDS:${PN} += " \
python3-attrs \
diff --git a/poky/meta/recipes-devtools/python/python3-iso8601_2.0.0.bb b/poky/meta/recipes-devtools/python/python3-iso8601_2.1.0.bb
index a8dccb90c7..40ca5177be 100644
--- a/poky/meta/recipes-devtools/python/python3-iso8601_2.0.0.bb
+++ b/poky/meta/recipes-devtools/python/python3-iso8601_2.1.0.bb
@@ -3,7 +3,7 @@ HOMEPAGE = "http://pyiso8601.readthedocs.org/"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=aab31f2ef7ba214a5a341eaa47a7f367"
-SRC_URI[sha256sum] = "739960d37c74c77bd9bd546a76562ccb581fe3d4820ff5c3141eb49c839fda8f"
+SRC_URI[sha256sum] = "6b1d3829ee8921c4301998c909f7829fa9ed3cbdac0d3b16af2d743aed1ba8df"
inherit pypi python_poetry_core
diff --git a/poky/meta/recipes-devtools/python/python3-mako_1.2.4.bb b/poky/meta/recipes-devtools/python/python3-mako_1.3.0.bb
index 9860058723..d180e05cea 100644
--- a/poky/meta/recipes-devtools/python/python3-mako_1.2.4.bb
+++ b/poky/meta/recipes-devtools/python/python3-mako_1.3.0.bb
@@ -2,13 +2,13 @@ SUMMARY = "Templating library for Python"
HOMEPAGE = "http://www.makotemplates.org/"
SECTION = "devel/python"
LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=ad08dd28df88e64b35bcac27c822ee34"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=fcc01df649aee6c59dcb254c894ea0d4"
PYPI_PACKAGE = "Mako"
inherit pypi python_setuptools_build_meta
-SRC_URI[sha256sum] = "d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"
+SRC_URI[sha256sum] = "e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b"
RDEPENDS:${PN} = "${PYTHON_PN}-html \
${PYTHON_PN}-markupsafe \
diff --git a/poky/meta/recipes-devtools/python/python3-markdown_3.4.4.bb b/poky/meta/recipes-devtools/python/python3-markdown_3.5.bb
index 6a7e6f7c3e..1ad3f7828d 100644
--- a/poky/meta/recipes-devtools/python/python3-markdown_3.4.4.bb
+++ b/poky/meta/recipes-devtools/python/python3-markdown_3.5.bb
@@ -6,7 +6,7 @@ LIC_FILES_CHKSUM = "file://LICENSE.md;md5=745aaad0c69c60039e638bff9ffc59ed"
inherit pypi python_setuptools_build_meta
PYPI_PACKAGE = "Markdown"
-SRC_URI[sha256sum] = "225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6"
+SRC_URI[sha256sum] = "a807eb2e4778d9156c8f07876c6e4d50b5494c5665c4834f67b06459dfd877b3"
BBCLASSEXTEND = "native nativesdk"
diff --git a/poky/meta/recipes-devtools/python/python3-numpy_1.26.0.bb b/poky/meta/recipes-devtools/python/python3-numpy_1.26.2.bb
index 3ae40a33fb..00c09b2995 100644
--- a/poky/meta/recipes-devtools/python/python3-numpy_1.26.0.bb
+++ b/poky/meta/recipes-devtools/python/python3-numpy_1.26.2.bb
@@ -13,7 +13,7 @@ SRC_URI = "${GITHUB_BASE_URI}/download/v${PV}/${SRCNAME}-${PV}.tar.gz \
file://fix_reproducibility.patch \
file://run-ptest \
"
-SRC_URI[sha256sum] = "f93fc78fe8bf15afe2b8d6b6499f1c73953169fad1e9a8dd086cdff3190e7fdf"
+SRC_URI[sha256sum] = "f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"
GITHUB_BASE_URI = "https://github.com/numpy/numpy/releases"
UPSTREAM_CHECK_REGEX = "releases/tag/v?(?P<pver>\d+(\.\d+)+)$"
diff --git a/poky/meta/recipes-devtools/python/python3-packaging_23.1.bb b/poky/meta/recipes-devtools/python/python3-packaging_23.2.bb
index 53d3522dd7..2d35936615 100644
--- a/poky/meta/recipes-devtools/python/python3-packaging_23.1.bb
+++ b/poky/meta/recipes-devtools/python/python3-packaging_23.2.bb
@@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/pypa/packaging"
LICENSE = "Apache-2.0 | BSD-2-Clause"
LIC_FILES_CHKSUM = "file://LICENSE;md5=faadaedca9251a90b205c9167578ce91"
-SRC_URI[sha256sum] = "a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"
+SRC_URI[sha256sum] = "048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"
inherit pypi python_flit_core
diff --git a/poky/meta/recipes-devtools/python/python3-pbr_5.11.1.bb b/poky/meta/recipes-devtools/python/python3-pbr_5.11.1.bb
deleted file mode 100644
index 520dbef8dd..0000000000
--- a/poky/meta/recipes-devtools/python/python3-pbr_5.11.1.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools3
-require python-pbr.inc
-
-SRC_URI[sha256sum] = "aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"
diff --git a/poky/meta/recipes-devtools/python/python3-pbr_6.0.0.bb b/poky/meta/recipes-devtools/python/python3-pbr_6.0.0.bb
new file mode 100644
index 0000000000..6c8171196a
--- /dev/null
+++ b/poky/meta/recipes-devtools/python/python3-pbr_6.0.0.bb
@@ -0,0 +1,4 @@
+inherit setuptools3
+require python-pbr.inc
+
+SRC_URI[sha256sum] = "d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"
diff --git a/poky/meta/recipes-devtools/python/python3-pip_23.2.1.bb b/poky/meta/recipes-devtools/python/python3-pip_23.3.1.bb
index c92e2dbd57..3699bdf515 100644
--- a/poky/meta/recipes-devtools/python/python3-pip_23.2.1.bb
+++ b/poky/meta/recipes-devtools/python/python3-pip_23.3.1.bb
@@ -33,7 +33,7 @@ inherit pypi python_setuptools_build_meta
SRC_URI += "file://no_shebang_mangling.patch"
-SRC_URI[sha256sum] = "fb0bd5435b3200c602b5bf61d2d43c2f13c02e29c1707567ae7fbc514eb9faf2"
+SRC_URI[sha256sum] = "1fcaa041308d01f14575f6d0d2ea4b75a3e2871fe4f9c694976f908768e14174"
do_install:append() {
rm -f ${D}/${bindir}/pip
diff --git a/poky/meta/recipes-devtools/python/python3-poetry-core_1.7.0.bb b/poky/meta/recipes-devtools/python/python3-poetry-core_1.8.1.bb
index 40b6355f4b..fcb6d30ee0 100644
--- a/poky/meta/recipes-devtools/python/python3-poetry-core_1.7.0.bb
+++ b/poky/meta/recipes-devtools/python/python3-poetry-core_1.8.1.bb
@@ -4,21 +4,18 @@ HOMEPAGE = "https://github.com/python-poetry/poetry-core"
BUGTRACKER = "https://github.com/python-poetry/poetry-core"
CHANGELOG = "https://github.com/python-poetry/poetry-core/blob/master/CHANGELOG.md"
-LICENSE = "Apache-2.0 & BSD-2-Clause & MIT"
+LICENSE = "Apache-2.0 & BSD-2-Clause & BSD-3-Clause & MIT"
LIC_FILES_CHKSUM = "\
file://LICENSE;md5=78c39cfd009863ae44237a7ab1f9cedc \
- file://src/poetry/core/_vendor/attr/_version_info.py;beginline=1;endline=1;md5=b2dccaa94b3629a08bfb4f983cad6f89 \
- file://src/poetry/core/_vendor/attrs/LICENSE;md5=5e55731824cf9205cfabeab9a0600887 \
- file://src/poetry/core/_vendor/jsonschema/COPYING;md5=7a60a81c146ec25599a3e1dabb8610a8 \
+ file://src/poetry/core/_vendor/fastjsonschema/LICENSE;md5=18950e8362b69c0c617b42b8bd8e7532 \
file://src/poetry/core/_vendor/lark/LICENSE;md5=fcfbf1e2ecc0f37acbb5871aa0267500 \
file://src/poetry/core/_vendor/packaging/LICENSE;md5=faadaedca9251a90b205c9167578ce91 \
file://src/poetry/core/_vendor/packaging/LICENSE.APACHE;md5=2ee41112a44fe7014dce33e26468ba93 \
file://src/poetry/core/_vendor/packaging/LICENSE.BSD;md5=7bef9bf4a8e4263634d0597e7ba100b8 \
- file://src/poetry/core/_vendor/pyrsistent/LICENSE.mit;md5=b695eb9c6e7a6fb1b1bc2d193c42776e \
file://src/poetry/core/_vendor/tomli/LICENSE;md5=aaaaf0879d17df0110d1aa8c8c9f46f5 \
"
-SRC_URI[sha256sum] = "8f679b83bd9c820082637beca1204124d5d2a786e4818da47ec8acefd0353b74"
+SRC_URI[sha256sum] = "67a76c671da2a70e55047cddda83566035b701f7e463b32a2abfeac6e2a16376"
inherit python_poetry_core pypi
PYPI_ARCHIVE_NAME = "poetry_core-${PV}.${PYPI_PACKAGE_EXT}"
diff --git a/poky/meta/recipes-devtools/python/python3-psutil_5.9.5.bb b/poky/meta/recipes-devtools/python/python3-psutil_5.9.6.bb
index c84e2225b8..df4f776b7b 100644
--- a/poky/meta/recipes-devtools/python/python3-psutil_5.9.5.bb
+++ b/poky/meta/recipes-devtools/python/python3-psutil_5.9.6.bb
@@ -3,7 +3,7 @@ LICENSE = "BSD-3-Clause"
LIC_FILES_CHKSUM = "file://LICENSE;md5=a9c72113a843d0d732a0ac1c200d81b1"
HOMEPAGE = "https://pypi.org/project/psutil/"
-SRC_URI[sha256sum] = "5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"
+SRC_URI[sha256sum] = "e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"
inherit pypi setuptools3
diff --git a/poky/meta/recipes-devtools/python/python3-pycairo_1.24.0.bb b/poky/meta/recipes-devtools/python/python3-pycairo_1.25.1.bb
index 8059750de0..1599f6d39e 100644
--- a/poky/meta/recipes-devtools/python/python3-pycairo_1.24.0.bb
+++ b/poky/meta/recipes-devtools/python/python3-pycairo_1.25.1.bb
@@ -13,7 +13,7 @@ DEPENDS = "cairo python3"
SRC_URI = "${GITHUB_BASE_URI}/download/v${PV}/pycairo-${PV}.tar.gz"
GITHUB_BASE_URI = "https://github.com/pygobject/pycairo/releases/"
-SRC_URI[sha256sum] = "1444d52f1bb4cc79a4a0c0fe2ccec4bd78ff885ab01ebe1c0f637d8392bcafb6"
+SRC_URI[sha256sum] = "7e2be4fbc3b4536f16db7a11982cbf713e75069a4d73d44fe5a49b68423f5c0c"
S = "${WORKDIR}/pycairo-${PV}"
diff --git a/poky/meta/recipes-devtools/python/python3-pygobject_3.46.0.bb b/poky/meta/recipes-devtools/python/python3-pygobject_3.46.0.bb
index 28129fd66a..73a393051a 100644
--- a/poky/meta/recipes-devtools/python/python3-pygobject_3.46.0.bb
+++ b/poky/meta/recipes-devtools/python/python3-pygobject_3.46.0.bb
@@ -5,7 +5,6 @@ SECTION = "devel/python"
LICENSE = "LGPL-2.1-only"
LIC_FILES_CHKSUM = "file://COPYING;md5=a916467b91076e631dd8edb7424769c7"
-GNOMEBASEBUILDCLASS = "meson"
GIR_MESON_OPTION = ""
inherit gnomebase setuptools3-base gobject-introspection upstream-version-is-even
diff --git a/poky/meta/recipes-devtools/python/python3-pyopenssl_23.2.0.bb b/poky/meta/recipes-devtools/python/python3-pyopenssl_23.3.0.bb
index 86ae406ffb..cdcae48d60 100644
--- a/poky/meta/recipes-devtools/python/python3-pyopenssl_23.2.0.bb
+++ b/poky/meta/recipes-devtools/python/python3-pyopenssl_23.3.0.bb
@@ -5,7 +5,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
DEPENDS += "openssl ${PYTHON_PN}-cryptography"
-SRC_URI[sha256sum] = "276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"
+SRC_URI[sha256sum] = "6b2cba5cc46e822750ec3e5a81ee12819850b11303630d575e98108a079c2b12"
PYPI_PACKAGE = "pyOpenSSL"
inherit pypi setuptools3
diff --git a/poky/meta/recipes-devtools/python/python3-pyrsistent_0.19.3.bb b/poky/meta/recipes-devtools/python/python3-pyrsistent_0.20.0.bb
index 05654c348d..9661f1474e 100644
--- a/poky/meta/recipes-devtools/python/python3-pyrsistent_0.19.3.bb
+++ b/poky/meta/recipes-devtools/python/python3-pyrsistent_0.20.0.bb
@@ -1,9 +1,9 @@
SUMMARY = "Persistent/Immutable/Functional data structures for Python"
HOMEPAGE = "https://github.com/tobgu/pyrsistent"
LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.mit;md5=b695eb9c6e7a6fb1b1bc2d193c42776e"
+LIC_FILES_CHKSUM = "file://LICENSE.mit;md5=f798dc4222a29fea881fa998cdf4a8c8"
-SRC_URI[sha256sum] = "1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"
+SRC_URI[sha256sum] = "4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"
inherit pypi python_setuptools_build_meta
diff --git a/poky/meta/recipes-devtools/python/python3-pytest_7.4.2.bb b/poky/meta/recipes-devtools/python/python3-pytest_7.4.3.bb
index 710aa51716..6fa0febd88 100644
--- a/poky/meta/recipes-devtools/python/python3-pytest_7.4.2.bb
+++ b/poky/meta/recipes-devtools/python/python3-pytest_7.4.3.bb
@@ -5,7 +5,7 @@ DESCRIPTION = "The pytest framework makes it easy to write small tests, yet scal
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=bd27e41b6550fe0fc45356d1d81ee37c"
-SRC_URI[sha256sum] = "a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"
+SRC_URI[sha256sum] = "d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"
DEPENDS += "python3-setuptools-scm-native"
diff --git a/poky/meta/recipes-devtools/python/python3-ruamel-yaml_0.17.32.bb b/poky/meta/recipes-devtools/python/python3-ruamel-yaml_0.17.35.bb
index 4b5e77e6e3..1760fec7ee 100644
--- a/poky/meta/recipes-devtools/python/python3-ruamel-yaml_0.17.32.bb
+++ b/poky/meta/recipes-devtools/python/python3-ruamel-yaml_0.17.35.bb
@@ -8,7 +8,7 @@ PYPI_PACKAGE = "ruamel.yaml"
inherit pypi setuptools3
-SRC_URI[sha256sum] = "ec939063761914e14542972a5cba6d33c23b0859ab6342f61cf070cfc600efc2"
+SRC_URI[sha256sum] = "801046a9caacb1b43acc118969b49b96b65e8847f29029563b29ac61d02db61b"
RDEPENDS:${PN} += "\
${PYTHON_PN}-shell \
diff --git a/poky/meta/recipes-devtools/python/python3-setuptools-rust_1.7.0.bb b/poky/meta/recipes-devtools/python/python3-setuptools-rust_1.8.1.bb
index 6392a4dead..db5c6c449c 100644
--- a/poky/meta/recipes-devtools/python/python3-setuptools-rust_1.7.0.bb
+++ b/poky/meta/recipes-devtools/python/python3-setuptools-rust_1.8.1.bb
@@ -12,7 +12,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=011cd92e702dd9e6b1a26157b6fd53f5"
SRC_URI = "${PYPI_SRC_URI} \
https://files.pythonhosted.org/packages/67/08/e1aa2c582c62ac76e4d60f8e454bd3bba933781a06a88b4e38797445822a/setuptools-rust-${PV}.tar.gz \
"
-SRC_URI[sha256sum] = "c7100999948235a38ae7e555fe199aa66c253dc384b125f5d85473bf81eae3a3"
+SRC_URI[sha256sum] = "94b1dd5d5308b3138d5b933c3a2b55e6d6927d1a22632e509fcea9ddd0f7e486"
inherit cargo pypi python_setuptools_build_meta
diff --git a/poky/meta/recipes-devtools/python/python3-setuptools-scm_7.1.0.bb b/poky/meta/recipes-devtools/python/python3-setuptools-scm_8.0.4.bb
index bb13c65460..5467b793ce 100644
--- a/poky/meta/recipes-devtools/python/python3-setuptools-scm_7.1.0.bb
+++ b/poky/meta/recipes-devtools/python/python3-setuptools-scm_8.0.4.bb
@@ -1,12 +1,13 @@
SUMMARY = "the blessed package to manage your versions by scm tags"
HOMEPAGE = "https://pypi.org/project/setuptools-scm/"
-DESCRIPTION = "setuptools_scm handles managing your Python package versions in SCM metadata instead of declaring them as the version argument or in a SCM managed file."
+DESCRIPTION = "setuptools_scm handles managing your Python package \
+versions in SCM metadata instead of declaring them as the version \
+argument or in a SCM managed file."
LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=838c366f69b72c5df05c96dff79b35f2"
-SRC_URI[sha256sum] = "6c508345a771aad7d56ebff0e70628bf2b0ec7573762be9960214730de278f27"
+SRC_URI[sha256sum] = "b5f43ff6800669595193fd09891564ee9d1d7dcb196cab4b2506d53a2e1c95c7"
-PYPI_PACKAGE = "setuptools_scm"
inherit pypi python_setuptools_build_meta
UPSTREAM_CHECK_REGEX = "scm-(?P<pver>.*)\.tar"
diff --git a/poky/meta/recipes-devtools/python/python3-spdx-tools_0.8.1.bb b/poky/meta/recipes-devtools/python/python3-spdx-tools_0.8.2.bb
index f58a138430..53263ca032 100644
--- a/poky/meta/recipes-devtools/python/python3-spdx-tools_0.8.1.bb
+++ b/poky/meta/recipes-devtools/python/python3-spdx-tools_0.8.2.bb
@@ -4,7 +4,7 @@ HOMEPAGE = "https://github.com/spdx/tools-python"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=dc7f21ccff0f672f2a7cd6f412ae627d"
-SRC_URI[sha256sum] = "c83652cd65b5726058dcbdaab85839dbe484c43ea6f61046137516aa1b8428ae"
+SRC_URI[sha256sum] = "aea4ac9c2c375e7f439b1cef5ff32ef34914c083de0f61e08ed67cd3d9deb2a9"
BBCLASSEXTEND = "native nativesdk"
diff --git a/poky/meta/recipes-devtools/python/python3-testtools_2.6.0.bb b/poky/meta/recipes-devtools/python/python3-testtools_2.7.1.bb
index 79e46a02de..79e46a02de 100644
--- a/poky/meta/recipes-devtools/python/python3-testtools_2.6.0.bb
+++ b/poky/meta/recipes-devtools/python/python3-testtools_2.7.1.bb
diff --git a/poky/meta/recipes-devtools/python/python3-trove-classifiers_2023.9.19.bb b/poky/meta/recipes-devtools/python/python3-trove-classifiers_2023.11.14.bb
index aa062f659b..a6c7e95c51 100644
--- a/poky/meta/recipes-devtools/python/python3-trove-classifiers_2023.9.19.bb
+++ b/poky/meta/recipes-devtools/python/python3-trove-classifiers_2023.11.14.bb
@@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/pypa/trove-classifiers"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
-SRC_URI[sha256sum] = "3e700af445c802f251ce2b741ee78d2e5dfa5ab8115b933b89ca631b414691c9"
+SRC_URI[sha256sum] = "64b5e78305a5de347f2cd7ec8c12d704a3ef0cb85cc10c0ca5f73488d1c201f8"
inherit pypi python_setuptools_build_meta ptest
diff --git a/poky/meta/recipes-devtools/python/python3-urllib3_2.0.5.bb b/poky/meta/recipes-devtools/python/python3-urllib3_2.0.7.bb
index 9c15791d34..c286838086 100644
--- a/poky/meta/recipes-devtools/python/python3-urllib3_2.0.5.bb
+++ b/poky/meta/recipes-devtools/python/python3-urllib3_2.0.7.bb
@@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/shazow/urllib3"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=52d273a3054ced561275d4d15260ecda"
-SRC_URI[sha256sum] = "13abf37382ea2ce6fb744d4dad67838eec857c9f4f57009891805e0b5e123594"
+SRC_URI[sha256sum] = "c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"
inherit pypi python_hatchling
diff --git a/poky/meta/recipes-devtools/python/python3-wcwidth_0.2.6.bb b/poky/meta/recipes-devtools/python/python3-wcwidth_0.2.9.bb
index fbd008c13d..983852d07d 100644
--- a/poky/meta/recipes-devtools/python/python3-wcwidth_0.2.6.bb
+++ b/poky/meta/recipes-devtools/python/python3-wcwidth_0.2.9.bb
@@ -4,7 +4,7 @@ HOMEPAGE = "https://github.com/jquast/wcwidth"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=b15979c39a2543892fca8cd86b4b52cb"
-SRC_URI[sha256sum] = "a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"
+SRC_URI[sha256sum] = "a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8"
inherit pypi setuptools3 ptest
diff --git a/poky/meta/recipes-devtools/python/python3-wheel_0.41.2.bb b/poky/meta/recipes-devtools/python/python3-wheel_0.41.3.bb
index d11c6a857a..bdba98b8d5 100644
--- a/poky/meta/recipes-devtools/python/python3-wheel_0.41.2.bb
+++ b/poky/meta/recipes-devtools/python/python3-wheel_0.41.3.bb
@@ -4,7 +4,7 @@ SECTION = "devel/python"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=7ffb0db04527cfe380e4f2726bd05ebf"
-SRC_URI[sha256sum] = "0c5ac5ff2afb79ac23ab82bab027a0be7b5dbcf2e54dc50efe4bf507de1f7985"
+SRC_URI[sha256sum] = "4d4987ce51a49370ea65c0bfd2234e8ce80a12780820d9dc462597a6e60d0841"
inherit python_flit_core pypi
diff --git a/poky/meta/recipes-devtools/qemu/qemu-native_8.1.0.bb b/poky/meta/recipes-devtools/qemu/qemu-native_8.1.2.bb
index 73a0f63f2b..73a0f63f2b 100644
--- a/poky/meta/recipes-devtools/qemu/qemu-native_8.1.0.bb
+++ b/poky/meta/recipes-devtools/qemu/qemu-native_8.1.2.bb
diff --git a/poky/meta/recipes-devtools/qemu/qemu-system-native_8.1.0.bb b/poky/meta/recipes-devtools/qemu/qemu-system-native_8.1.2.bb
index 558a416f7b..558a416f7b 100644
--- a/poky/meta/recipes-devtools/qemu/qemu-system-native_8.1.0.bb
+++ b/poky/meta/recipes-devtools/qemu/qemu-system-native_8.1.2.bb
diff --git a/poky/meta/recipes-devtools/qemu/qemu.inc b/poky/meta/recipes-devtools/qemu/qemu.inc
index b331f87c0d..5ab2cb83b4 100644
--- a/poky/meta/recipes-devtools/qemu/qemu.inc
+++ b/poky/meta/recipes-devtools/qemu/qemu.inc
@@ -29,18 +29,15 @@ SRC_URI = "https://download.qemu.org/${BPN}-${PV}.tar.xz \
file://0009-Define-MAP_SYNC-and-MAP_SHARED_VALIDATE-on-needed-li.patch \
file://0010-hw-pvrdma-Protect-against-buggy-or-malicious-guest-d.patch \
file://0002-linux-user-Replace-use-of-lfs64-related-functions-an.patch \
- file://0001-softmmu-Assert-data-in-bounds-in-iotlb_to_section.patch \
- file://0001-softmmu-Use-async_run_on_cpu-in-tcg_commit.patch \
file://fixedmeson.patch \
file://fixmips.patch \
file://qemu-guest-agent.init \
file://qemu-guest-agent.udev \
- file://CVE-2023-42467.patch \
"
UPSTREAM_CHECK_REGEX = "qemu-(?P<pver>\d+(\.\d+)+)\.tar"
-SRC_URI[sha256sum] = "710c101198e334d4762eef65f649bc43fa8a5dd75303554b8acfec3eb25f0e55"
+SRC_URI[sha256sum] = "541526a764576eb494d2ff5ec46aeb253e62ea29035d1c23c0a8af4e6cd4f087"
SRC_URI:append:class-target = " file://cross.patch"
SRC_URI:append:class-nativesdk = " file://cross.patch"
@@ -56,6 +53,9 @@ CVE_STATUS[CVE-2018-18438] = "disputed: The issues identified by this CVE were d
# https://bugzilla.redhat.com/show_bug.cgi?id=2167423
CVE_STATUS[CVE-2023-0664] = "not-applicable-platform: Issue only applies on Windows"
+# As per https://bugzilla.redhat.com/show_bug.cgi?id=2203387
+CVE_STATUS[CVE-2023-2680] = "not-applicable-platform: RHEL specific issue."
+
COMPATIBLE_HOST:mipsarchn32 = "null"
COMPATIBLE_HOST:mipsarchn64 = "null"
COMPATIBLE_HOST:riscv32 = "null"
diff --git a/poky/meta/recipes-devtools/qemu/qemu/0001-CVE-2023-40360-hw-nvme-fix-null-pointer-access-in-di.patch b/poky/meta/recipes-devtools/qemu/qemu/0001-CVE-2023-40360-hw-nvme-fix-null-pointer-access-in-di.patch
deleted file mode 100644
index 731b0281f4..0000000000
--- a/poky/meta/recipes-devtools/qemu/qemu/0001-CVE-2023-40360-hw-nvme-fix-null-pointer-access-in-di.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 83dd3da9fac872fac9739b9dcb96232c93675824 Mon Sep 17 00:00:00 2001
-From: Klaus Jensen <k.jensen@samsung.com>
-Date: Tue, 8 Aug 2023 17:16:13 +0200
-Subject: [PATCH] CVE-2023-40360 hw/nvme: fix null pointer access in directive
- receive
-
-nvme_directive_receive() does not check if an endurance group has been
-configured (set) prior to testing if flexible data placement is enabled
-or not.
-
-Fix this.
-
-CVE: CVE-2023-40360
-Upstream-Status: Backport [https://gitlab.com/birkelund/qemu/-/commit/6c8f8456cb0b239812dee5211881426496da7b98]
-Cc: qemu-stable@nongnu.org
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1815
-Fixes: 73064edfb864 ("hw/nvme: flexible data placement emulation")
-Reviewed-by: Jesper Wendel Devantier <j.devantier@samsung.com>
-Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
----
- hw/nvme/ctrl.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
-index 2097fb131..36a2846c3 100644
---- a/hw/nvme/ctrl.c
-+++ b/hw/nvme/ctrl.c
-@@ -6862,7 +6862,7 @@ static uint16_t nvme_directive_receive(NvmeCtrl *n, NvmeRequest *req)
- case NVME_DIRECTIVE_IDENTIFY:
- switch (doper) {
- case NVME_DIRECTIVE_RETURN_PARAMS:
-- if (ns->endgrp->fdp.enabled) {
-+ if (ns->endgrp && ns->endgrp->fdp.enabled) {
- id.supported |= 1 << NVME_DIRECTIVE_DATA_PLACEMENT;
- id.enabled |= 1 << NVME_DIRECTIVE_DATA_PLACEMENT;
- id.persistent |= 1 << NVME_DIRECTIVE_DATA_PLACEMENT;
---
-2.42.0
-
diff --git a/poky/meta/recipes-devtools/qemu/qemu/0001-softmmu-Assert-data-in-bounds-in-iotlb_to_section.patch b/poky/meta/recipes-devtools/qemu/qemu/0001-softmmu-Assert-data-in-bounds-in-iotlb_to_section.patch
deleted file mode 100644
index 7380e16ab3..0000000000
--- a/poky/meta/recipes-devtools/qemu/qemu/0001-softmmu-Assert-data-in-bounds-in-iotlb_to_section.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 86e4f93d827d3c1efd00cd8a906e38a2c0f2b5bc Mon Sep 17 00:00:00 2001
-From: Richard Henderson <richard.henderson@linaro.org>
-Date: Fri, 25 Aug 2023 14:06:58 -0700
-Subject: [PATCH] softmmu: Assert data in bounds in iotlb_to_section
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Acked-by: Alex Bennée <alex.bennee@linaro.org>
-Suggested-by: Alex Bennée <alex.bennee@linaro.org>
-Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
-
-Upstream-Status: Backport [https://gitlab.com/qemu-project/qemu/-/commit/86e4f93d827d3c1efd00cd8a906e38a2c0f2b5bc]
----
- softmmu/physmem.c | 10 ++++++++--
- 1 file changed, 8 insertions(+), 2 deletions(-)
-
-diff --git a/softmmu/physmem.c b/softmmu/physmem.c
-index 3df73542e1..7597dc1c39 100644
---- a/softmmu/physmem.c
-+++ b/softmmu/physmem.c
-@@ -2413,9 +2413,15 @@ MemoryRegionSection *iotlb_to_section(CPUState *cpu,
- int asidx = cpu_asidx_from_attrs(cpu, attrs);
- CPUAddressSpace *cpuas = &cpu->cpu_ases[asidx];
- AddressSpaceDispatch *d = qatomic_rcu_read(&cpuas->memory_dispatch);
-- MemoryRegionSection *sections = d->map.sections;
-+ int section_index = index & ~TARGET_PAGE_MASK;
-+ MemoryRegionSection *ret;
-+
-+ assert(section_index < d->map.sections_nb);
-+ ret = d->map.sections + section_index;
-+ assert(ret->mr);
-+ assert(ret->mr->ops);
-
-- return &sections[index & ~TARGET_PAGE_MASK];
-+ return ret;
- }
-
- static void io_mem_init(void)
---
-2.34.1
-
diff --git a/poky/meta/recipes-devtools/qemu/qemu/0001-softmmu-Use-async_run_on_cpu-in-tcg_commit.patch b/poky/meta/recipes-devtools/qemu/qemu/0001-softmmu-Use-async_run_on_cpu-in-tcg_commit.patch
deleted file mode 100644
index 8289b45991..0000000000
--- a/poky/meta/recipes-devtools/qemu/qemu/0001-softmmu-Use-async_run_on_cpu-in-tcg_commit.patch
+++ /dev/null
@@ -1,157 +0,0 @@
-From 0d58c660689f6da1e3feff8a997014003d928b3b Mon Sep 17 00:00:00 2001
-From: Richard Henderson <richard.henderson@linaro.org>
-Date: Fri, 25 Aug 2023 16:13:17 -0700
-Subject: [PATCH] softmmu: Use async_run_on_cpu in tcg_commit
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-After system startup, run the update to memory_dispatch
-and the tlb_flush on the cpu. This eliminates a race,
-wherein a running cpu sees the memory_dispatch change
-but has not yet seen the tlb_flush.
-
-Since the update now happens on the cpu, we need not use
-qatomic_rcu_read to protect the read of memory_dispatch.
-
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1826
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1834
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1846
-Tested-by: Alex Bennée <alex.bennee@linaro.org>
-Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
-Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
-
-Upstream-Status: Backport [0d58c660689f6da1e3feff8a997014003d928b3b]
----
- accel/tcg/cpu-exec-common.c | 30 ----------------------------
- include/exec/cpu-common.h | 1 -
- softmmu/physmem.c | 40 +++++++++++++++++++++++++++----------
- 3 files changed, 29 insertions(+), 42 deletions(-)
-
-Index: qemu-8.1.0/accel/tcg/cpu-exec-common.c
-===================================================================
---- qemu-8.1.0.orig/accel/tcg/cpu-exec-common.c
-+++ qemu-8.1.0/accel/tcg/cpu-exec-common.c
-@@ -33,36 +33,6 @@ void cpu_loop_exit_noexc(CPUState *cpu)
- cpu_loop_exit(cpu);
- }
-
--#if defined(CONFIG_SOFTMMU)
--void cpu_reloading_memory_map(void)
--{
-- if (qemu_in_vcpu_thread() && current_cpu->running) {
-- /* The guest can in theory prolong the RCU critical section as long
-- * as it feels like. The major problem with this is that because it
-- * can do multiple reconfigurations of the memory map within the
-- * critical section, we could potentially accumulate an unbounded
-- * collection of memory data structures awaiting reclamation.
-- *
-- * Because the only thing we're currently protecting with RCU is the
-- * memory data structures, it's sufficient to break the critical section
-- * in this callback, which we know will get called every time the
-- * memory map is rearranged.
-- *
-- * (If we add anything else in the system that uses RCU to protect
-- * its data structures, we will need to implement some other mechanism
-- * to force TCG CPUs to exit the critical section, at which point this
-- * part of this callback might become unnecessary.)
-- *
-- * This pair matches cpu_exec's rcu_read_lock()/rcu_read_unlock(), which
-- * only protects cpu->as->dispatch. Since we know our caller is about
-- * to reload it, it's safe to split the critical section.
-- */
-- rcu_read_unlock();
-- rcu_read_lock();
-- }
--}
--#endif
--
- void cpu_loop_exit(CPUState *cpu)
- {
- /* Undo the setting in cpu_tb_exec. */
-Index: qemu-8.1.0/include/exec/cpu-common.h
-===================================================================
---- qemu-8.1.0.orig/include/exec/cpu-common.h
-+++ qemu-8.1.0/include/exec/cpu-common.h
-@@ -133,7 +133,6 @@ static inline void cpu_physical_memory_w
- {
- cpu_physical_memory_rw(addr, (void *)buf, len, true);
- }
--void cpu_reloading_memory_map(void);
- void *cpu_physical_memory_map(hwaddr addr,
- hwaddr *plen,
- bool is_write);
-Index: qemu-8.1.0/softmmu/physmem.c
-===================================================================
---- qemu-8.1.0.orig/softmmu/physmem.c
-+++ qemu-8.1.0/softmmu/physmem.c
-@@ -680,8 +680,7 @@ address_space_translate_for_iotlb(CPUSta
- IOMMUTLBEntry iotlb;
- int iommu_idx;
- hwaddr addr = orig_addr;
-- AddressSpaceDispatch *d =
-- qatomic_rcu_read(&cpu->cpu_ases[asidx].memory_dispatch);
-+ AddressSpaceDispatch *d = cpu->cpu_ases[asidx].memory_dispatch;
-
- for (;;) {
- section = address_space_translate_internal(d, addr, &addr, plen, false);
-@@ -2412,7 +2411,7 @@ MemoryRegionSection *iotlb_to_section(CP
- {
- int asidx = cpu_asidx_from_attrs(cpu, attrs);
- CPUAddressSpace *cpuas = &cpu->cpu_ases[asidx];
-- AddressSpaceDispatch *d = qatomic_rcu_read(&cpuas->memory_dispatch);
-+ AddressSpaceDispatch *d = cpuas->memory_dispatch;
- int section_index = index & ~TARGET_PAGE_MASK;
- MemoryRegionSection *ret;
-
-@@ -2487,23 +2486,42 @@ static void tcg_log_global_after_sync(Me
- }
- }
-
-+static void tcg_commit_cpu(CPUState *cpu, run_on_cpu_data data)
-+{
-+ CPUAddressSpace *cpuas = data.host_ptr;
-+
-+ cpuas->memory_dispatch = address_space_to_dispatch(cpuas->as);
-+ tlb_flush(cpu);
-+}
-+
- static void tcg_commit(MemoryListener *listener)
- {
- CPUAddressSpace *cpuas;
-- AddressSpaceDispatch *d;
-+ CPUState *cpu;
-
- assert(tcg_enabled());
- /* since each CPU stores ram addresses in its TLB cache, we must
- reset the modified entries */
- cpuas = container_of(listener, CPUAddressSpace, tcg_as_listener);
-- cpu_reloading_memory_map();
-- /* The CPU and TLB are protected by the iothread lock.
-- * We reload the dispatch pointer now because cpu_reloading_memory_map()
-- * may have split the RCU critical section.
-+ cpu = cpuas->cpu;
-+
-+ /*
-+ * Defer changes to as->memory_dispatch until the cpu is quiescent.
-+ * Otherwise we race between (1) other cpu threads and (2) ongoing
-+ * i/o for the current cpu thread, with data cached by mmu_lookup().
-+ *
-+ * In addition, queueing the work function will kick the cpu back to
-+ * the main loop, which will end the RCU critical section and reclaim
-+ * the memory data structures.
-+ *
-+ * That said, the listener is also called during realize, before
-+ * all of the tcg machinery for run-on is initialized: thus halt_cond.
- */
-- d = address_space_to_dispatch(cpuas->as);
-- qatomic_rcu_set(&cpuas->memory_dispatch, d);
-- tlb_flush(cpuas->cpu);
-+ if (cpu->halt_cond) {
-+ async_run_on_cpu(cpu, tcg_commit_cpu, RUN_ON_CPU_HOST_PTR(cpuas));
-+ } else {
-+ tcg_commit_cpu(cpu, RUN_ON_CPU_HOST_PTR(cpuas));
-+ }
- }
-
- static void memory_map_init(void)
diff --git a/poky/meta/recipes-devtools/qemu/qemu/CVE-2023-42467.patch b/poky/meta/recipes-devtools/qemu/qemu/CVE-2023-42467.patch
deleted file mode 100644
index 86ab7cf81a..0000000000
--- a/poky/meta/recipes-devtools/qemu/qemu/CVE-2023-42467.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 7cfcc79b0ab800959716738aff9419f53fc68c9c Mon Sep 17 00:00:00 2001
-From: Thomas Huth <thuth@redhat.com>
-Date: Thu, 5 Oct 2023 06:01:10 +0000
-Subject: [PATCH] hw/scsi/scsi-disk: Disallow block sizes smaller than 512
- [CVE-2023-42467]
-
-We are doing things like
-
- nb_sectors /= (s->qdev.blocksize / BDRV_SECTOR_SIZE);
-
-in the code here (e.g. in scsi_disk_emulate_mode_sense()), so if
-the blocksize is smaller than BDRV_SECTOR_SIZE (=512), this crashes
-with a division by 0 exception. Thus disallow block sizes of 256
-bytes to avoid this situation.
-
-Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1813
-CVE: 2023-42467
-Signed-off-by: Thomas Huth <thuth@redhat.com>
-Message-ID: <20230925091854.49198-1-thuth@redhat.com>
-Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-
-CVE: CVE-2023-42467
-
-Upstream-Status: Backport [https://gitlab.com/qemu-project/qemu/-/commit/7cfcc79b0ab800959716738aff9419f53fc68c9c]
-
-Signed-off-by: Yogita Urade <yogita.urade@windriver.com>
----
- hw/scsi/scsi-disk.c | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
-index e0d79c796..477ee2bcd 100644
---- a/hw/scsi/scsi-disk.c
-+++ b/hw/scsi/scsi-disk.c
-@@ -1628,9 +1628,10 @@ static void scsi_disk_emulate_mode_select(SCSIDiskReq *r, uint8_t *inbuf)
- * Since the existing code only checks/updates bits 8-15 of the block
- * size, restrict ourselves to the same requirement for now to ensure
- * that a block size set by a block descriptor and then read back by
-- * a subsequent SCSI command will be the same
-+ * a subsequent SCSI command will be the same. Also disallow a block
-+ * size of 256 since we cannot handle anything below BDRV_SECTOR_SIZE.
- */
-- if (bs && !(bs & ~0xff00) && bs != s->qdev.blocksize) {
-+ if (bs && !(bs & ~0xfe00) && bs != s->qdev.blocksize) {
- s->qdev.blocksize = bs;
- trace_scsi_disk_mode_select_set_blocksize(s->qdev.blocksize);
- }
---
-2.40.0
diff --git a/poky/meta/recipes-devtools/qemu/qemu_8.1.0.bb b/poky/meta/recipes-devtools/qemu/qemu_8.1.2.bb
index 84ee0bcc49..84ee0bcc49 100644
--- a/poky/meta/recipes-devtools/qemu/qemu_8.1.0.bb
+++ b/poky/meta/recipes-devtools/qemu/qemu_8.1.2.bb
diff --git a/poky/meta/recipes-devtools/repo/repo_2.36.1.bb b/poky/meta/recipes-devtools/repo/repo_2.37.bb
index a3b43439f2..d6d3d03a62 100644
--- a/poky/meta/recipes-devtools/repo/repo_2.36.1.bb
+++ b/poky/meta/recipes-devtools/repo/repo_2.37.bb
@@ -12,7 +12,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
SRC_URI = "git://gerrit.googlesource.com/git-repo.git;protocol=https;branch=main \
file://0001-python3-shebang.patch \
"
-SRCREV = "1e9f7b9e9ef473305d10a26a48138bc6ad38ccf6"
+SRCREV = "83c66ec661e39e47795086a5d26d0f3782ac1d49"
MIRRORS += "git://gerrit.googlesource.com/git-repo.git git://github.com/GerritCodeReview/git-repo.git"
diff --git a/poky/meta/recipes-devtools/rust/cargo_1.70.0.bb b/poky/meta/recipes-devtools/rust/cargo_1.70.0.bb
index a5c1064106..50b7e7c7b4 100644
--- a/poky/meta/recipes-devtools/rust/cargo_1.70.0.bb
+++ b/poky/meta/recipes-devtools/rust/cargo_1.70.0.bb
@@ -19,7 +19,7 @@ CARGO_VENDORING_DIRECTORY = "${RUSTSRC}/vendor"
inherit cargo pkgconfig
-DEBUG_PREFIX_MAP += "-fdebug-prefix-map=${RUSTSRC}/vendor=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}"
+DEBUG_PREFIX_MAP += "-fdebug-prefix-map=${RUSTSRC}/vendor=${TARGET_DBGSRC_DIR}"
do_cargo_setup_snapshot () {
${WORKDIR}/rust-snapshot-components/${CARGO_SNAPSHOT}/install.sh --prefix="${WORKDIR}/${CARGO_SNAPSHOT}" --disable-ldconfig
diff --git a/poky/meta/recipes-devtools/rust/rust-cross-canadian.inc b/poky/meta/recipes-devtools/rust/rust-cross-canadian.inc
index d569ac59f5..7bfef6d175 100644
--- a/poky/meta/recipes-devtools/rust/rust-cross-canadian.inc
+++ b/poky/meta/recipes-devtools/rust/rust-cross-canadian.inc
@@ -54,8 +54,13 @@ do_install () {
mkdir "${ENV_SETUP_DIR}"
RUST_ENV_SETUP_SH="${ENV_SETUP_DIR}/rust.sh"
+ RUST_TARGET_TRIPLE=`echo ${RUST_TARGET_SYS} | tr '[:lower:]' '[:upper:]' | sed 's/-/_/g'`
+ RUST_HOST_TRIPLE=`echo ${RUST_HOST_SYS} | tr '[:lower:]' '[:upper:]' | sed 's/-/_/g'`
+ SDKLOADER=${@bb.utils.contains('SDK_ARCH', 'x86_64', 'ld-linux-x86-64.so.2', '', d)}${@bb.utils.contains('SDK_ARCH', 'i686', 'ld-linux.so.2', '', d)}${@bb.utils.contains('SDK_ARCH', 'aarch64', 'ld-linux-aarch64.so.1', '', d)}${@bb.utils.contains('SDK_ARCH', 'ppc64le', 'ld64.so.2', '', d)}${@bb.utils.contains('SDK_ARCH', 'riscv64', 'ld-linux-riscv64-lp64d.so.1', '', d)}
+
cat <<- EOF > "${RUST_ENV_SETUP_SH}"
- export RUSTFLAGS="--sysroot=\$OECORE_TARGET_SYSROOT/usr -C link-arg=--sysroot=\$OECORE_TARGET_SYSROOT"
+ export CARGO_TARGET_${RUST_TARGET_TRIPLE}_RUSTFLAGS="--sysroot=\$OECORE_TARGET_SYSROOT/usr -C link-arg=--sysroot=\$OECORE_TARGET_SYSROOT"
+ export CARGO_TARGET_${RUST_HOST_TRIPLE}_RUNNER="\$OECORE_NATIVE_SYSROOT/lib/${SDKLOADER}"
export RUST_TARGET_PATH="\$OECORE_NATIVE_SYSROOT/usr/lib/${TARGET_SYS}/rustlib"
EOF
diff --git a/poky/meta/recipes-devtools/rust/rust-llvm_1.70.0.bb b/poky/meta/recipes-devtools/rust/rust-llvm_1.70.0.bb
index 09e4c65be3..57bbe79cdf 100644
--- a/poky/meta/recipes-devtools/rust/rust-llvm_1.70.0.bb
+++ b/poky/meta/recipes-devtools/rust/rust-llvm_1.70.0.bb
@@ -16,7 +16,7 @@ S = "${RUSTSRC}/src/llvm-project/llvm"
LIC_FILES_CHKSUM = "file://LICENSE.TXT;md5=8a15a0759ef07f2682d2ba4b893c9afe"
-inherit cmake python3native
+inherit cmake
DEPENDS += "ninja-native rust-llvm-native"
@@ -47,6 +47,15 @@ EXTRA_OECMAKE = " \
-DLLVM_TARGET_ARCH=${TARGET_ARCH} \
-DCMAKE_INSTALL_PREFIX:PATH=${libdir}/llvm-rust \
"
+
+# Forcibly disable the detection of these packages as otherwise
+# it will look at the host Python install
+EXTRA_OECMAKE += "\
+ -DPY_PYGMENTS_FOUND=OFF \
+ -DPY_PYGMENTS_LEXERS_C_CPP_FOUND=OFF \
+ -DPY_YAML_FOUND=OFF \
+"
+
EXTRA_OECMAKE:append:class-target = "\
-DLLVM_BUILD_TOOLS=OFF \
-DLLVM_TABLEGEN=${STAGING_LIBDIR_NATIVE}/llvm-rust/bin/llvm-tblgen \
diff --git a/poky/meta/recipes-devtools/strace/strace/ptest-spacesave.patch b/poky/meta/recipes-devtools/strace/strace/ptest-spacesave.patch
index c5d8ff9207..4e86ccadc5 100644
--- a/poky/meta/recipes-devtools/strace/strace/ptest-spacesave.patch
+++ b/poky/meta/recipes-devtools/strace/strace/ptest-spacesave.patch
@@ -22,7 +22,7 @@ index 3540204..5e1e7c9 100755
$hdr
. "\${srcdir=.}/init.sh"
run_strace_match_diff $arg0 $args
-+ rm -rf log exp
++ rm -rf log exp out
EOF
;;
diff --git a/poky/meta/recipes-devtools/strace/strace/skip-test-so_peerpidfd.gen.test.patch b/poky/meta/recipes-devtools/strace/strace/skip-test-so_peerpidfd.gen.test.patch
deleted file mode 100644
index 5c73e1f10e..0000000000
--- a/poky/meta/recipes-devtools/strace/strace/skip-test-so_peerpidfd.gen.test.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 002d9f2512245536dfc8d62db429d97e2216ec3a Mon Sep 17 00:00:00 2001
-From: Randy MacLeod <Randy.MacLeod@windriver.com>
-Date: Fri, 6 Oct 2023 12:08:23 -0700
-Subject: [PATCH] skip tests/so_peerpidfd.gen.test
-
-Upstream-Status: Inappropriate
-
-Signed-off-by: Randy MacLeod <Randy.MacLeod@windriver.com>
----
- tests/so_peerpidfd.gen.test | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/tests/so_peerpidfd.gen.test b/tests/so_peerpidfd.gen.test
-index 64ad3a2..f89da9f 100755
---- a/tests/so_peerpidfd.gen.test
-+++ b/tests/so_peerpidfd.gen.test
-@@ -1,4 +1,5 @@
- #!/bin/sh -efu
- # Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (so_peerpidfd --trace=getsockopt -y); do not edit.
- . "${srcdir=.}/init.sh"
-+skip_ "Test fails due to apparently trivial log format differences"
- run_strace_match_diff --trace=getsockopt -y
---
-2.39.0
-
diff --git a/poky/meta/recipes-devtools/strace/strace_6.5.bb b/poky/meta/recipes-devtools/strace/strace_6.6.bb
index d6475e8db9..a3de7941cf 100644
--- a/poky/meta/recipes-devtools/strace/strace_6.5.bb
+++ b/poky/meta/recipes-devtools/strace/strace_6.6.bb
@@ -3,7 +3,7 @@ HOMEPAGE = "http://strace.io"
DESCRIPTION = "strace is a diagnostic, debugging and instructional userspace utility for Linux. It is used to monitor and tamper with interactions between processes and the Linux kernel, which include system calls, signal deliveries, and changes of process state."
SECTION = "console/utils"
LICENSE = "LGPL-2.1-or-later & GPL-2.0-or-later"
-LIC_FILES_CHKSUM = "file://COPYING;md5=59a33f0a3e6122d67c0b3befccbdaa6b"
+LIC_FILES_CHKSUM = "file://COPYING;md5=63c8c3eb5c71b4362edac1397f40bdc7"
SRC_URI = "https://strace.io/files/${PV}/strace-${PV}.tar.xz \
file://update-gawk-paths.patch \
@@ -14,9 +14,8 @@ SRC_URI = "https://strace.io/files/${PV}/strace-${PV}.tar.xz \
file://skip-load.patch \
file://0001-configure-Use-autoconf-macro-to-detect-largefile-sup.patch \
file://0002-tests-Replace-off64_t-with-off_t.patch \
- file://skip-test-so_peerpidfd.gen.test.patch \
"
-SRC_URI[sha256sum] = "dfb051702389e1979a151892b5901afc9e93bbc1c70d84c906ade3224ca91980"
+SRC_URI[sha256sum] = "421b4186c06b705163e64dc85f271ebdcf67660af8667283147d5e859fc8a96c"
inherit autotools ptest
diff --git a/poky/meta/recipes-devtools/valgrind/valgrind_3.21.0.bb b/poky/meta/recipes-devtools/valgrind/valgrind_3.21.0.bb
index 717d82830e..67a197c509 100644
--- a/poky/meta/recipes-devtools/valgrind/valgrind_3.21.0.bb
+++ b/poky/meta/recipes-devtools/valgrind/valgrind_3.21.0.bb
@@ -92,6 +92,18 @@ CACHED_CONFIGUREVARS += "ac_cv_path_PERL='/usr/bin/env perl'"
# which fixes build path issue in DWARF.
SELECTED_OPTIMIZATION = "${DEBUG_FLAGS}"
+# Split out various helper scripts to separate packages to avoid the
+# main package depending on perl and python.
+PACKAGES =+ "${PN}-cachegrind ${PN}-massif ${PN}-callgrind"
+
+FILES:${PN}-cachegrind = "${bindir}/cg_*"
+FILES:${PN}-massif = "${bindir}/ms_*"
+FILES:${PN}-callgrind = "${bindir}/callgrind_*"
+
+RDEPENDS:${PN}-cachegrind = "${PN} python3-core"
+RDEPENDS:${PN}-massif = "${PN} perl"
+RDEPENDS:${PN}-callgrind = "${PN} perl"
+
do_configure:prepend () {
rm -rf ${S}/config.h
sed -i -e 's:$(abs_top_builddir):$(pkglibdir)/ptest:g' ${S}/none/tests/Makefile.am
@@ -116,8 +128,6 @@ VALGRINDARCH:powerpc64le = "ppc64le"
INHIBIT_PACKAGE_STRIP_FILES = "${PKGD}${libexecdir}/valgrind/vgpreload_memcheck-${VALGRINDARCH}-linux.so"
-RDEPENDS:${PN} += "perl"
-
# valgrind needs debug information for ld.so at runtime in order to
# redirect functions like strlen.
RRECOMMENDS:${PN} += "${TCLIBC}-dbg"
@@ -229,8 +239,8 @@ do_install_ptest() {
# As the binary isn't stripped or debug-splitted, the source file isn't fetched
# via dwarfsrcfiles either, so it needs to be installed manually.
- mkdir -p ${D}/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/none/tests/
- install ${S}/none/tests/tls.c ${D}/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/none/tests/
+ mkdir -p ${D}${TARGET_DBGSRC_DIR}/none/tests/
+ install ${S}/none/tests/tls.c ${D}${TARGET_DBGSRC_DIR}/none/tests/
}
do_install_ptest:append:x86-64 () {
diff --git a/poky/meta/recipes-extended/acpica/acpica_20230628.bb b/poky/meta/recipes-extended/acpica/acpica_20230628.bb
index 3b939ad665..8974bdc1f1 100644
--- a/poky/meta/recipes-extended/acpica/acpica_20230628.bb
+++ b/poky/meta/recipes-extended/acpica/acpica_20230628.bb
@@ -36,7 +36,7 @@ EXTRA_OEMAKE = "CC='${CC}' \
INSTALLDIR=${bindir} \
INSTALLFLAGS= \
YACC=bison \
- YFLAGS='-y --file-prefix-map=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}' \
+ YFLAGS='-y --file-prefix-map=${WORKDIR}=${TARGET_DBGSRC_DIR}' \
"
do_install() {
@@ -49,4 +49,4 @@ RPROVIDES:${PN} += "iasl"
RREPLACES:${PN} += "iasl"
RCONFLICTS:${PN} += "iasl"
-BBCLASSEXTEND = "native"
+BBCLASSEXTEND = "native nativesdk"
diff --git a/poky/meta/recipes-extended/baremetal-example/baremetal-helloworld_git.bb b/poky/meta/recipes-extended/baremetal-example/baremetal-helloworld_git.bb
index fde75ec2fd..6832ccc541 100644
--- a/poky/meta/recipes-extended/baremetal-example/baremetal-helloworld_git.bb
+++ b/poky/meta/recipes-extended/baremetal-example/baremetal-helloworld_git.bb
@@ -4,7 +4,7 @@ DESCRIPTION = "These are introductory examples to showcase the use of QEMU to ru
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=39346640a23c701e4f459e05f56f4449"
-SRCREV = "fc7c43d138185028b6ac14c83f6492fce26eca95"
+SRCREV = "db2bf750eaef7fc0832e13ada8291343bbcc3afe"
PV = "0.1+git"
SRC_URI = "git://github.com/ahcbb6/baremetal-helloqemu.git;protocol=https;branch=master"
diff --git a/poky/meta/recipes-extended/bash/bash_5.2.15.bb b/poky/meta/recipes-extended/bash/bash_5.2.21.bb
index f78f79fcc5..6df73b653b 100644
--- a/poky/meta/recipes-extended/bash/bash_5.2.15.bb
+++ b/poky/meta/recipes-extended/bash/bash_5.2.21.bb
@@ -14,7 +14,7 @@ SRC_URI = "${GNU_MIRROR}/bash/${BP}.tar.gz;name=tarball \
file://use_aclocal.patch \
"
-SRC_URI[tarball.sha256sum] = "13720965b5f4fc3a0d4b61dd37e7565c741da9a5be24edc2ae00182fc1b3588c"
+SRC_URI[tarball.sha256sum] = "c8e31bdc59b69aaffc5b36509905ba3e5cbb12747091d27b4b977f078560d5b8"
DEBUG_OPTIMIZATION:append:armv4 = " ${@bb.utils.contains('TUNE_CCARGS', '-mthumb', '-fomit-frame-pointer', '', d)}"
DEBUG_OPTIMIZATION:append:armv5 = " ${@bb.utils.contains('TUNE_CCARGS', '-mthumb', '-fomit-frame-pointer', '', d)}"
diff --git a/poky/meta/recipes-extended/cronie/cronie_1.6.1.bb b/poky/meta/recipes-extended/cronie/cronie_1.7.0.bb
index 1b31bf0db2..24c419b1c5 100644
--- a/poky/meta/recipes-extended/cronie/cronie_1.6.1.bb
+++ b/poky/meta/recipes-extended/cronie/cronie_1.7.0.bb
@@ -25,7 +25,7 @@ SRC_URI = "${GITHUB_BASE_URI}/download/cronie-${PV}/cronie-${PV}.tar.gz \
PAM_SRC_URI = "file://crond_pam_config.patch"
PAM_DEPS = "libpam libpam-runtime pam-plugin-access pam-plugin-loginuid"
-SRC_URI[sha256sum] = "2cd0f0dd1680e6b9c39bf1e3a5e7ad6df76aa940de1ee90a453633aa59984e62"
+SRC_URI[sha256sum] = "6827f5a47760cc64afeef0a60d3cb5376f52569109fc9a73957dd5e9fdae7619"
inherit autotools update-rc.d useradd systemd github-releases
UPSTREAM_CHECK_REGEX = "releases/tag/cronie-(?P<pver>\d+(\.\d+)+)"
diff --git a/poky/meta/recipes-extended/cups/cups.inc b/poky/meta/recipes-extended/cups/cups.inc
index fa32c38549..ff5f55e62a 100644
--- a/poky/meta/recipes-extended/cups/cups.inc
+++ b/poky/meta/recipes-extended/cups/cups.inc
@@ -15,7 +15,6 @@ SRC_URI = "${GITHUB_BASE_URI}/download/v${PV}/cups-${PV}-source.tar.gz \
file://0004-cups-fix-multilib-install-file-conflicts.patch \
file://volatiles.99_cups \
file://cups-volatiles.conf \
- file://CVE-2023-4504.patch \
"
GITHUB_BASE_URI = "https://github.com/OpenPrinting/cups/releases"
@@ -38,10 +37,13 @@ GROUPADD_PARAM:${PN} = "--system lpadmin"
SYSTEMD_SERVICE:${PN} = "cups.socket cups.path cups.service cups-lpd.socket"
PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'zeroconf', 'avahi', '', d)} \
- ${@bb.utils.filter('DISTRO_FEATURES', 'pam systemd', d)}"
+ ${@bb.utils.filter('DISTRO_FEATURES', 'pam systemd', d)} \
+ openssl \
+"
PACKAGECONFIG[avahi] = "--with-dnssd=avahi,--with-dnssd=no,avahi"
PACKAGECONFIG[acl] = "--enable-acl,--disable-acl,acl"
-PACKAGECONFIG[gnutls] = "--with-tls=gnutls,--with-tls=no,gnutls"
+PACKAGECONFIG[gnutls] = "--with-tls=gnutls,,gnutls,,,openssl"
+PACKAGECONFIG[openssl] = "--with-tls=openssl,,openssl,,,gnutls"
PACKAGECONFIG[pam] = "--enable-pam --with-pam-module=unix, --disable-pam, libpam"
PACKAGECONFIG[systemd] = "--with-systemd=${systemd_system_unitdir},--without-systemd,systemd"
PACKAGECONFIG[xinetd] = "--with-xinetd=${sysconfdir}/xinetd.d,--without-xinetd,xinetd"
diff --git a/poky/meta/recipes-extended/cups/cups/CVE-2023-4504.patch b/poky/meta/recipes-extended/cups/cups/CVE-2023-4504.patch
deleted file mode 100644
index e52e43a209..0000000000
--- a/poky/meta/recipes-extended/cups/cups/CVE-2023-4504.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-CVE: CVE-2023-4504
-Upstream-Status: Backport [https://github.com/OpenPrinting/cups/commit/2431caddb7e6a87f04ac90b5c6366ad268b6ff31 ]
-Signed-off-by: Lee Chee Yang <chee.yang.lee@intel.com>
-
-From 2431caddb7e6a87f04ac90b5c6366ad268b6ff31 Mon Sep 17 00:00:00 2001
-From: Zdenek Dohnal <zdohnal@redhat.com>
-Date: Wed, 20 Sep 2023 14:45:17 +0200
-Subject: [PATCH] raster-interpret.c: Fix CVE-2023-4504
-
-We didn't check for end of buffer if it looks there is an escaped
-character - check for NULL terminator there and if found, return NULL
-as return value and in `ptr`, because a lone backslash is not
-a valid PostScript character.
----
- cups/raster-interpret.c | 14 +++++++++++++-
- 1 files changed, 13 insertions(+), 1 deletion(-)
-
-diff --git a/cups/raster-interpret.c b/cups/raster-interpret.c
-index 6fcf731b5..b8655c8c6 100644
---- a/cups/raster-interpret.c
-+++ b/cups/raster-interpret.c
-@@ -1116,7 +1116,19 @@ scan_ps(_cups_ps_stack_t *st, /* I - Stack */
-
- cur ++;
-
-- if (*cur == 'b')
-+ /*
-+ * Return NULL if we reached NULL terminator, a lone backslash
-+ * is not a valid character in PostScript.
-+ */
-+
-+ if (!*cur)
-+ {
-+ *ptr = NULL;
-+
-+ return (NULL);
-+ }
-+
-+ if (*cur == 'b')
- *valptr++ = '\b';
- else if (*cur == 'f')
- *valptr++ = '\f';
diff --git a/poky/meta/recipes-extended/cups/cups_2.4.6.bb b/poky/meta/recipes-extended/cups/cups_2.4.7.bb
index 58029fdbd4..f4b0282e4c 100644
--- a/poky/meta/recipes-extended/cups/cups_2.4.6.bb
+++ b/poky/meta/recipes-extended/cups/cups_2.4.7.bb
@@ -2,4 +2,4 @@ require cups.inc
LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
-SRC_URI[sha256sum] = "58e970cf1955e1cc87d0847c32526d9c2ccee335e5f0e3882b283138ba0e7262"
+SRC_URI[sha256sum] = "dd54228dd903526428ce7e37961afaed230ad310788141da75cebaa08362cf6c"
diff --git a/poky/meta/recipes-extended/ghostscript/ghostscript_10.02.0.bb b/poky/meta/recipes-extended/ghostscript/ghostscript_10.02.1.bb
index 4bad0f86e1..2a966afc21 100644
--- a/poky/meta/recipes-extended/ghostscript/ghostscript_10.02.0.bb
+++ b/poky/meta/recipes-extended/ghostscript/ghostscript_10.02.1.bb
@@ -28,7 +28,7 @@ SRC_URI = "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/downlo
file://configure.ac-add-option-to-explicitly-disable-neon.patch \
"
-SRC_URI[sha256sum] = "e54062f166708d84ca82de9f8304a04344466080f936118b88082bd55ed6dc97"
+SRC_URI[sha256sum] = "e429e4f5b01615a4f0f93a4128e8a1a4d932dff983b1774174c79c0630717ad9"
PACKAGECONFIG ??= ""
PACKAGECONFIG[gtk] = "--enable-gtk,--disable-gtk,gtk+3"
@@ -60,7 +60,8 @@ prune_sources() {
do_unpack[postfuncs] += "prune_sources"
do_install:append () {
- mkdir -p ${D}${datadir}/ghostscript/${PV}/
+ oe_runmake DESTDIR=${D} install-so
+ oe_runmake DESTDIR=${D} install-data
cp -r ${S}/Resource ${D}${datadir}/ghostscript/${PV}/
cp -r ${S}/iccprofiles ${D}${datadir}/ghostscript/${PV}/
}
diff --git a/poky/meta/recipes-extended/libarchive/libarchive_3.7.2.bb b/poky/meta/recipes-extended/libarchive/libarchive_3.7.2.bb
index a09f607fcf..91f521fa4d 100644
--- a/poky/meta/recipes-extended/libarchive/libarchive_3.7.2.bb
+++ b/poky/meta/recipes-extended/libarchive/libarchive_3.7.2.bb
@@ -18,6 +18,7 @@ PACKAGECONFIG[zlib] = "--with-zlib,--without-zlib,zlib,"
PACKAGECONFIG[bz2] = "--with-bz2lib,--without-bz2lib,${DEPENDS_BZIP2},"
PACKAGECONFIG[xz] = "--with-lzma,--without-lzma,xz,"
PACKAGECONFIG[openssl] = "--with-openssl,--without-openssl,openssl,"
+PACKAGECONFIG[libb2] = "--with-libb2,--without-libb2,libb2,"
PACKAGECONFIG[libxml2] = "--with-xml2,--without-xml2,libxml2,"
PACKAGECONFIG[expat] = "--with-expat,--without-expat,expat,"
PACKAGECONFIG[lzo] = "--with-lzo2,--without-lzo2,lzo,"
diff --git a/poky/meta/recipes-extended/libnsl/libnsl2_git.bb b/poky/meta/recipes-extended/libnsl/libnsl2_git.bb
index 7919ef9b24..8cc1f7cec3 100644
--- a/poky/meta/recipes-extended/libnsl/libnsl2_git.bb
+++ b/poky/meta/recipes-extended/libnsl/libnsl2_git.bb
@@ -10,9 +10,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c"
SECTION = "libs"
DEPENDS = "libtirpc"
-PV = "2.0.0"
+PV = "2.0.1"
-SRCREV = "82245c0c58add79a8e34ab0917358217a70e5100"
+SRCREV = "d4b22e54b5e6637a69b26eab5faad2a326c9b182"
SRC_URI = "git://github.com/thkukuk/libnsl;branch=master;protocol=https \
"
diff --git a/poky/meta/recipes-extended/libsolv/libsolv_0.7.25.bb b/poky/meta/recipes-extended/libsolv/libsolv_0.7.26.bb
index 69cb3f7996..bae7960138 100644
--- a/poky/meta/recipes-extended/libsolv/libsolv_0.7.25.bb
+++ b/poky/meta/recipes-extended/libsolv/libsolv_0.7.26.bb
@@ -12,7 +12,7 @@ SRC_URI = "git://github.com/openSUSE/libsolv.git;branch=master;protocol=https \
file://0001-utils-Conside-musl-when-wrapping-qsort_r.patch \
"
-SRCREV = "f1be8bf3dcc7dc14d331adbc97f337fa08e641c9"
+SRCREV = "48c985375134d2443eee551613161cadc278af2f"
UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+(\.\d+)+)"
diff --git a/poky/meta/recipes-extended/libtirpc/libtirpc/ipv6.patch b/poky/meta/recipes-extended/libtirpc/libtirpc/ipv6.patch
new file mode 100644
index 0000000000..f746f986f4
--- /dev/null
+++ b/poky/meta/recipes-extended/libtirpc/libtirpc/ipv6.patch
@@ -0,0 +1,52 @@
+From 077bbd32e8b7474dc5f153997732e1e6aec7fad6 Mon Sep 17 00:00:00 2001
+Message-Id: <077bbd32e8b7474dc5f153997732e1e6aec7fad6.1697120796.git.joerg.sommer@navimatix.de>
+From: =?UTF-8?q?J=C3=B6rg=20Sommer?= <joerg.sommer@navimatix.de>
+Date: Thu, 12 Oct 2023 16:22:59 +0200
+Subject: [PATCH] netconfig: remove tcp6, udp6 on --disable-ipv6
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+If the configuration for IPv6 is disabled, the netconfig should not contain
+settings for tcp6 and udp6.
+
+The test for the configure option didn't work, because it check the wrong
+variable.
+
+Signed-off-by: Jörg Sommer <joerg.sommer@navimatix.de>
+Upstream-Status: Submitted [libtirpc-devel@lists.sourceforge.net]
+Upstream-Status: Submitted [linux-nfs@vger.kernel.org]
+---
+ configure.ac | 2 +-
+ doc/Makefile.am | 5 +++++
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index fe6c517..b687f8d 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -64,7 +64,7 @@ fi
+ AC_ARG_ENABLE(ipv6,
+ [AC_HELP_STRING([--disable-ipv6], [Disable IPv6 support @<:@default=no@:>@])],
+ [],[enable_ipv6=yes])
+-AM_CONDITIONAL(INET6, test "x$disable_ipv6" != xno)
++AM_CONDITIONAL(INET6, test "x$enable_ipv6" != xno)
+ if test "x$enable_ipv6" != xno; then
+ AC_DEFINE(INET6, 1, [Define to 1 if IPv6 is available])
+ fi
+diff --git a/doc/Makefile.am b/doc/Makefile.am
+index d42ab90..b9678f6 100644
+--- a/doc/Makefile.am
++++ b/doc/Makefile.am
+@@ -2,3 +2,8 @@ dist_sysconf_DATA = netconfig bindresvport.blacklist
+
+ CLEANFILES = cscope.* *~
+ DISTCLEANFILES = Makefile.in
++
++if ! INET6
++install-exec-hook:
++ $(SED) -i '/^tcp6\|^udp6/d' "$(DESTDIR)$(sysconfdir)"/netconfig
++endif
+--
+2.34.1
+
diff --git a/poky/meta/recipes-extended/libtirpc/libtirpc_1.3.3.bb b/poky/meta/recipes-extended/libtirpc/libtirpc_1.3.4.bb
index b27c302460..16c7a6007a 100644
--- a/poky/meta/recipes-extended/libtirpc/libtirpc_1.3.3.bb
+++ b/poky/meta/recipes-extended/libtirpc/libtirpc_1.3.4.bb
@@ -9,10 +9,12 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=f835cce8852481e4b2bbbdd23b5e47f3 \
PROVIDES = "virtual/librpc"
-SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BP}.tar.bz2"
+SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BP}.tar.bz2 \
+ file://ipv6.patch \
+"
UPSTREAM_CHECK_URI = "https://sourceforge.net/projects/libtirpc/files/libtirpc/"
UPSTREAM_CHECK_REGEX = "(?P<pver>\d+(\.\d+)+)/"
-SRC_URI[sha256sum] = "6474e98851d9f6f33871957ddee9714fdcd9d8a5ee9abb5a98d63ea2e60e12f3"
+SRC_URI[sha256sum] = "1e0b0c7231c5fa122e06c0609a76723664d068b0dba3b8219b63e6340b347860"
CVE_STATUS[CVE-2021-46828] = "fixed-version: fixed in 1.3.3rc1 so not present in 1.3.3"
@@ -21,6 +23,11 @@ inherit autotools pkgconfig
PACKAGECONFIG ??= ""
PACKAGECONFIG[gssapi] = "--enable-gssapi,--disable-gssapi,krb5"
+PACKAGECONFIG ??= "\
+ ${@bb.utils.filter('DISTRO_FEATURES', 'ipv6', d)} \
+"
+PACKAGECONFIG[ipv6] = "--enable-ipv6,--disable-ipv6"
+
do_install:append() {
test -e ${D}${sysconfdir}/netconfig && chown root:root ${D}${sysconfdir}/netconfig
}
diff --git a/poky/meta/recipes-extended/lighttpd/lighttpd/lighttpd b/poky/meta/recipes-extended/lighttpd/lighttpd/lighttpd
index 82fbaa523b..f369dce42c 100644
--- a/poky/meta/recipes-extended/lighttpd/lighttpd/lighttpd
+++ b/poky/meta/recipes-extended/lighttpd/lighttpd/lighttpd
@@ -6,9 +6,14 @@ NAME=lighttpd
DESC="Lighttpd Web Server"
OPTS="-f /etc/lighttpd/lighttpd.conf"
+configtest() {
+ "$DAEMON" $OPTS -tt || exit 1
+}
+
case "$1" in
start)
echo -n "Starting $DESC: "
+ configtest
start-stop-daemon --start -x "$DAEMON" -- $OPTS
echo "$NAME."
;;
@@ -17,16 +22,26 @@ case "$1" in
start-stop-daemon --stop -x "$DAEMON"
echo "$NAME."
;;
- restart|force-reload)
+ restart)
echo -n "Restarting $DESC: "
+ configtest
start-stop-daemon --stop -x "$DAEMON"
sleep 1
start-stop-daemon --start -x "$DAEMON" -- $OPTS
echo "$NAME."
;;
+ reload|force-reload)
+ echo -n "Reloading $DESC: "
+ configtest
+ killall -USR1 "${DAEMON##*/}"
+ echo "$NAME."
+ ;;
+ configtest)
+ configtest
+ ;;
*)
N=/etc/init.d/$NAME
- echo "Usage: $N {start|stop|restart|force-reload}" >&2
+ echo "Usage: $N {start|stop|restart|reload|force-reload|configtest}" >&2
exit 1
;;
esac
diff --git a/poky/meta/recipes-extended/lighttpd/lighttpd/lighttpd.conf b/poky/meta/recipes-extended/lighttpd/lighttpd/lighttpd.conf
index 6e8402d242..47a6c93349 100644
--- a/poky/meta/recipes-extended/lighttpd/lighttpd/lighttpd.conf
+++ b/poky/meta/recipes-extended/lighttpd/lighttpd/lighttpd.conf
@@ -16,8 +16,6 @@ server.modules = (
# "mod_redirect",
# "mod_alias",
"mod_access",
-# "mod_cml",
-# "mod_trigger_b4_dl",
# "mod_auth",
# "mod_status",
# "mod_setenv",
@@ -27,11 +25,9 @@ server.modules = (
# "mod_evhost",
# "mod_userdir",
# "mod_cgi",
-# "mod_compress",
# "mod_ssi",
-# "mod_usertrack",
# "mod_expire",
-# "mod_secdownload",
+# "mod_deflate",
# "mod_rrdtool",
# "mod_webdav",
"mod_accesslog" )
@@ -47,9 +43,6 @@ server.errorlog = "/www/logs/lighttpd.error.log"
index-file.names = ( "index.php", "index.html",
"index.htm", "default.htm" )
-## set the event-handler (read the performance section in the manual)
-# server.event-handler = "freebsd-kqueue" # needed on OS X
-
# mimetype mapping
mimetype.assign = (
".pdf" => "application/pdf",
@@ -115,7 +108,6 @@ mimetype.assign = (
#### accesslog module
accesslog.filename = "/www/logs/access.log"
-debug.log-request-handling = "enable"
@@ -127,10 +119,6 @@ debug.log-request-handling = "enable"
# of the document-root
url.access-deny = ( "~", ".inc" )
-$HTTP["url"] =~ "\.pdf$" {
- server.range-requests = "disable"
-}
-
##
# which extensions should not be handle via static-file transfer
#
@@ -177,6 +165,7 @@ static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
#dir-listing.activate = "enable"
## enable debugging
+#debug.log-request-header-on-error = "enable"
#debug.log-request-header = "enable"
#debug.log-response-header = "enable"
#debug.log-request-handling = "enable"
@@ -194,8 +183,9 @@ static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
#server.groupname = "wwwrun"
#### compress module
-#compress.cache-dir = "/tmp/lighttpd/cache/compress/"
-#compress.filetype = ("text/plain", "text/html")
+#deflate.cache-dir = "/tmp/lighttpd/cache/compress/"
+#deflate.mimetypes = ("text/plain", "text/html")
+#deflate.allowed-encodings = ("gzip")
#### proxy module
## read proxy.txt for more info
@@ -227,7 +217,8 @@ static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
#### SSL engine
#ssl.engine = "enable"
-#ssl.pemfile = "server.pem"
+#ssl.pemfile = "/path/to/fullchain.pem"
+#ssl.privkey = "/path/to/privkey.pem"
#### status module
#status.status-url = "/server-status"
@@ -291,19 +282,6 @@ static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
#setenv.add-request-header = ( "TRAV_ENV" => "mysql://user@host/db" )
#setenv.add-response-header = ( "X-Secret-Message" => "42" )
-## for mod_trigger_b4_dl
-# trigger-before-download.gdbm-filename = "/home/weigon/testbase/trigger.db"
-# trigger-before-download.memcache-hosts = ( "127.0.0.1:11211" )
-# trigger-before-download.trigger-url = "^/trigger/"
-# trigger-before-download.download-url = "^/download/"
-# trigger-before-download.deny-url = "http://127.0.0.1/index.html"
-# trigger-before-download.trigger-timeout = 10
-
-## for mod_cml
-## don't forget to add index.cml to server.indexfiles
-# cml.extension = ".cml"
-# cml.memcache-hosts = ( "127.0.0.1:11211" )
-
#### variable usage:
## variable name without "." is auto prefixed by "var." and becomes "var.bar"
#bar = 1
@@ -328,4 +306,4 @@ static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
#var.a=1
# include other config file fragments from lighttpd.d subdir
-include_shell "find /etc/lighttpd.d -maxdepth 1 -name '*.conf' -exec cat {} \;"
+include "/etc/lighttpd.d/*.conf"
diff --git a/poky/meta/recipes-extended/lighttpd/lighttpd_1.4.71.bb b/poky/meta/recipes-extended/lighttpd/lighttpd_1.4.73.bb
index 3959f88b98..ea83a4b507 100644
--- a/poky/meta/recipes-extended/lighttpd/lighttpd_1.4.71.bb
+++ b/poky/meta/recipes-extended/lighttpd/lighttpd_1.4.73.bb
@@ -16,7 +16,7 @@ SRC_URI = "http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-${PV}.t
file://lighttpd \
"
-SRC_URI[sha256sum] = "b8b6915da20396fdc354df3324d5e440169b2e5ea7859e3a775213841325afac"
+SRC_URI[sha256sum] = "818816d0b314b0aa8728a7076513435f6d5eb227f3b61323468e1f10dbe84ca8"
DEPENDS = "virtual/crypt"
diff --git a/poky/meta/recipes-extended/lsb/lsb-release_1.4.bb b/poky/meta/recipes-extended/lsb/lsb-release_1.4.bb
index ad16554e98..00d8183a4f 100644
--- a/poky/meta/recipes-extended/lsb/lsb-release_1.4.bb
+++ b/poky/meta/recipes-extended/lsb/lsb-release_1.4.bb
@@ -14,10 +14,9 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/project/lsb/lsb_release/1.4/lsb-release-1.4.tar
file://help2man-reproducibility.patch \
"
-SRC_URI[md5sum] = "30537ef5a01e0ca94b7b8eb6a36bb1e4"
SRC_URI[sha256sum] = "99321288f8d62e7a1d485b7c6bdccf06766fb8ca603c6195806e4457fdf17172"
-UPSTREAM_CHECK_URI = "http://sourceforge.net/projects/lsb/files/lsb_release/"
+UPSTREAM_CHECK_URI = "https://sourceforge.net/projects/lsb/files/lsb_release/"
UPSTREAM_CHECK_REGEX = "/lsb_release/(?P<pver>(\d+[\.\-_]*)+)/"
CLEANBROKEN = "1"
diff --git a/poky/meta/recipes-extended/ltp/ltp_20230516.bb b/poky/meta/recipes-extended/ltp/ltp_20230929.bb
index 4d132b761a..5c43346883 100644
--- a/poky/meta/recipes-extended/ltp/ltp_20230516.bb
+++ b/poky/meta/recipes-extended/ltp/ltp_20230929.bb
@@ -24,7 +24,7 @@ TUNE_CCARGS:remove:x86-64 = "-mfpmath=sse"
CFLAGS:append:powerpc64 = " -D__SANE_USERSPACE_TYPES__"
CFLAGS:append:mipsarchn64 = " -D__SANE_USERSPACE_TYPES__"
-SRCREV = "3ebc2dfa85c2445bb68d8c0d66e33c4da1e1b3a7"
+SRCREV = "110d3be6a9c58674de3e366b96a70f0129a5d299"
SRC_URI = "git://github.com/linux-test-project/ltp.git;branch=master;protocol=https \
file://0001-Remove-OOM-tests-from-runtest-mm.patch \
diff --git a/poky/meta/recipes-extended/man-db/files/man_db.conf-avoid-multilib-install-file-conflict.patch b/poky/meta/recipes-extended/man-db/files/man_db.conf-avoid-multilib-install-file-conflict.patch
deleted file mode 100644
index 03273d3b49..0000000000
--- a/poky/meta/recipes-extended/man-db/files/man_db.conf-avoid-multilib-install-file-conflict.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-The first line of man_db.conf will be replaced by package name. And it causes
-multilib install file conflict. Remove the line to avoid the issue.
-
-Upstream-Status: Pending
-
-Signed-off-by: Kai Kang <kai.kang@windriver.com>
-
-diff --git a/src/man_db.conf.in b/src/man_db.conf.in
-index bc8bb7e..04cfb31 100644
---- a/src/man_db.conf.in
-+++ b/src/man_db.conf.in
-@@ -1,4 +1,3 @@
--# @config_file_basename@
- #
- # This file is used by the man-db package to configure the man and cat paths.
- # It is also used to provide a manpath for those without one by examining
diff --git a/poky/meta/recipes-extended/man-db/man-db_2.11.2.bb b/poky/meta/recipes-extended/man-db/man-db_2.11.2.bb
index 3884a531a6..8941ffc013 100644
--- a/poky/meta/recipes-extended/man-db/man-db_2.11.2.bb
+++ b/poky/meta/recipes-extended/man-db/man-db_2.11.2.bb
@@ -10,8 +10,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=1ebbd3e34237af26da5dc08a4e440464 \
SRC_URI = "${SAVANNAH_NONGNU_MIRROR}/man-db/man-db-${PV}.tar.xz \
file://99_mandb \
file://0001-man-Move-local-variable-declaration-to-function-scop.patch \
- file://autoconf-2.73.patch \
- file://man_db.conf-avoid-multilib-install-file-conflict.patch"
+ file://autoconf-2.73.patch"
SRC_URI[sha256sum] = "cffa1ee4e974be78646c46508e6dd2f37e7c589aaab2938cc1064f058fef9f8d"
DEPENDS = "libpipeline gdbm groff-native base-passwd"
@@ -52,7 +51,9 @@ FILES:${PN}-dev += "${libdir}/man-db/libman.so ${libdir}/${BPN}/libmandb.so"
RDEPENDS:${PN} += "groff"
RRECOMMENDS:${PN} += "less"
-RPROVIDES:${PN} += " man"
+# iconv from glibc-utils can be used to transform encoding
+RRECOMMENDS:${PN}:append:libc-glibc = " glibc-utils"
+RPROVIDES:${PN} += "man"
def compress_pkg(d):
if bb.utils.contains("INHERIT", "compress_doc", True, False, d):
diff --git a/poky/meta/recipes-extended/msmtp/msmtp_1.8.24.bb b/poky/meta/recipes-extended/msmtp/msmtp_1.8.25.bb
index b8c867161b..b575fad5e1 100644
--- a/poky/meta/recipes-extended/msmtp/msmtp_1.8.24.bb
+++ b/poky/meta/recipes-extended/msmtp/msmtp_1.8.25.bb
@@ -11,7 +11,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
UPSTREAM_CHECK_URI = "https://marlam.de/msmtp/download/"
SRC_URI = "https://marlam.de/${BPN}/releases/${BP}.tar.xz"
-SRC_URI[sha256sum] = "bd6644b1aaab17d61b86647993e3efad860b23c54283b00ddc579c1f5110aa59"
+SRC_URI[sha256sum] = "2dfe1dbbb397d26fe0b0b6b2e9cd2efdf9d72dd42d18e70d7f363ada2652d738"
inherit gettext autotools update-alternatives pkgconfig
diff --git a/poky/meta/recipes-extended/newt/libnewt_0.52.23.bb b/poky/meta/recipes-extended/newt/libnewt_0.52.24.bb
index cd3731cf74..1e39a1c5ca 100644
--- a/poky/meta/recipes-extended/newt/libnewt_0.52.23.bb
+++ b/poky/meta/recipes-extended/newt/libnewt_0.52.24.bb
@@ -23,7 +23,7 @@ SRC_URI = "https://releases.pagure.org/newt/newt-${PV}.tar.gz \
file://0001-detect-gold-as-GNU-linker-too.patch \
"
-SRC_URI[sha256sum] = "caa372907b14ececfe298f0d512a62f41d33b290610244a58aed07bbc5ada12a"
+SRC_URI[sha256sum] = "5ded7e221f85f642521c49b1826c8de19845aa372baf5d630a51774b544fbdbb"
S = "${WORKDIR}/newt-${PV}"
diff --git a/poky/meta/recipes-extended/pam/libpam_1.5.3.bb b/poky/meta/recipes-extended/pam/libpam_1.5.3.bb
index 1aa307af4d..7af3ea99d1 100644
--- a/poky/meta/recipes-extended/pam/libpam_1.5.3.bb
+++ b/poky/meta/recipes-extended/pam/libpam_1.5.3.bb
@@ -49,7 +49,10 @@ PACKAGECONFIG[audit] = "--enable-audit,--disable-audit,audit,"
PACKAGECONFIG[userdb] = "--enable-db=db,--enable-db=no,db,"
PACKAGES += "${PN}-runtime ${PN}-xtests"
-FILES:${PN} = "${base_libdir}/lib*${SOLIBS}"
+FILES:${PN} = " \
+ ${base_libdir}/lib*${SOLIBS} \
+ ${nonarch_libdir}/tmpfiles.d/*.conf \
+"
FILES:${PN}-dev += "${base_libdir}/security/*.la ${base_libdir}/*.la ${base_libdir}/lib*${SOLIBSDEV}"
FILES:${PN}-runtime = "${sysconfdir} ${sbindir} ${systemd_system_unitdir}"
FILES:${PN}-xtests = "${datadir}/Linux-PAM/xtests"
@@ -130,9 +133,9 @@ do_install() {
if ${@bb.utils.contains('DISTRO_FEATURES','sysvinit','false','true',d)}; then
rm -rf ${D}${sysconfdir}/init.d/
rm -rf ${D}${sysconfdir}/rc*
- install -d ${D}${sysconfdir}/tmpfiles.d
+ install -d ${D}${nonarch_libdir}/tmpfiles.d
install -m 0644 ${WORKDIR}/pam-volatiles.conf \
- ${D}${sysconfdir}/tmpfiles.d/pam.conf
+ ${D}${nonarch_libdir}/tmpfiles.d/pam.conf
else
install -d ${D}${sysconfdir}/default/volatiles
install -m 0644 ${WORKDIR}/99_pam \
diff --git a/poky/meta/recipes-extended/stress-ng/stress-ng_0.16.05.bb b/poky/meta/recipes-extended/stress-ng/stress-ng_0.17.01.bb
index 1a1e9e4057..b6fd96d857 100644
--- a/poky/meta/recipes-extended/stress-ng/stress-ng_0.16.05.bb
+++ b/poky/meta/recipes-extended/stress-ng/stress-ng_0.17.01.bb
@@ -7,7 +7,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
SRC_URI = "git://github.com/ColinIanKing/stress-ng.git;protocol=https;branch=master \
"
-SRCREV = "aea6f3306f4676a7f7e8d8c507f811ef3d0244c5"
+SRCREV = "c9669b041eff5905da191974ba0102208a59e04e"
S = "${WORKDIR}/git"
DEPENDS = "coreutils-native libbsd"
diff --git a/poky/meta/recipes-extended/sudo/sudo_1.9.14p3.bb b/poky/meta/recipes-extended/sudo/sudo_1.9.15p2.bb
index d5c5718ea5..431dfba3c2 100644
--- a/poky/meta/recipes-extended/sudo/sudo_1.9.14p3.bb
+++ b/poky/meta/recipes-extended/sudo/sudo_1.9.15p2.bb
@@ -7,7 +7,7 @@ SRC_URI = "https://www.sudo.ws/dist/sudo-${PV}.tar.gz \
PAM_SRC_URI = "file://sudo.pam"
-SRC_URI[sha256sum] = "a08318b1c4bc8582c004d4cd9ae2903abc549e7e46ba815e41fe81d1c0782b62"
+SRC_URI[sha256sum] = "199c0cdbfa7efcfffa9c88684a8e2fb206a62b70a316507e4a91c89c873bbcc8"
DEPENDS += " virtual/crypt ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}"
RDEPENDS:${PN} += " ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam-plugin-limits pam-plugin-keyinit', '', d)}"
diff --git a/poky/meta/recipes-extended/sysstat/sysstat_12.7.4.bb b/poky/meta/recipes-extended/sysstat/sysstat_12.7.4.bb
index 134fd5cf96..660bc634a0 100644
--- a/poky/meta/recipes-extended/sysstat/sysstat_12.7.4.bb
+++ b/poky/meta/recipes-extended/sysstat/sysstat_12.7.4.bb
@@ -48,9 +48,9 @@ do_install() {
install -m 0644 ${WORKDIR}/99_sysstat ${D}/etc/default/volatiles
fi
if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
- install -d ${D}${sysconfdir}/tmpfiles.d
+ install -d ${D}${nonarch_libdir}/tmpfiles.d
echo "d ${localstatedir}/log/sa - - - -" \
- > ${D}${sysconfdir}/tmpfiles.d/sysstat.conf
+ > ${D}${nonarch_libdir}/tmpfiles.d/sysstat.conf
# Unless both cron and systemd are enabled, install our own
# systemd unit file. Otherwise the package will install one.
@@ -70,7 +70,11 @@ pkg_postinst:${PN} () {
fi
}
-FILES:${PN} += "${systemd_system_unitdir} ${nonarch_base_libdir}/systemd"
+FILES:${PN} += " \
+ ${systemd_system_unitdir} \
+ ${nonarch_base_libdir}/systemd \
+ ${nonarch_libdir}/tmpfiles.d \
+"
TARGET_CC_ARCH += "${LDFLAGS}"
diff --git a/poky/meta/recipes-gnome/epiphany/epiphany_44.6.bb b/poky/meta/recipes-gnome/epiphany/epiphany_44.6.bb
index d8dd3d6dae..577eb43a80 100644
--- a/poky/meta/recipes-gnome/epiphany/epiphany_44.6.bb
+++ b/poky/meta/recipes-gnome/epiphany/epiphany_44.6.bb
@@ -23,7 +23,6 @@ DEPENDS = " \
desktop-file-utils-native \
"
-GNOMEBASEBUILDCLASS = "meson"
inherit gnomebase gsettings features_check gettext mime-xdg gtk-icon-cache
REQUIRED_DISTRO_FEATURES = "x11 opengl"
diff --git a/poky/meta/recipes-gnome/gcr/gcr_4.1.0.bb b/poky/meta/recipes-gnome/gcr/gcr_4.1.0.bb
index 239d9806cc..399f327e04 100644
--- a/poky/meta/recipes-gnome/gcr/gcr_4.1.0.bb
+++ b/poky/meta/recipes-gnome/gcr/gcr_4.1.0.bb
@@ -15,7 +15,6 @@ CACHED_CONFIGUREVARS += "ac_cv_path_GPG='gpg2'"
CFLAGS += "-D_GNU_SOURCE"
-GNOMEBASEBUILDCLASS = "meson"
GTKDOC_MESON_OPTION = "gtk_doc"
inherit gnomebase gtk-icon-cache gi-docgen features_check vala gobject-introspection gettext mime mime-xdg
diff --git a/poky/meta/recipes-gnome/gnome/adwaita-icon-theme_45.0.bb b/poky/meta/recipes-gnome/gnome/adwaita-icon-theme_45.0.bb
index 4dbcced5c3..0bd98288f6 100644
--- a/poky/meta/recipes-gnome/gnome/adwaita-icon-theme_45.0.bb
+++ b/poky/meta/recipes-gnome/gnome/adwaita-icon-theme_45.0.bb
@@ -10,7 +10,6 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=c84cac88e46fc07647ea07e6c24eeb7c \
file://COPYING_CCBYSA3;md5=96143d33de3a79321b1006c4e8ed07e7 \
file://COPYING_LGPL;md5=e6a600fd5e1d9cbde2d983680233ad02"
-GNOMEBASEBUILDCLASS = "meson"
inherit gnomebase allarch gtk-icon-cache
SRC_URI[archive.sha256sum] = "2442bfb06f4e6cc95bf6e2682fdff98fa5eddc688751b9d6215c623cb4e42ff1"
diff --git a/poky/meta/recipes-gnome/gnome/gconf_3.2.6.bb b/poky/meta/recipes-gnome/gnome/gconf_3.2.6.bb
index 4930aeb9f0..1e29bd9bb0 100644
--- a/poky/meta/recipes-gnome/gnome/gconf_3.2.6.bb
+++ b/poky/meta/recipes-gnome/gnome/gconf_3.2.6.bb
@@ -9,6 +9,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=55ca817ccb7d5b5b66355690e9abc605"
DEPENDS = "glib-2.0 glib-2.0-native dbus dbus-glib libxml2 intltool-native"
+GNOMEBASEBUILDCLASS = "autotools"
inherit gnomebase gtk-doc gettext gobject-introspection gio-module-cache
SRC_URI = "${GNOME_MIRROR}/GConf/${@gnome_verdir("${PV}")}/GConf-${PV}.tar.xz;name=archive \
diff --git a/poky/meta/recipes-gnome/gsettings-desktop-schemas/gsettings-desktop-schemas_44.0.bb b/poky/meta/recipes-gnome/gsettings-desktop-schemas/gsettings-desktop-schemas_45.0.bb
index 8e30d5e524..657f9d61ce 100644
--- a/poky/meta/recipes-gnome/gsettings-desktop-schemas/gsettings-desktop-schemas_44.0.bb
+++ b/poky/meta/recipes-gnome/gsettings-desktop-schemas/gsettings-desktop-schemas_45.0.bb
@@ -9,8 +9,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c"
DEPENDS = "glib-2.0"
-GNOMEBASEBUILDCLASS = "meson"
inherit gnomebase gsettings gobject-introspection gettext
-SRC_URI[archive.sha256sum] = "eb2de45cad905994849e642a623adeb75d41b21b0626d40d2a07b8ea281fec0e"
+SRC_URI[archive.sha256sum] = "365c8d04daf79b38c8b3dc9626349a024f9e4befdd31fede74b42f7a9fbe0ae2"
diff --git a/poky/meta/recipes-gnome/gtk+/gtk+3.inc b/poky/meta/recipes-gnome/gtk+/gtk+3.inc
index 8d01e6077f..4a04c06432 100644
--- a/poky/meta/recipes-gnome/gtk+/gtk+3.inc
+++ b/poky/meta/recipes-gnome/gtk+/gtk+3.inc
@@ -41,7 +41,7 @@ PACKAGECONFIG[x11] = "-Dx11_backend=true,-Dx11_backend=false,at-spi2-atk fontcon
# this is provided by oe-core patch that removes epoxy/gl dependency from a X11 build
PACKAGECONFIG[opengl] = "-Dopengl=true,-Dopengl=false,libepoxy"
PACKAGECONFIG[wayland] = "-Dwayland_backend=true,-Dwayland_backend=false,wayland wayland-protocols libxkbcommon virtual/egl virtual/libgles2 wayland-native"
-PACKAGECONFIG[cups] = ",,cups,cups"
+PACKAGECONFIG[cups] = ",,cups,cups gtk3-printbackend-cups"
PACKAGECONFIG[colord] = "-Dcolord=yes,-Dcolord=no,colord"
PACKAGECONFIG[cloudproviders] = "-Dcloudproviders=true,-Dcloudproviders=false,libcloudproviders"
PACKAGECONFIG[tracker3] = "-Dtracker3=true,-Dtracker3=false,tracker,tracker-miners"
diff --git a/poky/meta/recipes-gnome/gtk+/gtk4_4.12.3.bb b/poky/meta/recipes-gnome/gtk+/gtk4_4.12.3.bb
index a547db8376..001b06934e 100644
--- a/poky/meta/recipes-gnome/gtk+/gtk4_4.12.3.bb
+++ b/poky/meta/recipes-gnome/gtk+/gtk4_4.12.3.bb
@@ -66,7 +66,7 @@ PACKAGECONFIG:class-nativesdk = "${@bb.utils.filter('DISTRO_FEATURES', 'x11', d)
PACKAGECONFIG[x11] = "-Dx11-backend=true,-Dx11-backend=false,at-spi2-atk fontconfig libx11 libxext libxcursor libxi libxdamage libxrandr libxrender libxcomposite libxfixes xinerama"
PACKAGECONFIG[wayland] = "-Dwayland-backend=true,-Dwayland-backend=false,wayland wayland-protocols virtual/egl virtual/libgles2 wayland-native"
PACKAGECONFIG[cloudproviders] = "-Dcloudproviders=enabled,-Dcloudproviders=disabled,libcloudproviders"
-PACKAGECONFIG[cups] = "-Dprint-cups=enabled,-Dprint-cups=disabled,cups,cups"
+PACKAGECONFIG[cups] = "-Dprint-cups=enabled,-Dprint-cups=disabled,cups,cups gtk4-printbackend-cups"
PACKAGECONFIG[colord] = "-Dcolord=enabled,-Dcolord=disabled,colord"
PACKAGECONFIG[iso-codes] = ",,iso-codes,iso-codes"
PACKAGECONFIG[ffmpeg] = "-Dmedia-ffmpeg=enabled,-Dmedia-ffmpeg=disabled,ffmpeg"
diff --git a/poky/meta/recipes-gnome/gtk-doc/gtk-doc_1.33.2.bb b/poky/meta/recipes-gnome/gtk-doc/gtk-doc_1.33.2.bb
index 150eca9274..2e8ab1c771 100644
--- a/poky/meta/recipes-gnome/gtk-doc/gtk-doc_1.33.2.bb
+++ b/poky/meta/recipes-gnome/gtk-doc/gtk-doc_1.33.2.bb
@@ -5,6 +5,7 @@ HOMEPAGE = "https://www.gtk.org/docs/"
LICENSE = "GPL-2.0-only"
LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f"
+GNOMEBASEBUILDCLASS = "autotools"
inherit gnomebase
# Configure the scripts correctly (and build their dependencies) only if they are actually
diff --git a/poky/meta/recipes-gnome/json-glib/json-glib_1.6.6.bb b/poky/meta/recipes-gnome/json-glib/json-glib_1.6.6.bb
index 9c34fb7f40..a9a71953c3 100644
--- a/poky/meta/recipes-gnome/json-glib/json-glib_1.6.6.bb
+++ b/poky/meta/recipes-gnome/json-glib/json-glib_1.6.6.bb
@@ -11,7 +11,6 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=7fbc338309ac38fefcd64b04bb903e34"
DEPENDS = "glib-2.0 glib-2.0-native"
-GNOMEBASEBUILDCLASS = "meson"
inherit gnomebase lib_package gobject-introspection gi-docgen gettext ptest-gnome manpages upstream-version-is-even
GIR_MESON_ENABLE_FLAG = 'enabled'
GIR_MESON_DISABLE_FLAG = 'disabled'
diff --git a/poky/meta/recipes-gnome/libadwaita/libadwaita_1.4.0.bb b/poky/meta/recipes-gnome/libadwaita/libadwaita_1.4.0.bb
index d8aa2cd697..cc05756805 100644
--- a/poky/meta/recipes-gnome/libadwaita/libadwaita_1.4.0.bb
+++ b/poky/meta/recipes-gnome/libadwaita/libadwaita_1.4.0.bb
@@ -3,7 +3,6 @@ HOMEPAGE = "https://gitlab.gnome.org/GNOME/libadwaita"
LICENSE="LGPL-2.1-or-later"
LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c"
-GNOMEBASEBUILDCLASS = "meson"
DEPENDS = " \
gtk4 \
diff --git a/poky/meta/recipes-gnome/libdazzle/libdazzle_3.44.0.bb b/poky/meta/recipes-gnome/libdazzle/libdazzle_3.44.0.bb
index 49ebc818b0..9bca7e9dce 100644
--- a/poky/meta/recipes-gnome/libdazzle/libdazzle_3.44.0.bb
+++ b/poky/meta/recipes-gnome/libdazzle/libdazzle_3.44.0.bb
@@ -7,7 +7,6 @@ HOMEPAGE = "https://gitlab.gnome.org/GNOME/libdazzle"
BUGTRACKER = "https://gitlab.gnome.org/GNOME/libdazzle/issues"
LIC_FILES_CHKSUM = "file://COPYING;md5=8f0e2cd40e05189ec81232da84bd6e1a"
-GNOMEBASEBUILDCLASS = "meson"
inherit gnomebase upstream-version-is-even vala features_check gobject-introspection
DEPENDS = "glib-2.0-native glib-2.0 gtk+3"
diff --git a/poky/meta/recipes-gnome/libgudev/libgudev_238.bb b/poky/meta/recipes-gnome/libgudev/libgudev_238.bb
index c71e4bda74..5923544eca 100644
--- a/poky/meta/recipes-gnome/libgudev/libgudev_238.bb
+++ b/poky/meta/recipes-gnome/libgudev/libgudev_238.bb
@@ -14,7 +14,6 @@ RCONFLICTS:${PN} = "systemd (<= 220)"
LICENSE = "LGPL-2.1-only"
LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c"
-GNOMEBASEBUILDCLASS = "meson"
inherit gnomebase gobject-introspection gtk-doc
GIR_MESON_ENABLE_FLAG = 'enabled'
diff --git a/poky/meta/recipes-gnome/libnotify/libnotify_0.8.2.bb b/poky/meta/recipes-gnome/libnotify/libnotify_0.8.3.bb
index 6888c33d14..1e606b84b2 100644
--- a/poky/meta/recipes-gnome/libnotify/libnotify_0.8.2.bb
+++ b/poky/meta/recipes-gnome/libnotify/libnotify_0.8.3.bb
@@ -14,14 +14,13 @@ DEPENDS = "glib-2.0 glib-2.0-native gdk-pixbuf"
PACKAGECONFIG ?= ""
PACKAGECONFIG[tests] = "-Dtests=true,-Dtests=false,gtk+3"
-GNOMEBASEBUILDCLASS = "meson"
GIR_MESON_ENABLE_FLAG = "enabled"
GIR_MESON_DISABLE_FLAG = "disabled"
inherit gnomebase gi-docgen features_check gobject-introspection
# depends on gtk+3 if tests are enabled
ANY_OF_DISTRO_FEATURES = "${@bb.utils.contains('PACKAGECONFIG', 'tests', '${GTK3DISTROFEATURES}', '', d)}"
-SRC_URI[archive.sha256sum] = "c5f4ed3d1f86e5b118c76415aacb861873ed3e6f0c6b3181b828cf584fc5c616"
+SRC_URI[archive.sha256sum] = "ee8f3ef946156ad3406fdf45feedbdcd932dbd211ab4f16f75eba4f36fb2f6c0"
EXTRA_OEMESON = "-Dman=false"
diff --git a/poky/meta/recipes-gnome/librsvg/librsvg/0001-Add-riscv32-support.patch b/poky/meta/recipes-gnome/librsvg/librsvg/0001-Add-riscv32-support.patch
new file mode 100644
index 0000000000..2e36eaf508
--- /dev/null
+++ b/poky/meta/recipes-gnome/librsvg/librsvg/0001-Add-riscv32-support.patch
@@ -0,0 +1,1511 @@
+From a4066c09bec2d4ec956459237e0a48501cc4780f Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 8 Nov 2023 22:41:54 -0800
+Subject: [PATCH] Add riscv32 support
+
+Upstream-Status: Submitted [https://github.com/sunfishcode/linux-raw-sys/pull/95]
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/riscv32/ioctl.rs | 1490 +++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 1488 insertions(+), 2 deletions(-)
+
+diff --git a/src/riscv32/ioctl.rs b/src/riscv32/ioctl.rs
+index 85bcbe8..1d97396 100644
+--- a/src/riscv32/ioctl.rs
++++ b/src/riscv32/ioctl.rs
+@@ -1,3 +1,1489 @@
+-/* automatically generated by rust-bindgen 0.65.1 */
+-
++/* automatically generated by rust-bindgen 0.66.1 */
+
++pub const FIONREAD: u32 = 21531;
++pub const FIONBIO: u32 = 21537;
++pub const FIOCLEX: u32 = 21585;
++pub const FIONCLEX: u32 = 21584;
++pub const FIOASYNC: u32 = 21586;
++pub const FIOQSIZE: u32 = 21600;
++pub const TCXONC: u32 = 21514;
++pub const TCFLSH: u32 = 21515;
++pub const TIOCSCTTY: u32 = 21518;
++pub const TIOCSPGRP: u32 = 21520;
++pub const TIOCOUTQ: u32 = 21521;
++pub const TIOCSTI: u32 = 21522;
++pub const TIOCSWINSZ: u32 = 21524;
++pub const TIOCMGET: u32 = 21525;
++pub const TIOCMBIS: u32 = 21526;
++pub const TIOCMBIC: u32 = 21527;
++pub const TIOCMSET: u32 = 21528;
++pub const TIOCSSOFTCAR: u32 = 21530;
++pub const TIOCLINUX: u32 = 21532;
++pub const TIOCCONS: u32 = 21533;
++pub const TIOCSSERIAL: u32 = 21535;
++pub const TIOCPKT: u32 = 21536;
++pub const TIOCNOTTY: u32 = 21538;
++pub const TIOCSETD: u32 = 21539;
++pub const TIOCSBRK: u32 = 21543;
++pub const TIOCCBRK: u32 = 21544;
++pub const TIOCSRS485: u32 = 21551;
++pub const TIOCSPTLCK: u32 = 1074025521;
++pub const TIOCSIG: u32 = 1074025526;
++pub const TIOCVHANGUP: u32 = 21559;
++pub const TIOCSERCONFIG: u32 = 21587;
++pub const TIOCSERGWILD: u32 = 21588;
++pub const TIOCSERSWILD: u32 = 21589;
++pub const TIOCSLCKTRMIOS: u32 = 21591;
++pub const TIOCSERGSTRUCT: u32 = 21592;
++pub const TIOCSERGETLSR: u32 = 21593;
++pub const TIOCSERGETMULTI: u32 = 21594;
++pub const TIOCSERSETMULTI: u32 = 21595;
++pub const TIOCMIWAIT: u32 = 21596;
++pub const TCGETS: u32 = 21505;
++pub const TCGETA: u32 = 21509;
++pub const TCSBRK: u32 = 21513;
++pub const TCSBRKP: u32 = 21541;
++pub const TCSETA: u32 = 21510;
++pub const TCSETAF: u32 = 21512;
++pub const TCSETAW: u32 = 21511;
++pub const TIOCEXCL: u32 = 21516;
++pub const TIOCNXCL: u32 = 21517;
++pub const TIOCGDEV: u32 = 2147767346;
++pub const TIOCGEXCL: u32 = 2147767360;
++pub const TIOCGICOUNT: u32 = 21597;
++pub const TIOCGLCKTRMIOS: u32 = 21590;
++pub const TIOCGPGRP: u32 = 21519;
++pub const TIOCGPKT: u32 = 2147767352;
++pub const TIOCGPTLCK: u32 = 2147767353;
++pub const TIOCGPTN: u32 = 2147767344;
++pub const TIOCGPTPEER: u32 = 21569;
++pub const TIOCGRS485: u32 = 21550;
++pub const TIOCGSERIAL: u32 = 21534;
++pub const TIOCGSID: u32 = 21545;
++pub const TIOCGSOFTCAR: u32 = 21529;
++pub const TIOCGWINSZ: u32 = 21523;
++pub const TCGETS2: u32 = 2150388778;
++pub const TCGETX: u32 = 21554;
++pub const TCSETS: u32 = 21506;
++pub const TCSETS2: u32 = 1076646955;
++pub const TCSETSF: u32 = 21508;
++pub const TCSETSF2: u32 = 1076646957;
++pub const TCSETSW: u32 = 21507;
++pub const TCSETSW2: u32 = 1076646956;
++pub const TCSETX: u32 = 21555;
++pub const TCSETXF: u32 = 21556;
++pub const TCSETXW: u32 = 21557;
++pub const TIOCGETD: u32 = 21540;
++pub const MTIOCGET: u32 = 2150657282;
++pub const BLKSSZGET: u32 = 4712;
++pub const BLKPBSZGET: u32 = 4731;
++pub const BLKROSET: u32 = 4701;
++pub const BLKROGET: u32 = 4702;
++pub const BLKRRPART: u32 = 4703;
++pub const BLKGETSIZE: u32 = 4704;
++pub const BLKFLSBUF: u32 = 4705;
++pub const BLKRASET: u32 = 4706;
++pub const BLKRAGET: u32 = 4707;
++pub const BLKFRASET: u32 = 4708;
++pub const BLKFRAGET: u32 = 4709;
++pub const BLKSECTSET: u32 = 4710;
++pub const BLKSECTGET: u32 = 4711;
++pub const BLKPG: u32 = 4713;
++pub const BLKBSZGET: u32 = 2148012656;
++pub const BLKBSZSET: u32 = 1074270833;
++pub const BLKGETSIZE64: u32 = 2148012658;
++pub const BLKTRACESETUP: u32 = 3225948787;
++pub const BLKTRACESTART: u32 = 4724;
++pub const BLKTRACESTOP: u32 = 4725;
++pub const BLKTRACETEARDOWN: u32 = 4726;
++pub const BLKDISCARD: u32 = 4727;
++pub const BLKIOMIN: u32 = 4728;
++pub const BLKIOOPT: u32 = 4729;
++pub const BLKALIGNOFF: u32 = 4730;
++pub const BLKDISCARDZEROES: u32 = 4732;
++pub const BLKSECDISCARD: u32 = 4733;
++pub const BLKROTATIONAL: u32 = 4734;
++pub const BLKZEROOUT: u32 = 4735;
++pub const UFFDIO_REGISTER: u32 = 3223366144;
++pub const UFFDIO_UNREGISTER: u32 = 2148575745;
++pub const UFFDIO_WAKE: u32 = 2148575746;
++pub const UFFDIO_COPY: u32 = 3223890435;
++pub const UFFDIO_ZEROPAGE: u32 = 3223366148;
++pub const UFFDIO_WRITEPROTECT: u32 = 3222841862;
++pub const UFFDIO_API: u32 = 3222841919;
++pub const NS_GET_USERNS: u32 = 46849;
++pub const NS_GET_PARENT: u32 = 46850;
++pub const NS_GET_NSTYPE: u32 = 46851;
++pub const KDGETLED: u32 = 19249;
++pub const KDSETLED: u32 = 19250;
++pub const KDGKBLED: u32 = 19300;
++pub const KDSKBLED: u32 = 19301;
++pub const KDGKBTYPE: u32 = 19251;
++pub const KDADDIO: u32 = 19252;
++pub const KDDELIO: u32 = 19253;
++pub const KDENABIO: u32 = 19254;
++pub const KDDISABIO: u32 = 19255;
++pub const KDSETMODE: u32 = 19258;
++pub const KDGETMODE: u32 = 19259;
++pub const KDMKTONE: u32 = 19248;
++pub const KIOCSOUND: u32 = 19247;
++pub const GIO_CMAP: u32 = 19312;
++pub const PIO_CMAP: u32 = 19313;
++pub const GIO_FONT: u32 = 19296;
++pub const GIO_FONTX: u32 = 19307;
++pub const PIO_FONT: u32 = 19297;
++pub const PIO_FONTX: u32 = 19308;
++pub const PIO_FONTRESET: u32 = 19309;
++pub const GIO_SCRNMAP: u32 = 19264;
++pub const GIO_UNISCRNMAP: u32 = 19305;
++pub const PIO_SCRNMAP: u32 = 19265;
++pub const PIO_UNISCRNMAP: u32 = 19306;
++pub const GIO_UNIMAP: u32 = 19302;
++pub const PIO_UNIMAP: u32 = 19303;
++pub const PIO_UNIMAPCLR: u32 = 19304;
++pub const KDGKBMODE: u32 = 19268;
++pub const KDSKBMODE: u32 = 19269;
++pub const KDGKBMETA: u32 = 19298;
++pub const KDSKBMETA: u32 = 19299;
++pub const KDGKBENT: u32 = 19270;
++pub const KDSKBENT: u32 = 19271;
++pub const KDGKBSENT: u32 = 19272;
++pub const KDSKBSENT: u32 = 19273;
++pub const KDGKBDIACR: u32 = 19274;
++pub const KDGETKEYCODE: u32 = 19276;
++pub const KDSETKEYCODE: u32 = 19277;
++pub const KDSIGACCEPT: u32 = 19278;
++pub const VT_OPENQRY: u32 = 22016;
++pub const VT_GETMODE: u32 = 22017;
++pub const VT_SETMODE: u32 = 22018;
++pub const VT_GETSTATE: u32 = 22019;
++pub const VT_RELDISP: u32 = 22021;
++pub const VT_ACTIVATE: u32 = 22022;
++pub const VT_WAITACTIVE: u32 = 22023;
++pub const VT_DISALLOCATE: u32 = 22024;
++pub const VT_RESIZE: u32 = 22025;
++pub const VT_RESIZEX: u32 = 22026;
++pub const FIOSETOWN: u32 = 35073;
++pub const SIOCSPGRP: u32 = 35074;
++pub const FIOGETOWN: u32 = 35075;
++pub const SIOCGPGRP: u32 = 35076;
++pub const SIOCATMARK: u32 = 35077;
++pub const SIOCGSTAMP: u32 = 35078;
++pub const TIOCINQ: u32 = 21531;
++pub const SIOCADDRT: u32 = 35083;
++pub const SIOCDELRT: u32 = 35084;
++pub const SIOCGIFNAME: u32 = 35088;
++pub const SIOCSIFLINK: u32 = 35089;
++pub const SIOCGIFCONF: u32 = 35090;
++pub const SIOCGIFFLAGS: u32 = 35091;
++pub const SIOCSIFFLAGS: u32 = 35092;
++pub const SIOCGIFADDR: u32 = 35093;
++pub const SIOCSIFADDR: u32 = 35094;
++pub const SIOCGIFDSTADDR: u32 = 35095;
++pub const SIOCSIFDSTADDR: u32 = 35096;
++pub const SIOCGIFBRDADDR: u32 = 35097;
++pub const SIOCSIFBRDADDR: u32 = 35098;
++pub const SIOCGIFNETMASK: u32 = 35099;
++pub const SIOCSIFNETMASK: u32 = 35100;
++pub const SIOCGIFMETRIC: u32 = 35101;
++pub const SIOCSIFMETRIC: u32 = 35102;
++pub const SIOCGIFMEM: u32 = 35103;
++pub const SIOCSIFMEM: u32 = 35104;
++pub const SIOCGIFMTU: u32 = 35105;
++pub const SIOCSIFMTU: u32 = 35106;
++pub const SIOCSIFHWADDR: u32 = 35108;
++pub const SIOCGIFENCAP: u32 = 35109;
++pub const SIOCSIFENCAP: u32 = 35110;
++pub const SIOCGIFHWADDR: u32 = 35111;
++pub const SIOCGIFSLAVE: u32 = 35113;
++pub const SIOCSIFSLAVE: u32 = 35120;
++pub const SIOCADDMULTI: u32 = 35121;
++pub const SIOCDELMULTI: u32 = 35122;
++pub const SIOCDARP: u32 = 35155;
++pub const SIOCGARP: u32 = 35156;
++pub const SIOCSARP: u32 = 35157;
++pub const SIOCDRARP: u32 = 35168;
++pub const SIOCGRARP: u32 = 35169;
++pub const SIOCSRARP: u32 = 35170;
++pub const SIOCGIFMAP: u32 = 35184;
++pub const SIOCSIFMAP: u32 = 35185;
++pub const SIOCRTMSG: u32 = 35085;
++pub const SIOCSIFNAME: u32 = 35107;
++pub const SIOCGIFINDEX: u32 = 35123;
++pub const SIOGIFINDEX: u32 = 35123;
++pub const SIOCSIFPFLAGS: u32 = 35124;
++pub const SIOCGIFPFLAGS: u32 = 35125;
++pub const SIOCDIFADDR: u32 = 35126;
++pub const SIOCSIFHWBROADCAST: u32 = 35127;
++pub const SIOCGIFCOUNT: u32 = 35128;
++pub const SIOCGIFBR: u32 = 35136;
++pub const SIOCSIFBR: u32 = 35137;
++pub const SIOCGIFTXQLEN: u32 = 35138;
++pub const SIOCSIFTXQLEN: u32 = 35139;
++pub const SIOCADDDLCI: u32 = 35200;
++pub const SIOCDELDLCI: u32 = 35201;
++pub const SIOCDEVPRIVATE: u32 = 35312;
++pub const SIOCPROTOPRIVATE: u32 = 35296;
++pub const FIBMAP: u32 = 1;
++pub const FIGETBSZ: u32 = 2;
++pub const FIFREEZE: u32 = 3221510263;
++pub const FITHAW: u32 = 3221510264;
++pub const FITRIM: u32 = 3222820985;
++pub const FICLONE: u32 = 1074041865;
++pub const FICLONERANGE: u32 = 1075876877;
++pub const FIDEDUPERANGE: u32 = 3222836278;
++pub const FS_IOC_GETFLAGS: u32 = 2148034049;
++pub const FS_IOC_SETFLAGS: u32 = 1074292226;
++pub const FS_IOC_GETVERSION: u32 = 2148038145;
++pub const FS_IOC_SETVERSION: u32 = 1074296322;
++pub const FS_IOC_FIEMAP: u32 = 3223348747;
++pub const FS_IOC32_GETFLAGS: u32 = 2147771905;
++pub const FS_IOC32_SETFLAGS: u32 = 1074030082;
++pub const FS_IOC32_GETVERSION: u32 = 2147776001;
++pub const FS_IOC32_SETVERSION: u32 = 1074034178;
++pub const FS_IOC_FSGETXATTR: u32 = 2149341215;
++pub const FS_IOC_FSSETXATTR: u32 = 1075599392;
++pub const FS_IOC_GETFSLABEL: u32 = 2164298801;
++pub const FS_IOC_SETFSLABEL: u32 = 1090556978;
++pub const EXT4_IOC_GETVERSION: u32 = 2148034051;
++pub const EXT4_IOC_SETVERSION: u32 = 1074292228;
++pub const EXT4_IOC_GETVERSION_OLD: u32 = 2148038145;
++pub const EXT4_IOC_SETVERSION_OLD: u32 = 1074296322;
++pub const EXT4_IOC_GETRSVSZ: u32 = 2148034053;
++pub const EXT4_IOC_SETRSVSZ: u32 = 1074292230;
++pub const EXT4_IOC_GROUP_EXTEND: u32 = 1074292231;
++pub const EXT4_IOC_MIGRATE: u32 = 26121;
++pub const EXT4_IOC_ALLOC_DA_BLKS: u32 = 26124;
++pub const EXT4_IOC_RESIZE_FS: u32 = 1074292240;
++pub const EXT4_IOC_SWAP_BOOT: u32 = 26129;
++pub const EXT4_IOC_PRECACHE_EXTENTS: u32 = 26130;
++pub const EXT4_IOC_CLEAR_ES_CACHE: u32 = 26152;
++pub const EXT4_IOC_GETSTATE: u32 = 1074030121;
++pub const EXT4_IOC_GET_ES_CACHE: u32 = 3223348778;
++pub const EXT4_IOC_CHECKPOINT: u32 = 1074030123;
++pub const EXT4_IOC_SHUTDOWN: u32 = 2147768445;
++pub const EXT4_IOC32_GETVERSION: u32 = 2147771907;
++pub const EXT4_IOC32_SETVERSION: u32 = 1074030084;
++pub const EXT4_IOC32_GETRSVSZ: u32 = 2147771909;
++pub const EXT4_IOC32_SETRSVSZ: u32 = 1074030086;
++pub const EXT4_IOC32_GROUP_EXTEND: u32 = 1074030087;
++pub const EXT4_IOC32_GETVERSION_OLD: u32 = 2147776001;
++pub const EXT4_IOC32_SETVERSION_OLD: u32 = 1074034178;
++pub const VIDIOC_SUBDEV_QUERYSTD: u32 = 2148030015;
++pub const AUTOFS_DEV_IOCTL_CLOSEMOUNT: u32 = 3222836085;
++pub const LIRC_SET_SEND_CARRIER: u32 = 1074030867;
++pub const AUTOFS_IOC_PROTOSUBVER: u32 = 2147783527;
++pub const PTP_SYS_OFFSET_PRECISE: u32 = 3225435400;
++pub const FSI_SCOM_WRITE: u32 = 3223352066;
++pub const ATM_GETCIRANGE: u32 = 1074815370;
++pub const DMA_BUF_SET_NAME_B: u32 = 1074291201;
++pub const RIO_CM_EP_GET_LIST_SIZE: u32 = 3221512961;
++pub const TUNSETPERSIST: u32 = 1074025675;
++pub const FS_IOC_GET_ENCRYPTION_POLICY: u32 = 1074554389;
++pub const CEC_RECEIVE: u32 = 3224920326;
++pub const MGSL_IOCGPARAMS: u32 = 2150657281;
++pub const ENI_SETMULT: u32 = 1074815335;
++pub const RIO_GET_EVENT_MASK: u32 = 2147773710;
++pub const LIRC_GET_MAX_TIMEOUT: u32 = 2147772681;
++pub const USBDEVFS_CLAIMINTERFACE: u32 = 2147767567;
++pub const CHIOMOVE: u32 = 1075077889;
++pub const SONYPI_IOCGBATFLAGS: u32 = 2147579399;
++pub const BTRFS_IOC_SYNC: u32 = 37896;
++pub const VIDIOC_TRY_FMT: u32 = 3234879040;
++pub const LIRC_SET_REC_MODE: u32 = 1074030866;
++pub const VIDIOC_DQEVENT: u32 = 2156418649;
++pub const RPMSG_DESTROY_EPT_IOCTL: u32 = 46338;
++pub const UVCIOC_CTRL_MAP: u32 = 3227546912;
++pub const VHOST_SET_BACKEND_FEATURES: u32 = 1074310949;
++pub const VHOST_VSOCK_SET_GUEST_CID: u32 = 1074311008;
++pub const UI_SET_KEYBIT: u32 = 1074025829;
++pub const LIRC_SET_REC_TIMEOUT: u32 = 1074030872;
++pub const FS_IOC_GET_ENCRYPTION_KEY_STATUS: u32 = 3229640218;
++pub const BTRFS_IOC_TREE_SEARCH_V2: u32 = 3228603409;
++pub const VHOST_SET_VRING_BASE: u32 = 1074310930;
++pub const RIO_ENABLE_DOORBELL_RANGE: u32 = 1074294025;
++pub const VIDIOC_TRY_EXT_CTRLS: u32 = 3223344713;
++pub const LIRC_GET_REC_MODE: u32 = 2147772674;
++pub const PPGETTIME: u32 = 2148561045;
++pub const BTRFS_IOC_RM_DEV: u32 = 1342215179;
++pub const ATM_SETBACKEND: u32 = 1073897970;
++pub const FSL_HV_IOCTL_PARTITION_START: u32 = 3222318851;
++pub const FBIO_WAITEVENT: u32 = 18056;
++pub const SWITCHTEC_IOCTL_PORT_TO_PFF: u32 = 3222034245;
++pub const NVME_IOCTL_IO_CMD: u32 = 3225964099;
++pub const IPMICTL_RECEIVE_MSG_TRUNC: u32 = 3224398091;
++pub const FDTWADDLE: u32 = 601;
++pub const NVME_IOCTL_SUBMIT_IO: u32 = 1076907586;
++pub const NILFS_IOCTL_SYNC: u32 = 2148036234;
++pub const VIDIOC_SUBDEV_S_DV_TIMINGS: u32 = 3229898327;
++pub const ASPEED_LPC_CTRL_IOCTL_GET_SIZE: u32 = 3222319616;
++pub const DM_DEV_STATUS: u32 = 3241737479;
++pub const TEE_IOC_CLOSE_SESSION: u32 = 2147787781;
++pub const NS_GETPSTAT: u32 = 3222298977;
++pub const UI_SET_PROPBIT: u32 = 1074025838;
++pub const TUNSETFILTEREBPF: u32 = 2147767521;
++pub const RIO_MPORT_MAINT_COMPTAG_SET: u32 = 1074031874;
++pub const AUTOFS_DEV_IOCTL_VERSION: u32 = 3222836081;
++pub const WDIOC_SETOPTIONS: u32 = 2147768068;
++pub const VHOST_SCSI_SET_ENDPOINT: u32 = 1088991040;
++pub const MGSL_IOCGTXIDLE: u32 = 27907;
++pub const ATM_ADDLECSADDR: u32 = 1074815374;
++pub const FSL_HV_IOCTL_GETPROP: u32 = 3223891719;
++pub const FDGETPRM: u32 = 2149581316;
++pub const HIDIOCAPPLICATION: u32 = 18434;
++pub const ENI_MEMDUMP: u32 = 1074815328;
++pub const PTP_SYS_OFFSET2: u32 = 1128283406;
++pub const VIDIOC_SUBDEV_G_DV_TIMINGS: u32 = 3229898328;
++pub const DMA_BUF_SET_NAME_A: u32 = 1074029057;
++pub const PTP_PIN_GETFUNC: u32 = 3227532550;
++pub const PTP_SYS_OFFSET_EXTENDED: u32 = 3300932873;
++pub const DFL_FPGA_PORT_UINT_SET_IRQ: u32 = 1074312776;
++pub const RTC_EPOCH_READ: u32 = 2148036621;
++pub const VIDIOC_SUBDEV_S_SELECTION: u32 = 3225441854;
++pub const VIDIOC_QUERY_EXT_CTRL: u32 = 3236451943;
++pub const ATM_GETLECSADDR: u32 = 1074815376;
++pub const FSL_HV_IOCTL_PARTITION_STOP: u32 = 3221794564;
++pub const SONET_GETDIAG: u32 = 2147770644;
++pub const ATMMPC_DATA: u32 = 25049;
++pub const IPMICTL_UNREGISTER_FOR_CMD_CHANS: u32 = 2148296989;
++pub const HIDIOCGCOLLECTIONINDEX: u32 = 1075333136;
++pub const RPMSG_CREATE_EPT_IOCTL: u32 = 1076409601;
++pub const GPIOHANDLE_GET_LINE_VALUES_IOCTL: u32 = 3225465864;
++pub const UI_DEV_SETUP: u32 = 1079792899;
++pub const ISST_IF_IO_CMD: u32 = 1074331138;
++pub const RIO_MPORT_MAINT_READ_REMOTE: u32 = 2149084423;
++pub const VIDIOC_OMAP3ISP_HIST_CFG: u32 = 3224393412;
++pub const BLKGETNRZONES: u32 = 2147750533;
++pub const VIDIOC_G_MODULATOR: u32 = 3225703990;
++pub const VBG_IOCTL_WRITE_CORE_DUMP: u32 = 3223082515;
++pub const USBDEVFS_SETINTERFACE: u32 = 2148029700;
++pub const PPPIOCGCHAN: u32 = 2147775543;
++pub const EVIOCGVERSION: u32 = 2147763457;
++pub const VHOST_NET_SET_BACKEND: u32 = 1074310960;
++pub const USBDEVFS_REAPURBNDELAY: u32 = 1074287885;
++pub const RNDZAPENTCNT: u32 = 20996;
++pub const VIDIOC_G_PARM: u32 = 3234616853;
++pub const TUNGETDEVNETNS: u32 = 21731;
++pub const LIRC_SET_MEASURE_CARRIER_MODE: u32 = 1074030877;
++pub const VHOST_SET_VRING_ERR: u32 = 1074310946;
++pub const VDUSE_VQ_SETUP: u32 = 1075872020;
++pub const AUTOFS_IOC_SETTIMEOUT: u32 = 3221787492;
++pub const VIDIOC_S_FREQUENCY: u32 = 1076647481;
++pub const F2FS_IOC_SEC_TRIM_FILE: u32 = 1075377428;
++pub const FS_IOC_REMOVE_ENCRYPTION_KEY: u32 = 3225445912;
++pub const WDIOC_GETPRETIMEOUT: u32 = 2147768073;
++pub const USBDEVFS_DROP_PRIVILEGES: u32 = 1074025758;
++pub const BTRFS_IOC_SNAP_CREATE_V2: u32 = 1342215191;
++pub const VHOST_VSOCK_SET_RUNNING: u32 = 1074048865;
++pub const STP_SET_OPTIONS: u32 = 1074275586;
++pub const FBIO_RADEON_GET_MIRROR: u32 = 2148024323;
++pub const IVTVFB_IOC_DMA_FRAME: u32 = 1075336896;
++pub const IPMICTL_SEND_COMMAND: u32 = 2150131981;
++pub const VIDIOC_G_ENC_INDEX: u32 = 2283296332;
++pub const DFL_FPGA_FME_PORT_PR: u32 = 46720;
++pub const CHIOSVOLTAG: u32 = 1076912914;
++pub const ATM_SETESIF: u32 = 1074815373;
++pub const FW_CDEV_IOC_SEND_RESPONSE: u32 = 1075323652;
++pub const PMU_IOC_GET_MODEL: u32 = 2148024835;
++pub const JSIOCGBTNMAP: u32 = 2214619700;
++pub const USBDEVFS_HUB_PORTINFO: u32 = 2155894035;
++pub const VBG_IOCTL_INTERRUPT_ALL_WAIT_FOR_EVENTS: u32 = 3222820363;
++pub const FDCLRPRM: u32 = 577;
++pub const BTRFS_IOC_SCRUB: u32 = 3288372251;
++pub const USBDEVFS_DISCONNECT: u32 = 21782;
++pub const TUNSETVNETBE: u32 = 1074025694;
++pub const ATMTCP_REMOVE: u32 = 24975;
++pub const VHOST_VDPA_GET_CONFIG: u32 = 2148052851;
++pub const PPPIOCGNPMODE: u32 = 3221779532;
++pub const FDGETDRVPRM: u32 = 2155872785;
++pub const TUNSETVNETLE: u32 = 1074025692;
++pub const PHN_SETREG: u32 = 1074294790;
++pub const PPPIOCDETACH: u32 = 1074033724;
++pub const MMTIMER_GETRES: u32 = 2148035841;
++pub const VIDIOC_SUBDEV_ENUMSTD: u32 = 3225966105;
++pub const PPGETFLAGS: u32 = 2147774618;
++pub const VDUSE_DEV_GET_FEATURES: u32 = 2148040977;
++pub const CAPI_MANUFACTURER_CMD: u32 = 3222291232;
++pub const VIDIOC_G_TUNER: u32 = 3226752541;
++pub const DM_TABLE_STATUS: u32 = 3241737484;
++pub const DM_DEV_ARM_POLL: u32 = 3241737488;
++pub const NE_CREATE_VM: u32 = 2148052512;
++pub const MEDIA_IOC_ENUM_LINKS: u32 = 3223878658;
++pub const F2FS_IOC_PRECACHE_EXTENTS: u32 = 62735;
++pub const DFL_FPGA_PORT_DMA_MAP: u32 = 46659;
++pub const MGSL_IOCGXCTRL: u32 = 27926;
++pub const FW_CDEV_IOC_SEND_REQUEST: u32 = 1076372225;
++pub const SONYPI_IOCGBLUE: u32 = 2147579400;
++pub const F2FS_IOC_DECOMPRESS_FILE: u32 = 62743;
++pub const I2OHTML: u32 = 3224398089;
++pub const VFIO_GET_API_VERSION: u32 = 15204;
++pub const IDT77105_GETSTATZ: u32 = 1074815283;
++pub const I2OPARMSET: u32 = 3223873795;
++pub const TEE_IOC_CANCEL: u32 = 2148049924;
++pub const PTP_SYS_OFFSET_PRECISE2: u32 = 3225435409;
++pub const DFL_FPGA_PORT_RESET: u32 = 46656;
++pub const PPPIOCGASYNCMAP: u32 = 2147775576;
++pub const EVIOCGKEYCODE_V2: u32 = 2150122756;
++pub const DM_DEV_SET_GEOMETRY: u32 = 3241737487;
++pub const HIDIOCSUSAGE: u32 = 1075333132;
++pub const FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE: u32 = 1075323664;
++pub const PTP_EXTTS_REQUEST: u32 = 1074806018;
++pub const SWITCHTEC_IOCTL_EVENT_CTL: u32 = 3223869251;
++pub const WDIOC_SETPRETIMEOUT: u32 = 3221509896;
++pub const VHOST_SCSI_CLEAR_ENDPOINT: u32 = 1088991041;
++pub const JSIOCGAXES: u32 = 2147576337;
++pub const HIDIOCSFLAG: u32 = 1074022415;
++pub const PTP_PEROUT_REQUEST2: u32 = 1077427468;
++pub const PPWDATA: u32 = 1073836166;
++pub const PTP_CLOCK_GETCAPS: u32 = 2152742145;
++pub const FDGETMAXERRS: u32 = 2148794894;
++pub const TUNSETQUEUE: u32 = 1074025689;
++pub const PTP_ENABLE_PPS: u32 = 1074019588;
++pub const SIOCSIFATMTCP: u32 = 24960;
++pub const CEC_ADAP_G_LOG_ADDRS: u32 = 2153537795;
++pub const ND_IOCTL_ARS_CAP: u32 = 3223342593;
++pub const NBD_SET_BLKSIZE: u32 = 43777;
++pub const NBD_SET_TIMEOUT: u32 = 43785;
++pub const VHOST_SCSI_GET_ABI_VERSION: u32 = 1074048834;
++pub const RIO_UNMAP_INBOUND: u32 = 1074294034;
++pub const ATM_QUERYLOOP: u32 = 1074815316;
++pub const DFL_FPGA_GET_API_VERSION: u32 = 46592;
++pub const USBDEVFS_WAIT_FOR_RESUME: u32 = 21795;
++pub const FBIO_CURSOR: u32 = 3228059144;
++pub const RNDCLEARPOOL: u32 = 20998;
++pub const VIDIOC_QUERYSTD: u32 = 2148030015;
++pub const DMA_BUF_IOCTL_SYNC: u32 = 1074291200;
++pub const SCIF_RECV: u32 = 3222827783;
++pub const PTP_PIN_GETFUNC2: u32 = 3227532559;
++pub const FW_CDEV_IOC_ALLOCATE: u32 = 3223331586;
++pub const CEC_ADAP_G_CAPS: u32 = 3226231040;
++pub const VIDIOC_G_FBUF: u32 = 2150651402;
++pub const PTP_ENABLE_PPS2: u32 = 1074019597;
++pub const PCITEST_CLEAR_IRQ: u32 = 20496;
++pub const IPMICTL_SET_GETS_EVENTS_CMD: u32 = 2147772688;
++pub const BTRFS_IOC_DEVICES_READY: u32 = 2415957031;
++pub const JSIOCGAXMAP: u32 = 2151705138;
++pub const FW_CDEV_IOC_GET_CYCLE_TIMER: u32 = 2148541196;
++pub const FW_CDEV_IOC_SET_ISO_CHANNELS: u32 = 1074799383;
++pub const RTC_WIE_OFF: u32 = 28688;
++pub const PPGETMODE: u32 = 2147774616;
++pub const VIDIOC_DBG_G_REGISTER: u32 = 3224917584;
++pub const PTP_SYS_OFFSET: u32 = 1128283397;
++pub const BTRFS_IOC_SPACE_INFO: u32 = 3222311956;
++pub const VIDIOC_SUBDEV_ENUM_FRAME_SIZE: u32 = 3225441866;
++pub const ND_IOCTL_VENDOR: u32 = 3221769737;
++pub const SCIF_VREADFROM: u32 = 3223876364;
++pub const BTRFS_IOC_TRANS_START: u32 = 37894;
++pub const INOTIFY_IOC_SETNEXTWD: u32 = 1074022656;
++pub const SNAPSHOT_GET_IMAGE_SIZE: u32 = 2148021006;
++pub const TUNDETACHFILTER: u32 = 1074812118;
++pub const ND_IOCTL_CLEAR_ERROR: u32 = 3223342596;
++pub const IOC_PR_CLEAR: u32 = 1074819277;
++pub const SCIF_READFROM: u32 = 3223876362;
++pub const PPPIOCGDEBUG: u32 = 2147775553;
++pub const BLKGETZONESZ: u32 = 2147750532;
++pub const HIDIOCGUSAGES: u32 = 3491514387;
++pub const SONYPI_IOCGTEMP: u32 = 2147579404;
++pub const UI_SET_MSCBIT: u32 = 1074025832;
++pub const APM_IOC_SUSPEND: u32 = 16642;
++pub const BTRFS_IOC_TREE_SEARCH: u32 = 3489698833;
++pub const RTC_PLL_GET: u32 = 2149609489;
++pub const RIO_CM_EP_GET_LIST: u32 = 3221512962;
++pub const USBDEVFS_DISCSIGNAL: u32 = 2148553998;
++pub const LIRC_GET_MIN_TIMEOUT: u32 = 2147772680;
++pub const SWITCHTEC_IOCTL_EVENT_SUMMARY_LEGACY: u32 = 2174244674;
++pub const DM_TARGET_MSG: u32 = 3241737486;
++pub const SONYPI_IOCGBAT1REM: u32 = 2147644931;
++pub const EVIOCSFF: u32 = 1076905344;
++pub const TUNSETGROUP: u32 = 1074025678;
++pub const EVIOCGKEYCODE: u32 = 2148025604;
++pub const KCOV_REMOTE_ENABLE: u32 = 1075340134;
++pub const ND_IOCTL_GET_CONFIG_SIZE: u32 = 3222031876;
++pub const FDEJECT: u32 = 602;
++pub const TUNSETOFFLOAD: u32 = 1074025680;
++pub const PPPIOCCONNECT: u32 = 1074033722;
++pub const ATM_ADDADDR: u32 = 1074815368;
++pub const VDUSE_DEV_INJECT_CONFIG_IRQ: u32 = 33043;
++pub const AUTOFS_DEV_IOCTL_ASKUMOUNT: u32 = 3222836093;
++pub const VHOST_VDPA_GET_STATUS: u32 = 2147594097;
++pub const CCISS_PASSTHRU: u32 = 3227009547;
++pub const MGSL_IOCCLRMODCOUNT: u32 = 27919;
++pub const TEE_IOC_SUPPL_SEND: u32 = 2148574215;
++pub const ATMARPD_CTRL: u32 = 25057;
++pub const UI_ABS_SETUP: u32 = 1075598596;
++pub const UI_DEV_DESTROY: u32 = 21762;
++pub const BTRFS_IOC_QUOTA_CTL: u32 = 3222311976;
++pub const RTC_AIE_ON: u32 = 28673;
++pub const AUTOFS_IOC_EXPIRE: u32 = 2165085029;
++pub const PPPIOCSDEBUG: u32 = 1074033728;
++pub const GPIO_V2_LINE_SET_VALUES_IOCTL: u32 = 3222320143;
++pub const PPPIOCSMRU: u32 = 1074033746;
++pub const CCISS_DEREGDISK: u32 = 16908;
++pub const UI_DEV_CREATE: u32 = 21761;
++pub const FUSE_DEV_IOC_CLONE: u32 = 2147804416;
++pub const BTRFS_IOC_START_SYNC: u32 = 2148045848;
++pub const NILFS_IOCTL_DELETE_CHECKPOINT: u32 = 1074294401;
++pub const SNAPSHOT_AVAIL_SWAP_SIZE: u32 = 2148021011;
++pub const DM_TABLE_CLEAR: u32 = 3241737482;
++pub const CCISS_GETINTINFO: u32 = 2148024834;
++pub const PPPIOCSASYNCMAP: u32 = 1074033751;
++pub const I2OEVTGET: u32 = 2154326283;
++pub const NVME_IOCTL_RESET: u32 = 20036;
++pub const PPYIELD: u32 = 28813;
++pub const NVME_IOCTL_IO64_CMD: u32 = 3226488392;
++pub const TUNSETCARRIER: u32 = 1074025698;
++pub const DM_DEV_WAIT: u32 = 3241737480;
++pub const RTC_WIE_ON: u32 = 28687;
++pub const MEDIA_IOC_DEVICE_INFO: u32 = 3238034432;
++pub const RIO_CM_CHAN_CREATE: u32 = 3221381891;
++pub const MGSL_IOCSPARAMS: u32 = 1076915456;
++pub const RTC_SET_TIME: u32 = 1076129802;
++pub const VHOST_RESET_OWNER: u32 = 44802;
++pub const IOC_OPAL_PSID_REVERT_TPR: u32 = 1091072232;
++pub const AUTOFS_DEV_IOCTL_OPENMOUNT: u32 = 3222836084;
++pub const UDF_GETEABLOCK: u32 = 2148035649;
++pub const VFIO_IOMMU_MAP_DMA: u32 = 15217;
++pub const VIDIOC_SUBSCRIBE_EVENT: u32 = 1075861082;
++pub const HIDIOCGFLAG: u32 = 2147764238;
++pub const HIDIOCGUCODE: u32 = 3222816781;
++pub const VIDIOC_OMAP3ISP_AF_CFG: u32 = 3226228421;
++pub const DM_REMOVE_ALL: u32 = 3241737473;
++pub const ASPEED_LPC_CTRL_IOCTL_MAP: u32 = 1074835969;
++pub const CCISS_GETFIRMVER: u32 = 2147762696;
++pub const ND_IOCTL_ARS_START: u32 = 3223342594;
++pub const PPPIOCSMRRU: u32 = 1074033723;
++pub const CEC_ADAP_S_LOG_ADDRS: u32 = 3227279620;
++pub const RPROC_GET_SHUTDOWN_ON_RELEASE: u32 = 2147792642;
++pub const DMA_HEAP_IOCTL_ALLOC: u32 = 3222816768;
++pub const PPSETTIME: u32 = 1074819222;
++pub const RTC_ALM_READ: u32 = 2149871624;
++pub const VDUSE_SET_API_VERSION: u32 = 1074299137;
++pub const RIO_MPORT_MAINT_WRITE_REMOTE: u32 = 1075342600;
++pub const VIDIOC_SUBDEV_S_CROP: u32 = 3224917564;
++pub const USBDEVFS_CONNECT: u32 = 21783;
++pub const SYNC_IOC_FILE_INFO: u32 = 3224911364;
++pub const ATMARP_MKIP: u32 = 25058;
++pub const VFIO_IOMMU_SPAPR_TCE_GET_INFO: u32 = 15216;
++pub const CCISS_GETHEARTBEAT: u32 = 2147762694;
++pub const ATM_RSTADDR: u32 = 1074815367;
++pub const NBD_SET_SIZE: u32 = 43778;
++pub const UDF_GETVOLIDENT: u32 = 2148035650;
++pub const GPIO_V2_LINE_GET_VALUES_IOCTL: u32 = 3222320142;
++pub const MGSL_IOCSTXIDLE: u32 = 27906;
++pub const FSL_HV_IOCTL_SETPROP: u32 = 3223891720;
++pub const BTRFS_IOC_GET_DEV_STATS: u32 = 3288896564;
++pub const PPRSTATUS: u32 = 2147577985;
++pub const MGSL_IOCTXENABLE: u32 = 27908;
++pub const UDF_GETEASIZE: u32 = 2147773504;
++pub const NVME_IOCTL_ADMIN64_CMD: u32 = 3226488391;
++pub const VHOST_SET_OWNER: u32 = 44801;
++pub const RIO_ALLOC_DMA: u32 = 3222826259;
++pub const RIO_CM_CHAN_ACCEPT: u32 = 3221775111;
++pub const I2OHRTGET: u32 = 3222825217;
++pub const ATM_SETCIRANGE: u32 = 1074815371;
++pub const HPET_IE_ON: u32 = 26625;
++pub const PERF_EVENT_IOC_ID: u32 = 2148017159;
++pub const TUNSETSNDBUF: u32 = 1074025684;
++pub const PTP_PIN_SETFUNC: u32 = 1080048903;
++pub const PPPIOCDISCONN: u32 = 29753;
++pub const VIDIOC_QUERYCTRL: u32 = 3225703972;
++pub const PPEXCL: u32 = 28815;
++pub const PCITEST_MSI: u32 = 1074024451;
++pub const FDWERRORCLR: u32 = 598;
++pub const AUTOFS_IOC_FAIL: u32 = 37729;
++pub const USBDEVFS_IOCTL: u32 = 3222295826;
++pub const VIDIOC_S_STD: u32 = 1074288152;
++pub const F2FS_IOC_RESIZE_FS: u32 = 1074328848;
++pub const SONET_SETDIAG: u32 = 3221512466;
++pub const BTRFS_IOC_DEFRAG: u32 = 1342215170;
++pub const CCISS_GETDRIVVER: u32 = 2147762697;
++pub const IPMICTL_GET_TIMING_PARMS_CMD: u32 = 2148034839;
++pub const HPET_IRQFREQ: u32 = 1074292742;
++pub const ATM_GETESI: u32 = 1074815365;
++pub const CCISS_GETLUNINFO: u32 = 2148286993;
++pub const AUTOFS_DEV_IOCTL_ISMOUNTPOINT: u32 = 3222836094;
++pub const TEE_IOC_SHM_ALLOC: u32 = 3222316033;
++pub const PERF_EVENT_IOC_SET_BPF: u32 = 1074013192;
++pub const UDMABUF_CREATE_LIST: u32 = 1074296131;
++pub const VHOST_SET_LOG_BASE: u32 = 1074310916;
++pub const ZATM_GETPOOL: u32 = 1074815329;
++pub const BR2684_SETFILT: u32 = 1075601808;
++pub const RNDGETPOOL: u32 = 2148028930;
++pub const PPS_GETPARAMS: u32 = 2148036769;
++pub const IOC_PR_RESERVE: u32 = 1074819273;
++pub const VIDIOC_TRY_DECODER_CMD: u32 = 3225966177;
++pub const RIO_CM_CHAN_CLOSE: u32 = 1073898244;
++pub const VIDIOC_DV_TIMINGS_CAP: u32 = 3230684772;
++pub const IOCTL_MEI_CONNECT_CLIENT_VTAG: u32 = 3222554628;
++pub const PMU_IOC_GET_BACKLIGHT: u32 = 2148024833;
++pub const USBDEVFS_GET_CAPABILITIES: u32 = 2147767578;
++pub const SCIF_WRITETO: u32 = 3223876363;
++pub const UDF_RELOCATE_BLOCKS: u32 = 3221777475;
++pub const FSL_HV_IOCTL_PARTITION_RESTART: u32 = 3221794561;
++pub const CCISS_REGNEWD: u32 = 16910;
++pub const FAT_IOCTL_SET_ATTRIBUTES: u32 = 1074033169;
++pub const VIDIOC_CREATE_BUFS: u32 = 3238024796;
++pub const CAPI_GET_VERSION: u32 = 3222291207;
++pub const SWITCHTEC_IOCTL_EVENT_SUMMARY: u32 = 2228770626;
++pub const VFIO_EEH_PE_OP: u32 = 15225;
++pub const FW_CDEV_IOC_CREATE_ISO_CONTEXT: u32 = 3223331592;
++pub const F2FS_IOC_RELEASE_COMPRESS_BLOCKS: u32 = 2148070674;
++pub const NBD_SET_SIZE_BLOCKS: u32 = 43783;
++pub const IPMI_BMC_IOCTL_SET_SMS_ATN: u32 = 45312;
++pub const ASPEED_P2A_CTRL_IOCTL_GET_MEMORY_CONFIG: u32 = 3222319873;
++pub const VIDIOC_S_AUDOUT: u32 = 1077171762;
++pub const VIDIOC_S_FMT: u32 = 3234878981;
++pub const PPPIOCATTACH: u32 = 1074033725;
++pub const VHOST_GET_VRING_BUSYLOOP_TIMEOUT: u32 = 1074310948;
++pub const FS_IOC_MEASURE_VERITY: u32 = 3221513862;
++pub const CCISS_BIG_PASSTHRU: u32 = 3227533842;
++pub const IPMICTL_SET_MY_LUN_CMD: u32 = 2147772691;
++pub const PCITEST_LEGACY_IRQ: u32 = 20482;
++pub const USBDEVFS_SUBMITURB: u32 = 2151175434;
++pub const AUTOFS_IOC_READY: u32 = 37728;
++pub const BTRFS_IOC_SEND: u32 = 1078498342;
++pub const VIDIOC_G_EXT_CTRLS: u32 = 3223344711;
++pub const JSIOCSBTNMAP: u32 = 1140877875;
++pub const PPPIOCSFLAGS: u32 = 1074033753;
++pub const NVRAM_INIT: u32 = 28736;
++pub const RFKILL_IOCTL_NOINPUT: u32 = 20993;
++pub const BTRFS_IOC_BALANCE: u32 = 1342215180;
++pub const FS_IOC_GETFSMAP: u32 = 3233830971;
++pub const IPMICTL_GET_MY_CHANNEL_LUN_CMD: u32 = 2147772699;
++pub const STP_POLICY_ID_GET: u32 = 2148541697;
++pub const PPSETFLAGS: u32 = 1074032795;
++pub const CEC_ADAP_S_PHYS_ADDR: u32 = 1073897730;
++pub const ATMTCP_CREATE: u32 = 24974;
++pub const IPMI_BMC_IOCTL_FORCE_ABORT: u32 = 45314;
++pub const PPPIOCGXASYNCMAP: u32 = 2149610576;
++pub const VHOST_SET_VRING_CALL: u32 = 1074310945;
++pub const LIRC_GET_FEATURES: u32 = 2147772672;
++pub const GSMIOC_DISABLE_NET: u32 = 18179;
++pub const AUTOFS_IOC_CATATONIC: u32 = 37730;
++pub const NBD_DO_IT: u32 = 43779;
++pub const LIRC_SET_REC_CARRIER_RANGE: u32 = 1074030879;
++pub const IPMICTL_GET_MY_CHANNEL_ADDRESS_CMD: u32 = 2147772697;
++pub const EVIOCSCLOCKID: u32 = 1074021792;
++pub const USBDEVFS_FREE_STREAMS: u32 = 2148029725;
++pub const FSI_SCOM_RESET: u32 = 1074033411;
++pub const PMU_IOC_GRAB_BACKLIGHT: u32 = 2148024838;
++pub const VIDIOC_SUBDEV_S_FMT: u32 = 3227014661;
++pub const FDDEFPRM: u32 = 1075839555;
++pub const TEE_IOC_INVOKE: u32 = 2148574211;
++pub const USBDEVFS_BULK: u32 = 3222820098;
++pub const SCIF_VWRITETO: u32 = 3223876365;
++pub const SONYPI_IOCSBRT: u32 = 1073837568;
++pub const BTRFS_IOC_FILE_EXTENT_SAME: u32 = 3222836278;
++pub const RTC_PIE_ON: u32 = 28677;
++pub const BTRFS_IOC_SCAN_DEV: u32 = 1342215172;
++pub const PPPIOCXFERUNIT: u32 = 29774;
++pub const WDIOC_GETTIMEOUT: u32 = 2147768071;
++pub const BTRFS_IOC_SET_RECEIVED_SUBVOL: u32 = 3234370597;
++pub const DFL_FPGA_PORT_ERR_SET_IRQ: u32 = 1074312774;
++pub const FBIO_WAITFORVSYNC: u32 = 1074021920;
++pub const RTC_PIE_OFF: u32 = 28678;
++pub const EVIOCGRAB: u32 = 1074021776;
++pub const PMU_IOC_SET_BACKLIGHT: u32 = 1074283010;
++pub const EVIOCGREP: u32 = 2148025603;
++pub const PERF_EVENT_IOC_MODIFY_ATTRIBUTES: u32 = 1074275339;
++pub const UFFDIO_CONTINUE: u32 = 3223366151;
++pub const VDUSE_GET_API_VERSION: u32 = 2148040960;
++pub const RTC_RD_TIME: u32 = 2149871625;
++pub const FDMSGOFF: u32 = 582;
++pub const IPMICTL_REGISTER_FOR_CMD_CHANS: u32 = 2148296988;
++pub const CAPI_GET_ERRCODE: u32 = 2147631905;
++pub const PCITEST_SET_IRQTYPE: u32 = 1074024456;
++pub const VIDIOC_SUBDEV_S_EDID: u32 = 3223868969;
++pub const MATROXFB_SET_OUTPUT_MODE: u32 = 1074294522;
++pub const RIO_DEV_ADD: u32 = 1075866903;
++pub const VIDIOC_ENUM_FREQ_BANDS: u32 = 3225441893;
++pub const FBIO_RADEON_SET_MIRROR: u32 = 1074282500;
++pub const PCITEST_GET_IRQTYPE: u32 = 20489;
++pub const JSIOCGVERSION: u32 = 2147772929;
++pub const SONYPI_IOCSBLUE: u32 = 1073837577;
++pub const SNAPSHOT_PREF_IMAGE_SIZE: u32 = 13074;
++pub const F2FS_IOC_GET_FEATURES: u32 = 2147808524;
++pub const SCIF_REG: u32 = 3223876360;
++pub const NILFS_IOCTL_CLEAN_SEGMENTS: u32 = 1081634440;
++pub const FW_CDEV_IOC_INITIATE_BUS_RESET: u32 = 1074012933;
++pub const RIO_WAIT_FOR_ASYNC: u32 = 1074294038;
++pub const VHOST_SET_VRING_NUM: u32 = 1074310928;
++pub const AUTOFS_DEV_IOCTL_PROTOVER: u32 = 3222836082;
++pub const RIO_FREE_DMA: u32 = 1074294036;
++pub const MGSL_IOCRXENABLE: u32 = 27909;
++pub const IOCTL_VM_SOCKETS_GET_LOCAL_CID: u32 = 1977;
++pub const IPMICTL_SET_TIMING_PARMS_CMD: u32 = 2148034838;
++pub const PPPIOCGL2TPSTATS: u32 = 2152231990;
++pub const PERF_EVENT_IOC_PERIOD: u32 = 1074275332;
++pub const PTP_PIN_SETFUNC2: u32 = 1080048912;
++pub const CHIOEXCHANGE: u32 = 1075602178;
++pub const NILFS_IOCTL_GET_SUINFO: u32 = 2149084804;
++pub const CEC_DQEVENT: u32 = 3226493191;
++pub const UI_SET_SWBIT: u32 = 1074025837;
++pub const VHOST_VDPA_SET_CONFIG: u32 = 1074311028;
++pub const TUNSETIFF: u32 = 1074025674;
++pub const CHIOPOSITION: u32 = 1074553603;
++pub const IPMICTL_SET_MAINTENANCE_MODE_CMD: u32 = 1074030879;
++pub const BTRFS_IOC_DEFAULT_SUBVOL: u32 = 1074304019;
++pub const RIO_UNMAP_OUTBOUND: u32 = 1076391184;
++pub const CAPI_CLR_FLAGS: u32 = 2147762981;
++pub const FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE: u32 = 1075323663;
++pub const MATROXFB_GET_OUTPUT_CONNECTION: u32 = 2148036344;
++pub const EVIOCSMASK: u32 = 1074808211;
++pub const BTRFS_IOC_FORGET_DEV: u32 = 1342215173;
++pub const CXL_MEM_QUERY_COMMANDS: u32 = 2148060673;
++pub const CEC_S_MODE: u32 = 1074028809;
++pub const MGSL_IOCSIF: u32 = 27914;
++pub const SWITCHTEC_IOCTL_PFF_TO_PORT: u32 = 3222034244;
++pub const PPSETMODE: u32 = 1074032768;
++pub const VFIO_DEVICE_SET_IRQS: u32 = 15214;
++pub const VIDIOC_PREPARE_BUF: u32 = 3227014749;
++pub const CEC_ADAP_G_CONNECTOR_INFO: u32 = 2151964938;
++pub const IOC_OPAL_WRITE_SHADOW_MBR: u32 = 1092645098;
++pub const VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL: u32 = 3225441867;
++pub const UDMABUF_CREATE: u32 = 1075344706;
++pub const SONET_CLRDIAG: u32 = 3221512467;
++pub const PHN_SET_REG: u32 = 1074294785;
++pub const RNDADDTOENTCNT: u32 = 1074024961;
++pub const VBG_IOCTL_CHECK_BALLOON: u32 = 3223344657;
++pub const VIDIOC_OMAP3ISP_STAT_REQ: u32 = 3223869126;
++pub const PPS_FETCH: u32 = 3221778596;
++pub const RTC_AIE_OFF: u32 = 28674;
++pub const VFIO_GROUP_SET_CONTAINER: u32 = 15208;
++pub const FW_CDEV_IOC_RECEIVE_PHY_PACKETS: u32 = 1074275094;
++pub const VFIO_IOMMU_SPAPR_TCE_REMOVE: u32 = 15224;
++pub const VFIO_IOMMU_GET_INFO: u32 = 15216;
++pub const DM_DEV_SUSPEND: u32 = 3241737478;
++pub const F2FS_IOC_GET_COMPRESS_OPTION: u32 = 2147677461;
++pub const FW_CDEV_IOC_STOP_ISO: u32 = 1074012939;
++pub const GPIO_V2_GET_LINEINFO_IOCTL: u32 = 3238048773;
++pub const ATMMPC_CTRL: u32 = 25048;
++pub const PPPIOCSXASYNCMAP: u32 = 1075868751;
++pub const CHIOGSTATUS: u32 = 1074815752;
++pub const FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE: u32 = 3222807309;
++pub const RIO_MPORT_MAINT_PORT_IDX_GET: u32 = 2147773699;
++pub const CAPI_SET_FLAGS: u32 = 2147762980;
++pub const VFIO_GROUP_GET_DEVICE_FD: u32 = 15210;
++pub const VHOST_SET_MEM_TABLE: u32 = 1074310915;
++pub const MATROXFB_SET_OUTPUT_CONNECTION: u32 = 1074294520;
++pub const DFL_FPGA_PORT_GET_REGION_INFO: u32 = 46658;
++pub const VHOST_GET_FEATURES: u32 = 2148052736;
++pub const LIRC_GET_REC_RESOLUTION: u32 = 2147772679;
++pub const PACKET_CTRL_CMD: u32 = 3222820865;
++pub const LIRC_SET_TRANSMITTER_MASK: u32 = 1074030871;
++pub const BTRFS_IOC_ADD_DEV: u32 = 1342215178;
++pub const JSIOCGCORR: u32 = 2149870114;
++pub const VIDIOC_G_FMT: u32 = 3234878980;
++pub const RTC_EPOCH_SET: u32 = 1074294798;
++pub const CAPI_GET_PROFILE: u32 = 3225436937;
++pub const ATM_GETLOOP: u32 = 1074815314;
++pub const SCIF_LISTEN: u32 = 1074033410;
++pub const NBD_CLEAR_QUE: u32 = 43781;
++pub const F2FS_IOC_MOVE_RANGE: u32 = 3223385353;
++pub const LIRC_GET_LENGTH: u32 = 2147772687;
++pub const I8K_SET_FAN: u32 = 3221776775;
++pub const FDSETMAXERRS: u32 = 1075053132;
++pub const VIDIOC_SUBDEV_QUERYCAP: u32 = 2151699968;
++pub const SNAPSHOT_SET_SWAP_AREA: u32 = 1074541325;
++pub const LIRC_GET_REC_TIMEOUT: u32 = 2147772708;
++pub const EVIOCRMFF: u32 = 1074021761;
++pub const GPIO_GET_LINEEVENT_IOCTL: u32 = 3224417284;
++pub const PPRDATA: u32 = 2147577989;
++pub const RIO_MPORT_GET_PROPERTIES: u32 = 2150657284;
++pub const TUNSETVNETHDRSZ: u32 = 1074025688;
++pub const GPIO_GET_LINEINFO_IOCTL: u32 = 3225990146;
++pub const GSMIOC_GETCONF: u32 = 2152482560;
++pub const LIRC_GET_SEND_MODE: u32 = 2147772673;
++pub const PPPIOCSACTIVE: u32 = 1074820166;
++pub const SIOCGSTAMPNS_NEW: u32 = 2148567303;
++pub const IPMICTL_RECEIVE_MSG: u32 = 3224398092;
++pub const LIRC_SET_SEND_DUTY_CYCLE: u32 = 1074030869;
++pub const UI_END_FF_ERASE: u32 = 1074550219;
++pub const SWITCHTEC_IOCTL_FLASH_PART_INFO: u32 = 3222296385;
++pub const FW_CDEV_IOC_SEND_PHY_PACKET: u32 = 3222807317;
++pub const NBD_SET_FLAGS: u32 = 43786;
++pub const VFIO_DEVICE_GET_REGION_INFO: u32 = 15212;
++pub const REISERFS_IOC_UNPACK: u32 = 1074318593;
++pub const FW_CDEV_IOC_REMOVE_DESCRIPTOR: u32 = 1074012935;
++pub const RIO_SET_EVENT_MASK: u32 = 1074031885;
++pub const SNAPSHOT_ALLOC_SWAP_PAGE: u32 = 2148021012;
++pub const VDUSE_VQ_INJECT_IRQ: u32 = 1074037015;
++pub const I2OPASSTHRU: u32 = 2148559116;
++pub const IOC_OPAL_SET_PW: u32 = 1109422304;
++pub const FSI_SCOM_READ: u32 = 3223352065;
++pub const VHOST_VDPA_GET_DEVICE_ID: u32 = 2147790704;
++pub const VIDIOC_QBUF: u32 = 3227014671;
++pub const VIDIOC_S_TUNER: u32 = 1079268894;
++pub const TUNGETVNETHDRSZ: u32 = 2147767511;
++pub const CAPI_NCCI_GETUNIT: u32 = 2147762983;
++pub const DFL_FPGA_PORT_UINT_GET_IRQ_NUM: u32 = 2147792455;
++pub const VIDIOC_OMAP3ISP_STAT_EN: u32 = 3221771975;
++pub const GPIO_V2_LINE_SET_CONFIG_IOCTL: u32 = 3239097357;
++pub const TEE_IOC_VERSION: u32 = 2148312064;
++pub const VIDIOC_LOG_STATUS: u32 = 22086;
++pub const IPMICTL_SEND_COMMAND_SETTIME: u32 = 2150656277;
++pub const VHOST_SET_LOG_FD: u32 = 1074048775;
++pub const SCIF_SEND: u32 = 3222827782;
++pub const VIDIOC_SUBDEV_G_FMT: u32 = 3227014660;
++pub const NS_ADJBUFLEV: u32 = 24931;
++pub const VIDIOC_DBG_S_REGISTER: u32 = 1077433935;
++pub const NILFS_IOCTL_RESIZE: u32 = 1074294411;
++pub const PHN_GETREG: u32 = 3221778437;
++pub const I2OSWDL: u32 = 3224398085;
++pub const VBG_IOCTL_VMMDEV_REQUEST_BIG: u32 = 22019;
++pub const JSIOCGBUTTONS: u32 = 2147576338;
++pub const VFIO_IOMMU_ENABLE: u32 = 15219;
++pub const DM_DEV_RENAME: u32 = 3241737477;
++pub const MEDIA_IOC_SETUP_LINK: u32 = 3224665091;
++pub const VIDIOC_ENUMOUTPUT: u32 = 3225966128;
++pub const STP_POLICY_ID_SET: u32 = 3222283520;
++pub const VHOST_VDPA_SET_CONFIG_CALL: u32 = 1074048887;
++pub const VIDIOC_SUBDEV_G_CROP: u32 = 3224917563;
++pub const VIDIOC_S_CROP: u32 = 1075074620;
++pub const WDIOC_GETTEMP: u32 = 2147768067;
++pub const IOC_OPAL_ADD_USR_TO_LR: u32 = 1092120804;
++pub const UI_SET_LEDBIT: u32 = 1074025833;
++pub const NBD_SET_SOCK: u32 = 43776;
++pub const BTRFS_IOC_SNAP_DESTROY_V2: u32 = 1342215231;
++pub const HIDIOCGCOLLECTIONINFO: u32 = 3222292497;
++pub const I2OSWUL: u32 = 3224398086;
++pub const IOCTL_MEI_NOTIFY_GET: u32 = 2147764227;
++pub const FDFMTTRK: u32 = 1074528840;
++pub const MMTIMER_GETBITS: u32 = 27908;
++pub const VIDIOC_ENUMSTD: u32 = 3225966105;
++pub const VHOST_GET_VRING_BASE: u32 = 3221794578;
++pub const VFIO_DEVICE_IOEVENTFD: u32 = 15220;
++pub const ATMARP_SETENTRY: u32 = 25059;
++pub const CCISS_REVALIDVOLS: u32 = 16906;
++pub const MGSL_IOCLOOPTXDONE: u32 = 27913;
++pub const RTC_VL_READ: u32 = 2147774483;
++pub const ND_IOCTL_ARS_STATUS: u32 = 3224391171;
++pub const RIO_DEV_DEL: u32 = 1075866904;
++pub const VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES: u32 = 3223606797;
++pub const VIDIOC_SUBDEV_DV_TIMINGS_CAP: u32 = 3230684772;
++pub const SONYPI_IOCSFAN: u32 = 1073837579;
++pub const SPIOCSTYPE: u32 = 1074295041;
++pub const IPMICTL_REGISTER_FOR_CMD: u32 = 2147641614;
++pub const I8K_GET_FAN: u32 = 3221776774;
++pub const TUNGETVNETBE: u32 = 2147767519;
++pub const AUTOFS_DEV_IOCTL_FAIL: u32 = 3222836087;
++pub const UI_END_FF_UPLOAD: u32 = 1080579529;
++pub const TOSH_SMM: u32 = 3222828176;
++pub const SONYPI_IOCGBAT2REM: u32 = 2147644933;
++pub const F2FS_IOC_GET_COMPRESS_BLOCKS: u32 = 2148070673;
++pub const PPPIOCSNPMODE: u32 = 1074295883;
++pub const USBDEVFS_CONTROL: u32 = 3222820096;
++pub const HIDIOCGUSAGE: u32 = 3222816779;
++pub const TUNSETTXFILTER: u32 = 1074025681;
++pub const TUNGETVNETLE: u32 = 2147767517;
++pub const VIDIOC_ENUM_DV_TIMINGS: u32 = 3230946914;
++pub const BTRFS_IOC_INO_PATHS: u32 = 3224933411;
++pub const MGSL_IOCGXSYNC: u32 = 27924;
++pub const HIDIOCGFIELDINFO: u32 = 3224913930;
++pub const VIDIOC_SUBDEV_G_STD: u32 = 2148029975;
++pub const I2OVALIDATE: u32 = 2147772680;
++pub const VIDIOC_TRY_ENCODER_CMD: u32 = 3223869006;
++pub const NILFS_IOCTL_GET_CPINFO: u32 = 2149084802;
++pub const VIDIOC_G_FREQUENCY: u32 = 3224131128;
++pub const VFAT_IOCTL_READDIR_SHORT: u32 = 2184212994;
++pub const ND_IOCTL_GET_CONFIG_DATA: u32 = 3222031877;
++pub const F2FS_IOC_RESERVE_COMPRESS_BLOCKS: u32 = 2148070675;
++pub const FDGETDRVSTAT: u32 = 2152727058;
++pub const SYNC_IOC_MERGE: u32 = 3224387075;
++pub const VIDIOC_S_DV_TIMINGS: u32 = 3229898327;
++pub const PPPIOCBRIDGECHAN: u32 = 1074033717;
++pub const LIRC_SET_SEND_MODE: u32 = 1074030865;
++pub const RIO_ENABLE_PORTWRITE_RANGE: u32 = 1074818315;
++pub const ATM_GETTYPE: u32 = 1074815364;
++pub const PHN_GETREGS: u32 = 3223875591;
++pub const FDSETEMSGTRESH: u32 = 586;
++pub const NILFS_IOCTL_GET_VINFO: u32 = 3222826630;
++pub const MGSL_IOCWAITEVENT: u32 = 3221515528;
++pub const CAPI_INSTALLED: u32 = 2147631906;
++pub const EVIOCGMASK: u32 = 2148550034;
++pub const BTRFS_IOC_SUBVOL_GETFLAGS: u32 = 2148045849;
++pub const FSL_HV_IOCTL_PARTITION_GET_STATUS: u32 = 3222056706;
++pub const MEDIA_IOC_ENUM_ENTITIES: u32 = 3238034433;
++pub const GSMIOC_GETFIRST: u32 = 2147763972;
++pub const FW_CDEV_IOC_FLUSH_ISO: u32 = 1074012952;
++pub const VIDIOC_DBG_G_CHIP_INFO: u32 = 3234354790;
++pub const F2FS_IOC_RELEASE_VOLATILE_WRITE: u32 = 62724;
++pub const CAPI_GET_SERIAL: u32 = 3221504776;
++pub const FDSETDRVPRM: u32 = 1082131088;
++pub const IOC_OPAL_SAVE: u32 = 1092120796;
++pub const VIDIOC_G_DV_TIMINGS: u32 = 3229898328;
++pub const TUNSETIFINDEX: u32 = 1074025690;
++pub const CCISS_SETINTINFO: u32 = 1074283011;
++pub const CM_IOSDBGLVL: u32 = 1074291706;
++pub const RTC_VL_CLR: u32 = 28692;
++pub const VIDIOC_REQBUFS: u32 = 3222558216;
++pub const USBDEVFS_REAPURBNDELAY32: u32 = 1074025741;
++pub const TEE_IOC_SHM_REGISTER: u32 = 3222840329;
++pub const USBDEVFS_SETCONFIGURATION: u32 = 2147767557;
++pub const CCISS_GETNODENAME: u32 = 2148549124;
++pub const VIDIOC_SUBDEV_S_FRAME_INTERVAL: u32 = 3224393238;
++pub const VIDIOC_ENUM_FRAMESIZES: u32 = 3224131146;
++pub const VFIO_DEVICE_PCI_HOT_RESET: u32 = 15217;
++pub const FW_CDEV_IOC_SEND_BROADCAST_REQUEST: u32 = 1076372242;
++pub const LPSETTIMEOUT_NEW: u32 = 1074791951;
++pub const RIO_CM_MPORT_GET_LIST: u32 = 3221512971;
++pub const FW_CDEV_IOC_QUEUE_ISO: u32 = 3222807305;
++pub const FDRAWCMD: u32 = 600;
++pub const SCIF_UNREG: u32 = 3222303497;
++pub const PPPIOCGIDLE64: u32 = 2148561983;
++pub const USBDEVFS_RELEASEINTERFACE: u32 = 2147767568;
++pub const VIDIOC_CROPCAP: u32 = 3224131130;
++pub const DFL_FPGA_PORT_GET_INFO: u32 = 46657;
++pub const PHN_SET_REGS: u32 = 1074294787;
++pub const ATMLEC_DATA: u32 = 25041;
++pub const PPPOEIOCDFWD: u32 = 45313;
++pub const VIDIOC_S_SELECTION: u32 = 3225441887;
++pub const SNAPSHOT_FREE_SWAP_PAGES: u32 = 13065;
++pub const BTRFS_IOC_LOGICAL_INO: u32 = 3224933412;
++pub const VIDIOC_S_CTRL: u32 = 3221771804;
++pub const ZATM_SETPOOL: u32 = 1074815331;
++pub const MTIOCPOS: u32 = 2148035843;
++pub const PMU_IOC_SLEEP: u32 = 16896;
++pub const AUTOFS_DEV_IOCTL_PROTOSUBVER: u32 = 3222836083;
++pub const VBG_IOCTL_CHANGE_FILTER_MASK: u32 = 3223344652;
++pub const NILFS_IOCTL_GET_SUSTAT: u32 = 2150657669;
++pub const VIDIOC_QUERYCAP: u32 = 2154321408;
++pub const HPET_INFO: u32 = 2149083139;
++pub const VIDIOC_AM437X_CCDC_CFG: u32 = 1074288321;
++pub const DM_LIST_DEVICES: u32 = 3241737474;
++pub const TUNSETOWNER: u32 = 1074025676;
++pub const VBG_IOCTL_CHANGE_GUEST_CAPABILITIES: u32 = 3223344654;
++pub const RNDADDENTROPY: u32 = 1074287107;
++pub const USBDEVFS_RESET: u32 = 21780;
++pub const BTRFS_IOC_SUBVOL_CREATE: u32 = 1342215182;
++pub const USBDEVFS_FORBID_SUSPEND: u32 = 21793;
++pub const FDGETDRVTYP: u32 = 2148532751;
++pub const PPWCONTROL: u32 = 1073836164;
++pub const VIDIOC_ENUM_FRAMEINTERVALS: u32 = 3224655435;
++pub const KCOV_DISABLE: u32 = 25445;
++pub const IOC_OPAL_ACTIVATE_LSP: u32 = 1092120799;
++pub const VHOST_VDPA_GET_IOVA_RANGE: u32 = 2148577144;
++pub const PPPIOCSPASS: u32 = 1074820167;
++pub const RIO_CM_CHAN_CONNECT: u32 = 1074291464;
++pub const I2OSWDEL: u32 = 3224398087;
++pub const FS_IOC_SET_ENCRYPTION_POLICY: u32 = 2148296211;
++pub const IOC_OPAL_MBR_DONE: u32 = 1091596521;
++pub const PPPIOCSMAXCID: u32 = 1074033745;
++pub const PPSETPHASE: u32 = 1074032788;
++pub const VHOST_VDPA_SET_VRING_ENABLE: u32 = 1074311029;
++pub const USBDEVFS_GET_SPEED: u32 = 21791;
++pub const SONET_GETFRAMING: u32 = 2147770646;
++pub const VIDIOC_QUERYBUF: u32 = 3227014665;
++pub const VIDIOC_S_EDID: u32 = 3223868969;
++pub const BTRFS_IOC_QGROUP_ASSIGN: u32 = 1075352617;
++pub const PPS_GETCAP: u32 = 2148036771;
++pub const SNAPSHOT_PLATFORM_SUPPORT: u32 = 13071;
++pub const LIRC_SET_REC_TIMEOUT_REPORTS: u32 = 1074030873;
++pub const SCIF_GET_NODEIDS: u32 = 3222827790;
++pub const NBD_DISCONNECT: u32 = 43784;
++pub const VIDIOC_SUBDEV_G_FRAME_INTERVAL: u32 = 3224393237;
++pub const VFIO_IOMMU_DISABLE: u32 = 15220;
++pub const SNAPSHOT_CREATE_IMAGE: u32 = 1074017041;
++pub const SNAPSHOT_POWER_OFF: u32 = 13072;
++pub const APM_IOC_STANDBY: u32 = 16641;
++pub const PPPIOCGUNIT: u32 = 2147775574;
++pub const AUTOFS_IOC_EXPIRE_MULTI: u32 = 1074041702;
++pub const SCIF_BIND: u32 = 3221779201;
++pub const IOC_WATCH_QUEUE_SET_SIZE: u32 = 22368;
++pub const NILFS_IOCTL_CHANGE_CPMODE: u32 = 1074818688;
++pub const IOC_OPAL_LOCK_UNLOCK: u32 = 1092120797;
++pub const F2FS_IOC_SET_PIN_FILE: u32 = 1074066701;
++pub const PPPIOCGRASYNCMAP: u32 = 2147775573;
++pub const MMTIMER_MMAPAVAIL: u32 = 27910;
++pub const I2OPASSTHRU32: u32 = 2148034828;
++pub const DFL_FPGA_FME_PORT_RELEASE: u32 = 1074050689;
++pub const VIDIOC_SUBDEV_QUERY_DV_TIMINGS: u32 = 2156156515;
++pub const UI_SET_SNDBIT: u32 = 1074025834;
++pub const VIDIOC_G_AUDOUT: u32 = 2150913585;
++pub const RTC_PLL_SET: u32 = 1075867666;
++pub const VIDIOC_ENUMAUDIO: u32 = 3224655425;
++pub const AUTOFS_DEV_IOCTL_TIMEOUT: u32 = 3222836090;
++pub const VBG_IOCTL_DRIVER_VERSION_INFO: u32 = 3224131072;
++pub const VHOST_SCSI_GET_EVENTS_MISSED: u32 = 1074048836;
++pub const VHOST_SET_VRING_ADDR: u32 = 1076408081;
++pub const VDUSE_CREATE_DEV: u32 = 1095794946;
++pub const FDFLUSH: u32 = 587;
++pub const VBG_IOCTL_WAIT_FOR_EVENTS: u32 = 3223344650;
++pub const DFL_FPGA_FME_ERR_SET_IRQ: u32 = 1074312836;
++pub const F2FS_IOC_GET_PIN_FILE: u32 = 2147808526;
++pub const SCIF_CONNECT: u32 = 3221779203;
++pub const BLKREPORTZONE: u32 = 3222278786;
++pub const AUTOFS_IOC_ASKUMOUNT: u32 = 2147783536;
++pub const ATM_ADDPARTY: u32 = 1074815476;
++pub const FDSETPRM: u32 = 1075839554;
++pub const ATM_GETSTATZ: u32 = 1074815313;
++pub const ISST_IF_MSR_COMMAND: u32 = 3221814788;
++pub const BTRFS_IOC_GET_SUBVOL_INFO: u32 = 2180551740;
++pub const VIDIOC_UNSUBSCRIBE_EVENT: u32 = 1075861083;
++pub const SEV_ISSUE_CMD: u32 = 3222295296;
++pub const GPIOHANDLE_SET_LINE_VALUES_IOCTL: u32 = 3225465865;
++pub const PCITEST_COPY: u32 = 1074286598;
++pub const IPMICTL_GET_MY_ADDRESS_CMD: u32 = 2147772690;
++pub const CHIOGPICKER: u32 = 2147771140;
++pub const CAPI_NCCI_OPENCOUNT: u32 = 2147762982;
++pub const CXL_MEM_SEND_COMMAND: u32 = 3224423938;
++pub const PERF_EVENT_IOC_SET_FILTER: u32 = 1074275334;
++pub const IOC_OPAL_REVERT_TPR: u32 = 1091072226;
++pub const CHIOGVPARAMS: u32 = 2154849043;
++pub const PTP_PEROUT_REQUEST: u32 = 1077427459;
++pub const FSI_SCOM_CHECK: u32 = 2147775232;
++pub const RTC_IRQP_READ: u32 = 2148036619;
++pub const RIO_MPORT_MAINT_READ_LOCAL: u32 = 2149084421;
++pub const HIDIOCGRDESCSIZE: u32 = 2147764225;
++pub const UI_GET_VERSION: u32 = 2147767597;
++pub const NILFS_IOCTL_GET_CPSTAT: u32 = 2149084803;
++pub const CCISS_GETBUSTYPES: u32 = 2147762695;
++pub const VFIO_IOMMU_SPAPR_TCE_CREATE: u32 = 15223;
++pub const VIDIOC_EXPBUF: u32 = 3225441808;
++pub const UI_SET_RELBIT: u32 = 1074025830;
++pub const VFIO_SET_IOMMU: u32 = 15206;
++pub const VIDIOC_S_MODULATOR: u32 = 1078220343;
++pub const TUNGETFILTER: u32 = 2148553947;
++pub const MEYEIOC_SYNC: u32 = 3221518019;
++pub const CCISS_SETNODENAME: u32 = 1074807301;
++pub const FBIO_GETCONTROL2: u32 = 2148025993;
++pub const TUNSETDEBUG: u32 = 1074025673;
++pub const DM_DEV_REMOVE: u32 = 3241737476;
++pub const HIDIOCSUSAGES: u32 = 1344030740;
++pub const FS_IOC_ADD_ENCRYPTION_KEY: u32 = 3226494487;
++pub const FBIOGET_VBLANK: u32 = 2149598738;
++pub const ATM_GETSTAT: u32 = 1074815312;
++pub const VIDIOC_G_JPEGCOMP: u32 = 2156680765;
++pub const TUNATTACHFILTER: u32 = 1074812117;
++pub const UI_SET_ABSBIT: u32 = 1074025831;
++pub const DFL_FPGA_PORT_ERR_GET_IRQ_NUM: u32 = 2147792453;
++pub const USBDEVFS_REAPURB32: u32 = 1074025740;
++pub const BTRFS_IOC_TRANS_END: u32 = 37895;
++pub const CAPI_REGISTER: u32 = 1074545409;
++pub const F2FS_IOC_COMPRESS_FILE: u32 = 62744;
++pub const USBDEVFS_DISCARDURB: u32 = 21771;
++pub const HE_GET_REG: u32 = 1074815328;
++pub const ATM_SETLOOP: u32 = 1074815315;
++pub const ATMSIGD_CTRL: u32 = 25072;
++pub const CIOC_KERNEL_VERSION: u32 = 3221775114;
++pub const BTRFS_IOC_CLONE_RANGE: u32 = 1075876877;
++pub const SNAPSHOT_UNFREEZE: u32 = 13058;
++pub const F2FS_IOC_START_VOLATILE_WRITE: u32 = 62723;
++pub const PMU_IOC_HAS_ADB: u32 = 2148024836;
++pub const I2OGETIOPS: u32 = 2149607680;
++pub const VIDIOC_S_FBUF: u32 = 1076909579;
++pub const PPRCONTROL: u32 = 2147577987;
++pub const CHIOSPICKER: u32 = 1074029317;
++pub const VFIO_IOMMU_SPAPR_REGISTER_MEMORY: u32 = 15221;
++pub const TUNGETSNDBUF: u32 = 2147767507;
++pub const GSMIOC_SETCONF: u32 = 1078740737;
++pub const IOC_PR_PREEMPT: u32 = 1075343563;
++pub const KCOV_INIT_TRACE: u32 = 2148033281;
++pub const SONYPI_IOCGBAT1CAP: u32 = 2147644930;
++pub const SWITCHTEC_IOCTL_FLASH_INFO: u32 = 2148554560;
++pub const MTIOCTOP: u32 = 1074294017;
++pub const VHOST_VDPA_SET_STATUS: u32 = 1073852274;
++pub const VHOST_SCSI_SET_EVENTS_MISSED: u32 = 1074048835;
++pub const VFIO_IOMMU_DIRTY_PAGES: u32 = 15221;
++pub const BTRFS_IOC_SCRUB_PROGRESS: u32 = 3288372253;
++pub const PPPIOCGMRU: u32 = 2147775571;
++pub const BTRFS_IOC_DEV_REPLACE: u32 = 3391657013;
++pub const PPPIOCGFLAGS: u32 = 2147775578;
++pub const NILFS_IOCTL_SET_SUINFO: u32 = 1075342989;
++pub const FW_CDEV_IOC_GET_CYCLE_TIMER2: u32 = 3222807316;
++pub const ATM_DELLECSADDR: u32 = 1074815375;
++pub const FW_CDEV_IOC_GET_SPEED: u32 = 8977;
++pub const PPPIOCGIDLE32: u32 = 2148037695;
++pub const VFIO_DEVICE_RESET: u32 = 15215;
++pub const GPIO_GET_LINEINFO_UNWATCH_IOCTL: u32 = 3221533708;
++pub const WDIOC_GETSTATUS: u32 = 2147768065;
++pub const BTRFS_IOC_SET_FEATURES: u32 = 1076925497;
++pub const IOCTL_MEI_CONNECT_CLIENT: u32 = 3222292481;
++pub const VIDIOC_OMAP3ISP_AEWB_CFG: u32 = 3223344835;
++pub const PCITEST_READ: u32 = 1074286597;
++pub const VFIO_GROUP_GET_STATUS: u32 = 15207;
++pub const MATROXFB_GET_ALL_OUTPUTS: u32 = 2148036347;
++pub const USBDEVFS_CLEAR_HALT: u32 = 2147767573;
++pub const VIDIOC_DECODER_CMD: u32 = 3225966176;
++pub const VIDIOC_G_AUDIO: u32 = 2150913569;
++pub const CCISS_RESCANDISK: u32 = 16912;
++pub const RIO_DISABLE_PORTWRITE_RANGE: u32 = 1074818316;
++pub const IOC_OPAL_SECURE_ERASE_LR: u32 = 1091596519;
++pub const USBDEVFS_REAPURB: u32 = 1074287884;
++pub const DFL_FPGA_CHECK_EXTENSION: u32 = 46593;
++pub const AUTOFS_IOC_PROTOVER: u32 = 2147783523;
++pub const FSL_HV_IOCTL_MEMCPY: u32 = 3223891717;
++pub const BTRFS_IOC_GET_FEATURES: u32 = 2149094457;
++pub const PCITEST_MSIX: u32 = 1074024455;
++pub const BTRFS_IOC_DEFRAG_RANGE: u32 = 1076925456;
++pub const UI_BEGIN_FF_ERASE: u32 = 3222033866;
++pub const DM_GET_TARGET_VERSION: u32 = 3241737489;
++pub const PPPIOCGIDLE: u32 = 2148561983;
++pub const NVRAM_SETCKS: u32 = 28737;
++pub const WDIOC_GETSUPPORT: u32 = 2150127360;
++pub const GSMIOC_ENABLE_NET: u32 = 1077167874;
++pub const GPIO_GET_CHIPINFO_IOCTL: u32 = 2151986177;
++pub const NE_ADD_VCPU: u32 = 3221532193;
++pub const EVIOCSKEYCODE_V2: u32 = 1076380932;
++pub const PTP_SYS_OFFSET_EXTENDED2: u32 = 3300932882;
++pub const SCIF_FENCE_WAIT: u32 = 3221517072;
++pub const RIO_TRANSFER: u32 = 3222826261;
++pub const FSL_HV_IOCTL_DOORBELL: u32 = 3221794566;
++pub const RIO_MPORT_MAINT_WRITE_LOCAL: u32 = 1075342598;
++pub const I2OEVTREG: u32 = 1074555146;
++pub const I2OPARMGET: u32 = 3223873796;
++pub const EVIOCGID: u32 = 2148025602;
++pub const BTRFS_IOC_QGROUP_CREATE: u32 = 1074828330;
++pub const AUTOFS_DEV_IOCTL_SETPIPEFD: u32 = 3222836088;
++pub const VIDIOC_S_PARM: u32 = 3234616854;
++pub const TUNSETSTEERINGEBPF: u32 = 2147767520;
++pub const ATM_GETNAMES: u32 = 1074815363;
++pub const VIDIOC_QUERYMENU: u32 = 3224131109;
++pub const DFL_FPGA_PORT_DMA_UNMAP: u32 = 46660;
++pub const I2OLCTGET: u32 = 3222825218;
++pub const FS_IOC_GET_ENCRYPTION_PWSALT: u32 = 1074816532;
++pub const NS_SETBUFLEV: u32 = 1074815330;
++pub const BLKCLOSEZONE: u32 = 1074795143;
++pub const SONET_GETFRSENSE: u32 = 2147901719;
++pub const UI_SET_EVBIT: u32 = 1074025828;
++pub const DM_LIST_VERSIONS: u32 = 3241737485;
++pub const HIDIOCGSTRING: u32 = 2164541444;
++pub const PPPIOCATTCHAN: u32 = 1074033720;
++pub const VDUSE_DEV_SET_CONFIG: u32 = 1074299154;
++pub const TUNGETFEATURES: u32 = 2147767503;
++pub const VFIO_GROUP_UNSET_CONTAINER: u32 = 15209;
++pub const IPMICTL_SET_MY_ADDRESS_CMD: u32 = 2147772689;
++pub const CCISS_REGNEWDISK: u32 = 1074020877;
++pub const VIDIOC_QUERY_DV_TIMINGS: u32 = 2156156515;
++pub const PHN_SETREGS: u32 = 1076391944;
++pub const FAT_IOCTL_GET_ATTRIBUTES: u32 = 2147774992;
++pub const FSL_MC_SEND_MC_COMMAND: u32 = 3225440992;
++pub const TUNGETIFF: u32 = 2147767506;
++pub const PTP_CLOCK_GETCAPS2: u32 = 2152742154;
++pub const BTRFS_IOC_RESIZE: u32 = 1342215171;
++pub const VHOST_SET_VRING_ENDIAN: u32 = 1074310931;
++pub const PPS_KC_BIND: u32 = 1074294949;
++pub const F2FS_IOC_WRITE_CHECKPOINT: u32 = 62727;
++pub const UI_SET_FFBIT: u32 = 1074025835;
++pub const IPMICTL_GET_MY_LUN_CMD: u32 = 2147772692;
++pub const CEC_ADAP_G_PHYS_ADDR: u32 = 2147639553;
++pub const CEC_G_MODE: u32 = 2147770632;
++pub const USBDEVFS_RESETEP: u32 = 2147767555;
++pub const MEDIA_REQUEST_IOC_QUEUE: u32 = 31872;
++pub const USBDEVFS_ALLOC_STREAMS: u32 = 2148029724;
++pub const MGSL_IOCSXCTRL: u32 = 27925;
++pub const MEDIA_IOC_G_TOPOLOGY: u32 = 3225975812;
++pub const PPPIOCUNBRIDGECHAN: u32 = 29748;
++pub const F2FS_IOC_COMMIT_ATOMIC_WRITE: u32 = 62722;
++pub const ISST_IF_GET_PLATFORM_INFO: u32 = 2148072960;
++pub const SCIF_FENCE_MARK: u32 = 3222303503;
++pub const USBDEVFS_RELEASE_PORT: u32 = 2147767577;
++pub const VFIO_CHECK_EXTENSION: u32 = 15205;
++pub const BTRFS_IOC_QGROUP_LIMIT: u32 = 2150667307;
++pub const FAT_IOCTL_GET_VOLUME_ID: u32 = 2147774995;
++pub const UI_SET_PHYS: u32 = 1074287980;
++pub const FDWERRORGET: u32 = 2150105623;
++pub const VIDIOC_SUBDEV_G_EDID: u32 = 3223868968;
++pub const MGSL_IOCGSTATS: u32 = 27911;
++pub const RPROC_SET_SHUTDOWN_ON_RELEASE: u32 = 1074050817;
++pub const SIOCGSTAMP_NEW: u32 = 2148567302;
++pub const RTC_WKALM_RD: u32 = 2150133776;
++pub const PHN_GET_REG: u32 = 3221778432;
++pub const DELL_WMI_SMBIOS_CMD: u32 = 3224655616;
++pub const PHN_NOT_OH: u32 = 28676;
++pub const PPGETMODES: u32 = 2147774615;
++pub const CHIOGPARAMS: u32 = 2148819718;
++pub const VFIO_DEVICE_GET_GFX_DMABUF: u32 = 15219;
++pub const VHOST_SET_VRING_BUSYLOOP_TIMEOUT: u32 = 1074310947;
++pub const VIDIOC_SUBDEV_G_SELECTION: u32 = 3225441853;
++pub const BTRFS_IOC_RM_DEV_V2: u32 = 1342215226;
++pub const MGSL_IOCWAITGPIO: u32 = 3222301970;
++pub const PMU_IOC_CAN_SLEEP: u32 = 2148024837;
++pub const KCOV_ENABLE: u32 = 25444;
++pub const BTRFS_IOC_CLONE: u32 = 1074041865;
++pub const F2FS_IOC_DEFRAGMENT: u32 = 3222336776;
++pub const FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE: u32 = 1074012942;
++pub const AGPIOC_ALLOCATE: u32 = 3221766406;
++pub const NE_SET_USER_MEMORY_REGION: u32 = 1075359267;
++pub const MGSL_IOCTXABORT: u32 = 27910;
++pub const MGSL_IOCSGPIO: u32 = 1074818320;
++pub const LIRC_SET_REC_CARRIER: u32 = 1074030868;
++pub const F2FS_IOC_FLUSH_DEVICE: u32 = 1074328842;
++pub const SNAPSHOT_ATOMIC_RESTORE: u32 = 13060;
++pub const RTC_UIE_OFF: u32 = 28676;
++pub const BT_BMC_IOCTL_SMS_ATN: u32 = 45312;
++pub const NVME_IOCTL_ID: u32 = 20032;
++pub const NE_START_ENCLAVE: u32 = 3222318628;
++pub const VIDIOC_STREAMON: u32 = 1074026002;
++pub const FDPOLLDRVSTAT: u32 = 2152727059;
++pub const AUTOFS_DEV_IOCTL_READY: u32 = 3222836086;
++pub const VIDIOC_ENUMAUDOUT: u32 = 3224655426;
++pub const VIDIOC_SUBDEV_S_STD: u32 = 1074288152;
++pub const WDIOC_GETTIMELEFT: u32 = 2147768074;
++pub const ATM_GETLINKRATE: u32 = 1074815361;
++pub const RTC_WKALM_SET: u32 = 1076391951;
++pub const VHOST_GET_BACKEND_FEATURES: u32 = 2148052774;
++pub const ATMARP_ENCAP: u32 = 25061;
++pub const CAPI_GET_FLAGS: u32 = 2147762979;
++pub const IPMICTL_SET_MY_CHANNEL_ADDRESS_CMD: u32 = 2147772696;
++pub const DFL_FPGA_FME_PORT_ASSIGN: u32 = 1074050690;
++pub const NS_GET_OWNER_UID: u32 = 46852;
++pub const VIDIOC_OVERLAY: u32 = 1074025998;
++pub const BTRFS_IOC_WAIT_SYNC: u32 = 1074304022;
++pub const GPIOHANDLE_SET_CONFIG_IOCTL: u32 = 3226776586;
++pub const VHOST_GET_VRING_ENDIAN: u32 = 1074310932;
++pub const ATM_GETADDR: u32 = 1074815366;
++pub const PHN_GET_REGS: u32 = 3221778434;
++pub const AUTOFS_DEV_IOCTL_REQUESTER: u32 = 3222836091;
++pub const AUTOFS_DEV_IOCTL_EXPIRE: u32 = 3222836092;
++pub const SNAPSHOT_S2RAM: u32 = 13067;
++pub const JSIOCSAXMAP: u32 = 1077963313;
++pub const F2FS_IOC_SET_COMPRESS_OPTION: u32 = 1073935638;
++pub const VBG_IOCTL_HGCM_DISCONNECT: u32 = 3223082501;
++pub const SCIF_FENCE_SIGNAL: u32 = 3223876369;
++pub const VFIO_DEVICE_GET_PCI_HOT_RESET_INFO: u32 = 15216;
++pub const VIDIOC_SUBDEV_ENUM_MBUS_CODE: u32 = 3224393218;
++pub const MMTIMER_GETOFFSET: u32 = 27904;
++pub const RIO_CM_CHAN_LISTEN: u32 = 1073898246;
++pub const ATM_SETSC: u32 = 1074029041;
++pub const F2FS_IOC_SHUTDOWN: u32 = 2147768445;
++pub const NVME_IOCTL_RESCAN: u32 = 20038;
++pub const BLKOPENZONE: u32 = 1074795142;
++pub const DM_VERSION: u32 = 3241737472;
++pub const CEC_TRANSMIT: u32 = 3224920325;
++pub const FS_IOC_GET_ENCRYPTION_POLICY_EX: u32 = 3221841430;
++pub const SIOCMKCLIP: u32 = 25056;
++pub const IPMI_BMC_IOCTL_CLEAR_SMS_ATN: u32 = 45313;
++pub const HIDIOCGVERSION: u32 = 2147764225;
++pub const VIDIOC_S_INPUT: u32 = 3221509671;
++pub const VIDIOC_G_CROP: u32 = 3222558267;
++pub const LIRC_SET_WIDEBAND_RECEIVER: u32 = 1074030883;
++pub const EVIOCGEFFECTS: u32 = 2147763588;
++pub const UVCIOC_CTRL_QUERY: u32 = 3222304033;
++pub const IOC_OPAL_GENERIC_TABLE_RW: u32 = 1094217963;
++pub const FS_IOC_READ_VERITY_METADATA: u32 = 3223873159;
++pub const ND_IOCTL_SET_CONFIG_DATA: u32 = 3221769734;
++pub const USBDEVFS_GETDRIVER: u32 = 1090802952;
++pub const IDT77105_GETSTAT: u32 = 1074815282;
++pub const HIDIOCINITREPORT: u32 = 18437;
++pub const VFIO_DEVICE_GET_INFO: u32 = 15211;
++pub const RIO_CM_CHAN_RECEIVE: u32 = 3222299402;
++pub const RNDGETENTCNT: u32 = 2147766784;
++pub const PPPIOCNEWUNIT: u32 = 3221517374;
++pub const BTRFS_IOC_INO_LOOKUP: u32 = 3489698834;
++pub const FDRESET: u32 = 596;
++pub const IOC_PR_REGISTER: u32 = 1075343560;
++pub const HIDIOCSREPORT: u32 = 1074546696;
++pub const TEE_IOC_OPEN_SESSION: u32 = 2148574210;
++pub const TEE_IOC_SUPPL_RECV: u32 = 2148574214;
++pub const BTRFS_IOC_BALANCE_CTL: u32 = 1074041889;
++pub const GPIO_GET_LINEINFO_WATCH_IOCTL: u32 = 3225990155;
++pub const HIDIOCGRAWINFO: u32 = 2148026371;
++pub const PPPIOCSCOMPRESS: u32 = 1074820173;
++pub const USBDEVFS_CONNECTINFO: u32 = 1074287889;
++pub const BLKRESETZONE: u32 = 1074795139;
++pub const CHIOINITELEM: u32 = 25361;
++pub const NILFS_IOCTL_SET_ALLOC_RANGE: u32 = 1074818700;
++pub const AUTOFS_DEV_IOCTL_CATATONIC: u32 = 3222836089;
++pub const RIO_MPORT_MAINT_HDID_SET: u32 = 1073900801;
++pub const PPGETPHASE: u32 = 2147774617;
++pub const USBDEVFS_DISCONNECT_CLAIM: u32 = 2164806939;
++pub const FDMSGON: u32 = 581;
++pub const VIDIOC_G_SLICED_VBI_CAP: u32 = 3228849733;
++pub const BTRFS_IOC_BALANCE_V2: u32 = 3288372256;
++pub const MEDIA_REQUEST_IOC_REINIT: u32 = 31873;
++pub const IOC_OPAL_ERASE_LR: u32 = 1091596518;
++pub const FDFMTBEG: u32 = 583;
++pub const RNDRESEEDCRNG: u32 = 20999;
++pub const ISST_IF_GET_PHY_ID: u32 = 3221814785;
++pub const TUNSETNOCSUM: u32 = 1074025672;
++pub const SONET_GETSTAT: u32 = 2149867792;
++pub const TFD_IOC_SET_TICKS: u32 = 1074287616;
++pub const PPDATADIR: u32 = 1074032784;
++pub const IOC_OPAL_ENABLE_DISABLE_MBR: u32 = 1091596517;
++pub const GPIO_V2_GET_LINE_IOCTL: u32 = 3260068871;
++pub const RIO_CM_CHAN_SEND: u32 = 1074815753;
++pub const PPWCTLONIRQ: u32 = 1073836178;
++pub const SONYPI_IOCGBRT: u32 = 2147579392;
++pub const IOC_PR_RELEASE: u32 = 1074819274;
++pub const PPCLRIRQ: u32 = 2147774611;
++pub const IPMICTL_SET_MY_CHANNEL_LUN_CMD: u32 = 2147772698;
++pub const MGSL_IOCSXSYNC: u32 = 27923;
++pub const HPET_IE_OFF: u32 = 26626;
++pub const IOC_OPAL_ACTIVATE_USR: u32 = 1091596513;
++pub const SONET_SETFRAMING: u32 = 1074028821;
++pub const PERF_EVENT_IOC_PAUSE_OUTPUT: u32 = 1074013193;
++pub const BTRFS_IOC_LOGICAL_INO_V2: u32 = 3224933435;
++pub const VBG_IOCTL_HGCM_CONNECT: u32 = 3231471108;
++pub const BLKFINISHZONE: u32 = 1074795144;
++pub const EVIOCREVOKE: u32 = 1074021777;
++pub const VFIO_DEVICE_FEATURE: u32 = 15221;
++pub const CCISS_GETPCIINFO: u32 = 2148024833;
++pub const ISST_IF_MBOX_COMMAND: u32 = 3221814787;
++pub const SCIF_ACCEPTREQ: u32 = 3222303492;
++pub const PERF_EVENT_IOC_QUERY_BPF: u32 = 3221758986;
++pub const VIDIOC_STREAMOFF: u32 = 1074026003;
++pub const VDUSE_DESTROY_DEV: u32 = 1090552067;
++pub const FDGETFDCSTAT: u32 = 2150105621;
++pub const CM_IOCGATR: u32 = 3221775105;
++pub const VIDIOC_S_PRIORITY: u32 = 1074026052;
++pub const SNAPSHOT_FREEZE: u32 = 13057;
++pub const VIDIOC_ENUMINPUT: u32 = 3226490394;
++pub const ZATM_GETPOOLZ: u32 = 1074815330;
++pub const RIO_DISABLE_DOORBELL_RANGE: u32 = 1074294026;
++pub const GPIO_V2_GET_LINEINFO_WATCH_IOCTL: u32 = 3238048774;
++pub const VIDIOC_G_STD: u32 = 2148029975;
++pub const USBDEVFS_ALLOW_SUSPEND: u32 = 21794;
++pub const SONET_GETSTATZ: u32 = 2149867793;
++pub const SCIF_ACCEPTREG: u32 = 3221779205;
++pub const VIDIOC_ENCODER_CMD: u32 = 3223869005;
++pub const PPPIOCSRASYNCMAP: u32 = 1074033748;
++pub const IOCTL_MEI_NOTIFY_SET: u32 = 1074022402;
++pub const BTRFS_IOC_QUOTA_RESCAN_STATUS: u32 = 2151715885;
++pub const F2FS_IOC_GARBAGE_COLLECT: u32 = 1074066694;
++pub const ATMLEC_CTRL: u32 = 25040;
++pub const MATROXFB_GET_AVAILABLE_OUTPUTS: u32 = 2148036345;
++pub const DM_DEV_CREATE: u32 = 3241737475;
++pub const VHOST_VDPA_GET_VRING_NUM: u32 = 2147659638;
++pub const VIDIOC_G_CTRL: u32 = 3221771803;
++pub const NBD_CLEAR_SOCK: u32 = 43780;
++pub const VFIO_DEVICE_QUERY_GFX_PLANE: u32 = 15218;
++pub const WDIOC_KEEPALIVE: u32 = 2147768069;
++pub const NVME_IOCTL_SUBSYS_RESET: u32 = 20037;
++pub const PTP_EXTTS_REQUEST2: u32 = 1074806027;
++pub const PCITEST_BAR: u32 = 20481;
++pub const MGSL_IOCGGPIO: u32 = 2148560145;
++pub const EVIOCSREP: u32 = 1074283779;
++pub const VFIO_DEVICE_GET_IRQ_INFO: u32 = 15213;
++pub const HPET_DPI: u32 = 26629;
++pub const VDUSE_VQ_SETUP_KICKFD: u32 = 1074299158;
++pub const ND_IOCTL_CALL: u32 = 3225439754;
++pub const HIDIOCGDEVINFO: u32 = 2149337091;
++pub const DM_TABLE_DEPS: u32 = 3241737483;
++pub const BTRFS_IOC_DEV_INFO: u32 = 3489698846;
++pub const VDUSE_IOTLB_GET_FD: u32 = 3223355664;
++pub const FW_CDEV_IOC_GET_INFO: u32 = 3223855872;
++pub const VIDIOC_G_PRIORITY: u32 = 2147767875;
++pub const ATM_NEWBACKENDIF: u32 = 1073897971;
++pub const VIDIOC_S_EXT_CTRLS: u32 = 3223344712;
++pub const VIDIOC_SUBDEV_ENUM_DV_TIMINGS: u32 = 3230946914;
++pub const VIDIOC_OMAP3ISP_CCDC_CFG: u32 = 3224917697;
++pub const VIDIOC_S_HW_FREQ_SEEK: u32 = 1076909650;
++pub const DM_TABLE_LOAD: u32 = 3241737481;
++pub const F2FS_IOC_START_ATOMIC_WRITE: u32 = 62721;
++pub const VIDIOC_G_OUTPUT: u32 = 2147767854;
++pub const ATM_DROPPARTY: u32 = 1074029045;
++pub const CHIOGELEM: u32 = 1080845072;
++pub const BTRFS_IOC_GET_SUPPORTED_FEATURES: u32 = 2152240185;
++pub const EVIOCSKEYCODE: u32 = 1074283780;
++pub const NE_GET_IMAGE_LOAD_INFO: u32 = 3222318626;
++pub const TUNSETLINK: u32 = 1074025677;
++pub const FW_CDEV_IOC_ADD_DESCRIPTOR: u32 = 3222807302;
++pub const BTRFS_IOC_SCRUB_CANCEL: u32 = 37916;
++pub const PPS_SETPARAMS: u32 = 1074294946;
++pub const IOC_OPAL_LR_SETUP: u32 = 1093169379;
++pub const FW_CDEV_IOC_DEALLOCATE: u32 = 1074012931;
++pub const WDIOC_SETTIMEOUT: u32 = 3221509894;
++pub const IOC_WATCH_QUEUE_SET_FILTER: u32 = 22369;
++pub const CAPI_GET_MANUFACTURER: u32 = 3221504774;
++pub const VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY: u32 = 15222;
++pub const ASPEED_P2A_CTRL_IOCTL_SET_WINDOW: u32 = 1074836224;
++pub const VIDIOC_G_EDID: u32 = 3223868968;
++pub const F2FS_IOC_GARBAGE_COLLECT_RANGE: u32 = 1075377419;
++pub const RIO_MAP_INBOUND: u32 = 3223874833;
++pub const IOC_OPAL_TAKE_OWNERSHIP: u32 = 1091072222;
++pub const USBDEVFS_CLAIM_PORT: u32 = 2147767576;
++pub const VIDIOC_S_AUDIO: u32 = 1077171746;
++pub const FS_IOC_GET_ENCRYPTION_NONCE: u32 = 2148558363;
++pub const FW_CDEV_IOC_SEND_STREAM_PACKET: u32 = 1076372243;
++pub const BTRFS_IOC_SNAP_DESTROY: u32 = 1342215183;
++pub const SNAPSHOT_FREE: u32 = 13061;
++pub const I8K_GET_SPEED: u32 = 3221776773;
++pub const HIDIOCGREPORT: u32 = 1074546695;
++pub const HPET_EPI: u32 = 26628;
++pub const JSIOCSCORR: u32 = 1076128289;
++pub const IOC_PR_PREEMPT_ABORT: u32 = 1075343564;
++pub const RIO_MAP_OUTBOUND: u32 = 3223874831;
++pub const ATM_SETESI: u32 = 1074815372;
++pub const FW_CDEV_IOC_START_ISO: u32 = 1074799370;
++pub const ATM_DELADDR: u32 = 1074815369;
++pub const PPFCONTROL: u32 = 1073901710;
++pub const SONYPI_IOCGFAN: u32 = 2147579402;
++pub const RTC_IRQP_SET: u32 = 1074294796;
++pub const PCITEST_WRITE: u32 = 1074286596;
++pub const PPCLAIM: u32 = 28811;
++pub const VIDIOC_S_JPEGCOMP: u32 = 1082938942;
++pub const IPMICTL_UNREGISTER_FOR_CMD: u32 = 2147641615;
++pub const VHOST_SET_FEATURES: u32 = 1074310912;
++pub const TOSHIBA_ACPI_SCI: u32 = 3222828177;
++pub const VIDIOC_DQBUF: u32 = 3227014673;
++pub const BTRFS_IOC_BALANCE_PROGRESS: u32 = 2214630434;
++pub const BTRFS_IOC_SUBVOL_SETFLAGS: u32 = 1074304026;
++pub const ATMLEC_MCAST: u32 = 25042;
++pub const MMTIMER_GETFREQ: u32 = 2148035842;
++pub const VIDIOC_G_SELECTION: u32 = 3225441886;
++pub const RTC_ALM_SET: u32 = 1076129799;
++pub const PPPOEIOCSFWD: u32 = 1074311424;
++pub const IPMICTL_GET_MAINTENANCE_MODE_CMD: u32 = 2147772702;
++pub const FS_IOC_ENABLE_VERITY: u32 = 1082156677;
++pub const NILFS_IOCTL_GET_BDESCS: u32 = 3222826631;
++pub const FDFMTEND: u32 = 585;
++pub const DMA_BUF_SET_NAME: u32 = 1074291201;
++pub const UI_BEGIN_FF_UPLOAD: u32 = 3228063176;
++pub const RTC_UIE_ON: u32 = 28675;
++pub const PPRELEASE: u32 = 28812;
++pub const VFIO_IOMMU_UNMAP_DMA: u32 = 15218;
++pub const VIDIOC_OMAP3ISP_PRV_CFG: u32 = 3228587714;
++pub const GPIO_GET_LINEHANDLE_IOCTL: u32 = 3245126659;
++pub const VFAT_IOCTL_READDIR_BOTH: u32 = 2184212993;
++pub const NVME_IOCTL_ADMIN_CMD: u32 = 3225964097;
++pub const VHOST_SET_VRING_KICK: u32 = 1074310944;
++pub const BTRFS_IOC_SUBVOL_CREATE_V2: u32 = 1342215192;
++pub const BTRFS_IOC_SNAP_CREATE: u32 = 1342215169;
++pub const SONYPI_IOCGBAT2CAP: u32 = 2147644932;
++pub const PPNEGOT: u32 = 1074032785;
++pub const NBD_PRINT_DEBUG: u32 = 43782;
++pub const BTRFS_IOC_INO_LOOKUP_USER: u32 = 3489698878;
++pub const BTRFS_IOC_GET_SUBVOL_ROOTREF: u32 = 3489698877;
++pub const FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS: u32 = 3225445913;
++pub const BTRFS_IOC_FS_INFO: u32 = 2214630431;
++pub const VIDIOC_ENUM_FMT: u32 = 3225441794;
++pub const VIDIOC_G_INPUT: u32 = 2147767846;
++pub const VTPM_PROXY_IOC_NEW_DEV: u32 = 3222577408;
++pub const DFL_FPGA_FME_ERR_GET_IRQ_NUM: u32 = 2147792515;
++pub const ND_IOCTL_DIMM_FLAGS: u32 = 3221769731;
++pub const BTRFS_IOC_QUOTA_RESCAN: u32 = 1077974060;
++pub const MMTIMER_GETCOUNTER: u32 = 2148035849;
++pub const MATROXFB_GET_OUTPUT_MODE: u32 = 3221778170;
++pub const BTRFS_IOC_QUOTA_RESCAN_WAIT: u32 = 37934;
++pub const RIO_CM_CHAN_BIND: u32 = 1074291461;
++pub const HIDIOCGRDESC: u32 = 2416199682;
++pub const MGSL_IOCGIF: u32 = 27915;
++pub const VIDIOC_S_OUTPUT: u32 = 3221509679;
++pub const HIDIOCGREPORTINFO: u32 = 3222030345;
++pub const WDIOC_GETBOOTSTATUS: u32 = 2147768066;
++pub const VDUSE_VQ_GET_INFO: u32 = 3224404245;
++pub const ACRN_IOCTL_ASSIGN_PCIDEV: u32 = 1076142677;
++pub const BLKGETDISKSEQ: u32 = 2148012672;
++pub const ACRN_IOCTL_PM_GET_CPU_STATE: u32 = 3221791328;
++pub const ACRN_IOCTL_DESTROY_VM: u32 = 41489;
++pub const ACRN_IOCTL_SET_PTDEV_INTR: u32 = 1075094099;
++pub const ACRN_IOCTL_CREATE_IOREQ_CLIENT: u32 = 41522;
++pub const ACRN_IOCTL_IRQFD: u32 = 1075356273;
++pub const ACRN_IOCTL_CREATE_VM: u32 = 3224412688;
++pub const ACRN_IOCTL_INJECT_MSI: u32 = 1074831907;
++pub const ACRN_IOCTL_ATTACH_IOREQ_CLIENT: u32 = 41523;
++pub const ACRN_IOCTL_RESET_PTDEV_INTR: u32 = 1075094100;
++pub const ACRN_IOCTL_NOTIFY_REQUEST_FINISH: u32 = 1074307633;
++pub const ACRN_IOCTL_SET_IRQLINE: u32 = 1074307621;
++pub const ACRN_IOCTL_START_VM: u32 = 41490;
++pub const ACRN_IOCTL_SET_VCPU_REGS: u32 = 1093181974;
++pub const ACRN_IOCTL_SET_MEMSEG: u32 = 1075880513;
++pub const ACRN_IOCTL_PAUSE_VM: u32 = 41491;
++pub const ACRN_IOCTL_CLEAR_VM_IOREQ: u32 = 41525;
++pub const ACRN_IOCTL_UNSET_MEMSEG: u32 = 1075880514;
++pub const ACRN_IOCTL_IOEVENTFD: u32 = 1075880560;
++pub const ACRN_IOCTL_DEASSIGN_PCIDEV: u32 = 1076142678;
++pub const ACRN_IOCTL_RESET_VM: u32 = 41493;
++pub const ACRN_IOCTL_DESTROY_IOREQ_CLIENT: u32 = 41524;
++pub const ACRN_IOCTL_VM_INTR_MONITOR: u32 = 1074307620;
+--
+2.42.1
+
diff --git a/poky/meta/recipes-gnome/librsvg/librsvg_2.56.3.bb b/poky/meta/recipes-gnome/librsvg/librsvg_2.56.3.bb
index 4b9aaeecbe..9824b8898d 100644
--- a/poky/meta/recipes-gnome/librsvg/librsvg_2.56.3.bb
+++ b/poky/meta/recipes-gnome/librsvg/librsvg_2.56.3.bb
@@ -14,11 +14,13 @@ SECTION = "x11/utils"
DEPENDS = "cairo gdk-pixbuf glib-2.0 libxml2 pango python3-docutils-native"
BBCLASSEXTEND = "native nativesdk"
+GNOMEBASEBUILDCLASS = "autotools"
inherit cargo_common gnomebase pixbufcache gobject-introspection rust vala gi-docgen cargo-update-recipe-crates
require ${BPN}-crates.inc
SRC_URI += "file://0001-Makefile.am-pass-rust-target-to-cargo-also-when-not-.patch \
+ file://0001-Add-riscv32-support.patch;patchdir=../cargo_home/bitbake/linux-raw-sys-0.4.3 \
"
SRC_URI[archive.sha256sum] = "5a328048a02d014645cd27f61140f4e0b11280fb2c7f2a21864fe0c59ac1ce88"
@@ -38,7 +40,6 @@ export RUST_TARGET = "${RUST_HOST_SYS}"
RUSTFLAGS:append:mips = " --cfg crossbeam_no_atomic_64"
RUSTFLAGS:append:mipsel = " --cfg crossbeam_no_atomic_64"
RUSTFLAGS:append:powerpc = " --cfg crossbeam_no_atomic_64"
-RUSTFLAGS:append:riscv32 = " --cfg crossbeam_no_atomic_64"
do_configure[postfuncs] += "cargo_common_do_configure"
diff --git a/poky/meta/recipes-gnome/libsecret/libsecret_0.21.1.bb b/poky/meta/recipes-gnome/libsecret/libsecret_0.21.1.bb
index 63102476cb..f762d7c343 100644
--- a/poky/meta/recipes-gnome/libsecret/libsecret_0.21.1.bb
+++ b/poky/meta/recipes-gnome/libsecret/libsecret_0.21.1.bb
@@ -8,7 +8,6 @@ HOMEPAGE = "https://github.com/GNOME/libsecret"
BUGTRACKER = "https://gitlab.gnome.org/GNOME/libsecret/issues"
LIC_FILES_CHKSUM = "file://COPYING;md5=23c2a5e0106b99d75238986559bb5fc6"
-GNOMEBASEBUILDCLASS = "meson"
inherit gnomebase gi-docgen vala gobject-introspection manpages
diff --git a/poky/meta/recipes-graphics/drm/libdrm_2.4.116.bb b/poky/meta/recipes-graphics/drm/libdrm_2.4.117.bb
index f0aaf314c6..3e6fb16e15 100644
--- a/poky/meta/recipes-graphics/drm/libdrm_2.4.116.bb
+++ b/poky/meta/recipes-graphics/drm/libdrm_2.4.117.bb
@@ -13,7 +13,7 @@ DEPENDS = "libpthread-stubs"
SRC_URI = "http://dri.freedesktop.org/libdrm/${BP}.tar.xz \
"
-SRC_URI[sha256sum] = "46c53f40735ea3d26d614297f155f6131a510624a24274f654f6469ca905339a"
+SRC_URI[sha256sum] = "a2888d69e3eb1c8a77adc08a75a60fbae01f0d208d26f034d1a12e362361242b"
inherit meson pkgconfig manpages
diff --git a/poky/meta/recipes-graphics/glslang/glslang_1.3.261.1.bb b/poky/meta/recipes-graphics/glslang/glslang_1.3.268.0.bb
index e607045148..033830ba36 100644
--- a/poky/meta/recipes-graphics/glslang/glslang_1.3.261.1.bb
+++ b/poky/meta/recipes-graphics/glslang/glslang_1.3.268.0.bb
@@ -8,13 +8,14 @@ HOMEPAGE = "https://www.khronos.org/opengles/sdk/tools/Reference-Compiler"
LICENSE = "BSD-3-Clause & BSD-2-Clause & MIT & Apache-2.0 & GPL-3-with-bison-exception"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2a2b5acd7bc4844964cfda45fe807dc3"
-SRCREV = "76b52ebf77833908dc4c0dd6c70a9c357ac720bd"
+SRCREV = "36d08c0d940cf307a23928299ef52c7970d8cee6"
SRC_URI = "git://github.com/KhronosGroup/glslang.git;protocol=https;branch=main \
file://0001-generate-glslang-pkg-config.patch \
"
PE = "1"
# These recipes need to be updated in lockstep with each other:
# glslang, vulkan-headers, vulkan-loader, vulkan-tools, spirv-headers, spirv-tools
+# vulkan-validation-layers, vulkan-utility-libraries.
# The tags versions should always be sdk-x.y.z, as this is what
# upstream considers a release.
UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P<pver>\d+(\.\d+)+)"
@@ -22,12 +23,15 @@ S = "${WORKDIR}/git"
inherit cmake python3native
+DEPENDS = "spirv-tools"
+
EXTRA_OECMAKE = " \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DENABLE_PCH=OFF \
-DENABLE_CTEST=OFF \
-DBUILD_EXTERNAL=OFF \
+ -DALLOW_EXTERNAL_SPIRV_TOOLS=ON \
"
BBCLASSEXTEND = "native nativesdk"
diff --git a/poky/meta/recipes-graphics/graphene/graphene_1.10.8.bb b/poky/meta/recipes-graphics/graphene/graphene_1.10.8.bb
index 55d8a2d74e..e2e82b32aa 100644
--- a/poky/meta/recipes-graphics/graphene/graphene_1.10.8.bb
+++ b/poky/meta/recipes-graphics/graphene/graphene_1.10.8.bb
@@ -3,7 +3,6 @@ HOMEPAGE = "http://ebassi.github.io/graphene/"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a7d871d9e23c450c421a85bb2819f648"
-GNOMEBASEBUILDCLASS = "meson"
inherit gnomebase gobject-introspection gtk-doc
diff --git a/poky/meta/recipes-graphics/harfbuzz/harfbuzz_8.2.1.bb b/poky/meta/recipes-graphics/harfbuzz/harfbuzz_8.3.0.bb
index df41af29f9..d733342682 100644
--- a/poky/meta/recipes-graphics/harfbuzz/harfbuzz_8.2.1.bb
+++ b/poky/meta/recipes-graphics/harfbuzz/harfbuzz_8.3.0.bb
@@ -9,7 +9,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=b98429b8e8e3c2a67cfef01e99e4893d \
"
SRC_URI = "${GITHUB_BASE_URI}/download/${PV}/${BPN}-${PV}.tar.xz"
-SRC_URI[sha256sum] = "0fec78f98c9c8faf228957a201c8846f809452c20f8445eb092a1ba6f22dbea5"
+SRC_URI[sha256sum] = "109501eaeb8bde3eadb25fab4164e993fbace29c3d775bcaa1c1e58e2f15f847"
DEPENDS += "glib-2.0-native"
diff --git a/poky/meta/recipes-graphics/igt-gpu-tools/igt-gpu-tools_git.bb b/poky/meta/recipes-graphics/igt-gpu-tools/igt-gpu-tools_git.bb
index 529b374c7d..90cd09ea70 100644
--- a/poky/meta/recipes-graphics/igt-gpu-tools/igt-gpu-tools_git.bb
+++ b/poky/meta/recipes-graphics/igt-gpu-tools/igt-gpu-tools_git.bb
@@ -24,7 +24,7 @@ PACKAGE_BEFORE_PN = "${PN}-benchmarks ${PN}-tests"
PACKAGECONFIG[chamelium] = "-Dchamelium=enabled,-Dchamelium=disabled,gsl xmlrpc-c"
-EXTRA_OEMESON = "-Ddocs=disabled -Drunner=enabled -Dsrcdir=/usr/src/debug/${PN}/${PV}-${PR}/git/ -Dversion_hash=${PV}"
+EXTRA_OEMESON = "-Ddocs=disabled -Drunner=enabled -Dsrcdir=${TARGET_DBGSRC_DIR}/git/ -Dversion_hash=${PV}"
COMPATIBLE_HOST = "(x86_64.*|i.86.*|arm.*|aarch64).*-linux"
COMPATIBLE_HOST:libc-musl:class-target = "null"
SECURITY_LDFLAGS = "${SECURITY_X_LDFLAGS}"
diff --git a/poky/meta/recipes-graphics/jpeg/libjpeg-turbo_3.0.0.bb b/poky/meta/recipes-graphics/jpeg/libjpeg-turbo_3.0.1.bb
index 146d80008c..132d4b375a 100644
--- a/poky/meta/recipes-graphics/jpeg/libjpeg-turbo_3.0.0.bb
+++ b/poky/meta/recipes-graphics/jpeg/libjpeg-turbo_3.0.1.bb
@@ -10,7 +10,7 @@ DEPENDS:append:x86:class-target = " nasm-native"
SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BPN}-${PV}.tar.gz"
-SRC_URI[sha256sum] = "c77c65fcce3d33417b2e90432e7a0eb05f59a7fff884022a9d931775d583bfaa"
+SRC_URI[sha256sum] = "22429507714ae147b3acacd299e82099fce5d9f456882fc28e252e4579ba2a75"
UPSTREAM_CHECK_URI = "http://sourceforge.net/projects/libjpeg-turbo/files/"
UPSTREAM_CHECK_REGEX = "/libjpeg-turbo/files/(?P<pver>(\d+[\.\-_]*)+)/"
@@ -24,7 +24,7 @@ RCONFLICTS:${PN} += "jpeg"
inherit cmake pkgconfig
-export NASMENV = "--reproducible --debug-prefix-map=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}"
+export NASMENV = "--reproducible --debug-prefix-map=${WORKDIR}=${TARGET_DBGSRC_DIR}"
# Add nasm-native dependency consistently for all build arches is hard
EXTRA_OECMAKE:append:class-native = " -DWITH_SIMD=False"
diff --git a/poky/meta/recipes-graphics/libsdl2/libsdl2_2.28.3.bb b/poky/meta/recipes-graphics/libsdl2/libsdl2_2.28.5.bb
index f866a3618f..fd876df0ad 100644
--- a/poky/meta/recipes-graphics/libsdl2/libsdl2_2.28.3.bb
+++ b/poky/meta/recipes-graphics/libsdl2/libsdl2_2.28.5.bb
@@ -25,7 +25,7 @@ SRC_URI = "http://www.libsdl.org/release/SDL2-${PV}.tar.gz"
S = "${WORKDIR}/SDL2-${PV}"
-SRC_URI[sha256sum] = "7acb8679652701a2504d734e2ba7543ec1a83e310498ddd22fd44bf965eb5518"
+SRC_URI[sha256sum] = "332cb37d0be20cb9541739c61f79bae5a477427d79ae85e352089afdaf6666e4"
inherit cmake lib_package binconfig-disabled pkgconfig upstream-version-is-even
diff --git a/poky/meta/recipes-graphics/libva/libva-initial_2.19.0.bb b/poky/meta/recipes-graphics/libva/libva-initial_2.20.0.bb
index 453096822f..453096822f 100644
--- a/poky/meta/recipes-graphics/libva/libva-initial_2.19.0.bb
+++ b/poky/meta/recipes-graphics/libva/libva-initial_2.20.0.bb
diff --git a/poky/meta/recipes-graphics/libva/libva.inc b/poky/meta/recipes-graphics/libva/libva.inc
index 3388fea32b..486291bced 100644
--- a/poky/meta/recipes-graphics/libva/libva.inc
+++ b/poky/meta/recipes-graphics/libva/libva.inc
@@ -18,7 +18,7 @@ LICENSE = "MIT"
SRC_URI = "${GITHUB_BASE_URI}/download/${PV}/libva-${PV}.tar.bz2"
LIC_FILES_CHKSUM = "file://COPYING;md5=2e48940f94acb0af582e5ef03537800f"
-SRC_URI[sha256sum] = "963be798d559df7feebda6fa81aa0dae6f9409c633a37909c44c6aa8af1e2174"
+SRC_URI[sha256sum] = "f72bdb4f48dfe71ad01f1cbefe069672a2c949a6abd51cf3c4d4784210badc49"
S = "${WORKDIR}/libva-${PV}"
diff --git a/poky/meta/recipes-graphics/libva/libva_2.19.0.bb b/poky/meta/recipes-graphics/libva/libva_2.20.0.bb
index 63dc5af8f2..63dc5af8f2 100644
--- a/poky/meta/recipes-graphics/libva/libva_2.19.0.bb
+++ b/poky/meta/recipes-graphics/libva/libva_2.20.0.bb
diff --git a/poky/meta/recipes-graphics/pango/pango_1.51.0.bb b/poky/meta/recipes-graphics/pango/pango_1.51.0.bb
index 77a1901248..85a0270a3f 100644
--- a/poky/meta/recipes-graphics/pango/pango_1.51.0.bb
+++ b/poky/meta/recipes-graphics/pango/pango_1.51.0.bb
@@ -11,7 +11,6 @@ LICENSE = "LGPL-2.0-or-later"
LIC_FILES_CHKSUM = "file://COPYING;md5=3bf50002aefd002f49e7bb854063f7e7"
-GNOMEBASEBUILDCLASS = "meson"
inherit gnomebase gi-docgen ptest-gnome upstream-version-is-even gobject-introspection
diff --git a/poky/meta/recipes-graphics/shaderc/shaderc_2023.6.bb b/poky/meta/recipes-graphics/shaderc/shaderc_2023.7.bb
index 5afdec5ce9..e4555af6d5 100644
--- a/poky/meta/recipes-graphics/shaderc/shaderc_2023.6.bb
+++ b/poky/meta/recipes-graphics/shaderc/shaderc_2023.7.bb
@@ -6,7 +6,7 @@ HOMEPAGE = "https://github.com/google/shaderc"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
-SRCREV = "9547789ecfa1be140327057e766ba80666b66e21"
+SRCREV = "23cc2d78fd4f866b6ab527886a396bec36948605"
SRC_URI = "git://github.com/google/shaderc.git;protocol=https;branch=main \
file://0001-cmake-disable-building-external-dependencies.patch \
file://0002-libshaderc_util-fix-glslang-header-file-location.patch \
diff --git a/poky/meta/recipes-graphics/spir/spirv-headers_1.3.261.1.bb b/poky/meta/recipes-graphics/spir/spirv-headers_1.3.268.0.bb
index 945f0879f5..7045f70473 100644
--- a/poky/meta/recipes-graphics/spir/spirv-headers_1.3.261.1.bb
+++ b/poky/meta/recipes-graphics/spir/spirv-headers_1.3.268.0.bb
@@ -4,11 +4,12 @@ HOMEPAGE = "https://www.khronos.org/registry/spir-v"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=c938b85bceb8fb26c1a807f28a52ae2d"
-SRCREV = "124a9665e464ef98b8b718d572d5f329311061eb"
+SRCREV = "e867c06631767a2d96424cbec530f9ee5e78180f"
SRC_URI = "git://github.com/KhronosGroup/SPIRV-Headers;protocol=https;branch=main"
PE = "1"
# These recipes need to be updated in lockstep with each other:
# glslang, vulkan-headers, vulkan-loader, vulkan-tools, spirv-headers, spirv-tools
+# vulkan-validation-layers, vulkan-utility-libraries.
# The tags versions should always be sdk-x.y.z, as this is what
# upstream considers a release.
UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P<pver>\d+(\.\d+)+)"
diff --git a/poky/meta/recipes-graphics/spir/spirv-tools_1.3.261.1.bb b/poky/meta/recipes-graphics/spir/spirv-tools_1.3.268.0.bb
index 6904288299..1cccafdad0 100644
--- a/poky/meta/recipes-graphics/spir/spirv-tools_1.3.261.1.bb
+++ b/poky/meta/recipes-graphics/spir/spirv-tools_1.3.268.0.bb
@@ -7,11 +7,12 @@ SECTION = "graphics"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
-SRCREV = "e553b884c7c9febaa4e52334f683641fb5f196a0"
+SRCREV = "360d469b9eac54d6c6e20f609f9ec35e3a5380ad"
SRC_URI = "git://github.com/KhronosGroup/SPIRV-Tools.git;branch=main;protocol=https"
PE = "1"
# These recipes need to be updated in lockstep with each other:
# glslang, vulkan-headers, vulkan-loader, vulkan-tools, spirv-headers, spirv-tools
+# vulkan-validation-layers, vulkan-utility-libraries.
# The tags versions should always be sdk-x.y.z, as this is what
# upstream considers a release.
UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P<pver>\d+(\.\d+)+)"
diff --git a/poky/meta/recipes-graphics/vulkan/vulkan-headers_1.3.261.1.bb b/poky/meta/recipes-graphics/vulkan/vulkan-headers_1.3.268.0.bb
index 01eb14b9fb..a1a83317da 100644
--- a/poky/meta/recipes-graphics/vulkan/vulkan-headers_1.3.261.1.bb
+++ b/poky/meta/recipes-graphics/vulkan/vulkan-headers_1.3.268.0.bb
@@ -11,7 +11,7 @@ LICENSE = "Apache-2.0 & MIT"
LIC_FILES_CHKSUM = "file://LICENSE.md;md5=1bc355d8c4196f774c8b87ed1a8dd625"
SRC_URI = "git://github.com/KhronosGroup/Vulkan-Headers.git;branch=main;protocol=https"
-SRCREV = "85c2334e92e215cce34e8e0ed8b2dce4700f4a50"
+SRCREV = "7b3466a1f47a9251ac1113efbe022ff016e2f95b"
S = "${WORKDIR}/git"
@@ -21,7 +21,8 @@ FILES:${PN} += "${datadir}/vulkan"
RDEPENDS:${PN} += "python3-core"
# These recipes need to be updated in lockstep with each other:
-# glslang, vulkan-headers, vulkan-loader, vulkan-tools, spirv-headers, spirv-tools
+# glslang, vulkan-headers, vulkan-loader, vulkan-tools, spirv-headers, spirv-tools,
+# vulkan-validation-layers, vulkan-utility-libraries.
# The tags versions should always be sdk-x.y.z, as this is what
# upstream considers a release.
UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P<pver>\d+(\.\d+)+)"
diff --git a/poky/meta/recipes-graphics/vulkan/vulkan-loader_1.3.261.1.bb b/poky/meta/recipes-graphics/vulkan/vulkan-loader_1.3.268.0.bb
index 01cbeafa3e..5a5749d40c 100644
--- a/poky/meta/recipes-graphics/vulkan/vulkan-loader_1.3.261.1.bb
+++ b/poky/meta/recipes-graphics/vulkan/vulkan-loader_1.3.268.0.bb
@@ -9,8 +9,8 @@ SECTION = "libs"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=7dbefed23242760aa3475ee42801c5ac"
-SRC_URI = "git://github.com/KhronosGroup/Vulkan-Loader.git;branch=main;protocol=https"
-SRCREV = "afdd025ead2b63b2c73d900ab128a2d3b512cdf0"
+SRC_URI = "git://github.com/KhronosGroup/Vulkan-Loader.git;branch=vulkan-sdk-1.3.268;protocol=https"
+SRCREV = "f4c838e2e7358fc450f8112119bbdbb5b03e03fa"
S = "${WORKDIR}/git"
@@ -36,7 +36,8 @@ PACKAGECONFIG[wayland] = "-DBUILD_WSI_WAYLAND_SUPPORT=ON, -DBUILD_WSI_WAYLAND_SU
RRECOMMENDS:${PN} = "mesa-vulkan-drivers"
# These recipes need to be updated in lockstep with each other:
-# glslang, vulkan-headers, vulkan-loader, vulkan-tools, spirv-headers, spirv-tools
+# glslang, vulkan-headers, vulkan-loader, vulkan-tools, spirv-headers, spirv-tools,
+# vulkan-validation-layers, vulkan-utility-libraries.
# The tags versions should always be sdk-x.y.z, as this is what
# upstream considers a release.
UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P<pver>\d+(\.\d+)+)"
diff --git a/poky/meta/recipes-graphics/vulkan/vulkan-samples/0001-vulkan-samples-Fix-reproducibility-issue.patch b/poky/meta/recipes-graphics/vulkan/vulkan-samples/0001-vulkan-samples-Fix-reproducibility-issue.patch
index 7609011421..c16e05112f 100644
--- a/poky/meta/recipes-graphics/vulkan/vulkan-samples/0001-vulkan-samples-Fix-reproducibility-issue.patch
+++ b/poky/meta/recipes-graphics/vulkan/vulkan-samples/0001-vulkan-samples-Fix-reproducibility-issue.patch
@@ -9,7 +9,7 @@ in the debug source remapping from CFLAGS
We export the right path to use in the recipe with:
-EXTRA_OECMAKE = "-DCMAKE_DEBUG_SRCDIR=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/"
+EXTRA_OECMAKE = "-DCMAKE_DEBUG_SRCDIR=${TARGET_DBGSRC_DIR}/"
and we then patch this into the code instead of the broken use
of CMAKE_SOURCE_DIR since __FILENAME__ will match our path prefix
diff --git a/poky/meta/recipes-graphics/vulkan/vulkan-samples_git.bb b/poky/meta/recipes-graphics/vulkan/vulkan-samples_git.bb
index 66f1ef5e9d..d60c0f3190 100644
--- a/poky/meta/recipes-graphics/vulkan/vulkan-samples_git.bb
+++ b/poky/meta/recipes-graphics/vulkan/vulkan-samples_git.bb
@@ -29,7 +29,7 @@ FILES:${PN} += "${datadir}"
# used for logging with LOGE in the code. We need to make this match the value we use
# in the debug source remapping from CFLAGS
#
-EXTRA_OECMAKE += "-DCMAKE_DEBUG_SRCDIR=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/"
+EXTRA_OECMAKE += "-DCMAKE_DEBUG_SRCDIR=${TARGET_DBGSRC_DIR}/"
# Binaries built with PCH enabled don't appear reproducible, differing results were seen
# from some builds depending on the point the PCH was compiled. Disable it to be
# deterministic
diff --git a/poky/meta/recipes-graphics/vulkan/vulkan-tools_1.3.261.1.bb b/poky/meta/recipes-graphics/vulkan/vulkan-tools_1.3.268.0.bb
index 7a7edc9ebd..78bd9b0e04 100644
--- a/poky/meta/recipes-graphics/vulkan/vulkan-tools_1.3.261.1.bb
+++ b/poky/meta/recipes-graphics/vulkan/vulkan-tools_1.3.268.0.bb
@@ -7,7 +7,7 @@ SECTION = "libs"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3b83ef96387f14655fc854ddc3c6bd57"
SRC_URI = "git://github.com/KhronosGroup/Vulkan-Tools.git;branch=main;protocol=https"
-SRCREV = "a7da7027ca9fd0901639f02619c226da9c6036f1"
+SRCREV = "1532001f7edae559af1988293eec90bc5e2607d5"
S = "${WORKDIR}/git"
@@ -31,6 +31,7 @@ PACKAGECONFIG[wayland] = "-DBUILD_WSI_WAYLAND_SUPPORT=ON, -DBUILD_WSI_WAYLAND_SU
# These recipes need to be updated in lockstep with each other:
# glslang, vulkan-headers, vulkan-loader, vulkan-tools, spirv-headers, spirv-tools
+# vulkan-validation-layers, vulkan-utility-libraries.
# The tags versions should always be sdk-x.y.z, as this is what
# upstream considers a release.
UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P<pver>\d+(\.\d+)+)"
diff --git a/poky/meta/recipes-graphics/vulkan/vulkan-utility-libraries_1.3.268.0.bb b/poky/meta/recipes-graphics/vulkan/vulkan-utility-libraries_1.3.268.0.bb
new file mode 100644
index 0000000000..fee4ba6cc9
--- /dev/null
+++ b/poky/meta/recipes-graphics/vulkan/vulkan-utility-libraries_1.3.268.0.bb
@@ -0,0 +1,33 @@
+SUMMARY = "Vulkan Utility Libraries"
+DESCRIPTION = "Common libraries created to share code across various \
+Vulkan repositories, solving long standing issues for Vulkan SDK \
+developers and users."
+HOMEPAGE = "https://www.khronos.org/vulkan/"
+BUGTRACKER = "https://github.com/KhronosGroup/Vulkan-Utility-Libraries"
+SECTION = "libs"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=4ca2d6799091aaa98a8520f1b793939b"
+
+SRC_URI = "git://github.com/KhronosGroup/Vulkan-Utility-Libraries.git;branch=main;protocol=https"
+SRCREV = "c9ca4ac620a238a93c65d864f2eaa33954d74509"
+
+S = "${WORKDIR}/git"
+
+REQUIRED_DISTRO_FEATURES = "vulkan"
+
+DEPENDS = "vulkan-headers"
+
+EXTRA_OECMAKE = "\
+ -DBUILD_TESTS=OFF \
+ "
+
+inherit cmake features_check pkgconfig
+
+# These recipes need to be updated in lockstep with each other:
+# glslang, vulkan-headers, vulkan-loader, vulkan-tools,
+# vulkan-validation-layers, spirv-headers, spirv-tools,
+# vulkan-utility-libraries.
+# The tags versions should always be sdk-x.y.z, as this is what
+# upstream considers a release.
+UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P<pver>\d+(\.\d+)+)"
diff --git a/poky/meta/recipes-graphics/vulkan/vulkan-validation-layers_1.3.261.1.bb b/poky/meta/recipes-graphics/vulkan/vulkan-validation-layers_1.3.268.0.bb
index 1e2a0acedb..6c2715b041 100644
--- a/poky/meta/recipes-graphics/vulkan/vulkan-validation-layers_1.3.261.1.bb
+++ b/poky/meta/recipes-graphics/vulkan/vulkan-validation-layers_1.3.268.0.bb
@@ -8,14 +8,14 @@ SECTION = "libs"
LICENSE = "Apache-2.0 & MIT"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=cd3c0bc366cd9b6a906e22f0bcb5910f"
-SRC_URI = "git://git@github.com/KhronosGroup/Vulkan-ValidationLayers.git;branch=sdk-1.3.261;protocol=https"
-SRCREV = "628cd310bef6d54b4e6b25b5ac2ed013473409d6"
+SRC_URI = "git://github.com/KhronosGroup/Vulkan-ValidationLayers.git;branch=vulkan-sdk-1.3.268;protocol=https"
+SRCREV = "3c64adb4e052062fc60b6580c365429fddfbcfbf"
S = "${WORKDIR}/git"
REQUIRED_DISTRO_FEATURES = "vulkan"
-DEPENDS = "vulkan-headers vulkan-loader spirv-headers spirv-tools glslang"
+DEPENDS = "vulkan-headers vulkan-loader spirv-headers spirv-tools glslang vulkan-utility-libraries"
# BUILD_TESTS - Not required for OE builds
# USE_ROBIN_HOOD_HASHING - Provides substantial performance improvements on all platforms.
@@ -42,7 +42,8 @@ FILES_SOLIBSDEV = ""
# These recipes need to be updated in lockstep with each other:
# glslang, vulkan-headers, vulkan-loader, vulkan-tools,
-# vulkan-validation-layers, spirv-headers, spirv-tools
+# vulkan-validation-layers, spirv-headers, spirv-tools,
+# vulkan-utility-libraries.
# The tags versions should always be sdk-x.y.z, as this is what
# upstream considers a release.
UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P<pver>\d+(\.\d+)+)"
diff --git a/poky/meta/recipes-graphics/xorg-lib/pixman_0.42.2.bb b/poky/meta/recipes-graphics/xorg-lib/pixman_0.42.2.bb
index 98df6dab21..8a93f8c0fe 100644
--- a/poky/meta/recipes-graphics/xorg-lib/pixman_0.42.2.bb
+++ b/poky/meta/recipes-graphics/xorg-lib/pixman_0.42.2.bb
@@ -41,3 +41,5 @@ EXTRA_OEMESON:append:armv7a = "${@bb.utils.contains("TUNE_FEATURES","neon","","
EXTRA_OEMESON:append:armv7ve = "${@bb.utils.contains("TUNE_FEATURES","neon",""," -Dneon=disabled",d)}"
BBCLASSEXTEND = "native nativesdk"
+
+CVE_STATUS[CVE-2023-37769] = "not-applicable-config: stress-test is an uninstalled test"
diff --git a/poky/meta/recipes-graphics/xorg-lib/xkeyboard-config_2.39.bb b/poky/meta/recipes-graphics/xorg-lib/xkeyboard-config_2.40.bb
index 4795464ac0..5c1f475739 100644
--- a/poky/meta/recipes-graphics/xorg-lib/xkeyboard-config_2.39.bb
+++ b/poky/meta/recipes-graphics/xorg-lib/xkeyboard-config_2.40.bb
@@ -10,10 +10,10 @@ HOMEPAGE = "http://freedesktop.org/wiki/Software/XKeyboardConfig"
BUGTRACKER = "https://bugs.freedesktop.org/enter_bug.cgi?product=xkeyboard-config"
LICENSE = "MIT & MIT"
-LIC_FILES_CHKSUM = "file://COPYING;md5=0e7f21ca7db975c63467d2e7624a12f9"
+LIC_FILES_CHKSUM = "file://COPYING;md5=8fc8ae699974c360e2e2e883a63ce264"
SRC_URI = "${XORG_MIRROR}/individual/data/xkeyboard-config/${BPN}-${PV}.tar.xz"
-SRC_URI[sha256sum] = "5ac5f533eff7b0c116805fe254fd79b2c9882700a4f9f2c070f8c4eae5aaa682"
+SRC_URI[sha256sum] = "7a3dba1bec7dc7191432da021242d17c9cf6c89690e6c57b0de048ff8c9d2ae3"
SECTION = "x11/libs"
DEPENDS = "util-macros libxslt-native"
diff --git a/poky/meta/recipes-graphics/xorg-xserver/xserver-xorg_21.1.8.bb b/poky/meta/recipes-graphics/xorg-xserver/xserver-xorg_21.1.9.bb
index 19db7ea434..43c06181e3 100644
--- a/poky/meta/recipes-graphics/xorg-xserver/xserver-xorg_21.1.8.bb
+++ b/poky/meta/recipes-graphics/xorg-xserver/xserver-xorg_21.1.9.bb
@@ -3,7 +3,7 @@ require xserver-xorg.inc
SRC_URI += "file://0001-xf86pciBus.c-use-Intel-ddx-only-for-pre-gen4-hardwar.patch \
file://0001-Avoid-duplicate-definitions-of-IOPortBase.patch \
"
-SRC_URI[sha256sum] = "38aadb735650c8024ee25211c190bf8aad844c5f59632761ab1ef4c4d5aeb152"
+SRC_URI[sha256sum] = "ff697be2011b4c4966b7806929e51b7a08e9d33800d505305d26d9ccde4b533a"
# These extensions are now integrated into the server, so declare the migration
# path for in-place upgrades.
diff --git a/poky/meta/recipes-graphics/xwayland/xwayland_23.2.1.bb b/poky/meta/recipes-graphics/xwayland/xwayland_23.2.2.bb
index e97a921a96..9feac147db 100644
--- a/poky/meta/recipes-graphics/xwayland/xwayland_23.2.1.bb
+++ b/poky/meta/recipes-graphics/xwayland/xwayland_23.2.2.bb
@@ -10,7 +10,7 @@ LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=5df87950af51ac2c5822094553ea1880"
SRC_URI = "https://www.x.org/archive/individual/xserver/xwayland-${PV}.tar.xz"
-SRC_URI[sha256sum] = "eebc2692c3aa80617d78428bc6ec7b91b254a98214d2a70e997098503cd6ef90"
+SRC_URI[sha256sum] = "9f7c0938d2a41e941ffa04f99c35e5db2bcd3eec034afe8d35d5c810a22eb0a8"
UPSTREAM_CHECK_REGEX = "xwayland-(?P<pver>\d+(\.(?!90\d)\d+)+)\.tar"
diff --git a/poky/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb b/poky/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb
index 3fcfe4b4c3..941160ea9c 100644
--- a/poky/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb
+++ b/poky/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb
@@ -11,7 +11,7 @@ LIC_FILES_CHKSUM = "\
DEPENDS = "git-native"
-SRCREV = "6645d3897cc2eeb1237ee0e2ff5342bd73ee0875"
+SRCREV = "7160ebe8b865dd6028aef278efa219433db93f7e"
PV = "0.3+git"
inherit native
diff --git a/poky/meta/recipes-kernel/kmod/kmod_30.bb b/poky/meta/recipes-kernel/kmod/kmod_31.bb
index 6fc9da9c82..934a678a06 100644
--- a/poky/meta/recipes-kernel/kmod/kmod_30.bb
+++ b/poky/meta/recipes-kernel/kmod/kmod_31.bb
@@ -15,7 +15,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \
"
inherit autotools bash-completion gtk-doc pkgconfig manpages update-alternatives
-SRCREV = "5d46434a63ae0160150a0efdde1914873697e273"
+SRCREV = "aff617ea871d0568cc491bd116c0be1e857463bb"
SRC_URI = "git://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git;branch=master;protocol=https \
file://depmod-search.conf \
diff --git a/poky/meta/recipes-kernel/linux-firmware/linux-firmware_20230804.bb b/poky/meta/recipes-kernel/linux-firmware/linux-firmware_20231030.bb
index 1dbe8374bc..c0394b9b3b 100644
--- a/poky/meta/recipes-kernel/linux-firmware/linux-firmware_20230804.bb
+++ b/poky/meta/recipes-kernel/linux-firmware/linux-firmware_20231030.bb
@@ -12,6 +12,7 @@ LICENSE = "\
& Firmware-amdgpu \
& Firmware-amd-ucode \
& Firmware-amlogic_vdec \
+ & Firmware-amphion_vpu \
& Firmware-atheros_firmware \
& Firmware-atmel \
& Firmware-broadcom_bcm43xx \
@@ -32,6 +33,7 @@ LICENSE = "\
& Firmware-i915 \
& Firmware-ibt_firmware \
& Firmware-ice \
+ & Firmware-ice_enhanced \
& Firmware-it913x \
& Firmware-iwlwifi_firmware \
& Firmware-IntcSST2 \
@@ -39,11 +41,14 @@ LICENSE = "\
& Firmware-linaro \
& Firmware-Lontium \
& Firmware-Marvell \
+ & Firmware-mediatek \
+ & Firmware-microchip \
& Firmware-moxa \
& Firmware-myri10ge_firmware \
& Firmware-netronome \
& Firmware-nvidia \
& Firmware-nxp \
+ & Firmware-nxp_mc_firmware \
& Firmware-OLPC \
& Firmware-ath9k-htc \
& Firmware-phanfw \
@@ -78,6 +83,7 @@ LIC_FILES_CHKSUM = "file://LICENCE.Abilis;md5=b5ee3f410780e56711ad48eadc22b8bc \
file://LICENSE.amdgpu;md5=a2589a05ea5b6bd2b7f4f623c7e7a649 \
file://LICENSE.amd-ucode;md5=6ca90c57f7b248de1e25c7f68ffc4698 \
file://LICENSE.amlogic_vdec;md5=dc44f59bf64a81643e500ad3f39a468a \
+ file://LICENSE.amphion_vpu;md5=2bcdc00527b2d0542bd92b52aaec2b60 \
file://LICENCE.atheros_firmware;md5=30a14c7823beedac9fa39c64fdd01a13 \
file://LICENSE.atmel;md5=aa74ac0c60595dee4d4e239107ea77a3 \
file://LICENCE.broadcom_bcm43xx;md5=3160c14df7228891b868060e1951dfbc \
@@ -99,6 +105,7 @@ LIC_FILES_CHKSUM = "file://LICENCE.Abilis;md5=b5ee3f410780e56711ad48eadc22b8bc \
file://LICENSE.i915;md5=2b0b2e0d20984affd4490ba2cba02570 \
file://LICENCE.ibt_firmware;md5=fdbee1ddfe0fb7ab0b2fcd6b454a366b \
file://LICENSE.ice;md5=742ab4850f2670792940e6d15c974b2f \
+ file://LICENSE.ice_enhanced;md5=f305cfc31b64f95f774f9edd9df0224d \
file://LICENCE.IntcSST2;md5=9e7d8bea77612d7cc7d9e9b54b623062 \
file://LICENCE.it913x;md5=1fbf727bfb6a949810c4dbfa7e6ce4f8 \
file://LICENCE.iwlwifi_firmware;md5=2ce6786e0fc11ac6e36b54bb9b799f1b \
@@ -107,12 +114,14 @@ LIC_FILES_CHKSUM = "file://LICENCE.Abilis;md5=b5ee3f410780e56711ad48eadc22b8bc \
file://LICENSE.Lontium;md5=4ec8dc582ff7295f39e2ca6a7b0be2b6 \
file://LICENCE.Marvell;md5=28b6ed8bd04ba105af6e4dcd6e997772 \
file://LICENCE.mediatek;md5=7c1976b63217d76ce47d0a11d8a79cf2 \
+ file://LICENCE.microchip;md5=db753b00305675dfbf120e3f24a47277 \
file://LICENCE.moxa;md5=1086614767d8ccf744a923289d3d4261 \
file://LICENCE.myri10ge_firmware;md5=42e32fb89f6b959ca222e25ac8df8fed \
file://LICENCE.Netronome;md5=4add08f2577086d44447996503cddf5f \
file://LICENCE.nvidia;md5=4428a922ed3ba2ceec95f076a488ce07 \
file://LICENCE.NXP;md5=58bb8ba632cd729b9ba6183bc6aed36f \
file://LICENSE.nxp;md5=cca321ca1524d6a1e4fed87486cd82dc \
+ file://LICENSE.nxp_mc_firmware;md5=9dc97e4b279b3858cae8879ae2fe5dd7 \
file://LICENCE.OLPC;md5=5b917f9d8c061991be4f6f5f108719cd \
file://LICENCE.open-ath9k-htc-firmware;md5=1b33c9f4d17bc4d457bdb23727046837 \
file://LICENCE.phanfw;md5=954dcec0e051f9409812b561ea743bfa \
@@ -142,7 +151,7 @@ LIC_FILES_CHKSUM = "file://LICENCE.Abilis;md5=b5ee3f410780e56711ad48eadc22b8bc \
"
# WHENCE checksum is defined separately to ease overriding it if
# class-devupstream is selected.
-WHENCE_CHKSUM = "41f9a48bf27971b126a36f9344594dcd"
+WHENCE_CHKSUM = "ceb5248746d24d165b603e71b288cf75"
# These are not common licenses, set NO_GENERIC_LICENSE for them
# so that the license files will be copied from fetched source
@@ -152,6 +161,7 @@ NO_GENERIC_LICENSE[Firmware-agere] = "LICENCE.agere"
NO_GENERIC_LICENSE[Firmware-amdgpu] = "LICENSE.amdgpu"
NO_GENERIC_LICENSE[Firmware-amd-ucode] = "LICENSE.amd-ucode"
NO_GENERIC_LICENSE[Firmware-amlogic_vdec] = "LICENSE.amlogic_vdec"
+NO_GENERIC_LICENSE[Firmware-amphion_vpu] = "LICENSE.amphion_vpu"
NO_GENERIC_LICENSE[Firmware-atheros_firmware] = "LICENCE.atheros_firmware"
NO_GENERIC_LICENSE[Firmware-atmel] = "LICENSE.atmel"
NO_GENERIC_LICENSE[Firmware-broadcom_bcm43xx] = "LICENCE.broadcom_bcm43xx"
@@ -173,6 +183,7 @@ NO_GENERIC_LICENSE[Firmware-hfi1_firmware] = "LICENSE.hfi1_firmware"
NO_GENERIC_LICENSE[Firmware-i915] = "LICENSE.i915"
NO_GENERIC_LICENSE[Firmware-ibt_firmware] = "LICENCE.ibt_firmware"
NO_GENERIC_LICENSE[Firmware-ice] = "LICENSE.ice"
+NO_GENERIC_LICENSE[Firmware-ice_enhanced] = "LICENSE.ice_enhanced"
NO_GENERIC_LICENSE[Firmware-IntcSST2] = "LICENCE.IntcSST2"
NO_GENERIC_LICENSE[Firmware-it913x] = "LICENCE.it913x"
NO_GENERIC_LICENSE[Firmware-iwlwifi_firmware] = "LICENCE.iwlwifi_firmware"
@@ -181,11 +192,13 @@ NO_GENERIC_LICENSE[Firmware-linaro] = "LICENCE.linaro"
NO_GENERIC_LICENSE[Firmware-Lontium] = "LICENSE.Lontium"
NO_GENERIC_LICENSE[Firmware-Marvell] = "LICENCE.Marvell"
NO_GENERIC_LICENSE[Firmware-mediatek] = "LICENCE.mediatek"
+NO_GENERIC_LICENSE[Firmware-microchip] = "LICENCE.microchip"
NO_GENERIC_LICENSE[Firmware-moxa] = "LICENCE.moxa"
NO_GENERIC_LICENSE[Firmware-myri10ge_firmware] = "LICENCE.myri10ge_firmware"
NO_GENERIC_LICENSE[Firmware-netronome] = "LICENCE.Netronome"
NO_GENERIC_LICENSE[Firmware-nvidia] = "LICENCE.nvidia"
NO_GENERIC_LICENSE[Firmware-nxp] = "LICENSE.nxp"
+NO_GENERIC_LICENSE[Firmware-nxp_mc_firmware] = "LICENSE.nxp_mc_firmware"
NO_GENERIC_LICENSE[Firmware-OLPC] = "LICENCE.OLPC"
NO_GENERIC_LICENSE[Firmware-ath9k-htc] = "LICENCE.open-ath9k-htc-firmware"
NO_GENERIC_LICENSE[Firmware-phanfw] = "LICENCE.phanfw"
@@ -224,7 +237,7 @@ SRC_URI:class-devupstream = "git://git.kernel.org/pub/scm/linux/kernel/git/firmw
# Pin this to the 20220509 release, override this in local.conf
SRCREV:class-devupstream ?= "b19cbdca78ab2adfd210c91be15a22568e8b8cae"
-SRC_URI[sha256sum] = "88d46c543847ee3b03404d4941d91c92974690ee1f6fdcbee9cef3e5f97db688"
+SRC_URI[sha256sum] = "c98d200fc4a3120de1a594713ce34e135819dff23e883a4ed387863ba25679c7"
inherit allarch
@@ -240,14 +253,22 @@ do_install() {
}
-PACKAGES =+ "${PN}-ralink-license ${PN}-ralink \
+PACKAGES =+ "${PN}-amphion-vpu-license ${PN}-amphion-vpu \
+ ${PN}-cw1200-license ${PN}-cw1200 \
+ ${PN}-ralink-license ${PN}-ralink \
${PN}-mt7601u-license ${PN}-mt7601u \
+ ${PN}-mt7650-license ${PN}-mt7650 \
+ ${PN}-mt76x2-license ${PN}-mt76x2 \
${PN}-radeon-license ${PN}-radeon \
${PN}-amdgpu-license ${PN}-amdgpu \
${PN}-marvell-license ${PN}-pcie8897 ${PN}-pcie8997 \
+ ${PN}-mediatek-license ${PN}-mediatek \
+ ${PN}-microchip-license ${PN}-microchip \
+ ${PN}-moxa-license ${PN}-moxa \
${PN}-sd8686 ${PN}-sd8688 ${PN}-sd8787 ${PN}-sd8797 ${PN}-sd8801 \
${PN}-sd8887 ${PN}-sd8897 ${PN}-sd8997 ${PN}-usb8997 \
${PN}-ti-connectivity-license ${PN}-wlcommon ${PN}-wl12xx ${PN}-wl18xx \
+ ${PN}-ti-keystone-license ${PN}-ti-keystone \
${PN}-vt6656-license ${PN}-vt6656 \
${PN}-rs9113 ${PN}-rs9116 \
${PN}-rtl-license ${PN}-rtl8188 ${PN}-rtl8192cu ${PN}-rtl8192ce ${PN}-rtl8192su ${PN}-rtl8723 ${PN}-rtl8821 \
@@ -291,7 +312,7 @@ PACKAGES =+ "${PN}-ralink-license ${PN}-ralink \
${PN}-bcm43xx-hdr \
${PN}-cirrus-license ${PN}-cirrus \
${PN}-cnm-license ${PN}-cnm \
- ${PN}-atheros-license ${PN}-ar9170 ${PN}-ath6k ${PN}-ath9k ${PN}-ath3k \
+ ${PN}-atheros-license ${PN}-ar5523 ${PN}-ar9170 ${PN}-ath6k ${PN}-ath9k ${PN}-ath3k \
${PN}-gplv2-license ${PN}-carl9170 \
${PN}-ar3k-license ${PN}-ar3k ${PN}-ath10k-license ${PN}-ath10k ${PN}-ath11k ${PN}-qca \
\
@@ -317,6 +338,7 @@ PACKAGES =+ "${PN}-ralink-license ${PN}-ralink \
${PN}-ibt-misc \
${PN}-i915-license ${PN}-i915 \
${PN}-ice-license ${PN}-ice \
+ ${PN}-ice-enhanced-license ${PN}-ice-enhanced \
${PN}-adsp-sst-license ${PN}-adsp-sst \
${PN}-bnx2-mips \
${PN}-liquidio \
@@ -333,15 +355,21 @@ PACKAGES =+ "${PN}-ralink-license ${PN}-ralink \
${PN}-nxp9098-sdio \
${PN}-nxpiw416-sdio \
${PN}-nxpiw612-sdio \
+ ${PN}-nxp-mc-license ${PN}-nxp-mc \
${PN}-netronome-license ${PN}-netronome \
+ ${PN}-olpc-license ${PN}-olpc \
+ ${PN}-phanfw-license ${PN}-phanfw \
${PN}-qat ${PN}-qat-license \
${PN}-qcom-license ${PN}-qcom-yamato-license \
- ${PN}-qcom-venus-1.8 ${PN}-qcom-venus-4.2 ${PN}-qcom-venus-5.2 ${PN}-qcom-venus-5.4 \
+ ${PN}-qcom-venus-1.8 ${PN}-qcom-venus-4.2 ${PN}-qcom-venus-5.2 ${PN}-qcom-venus-5.4 ${PN}-qcom-venus-6.0 \
${PN}-qcom-vpu-1.0 ${PN}-qcom-vpu-2.0 \
${PN}-qcom-adreno-a2xx ${PN}-qcom-adreno-a3xx ${PN}-qcom-adreno-a4xx ${PN}-qcom-adreno-a530 \
- ${PN}-qcom-adreno-a630 ${PN}-qcom-adreno-a650 ${PN}-qcom-adreno-a660 \
+ ${PN}-qcom-adreno-a630 ${PN}-qcom-adreno-a650 ${PN}-qcom-adreno-a660 ${PN}-qcom-adreno-a702 \
${PN}-qcom-apq8016-modem ${PN}-qcom-apq8016-wifi \
${PN}-qcom-apq8096-adreno ${PN}-qcom-apq8096-audio ${PN}-qcom-apq8096-modem \
+ ${PN}-qcom-qcm2290-adreno ${PN}-qcom-qcm2290-audio ${PN}-qcom-qcm2290-modem ${PN}-qcom-qcm2290-wifi \
+ ${PN}-qcom-qrb4210-adreno ${PN}-qcom-qrb4210-audio ${PN}-qcom-qrb4210-compute \
+ ${PN}-qcom-qrb4210-modem ${PN}-qcom-qrb4210-wifi \
${PN}-qcom-sc8280xp-lenovo-x13s-compat \
${PN}-qcom-sc8280xp-lenovo-x13s-audio \
${PN}-qcom-sc8280xp-lenovo-x13s-adreno \
@@ -350,13 +378,39 @@ PACKAGES =+ "${PN}-ralink-license ${PN}-ralink \
${PN}-qcom-sdm845-adreno ${PN}-qcom-sdm845-audio ${PN}-qcom-sdm845-compute ${PN}-qcom-sdm845-modem \
${PN}-qcom-sdm845-thundercomm-db845c-sensors \
${PN}-qcom-sm8250-adreno ${PN}-qcom-sm8250-audio ${PN}-qcom-sm8250-compute \
+ ${PN}-qcom-sm8250-thundercomm-rb5-sensors \
+ ${PN}-qla2xxx ${PN}-qla2xxx-license \
${PN}-amlogic-vdec-license ${PN}-amlogic-vdec \
${PN}-lt9611uxc ${PN}-lontium-license \
${PN}-whence-license \
+ ${PN}-wl1251-license ${PN}-wl1251 \
+ ${PN}-xc4000-license ${PN}-xc4000 \
+ ${PN}-xc5000-license ${PN}-xc5000 \
+ ${PN}-xc5000c-license ${PN}-xc5000c \
${PN}-license \
"
+# For Amphion VPU
+LICENSE:${PN}-amphion-vpu = "Firmware-amphion_vpu"
+LICENSE:${PN}-amphion-vpu-license = "Firmware-amphion_vpu"
+
+FILES:${PN}-amphion-vpu = "${nonarch_base_libdir}/firmware/amphion/*"
+FILES:${PN}-amphion-vpu-license = " \
+ ${nonarch_base_libdir}/firmware/LICENSE.amphion_vpu \
+"
+RDEPENDS:${PN}-amphion-vpu += "${PN}-amphion-vpu-license"
+
+# For cw1200
+LICENSE:${PN}-cw1200 = "Firmware-cw1200"
+LICENSE:${PN}-cw1200-license = "Firmware-cw1200"
+
+FILES:${PN}-cw1200 = "${nonarch_base_libdir}/firmware/wsm_22.bin"
+FILES:${PN}-cw1200-license = "${nonarch_base_libdir}/firmware/LICENCE.cw1200"
+
+RDEPENDS:${PN}-cw1200 += "${PN}-cw1200-license"
+
# For atheros
+LICENSE:${PN}-ar5523 = "Firmware-atheros_firmware"
LICENSE:${PN}-ar9170 = "Firmware-atheros_firmware"
LICENSE:${PN}-ath3k = "Firmware-atheros_firmware"
LICENSE:${PN}-ath6k = "Firmware-atheros_firmware"
@@ -364,6 +418,9 @@ LICENSE:${PN}-ath9k = "Firmware-atheros_firmware"
LICENSE:${PN}-atheros-license = "Firmware-atheros_firmware"
FILES:${PN}-atheros-license = "${nonarch_base_libdir}/firmware/LICENCE.atheros_firmware"
+FILES:${PN}-ar5523 = " \
+ ${nonarch_base_libdir}/firmware/ar5523.bin \
+"
FILES:${PN}-ar9170 = " \
${nonarch_base_libdir}/firmware/ar9170*.fw \
"
@@ -382,6 +439,7 @@ FILES:${PN}-ath9k = " \
${nonarch_base_libdir}/firmware/ath9k_htc/htc_9271-1.4.0.fw \
"
+RDEPENDS:${PN}-ar5523 += "${PN}-atheros-license"
RDEPENDS:${PN}-ar9170 += "${PN}-atheros-license"
RDEPENDS:${PN}-ath6k += "${PN}-atheros-license"
RDEPENDS:${PN}-ath9k += "${PN}-atheros-license"
@@ -445,11 +503,73 @@ LICENSE:${PN}-mt7601u-license = "Firmware-ralink_a_mediatek_company_firmware"
FILES:${PN}-mt7601u-license = "${nonarch_base_libdir}/firmware/LICENCE.ralink_a_mediatek_company_firmware"
FILES:${PN}-mt7601u = " \
${nonarch_base_libdir}/firmware/mediatek/mt7601u.bin \
+ ${nonarch_base_libdir}/firmware/mt7601u.bin \
"
-
RDEPENDS:${PN}-mt7601u += "${PN}-mt7601u-license"
+# For MediaTek Bluetooth USB driver 7650
+LICENSE:${PN}-mt7650 = "Firmware-ralink_a_mediatek_company_firmware"
+LICENSE:${PN}-mt7650-license = "Firmware-ralink_a_mediatek_company_firmware"
+
+FILES:${PN}-mt7650-license = " \
+ ${nonarch_base_libdir}/firmware/LICENCE.ralink_a_mediatek_company_firmware \
+"
+FILES:${PN}-mt7650 = " \
+ ${nonarch_base_libdir}/firmware/mediatek/mt7650.bin \
+ ${nonarch_base_libdir}/firmware/mt7650.bin \
+"
+RDEPENDS:${PN}-mt7650 += "${PN}-mt7650-license"
+
+# For MediaTek MT76x2 Wireless MACs
+LICENSE:${PN}-mt76x2 = "Firmware-ralink_a_mediatek_company_firmware"
+LICENSE:${PN}-mt76x2-license = "Firmware-ralink_a_mediatek_company_firmware"
+
+FILES:${PN}-mt76x2-license = " \
+ ${nonarch_base_libdir}/firmware/LICENCE.ralink_a_mediatek_company_firmware \
+"
+FILES:${PN}-mt76x2 = " \
+ ${nonarch_base_libdir}/firmware/mediatek/mt7662.bin \
+ ${nonarch_base_libdir}/firmware/mt7662.bin \
+ ${nonarch_base_libdir}/firmware/mediatek/mt7662_rom_patch.bin \
+ ${nonarch_base_libdir}/firmware/mt7662_rom_patch.bin \
+"
+RDEPENDS:${PN}-mt76x2 += "${PN}-mt76x2-license"
+
+# For MediaTek
+LICENSE:${PN}-mediatek = "Firmware-mediatek"
+LICENSE:${PN}-mediatek-license = "Firmware-mediatek"
+
+FILES:${PN}-mediatek = " \
+ ${nonarch_base_libdir}/firmware/mediatek/* \
+ ${nonarch_base_libdir}/firmware/vpu_d.bin \
+ ${nonarch_base_libdir}/firmware/vpu_p.bin \
+"
+FILES:${PN}-mediatek-license = " \
+ ${nonarch_base_libdir}/firmware/LICENCE.mediatek \
+"
+RDEPENDS:${PN}-mediatek += "${PN}-mediatek-license"
+
+# For Microchip
+LICENSE:${PN}-microchip = "Firmware-microchip"
+LICENSE:${PN}-microchip-license = "Firmware-microchip"
+
+FILES:${PN}-microchip = "${nonarch_base_libdir}/firmware/microchip/*"
+FILES:${PN}-microchip-license = " \
+ ${nonarch_base_libdir}/firmware/LICENCE.microchip \
+"
+RDEPENDS:${PN}-microchip += "${PN}-microchip-license"
+
+# For MOXA
+LICENSE:${PN}-moxa = "Firmware-moxa"
+LICENSE:${PN}-moxa-license = "Firmware-moxa"
+
+FILES:${PN}-moxa = "${nonarch_base_libdir}/firmware/moxa"
+FILES:${PN}-moxa-license = "${nonarch_base_libdir}/firmware/LICENCE.moxa"
+
+RDEPENDS:${PN}-moxa += "${PN}-moxa-license"
+
# For radeon
+
LICENSE:${PN}-radeon = "Firmware-radeon"
LICENSE:${PN}-radeon-license = "Firmware-radeon"
@@ -604,6 +724,16 @@ RDEPENDS:${PN}-nxp9098-sdio += "${PN}-nxp9098-common"
RDEPENDS:${PN}-nxpiw416-sdio += "${PN}-nxp-license"
RDEPENDS:${PN}-nxpiw612-sdio += "${PN}-nxp-license"
+# For nxp-mc
+LICENSE:${PN}-nxp-mc = "Firmware-nxp_mc_firmware"
+LICENSE:${PN}-nxp-mc-license = "Firmware-nxp_mc_firmware"
+
+FILES:${PN}-nxp-mc= "${nonarch_base_libdir}/firmware/dpaa2/mc/*"
+FILES:${PN}-nxp-mc-license = " \
+ ${nonarch_base_libdir}/firmware/LICENSE.nxp_mc_firmware \
+"
+RDEPENDS:${PN}-nxp-mc += "${PN}-nxp-mc-license"
+
# For Nvidia
LICENSE:${PN}-nvidia-gpu = "Firmware-nvidia"
LICENSE:${PN}-nvidia-tegra = "Firmware-nvidia"
@@ -626,6 +756,37 @@ RDEPENDS:${PN}-nvidia-gpu += "${PN}-nvidia-license"
RDEPENDS:${PN}-nvidia-tegra += "${PN}-nvidia-license"
RDEPENDS:${PN}-nvidia-tegra-k1 += "${PN}-nvidia-license"
+# For OLPC
+LICENSE:${PN}-olpc = "Firmware-OLPC"
+LICENSE:${PN}-olpc-license = "Firmware-OLPC"
+
+FILES:${PN}-olpc = " \
+ ${nonarch_base_libdir}/firmware/libertas/lbtf_sdio.bin \
+ ${nonarch_base_libdir}/firmware/lbtf_usb.bin \
+ ${nonarch_base_libdir}/firmware/libertas/usb8388_olpc.bin \
+"
+FILES:${PN}-olpc-license = "${nonarch_base_libdir}/firmware/LICENCE.OLPC"
+
+RDEPENDS:${PN}-olpc += "${PN}-olpc-license"
+
+# For phanfw
+LICENSE:${PN}-phanfw = "Firmware-phanfw"
+LICENSE:${PN}-phanfw-license = "Firmware-phanfw"
+
+FILES:${PN}-phanfw = "${nonarch_base_libdir}/firmware/phanfw.bin"
+FILES:${PN}-phanfw-license = "${nonarch_base_libdir}/firmware/LICENCE.phanfw"
+
+RDEPENDS:${PN}-phanfw += "${PN}-phanfw-license"
+
+# For qla2xxx
+LICENSE:${PN}-qla2xxx = "Firmware-qla2xxx"
+LICENSE:${PN}-qla2xxx-license = "Firmware-qla2xxx"
+
+FILES:${PN}-qla2xxx = "${nonarch_base_libdir}/firmware/ql2*"
+FILES:${PN}-qla2xxx-license = "${nonarch_base_libdir}/firmware/LICENCE.qla2xxx"
+
+RDEPENDS:${PN}-qla2xxx += "${PN}-qla2xxx-license"
+
# For RSI RS911x WiFi
LICENSE:${PN}-rs9113 = "WHENCE"
LICENSE:${PN}-rs9116 = "WHENCE"
@@ -668,6 +829,7 @@ FILES:${PN}-rtl8723 = " \
"
FILES:${PN}-rtl8821 = " \
${nonarch_base_libdir}/firmware/rtlwifi/rtl8821*.bin \
+ ${nonarch_base_libdir}/firmware/rtw88/rtw8821*.bin \
"
FILES:${PN}-rtl8761 = " \
${nonarch_base_libdir}/firmware/rtl_bt/rtl8761*.bin \
@@ -691,6 +853,18 @@ RDEPENDS:${PN}-rtl8761 += "${PN}-rtl-license"
RDEPENDS:${PN}-rtl8822 += "${PN}-rtl-license"
RDEPENDS:${PN}-rtl8168 += "${PN}-whence-license"
+# For TI wl1251
+LICENSE:${PN}-wl1251 = "Firmware-wl1251"
+LICENSE:${PN}-wl1251-license = "Firmware-wl1251"
+
+FILES:${PN}-wl1251 = " \
+ ${nonarch_base_libdir}/firmware/ti-connectivity/wl1251-fw.bin \
+ ${nonarch_base_libdir}/firmware/ti-connectivity/wl1251-nvs.bin \
+"
+FILES:${PN}-wl1251-license = "${nonarch_base_libdir}/firmware/LICENCE.wl1251"
+
+RDEPENDS:${PN}-wl1251 += "${PN}-wl1251-license"
+
# For ti-connectivity
LICENSE:${PN}-wlcommon = "Firmware-ti-connectivity"
LICENSE:${PN}-wl12xx = "Firmware-ti-connectivity"
@@ -720,6 +894,16 @@ FILES:${PN}-wl18xx = " \
RDEPENDS:${PN}-wl12xx = "${PN}-ti-connectivity-license ${PN}-wlcommon"
RDEPENDS:${PN}-wl18xx = "${PN}-ti-connectivity-license ${PN}-wlcommon"
+# For ti-keystone
+LICENSE:${PN}-ti-keystone = "Firmware-ti-keystone"
+LICENSE:${PN}-ti-keystone-license = "Firmware-ti-keystone"
+
+FILES:${PN}-ti-keystone = "${nonarch_base_libdir}/firmware/ti-keystone/*"
+FILES:${PN}-ti-keystone-license = " \
+ ${nonarch_base_libdir}/firmware/LICENCE.ti-keystone \
+"
+RDEPENDS:${PN}-ti-keystone += "${PN}-ti-keystone-license"
+
# For vt6656
LICENSE:${PN}-vt6656 = "Firmware-via_vt6656"
LICENSE:${PN}-vt6656-license = "Firmware-via_vt6656"
@@ -731,6 +915,35 @@ FILES:${PN}-vt6656 = " \
RDEPENDS:${PN}-vt6656 = "${PN}-vt6656-license"
+# For xc4000
+LICENSE:${PN}-xc4000 = "Firmware-xc4000"
+LICENSE:${PN}-xc4000-license = "Firmware-xc4000"
+
+FILES:${PN}-xc4000 = "${nonarch_base_libdir}/firmware/dvb-fe-xc4000-1.4.1.fw"
+FILES:${PN}-xc4000-license = "${nonarch_base_libdir}/firmware/LICENCE.xc4000"
+
+RDEPENDS:${PN}-xc4000 += "${PN}-xc4000-license"
+
+# For xc5000
+LICENSE:${PN}-xc5000 = "Firmware-xc5000"
+LICENSE:${PN}-xc5000-license = "Firmware-xc5000"
+
+FILES:${PN}-xc5000 = "${nonarch_base_libdir}/firmware/dvb-fe-xc5000-1.6.114.fw"
+FILES:${PN}-xc5000-license = "${nonarch_base_libdir}/firmware/LICENCE.xc5000"
+
+RDEPENDS:${PN}-xc5000 += "${PN}-xc5000-license"
+
+# For xc5000c
+LICENSE:${PN}-xc5000c = "Firmware-xc5000c"
+LICENSE:${PN}-xc5000c-license = "Firmware-xc5000c"
+
+FILES:${PN}-xc5000c = " \
+ ${nonarch_base_libdir}/firmware/dvb-fe-xc5000c-4.1.30.7.fw \
+"
+FILES:${PN}-xc5000c-license = "${nonarch_base_libdir}/firmware/LICENCE.xc5000c"
+
+RDEPENDS:${PN}-xc5000c += "${PN}-xc5000c-license"
+
# For broadcom
# for i in `grep brcm WHENCE | grep ^File | sed 's/File: brcm.//g'`; do pkg=`echo $i | sed 's/-[sp40].*//g; s/\.bin//g; s/brcmfmac/bcm/g; s/_hdr/-hdr/g; s/BCM/bcm-0bb4-0306/g'`; echo -e " \${PN}-$pkg \\"; done | sort -u
@@ -1053,10 +1266,26 @@ FILES:${PN}-i915-license = "${nonarch_base_libdir}/firmware/LICENSE.i915"
FILES:${PN}-i915 = "${nonarch_base_libdir}/firmware/i915"
RDEPENDS:${PN}-i915 = "${PN}-i915-license"
+# For ice-enhanced
+LICENSE:${PN}-ice-enhanced = "Firmware-ice_enhanced"
+LICENSE:${PN}-ice-enhanced-license = "Firmware-ice_enhanced"
+
+FILES:${PN}-ice-enhanced = " \
+ ${nonarch_base_libdir}/firmware/intel/ice/ddp-comms/* \
+ ${nonarch_base_libdir}/firmware/intel/ice/ddp-wireless_edge/* \
+"
+FILES:${PN}-ice-enhanced-license = " \
+ ${nonarch_base_libdir}/firmware/LICENSE.ice_enhanced \
+"
+RDEPENDS:${PN}-ice-enhanced = "${PN}-ice-enhanced-license"
+
LICENSE:${PN}-ice = "Firmware-ice"
LICENSE:${PN}-ice-license = "Firmware-ice"
FILES:${PN}-ice-license = "${nonarch_base_libdir}/firmware/LICENSE.ice"
-FILES:${PN}-ice = "${nonarch_base_libdir}/firmware/intel/ice"
+FILES:${PN}-ice = " \
+ ${nonarch_base_libdir}/firmware/intel/ice/ddp/* \
+ ${nonarch_base_libdir}/firmware/intel/ice/ddp-lag/* \
+"
RDEPENDS:${PN}-ice = "${PN}-ice-license"
FILES:${PN}-adsp-sst-license = "${nonarch_base_libdir}/firmware/LICENCE.adsp_sst"
@@ -1079,6 +1308,7 @@ LICENSE:${PN}-qcom-venus-1.8 = "Firmware-qcom"
LICENSE:${PN}-qcom-venus-4.2 = "Firmware-qcom"
LICENSE:${PN}-qcom-venus-5.2 = "Firmware-qcom"
LICENSE:${PN}-qcom-venus-5.4 = "Firmware-qcom"
+LICENSE:${PN}-qcom-venus-6.0 = "Firmware-qcom"
LICENSE:${PN}-qcom-vpu-1.0 = "Firmware-qcom"
LICENSE:${PN}-qcom-vpu-2.0 = "Firmware-qcom"
LICENSE:${PN}-qcom-adreno-a2xx = "Firmware-qcom Firmware-qcom-yamato"
@@ -1088,11 +1318,21 @@ LICENSE:${PN}-qcom-adreno-a530 = "Firmware-qcom"
LICENSE:${PN}-qcom-adreno-a630 = "Firmware-qcom"
LICENSE:${PN}-qcom-adreno-a650 = "Firmware-qcom"
LICENSE:${PN}-qcom-adreno-a660 = "Firmware-qcom"
+LICENSE:${PN}-qcom-adreno-a702 = "Firmware-qcom"
LICENSE:${PN}-qcom-apq8016-modem = "Firmware-qcom"
LICENSE:${PN}-qcom-apq8016-wifi = "Firmware-qcom"
LICENSE:${PN}-qcom-apq8096-audio = "Firmware-qcom"
LICENSE:${PN}-qcom-apq8096-adreno = "Firmware-qcom"
LICENSE:${PN}-qcom-apq8096-modem = "Firmware-qcom"
+LICENSE:${PN}-qcom-qcm2290-adreno = "Firmware-qcom"
+LICENSE:${PN}-qcom-qcm2290-audio = "Firmware-qcom"
+LICENSE:${PN}-qcom-qcm2290-modem = "Firmware-qcom"
+LICENSE:${PN}-qcom-qcm2290-wifi = "Firmware-qcom"
+LICENSE:${PN}-qcom-qrb4210-adreno = "Firmware-qcom"
+LICENSE:${PN}-qcom-qrb4210-audio = "Firmware-qcom"
+LICENSE:${PN}-qcom-qrb4210-compute = "Firmware-qcom"
+LICENSE:${PN}-qcom-qrb4210-modem = "Firmware-qcom"
+LICENSE:${PN}-qcom-qrb4210-wifi = "Firmware-qcom"
LICENSE:${PN}-qcom-sc8280xp-lenovo-x13s-audio = "Firmware-qcom & Firmware-linaro"
LICENSE:${PN}-qcom-sc8280xp-lenovo-x13s-adreno = "Firmware-qcom"
LICENSE:${PN}-qcom-sc8280xp-lenovo-x13s-compute = "Firmware-qcom"
@@ -1105,6 +1345,7 @@ LICENSE:${PN}-qcom-sdm845-thundercomm-db845c-sensors = "Firmware-qcom"
LICENSE:${PN}-qcom-sm8250-audio = "Firmware-qcom"
LICENSE:${PN}-qcom-sm8250-adreno = "Firmware-qcom"
LICENSE:${PN}-qcom-sm8250-compute = "Firmware-qcom"
+LICENSE:${PN}-qcom-sm8250-thundercomm-rb5-sensors = "Firmware-qcom"
FILES:${PN}-qcom-license = "${nonarch_base_libdir}/firmware/LICENSE.qcom ${nonarch_base_libdir}/firmware/qcom/NOTICE.txt"
FILES:${PN}-qcom-yamato-license = "${nonarch_base_libdir}/firmware/LICENSE.qcom_yamato"
@@ -1112,6 +1353,7 @@ FILES:${PN}-qcom-venus-1.8 = "${nonarch_base_libdir}/firmware/qcom/venus-1.8/*"
FILES:${PN}-qcom-venus-4.2 = "${nonarch_base_libdir}/firmware/qcom/venus-4.2/*"
FILES:${PN}-qcom-venus-5.2 = "${nonarch_base_libdir}/firmware/qcom/venus-5.2/*"
FILES:${PN}-qcom-venus-5.4 = "${nonarch_base_libdir}/firmware/qcom/venus-5.4/*"
+FILES:${PN}-qcom-venus-6.0 = "${nonarch_base_libdir}/firmware/qcom/venus-6.0/*"
FILES:${PN}-qcom-vpu-1.0 = "${nonarch_base_libdir}/firmware/qcom/vpu-1.0/*"
FILES:${PN}-qcom-vpu-2.0 = "${nonarch_base_libdir}/firmware/qcom/vpu-2.0/*"
FILES:${PN}-qcom-adreno-a2xx = "${nonarch_base_libdir}/firmware/qcom/leia_*.fw ${nonarch_base_libdir}/firmware/qcom/yamato_*.fw"
@@ -1121,29 +1363,41 @@ FILES:${PN}-qcom-adreno-a530 = "${nonarch_base_libdir}/firmware/qcom/a530*.fw*"
FILES:${PN}-qcom-adreno-a630 = "${nonarch_base_libdir}/firmware/qcom/a630*.*"
FILES:${PN}-qcom-adreno-a650 = "${nonarch_base_libdir}/firmware/qcom/a650*.*"
FILES:${PN}-qcom-adreno-a660 = "${nonarch_base_libdir}/firmware/qcom/a660*.*"
+FILES:${PN}-qcom-adreno-a702 = "${nonarch_base_libdir}/firmware/qcom/a702*.*"
FILES:${PN}-qcom-apq8016-modem = "${nonarch_base_libdir}/firmware/qcom/apq8016/mba.mbn ${nonarch_base_libdir}/firmware/qcom/apq8016/modem.mbn"
FILES:${PN}-qcom-apq8016-wifi = "${nonarch_base_libdir}/firmware/qcom/apq8016/wcnss.mbn ${nonarch_base_libdir}/firmware/qcom/apq8016/WCNSS*"
FILES:${PN}-qcom-apq8096-adreno = "${nonarch_base_libdir}/firmware/qcom/apq8096/a530_zap.mbn ${nonarch_base_libdir}/firmware/qcom/a530_zap.mdt"
FILES:${PN}-qcom-apq8096-audio = "${nonarch_base_libdir}/firmware/qcom/apq8096/adsp*.*"
FILES:${PN}-qcom-apq8096-modem = "${nonarch_base_libdir}/firmware/qcom/apq8096/mba.mbn ${nonarch_base_libdir}/firmware/qcom/apq8096/modem*.* ${nonarch_base_libdir}/firmware/qcom/apq8096/wlanmdsp.mbn"
+FILES:${PN}-qcom-qcm2290-adreno = "${nonarch_base_libdir}/firmware/qcom/qcm2290/a702_zap.mbn"
+FILES:${PN}-qcom-qcm2290-audio = "${nonarch_base_libdir}/firmware/qcom/qcm2290/adsp*.*"
+FILES:${PN}-qcom-qcm2290-modem = "${nonarch_base_libdir}/firmware/qcom/qcm2290/modem*.*"
+FILES:${PN}-qcom-qcm2290-wifi = "${nonarch_base_libdir}/firmware/qcom/qcm2290/wlanmdsp.mbn"
+FILES:${PN}-qcom-qrb4210-adreno = "${nonarch_base_libdir}/firmware/qcom/qrb4210/a610_zap.mbn"
+FILES:${PN}-qcom-qrb4210-audio = "${nonarch_base_libdir}/firmware/qcom/qrb4210/adsp*.*"
+FILES:${PN}-qcom-qrb4210-compute = "${nonarch_base_libdir}/firmware/qcom/qrb4210/cdsp*.*"
+FILES:${PN}-qcom-qrb4210-modem = "${nonarch_base_libdir}/firmware/qcom/qrb4210/modem*.*"
+FILES:${PN}-qcom-qrb4210-wifi = "${nonarch_base_libdir}/firmware/qcom/qrb4210/wlanmdsp.mbn"
FILES:${PN}-qcom-sc8280xp-lenovo-x13s-compat = "${nonarch_base_libdir}/firmware/qcom/LENOVO/21BX"
-FILES:${PN}-qcom-sc8280xp-lenovo-x13s-audio = "${nonarch_base_libdir}/firmware/qcom/sc8280xp/LENOVO/21BX/*adsp*.* ${nonarch_base_libdir}/firmware/qcom/sc8280xp/LENOVO/21BX/battmgr.jsn ${nonarch_base_libdir}/firmware/qcom/sc8280xp/LENOVO/21BX/audioreach-tplg.bin"
+FILES:${PN}-qcom-sc8280xp-lenovo-x13s-audio = "${nonarch_base_libdir}/firmware/qcom/sc8280xp/LENOVO/21BX/*adsp*.* ${nonarch_base_libdir}/firmware/qcom/sc8280xp/LENOVO/21BX/battmgr.jsn ${nonarch_base_libdir}/firmware/qcom/sc8280xp/LENOVO/21BX/audioreach-tplg.bin ${nonarch_base_libdir}/firmware/qcom/sc8280xp/SC8280XP-LENOVO-X13S-tplg.bin"
FILES:${PN}-qcom-sc8280xp-lenovo-x13s-adreno = "${nonarch_base_libdir}/firmware/qcom/sc8280xp/LENOVO/21BX/qcdxkmsuc8280.mbn"
FILES:${PN}-qcom-sc8280xp-lenovo-x13s-compute = "${nonarch_base_libdir}/firmware/qcom/sc8280xp/LENOVO/21BX/*cdsp*.*"
FILES:${PN}-qcom-sc8280xp-lenovo-x13s-sensors = "${nonarch_base_libdir}/firmware/qcom/sc8280xp/LENOVO/21BX/*slpi*.*"
FILES:${PN}-qcom-sdm845-adreno = "${nonarch_base_libdir}/firmware/qcom/sdm845/a630*.*"
FILES:${PN}-qcom-sdm845-audio = "${nonarch_base_libdir}/firmware/qcom/sdm845/adsp*.*"
FILES:${PN}-qcom-sdm845-compute = "${nonarch_base_libdir}/firmware/qcom/sdm845/cdsp*.*"
-FILES:${PN}-qcom-sdm845-modem = "${nonarch_base_libdir}/firmware/qcom/sdm845/mba.mbn ${nonarch_base_libdir}/firmware/qcom/sdm845/modem*.* ${nonarch_base_libdir}/firmware/qcom/sdm845/wlanmdsp.mbn"
+FILES:${PN}-qcom-sdm845-modem = "${nonarch_base_libdir}/firmware/qcom/sdm845/mba.mbn ${nonarch_base_libdir}/firmware/qcom/sdm845/modem*.* ${nonarch_base_libdir}/firmware/qcom/sdm845/wlanmdsp.mbn ${nonarch_base_libdir}/firmware/qcom/sdm845/notice.txt_wlanmdsp"
FILES:${PN}-qcom-sdm845-thundercomm-db845c-sensors = "${nonarch_base_libdir}/firmware/qcom/sdm845/Thundercomm/db845c/slpi*.*"
FILES:${PN}-qcom-sm8250-adreno = "${nonarch_base_libdir}/firmware/qcom/sm8250/a650*.*"
FILES:${PN}-qcom-sm8250-audio = "${nonarch_base_libdir}/firmware/qcom/sm8250/adsp*.*"
FILES:${PN}-qcom-sm8250-compute = "${nonarch_base_libdir}/firmware/qcom/sm8250/cdsp*.*"
+FILES:${PN}-qcom-sm8250-thundercomm-rb5-sensors = "${nonarch_base_libdir}/firmware/qcom/sm8250/Thundercomm/RB5/slpi*.*"
RDEPENDS:${PN}-qcom-venus-1.8 = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-venus-4.2 = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-venus-5.2 = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-venus-5.4 = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-venus-6.0 = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-vpu-1.0 = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-vpu-2.0 = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-adreno-a2xx = "${PN}-qcom-license ${PN}-qcom-yamato-license"
@@ -1153,20 +1407,34 @@ RDEPENDS:${PN}-qcom-adreno-a530 = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-adreno-a630 = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-adreno-a650 = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-adreno-a660 = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-adreno-a702 = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-apq8016-modem = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-apq8016-wifi = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-apq8096-adreno = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-apq8096-audio = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-apq8096-modem = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-qcm2290-adreno = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-qcm2290-audio = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-qcm2290-modem = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-qcm2290-wifi = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-qrb4210-adreno = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-qrb4210-audio = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-qrb4210-compute = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-qrb4210-modem = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-qrb4210-wifi = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-sc8280xp-lenovo-x13s-audio = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-sc8280xp-lenovo-x13s-adreno = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-sc8280xp-lenovo-x13s-compute = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-sc8280xp-lenovo-x13s-sensors = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-sdm845-adreno = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-sdm845-audio = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-sdm845-compute = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-sdm845-modem = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-sdm845-thundercomm-db845c-sensors = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-sm8250-adreno = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-sm8250-audio = "${PN}-qcom-license"
RDEPENDS:${PN}-qcom-sm8250-compute = "${PN}-qcom-license"
+RDEPENDS:${PN}-qcom-sm8250-thundercomm-rb5-sensors = "${PN}-qcom-license"
RRECOMMENDS:${PN}-qcom-sc8280xp-lenovo-x13s-audio = "${PN}-qcom-sc8280xp-lenovo-x13s-compat"
RRECOMMENDS:${PN}-qcom-sc8280xp-lenovo-x13s-adreno = "${PN}-qcom-sc8280xp-lenovo-x13s-compat"
diff --git a/poky/meta/recipes-kernel/linux/cve-exclusion_6.1.inc b/poky/meta/recipes-kernel/linux/cve-exclusion_6.1.inc
index 88c7e4589a..1216e0c2dd 100644
--- a/poky/meta/recipes-kernel/linux/cve-exclusion_6.1.inc
+++ b/poky/meta/recipes-kernel/linux/cve-exclusion_6.1.inc
@@ -1,9 +1,9 @@
# Auto-generated CVE metadata, DO NOT EDIT BY HAND.
-# Generated at 2023-09-30 07:26:16.988526+00:00 for version 6.1.55
+# Generated at 2023-11-09 17:12:27.365962+00:00 for version 6.1.61
python check_kernel_cve_status_version() {
- this_version = "6.1.55"
+ this_version = "6.1.61"
kernel_version = d.getVar("LINUX_VERSION")
if kernel_version != this_version:
bb.warn("Kernel CVE status needs updating: generated for %s but kernel is %s" % (this_version, kernel_version))
@@ -3354,7 +3354,7 @@ CVE_STATUS[CVE-2020-27194] = "fixed-version: Fixed from version 5.9"
CVE_STATUS[CVE-2020-2732] = "fixed-version: Fixed from version 5.6rc4"
-# CVE-2020-27418 has no known resolution
+CVE_STATUS[CVE-2020-27418] = "fixed-version: Fixed from version 5.6rc5"
CVE_STATUS[CVE-2020-27673] = "fixed-version: Fixed from version 5.10rc1"
@@ -4644,7 +4644,7 @@ CVE_STATUS[CVE-2023-1118] = "cpe-stable-backport: Backported in 6.1.16"
CVE_STATUS[CVE-2023-1192] = "cpe-stable-backport: Backported in 6.1.33"
-# CVE-2023-1193 has no known resolution
+# CVE-2023-1193 needs backporting (fixed from 6.3rc6)
CVE_STATUS[CVE-2023-1194] = "cpe-stable-backport: Backported in 6.1.34"
@@ -4856,7 +4856,7 @@ CVE_STATUS[CVE-2023-3106] = "fixed-version: Fixed from version 4.8rc7"
# CVE-2023-31084 needs backporting (fixed from 6.4rc3)
-# CVE-2023-31085 has no known resolution
+CVE_STATUS[CVE-2023-31085] = "cpe-stable-backport: Backported in 6.1.57"
CVE_STATUS[CVE-2023-3111] = "fixed-version: Fixed from version 6.0rc2"
@@ -4936,6 +4936,8 @@ CVE_STATUS[CVE-2023-34256] = "cpe-stable-backport: Backported in 6.1.29"
CVE_STATUS[CVE-2023-34319] = "cpe-stable-backport: Backported in 6.1.44"
+CVE_STATUS[CVE-2023-34324] = "cpe-stable-backport: Backported in 6.1.57"
+
CVE_STATUS[CVE-2023-3439] = "fixed-version: Fixed from version 5.18rc5"
CVE_STATUS[CVE-2023-35001] = "cpe-stable-backport: Backported in 6.1.39"
@@ -4952,7 +4954,7 @@ CVE_STATUS[CVE-2023-35824] = "cpe-stable-backport: Backported in 6.1.28"
CVE_STATUS[CVE-2023-35826] = "cpe-stable-backport: Backported in 6.1.28"
-# CVE-2023-35827 has no known resolution
+CVE_STATUS[CVE-2023-35827] = "cpe-stable-backport: Backported in 6.1.59"
CVE_STATUS[CVE-2023-35828] = "cpe-stable-backport: Backported in 6.1.28"
@@ -5004,6 +5006,16 @@ CVE_STATUS[CVE-2023-3866] = "cpe-stable-backport: Backported in 6.1.36"
CVE_STATUS[CVE-2023-3867] = "cpe-stable-backport: Backported in 6.1.40"
+CVE_STATUS[CVE-2023-39189] = "cpe-stable-backport: Backported in 6.1.54"
+
+# CVE-2023-39191 needs backporting (fixed from 6.3rc1)
+
+CVE_STATUS[CVE-2023-39192] = "cpe-stable-backport: Backported in 6.1.53"
+
+CVE_STATUS[CVE-2023-39193] = "cpe-stable-backport: Backported in 6.1.53"
+
+CVE_STATUS[CVE-2023-39194] = "cpe-stable-backport: Backported in 6.1.47"
+
CVE_STATUS[CVE-2023-4004] = "cpe-stable-backport: Backported in 6.1.42"
# CVE-2023-4010 has no known resolution
@@ -5012,6 +5024,8 @@ CVE_STATUS[CVE-2023-4015] = "cpe-stable-backport: Backported in 6.1.43"
CVE_STATUS[CVE-2023-40283] = "cpe-stable-backport: Backported in 6.1.45"
+CVE_STATUS[CVE-2023-40791] = "fixed-version: only affects 6.3rc1 onwards"
+
CVE_STATUS[CVE-2023-4128] = "cpe-stable-backport: Backported in 6.1.45"
CVE_STATUS[CVE-2023-4132] = "cpe-stable-backport: Backported in 6.1.39"
@@ -5032,7 +5046,7 @@ CVE_STATUS[CVE-2023-4207] = "cpe-stable-backport: Backported in 6.1.45"
CVE_STATUS[CVE-2023-4208] = "cpe-stable-backport: Backported in 6.1.45"
-# CVE-2023-4244 needs backporting (fixed from 6.5rc7)
+CVE_STATUS[CVE-2023-4244] = "cpe-stable-backport: Backported in 6.1.56"
CVE_STATUS[CVE-2023-4273] = "cpe-stable-backport: Backported in 6.1.45"
@@ -5040,8 +5054,12 @@ CVE_STATUS[CVE-2023-42752] = "cpe-stable-backport: Backported in 6.1.53"
CVE_STATUS[CVE-2023-42753] = "cpe-stable-backport: Backported in 6.1.53"
+CVE_STATUS[CVE-2023-42754] = "cpe-stable-backport: Backported in 6.1.56"
+
CVE_STATUS[CVE-2023-42755] = "cpe-stable-backport: Backported in 6.1.55"
+CVE_STATUS[CVE-2023-42756] = "fixed-version: only affects 6.4rc6 onwards"
+
CVE_STATUS[CVE-2023-4385] = "fixed-version: Fixed from version 5.19rc1"
CVE_STATUS[CVE-2023-4387] = "fixed-version: Fixed from version 5.18"
@@ -5050,23 +5068,53 @@ CVE_STATUS[CVE-2023-4389] = "fixed-version: Fixed from version 5.18rc3"
CVE_STATUS[CVE-2023-4394] = "fixed-version: Fixed from version 6.0rc3"
+CVE_STATUS[CVE-2023-44466] = "cpe-stable-backport: Backported in 6.1.40"
+
CVE_STATUS[CVE-2023-4459] = "fixed-version: Fixed from version 5.18"
-# CVE-2023-4563 needs backporting (fixed from 6.5rc6)
+CVE_STATUS[CVE-2023-4563] = "cpe-stable-backport: Backported in 6.1.56"
CVE_STATUS[CVE-2023-4569] = "cpe-stable-backport: Backported in 6.1.47"
+CVE_STATUS[CVE-2023-45862] = "cpe-stable-backport: Backported in 6.1.18"
+
+CVE_STATUS[CVE-2023-45863] = "cpe-stable-backport: Backported in 6.1.16"
+
+CVE_STATUS[CVE-2023-45871] = "cpe-stable-backport: Backported in 6.1.53"
+
+CVE_STATUS[CVE-2023-45898] = "fixed-version: only affects 6.5rc1 onwards"
+
+# CVE-2023-4610 needs backporting (fixed from 6.4)
+
CVE_STATUS[CVE-2023-4611] = "fixed-version: only affects 6.4rc1 onwards"
# CVE-2023-4622 needs backporting (fixed from 6.5rc1)
CVE_STATUS[CVE-2023-4623] = "cpe-stable-backport: Backported in 6.1.53"
+CVE_STATUS[CVE-2023-46813] = "cpe-stable-backport: Backported in 6.1.60"
+
+CVE_STATUS[CVE-2023-46862] = "cpe-stable-backport: Backported in 6.1.61"
+
+# CVE-2023-47233 has no known resolution
+
+CVE_STATUS[CVE-2023-4732] = "fixed-version: Fixed from version 5.14rc1"
+
CVE_STATUS[CVE-2023-4881] = "cpe-stable-backport: Backported in 6.1.54"
CVE_STATUS[CVE-2023-4921] = "cpe-stable-backport: Backported in 6.1.54"
-# CVE-2023-5158 has no known resolution
+# CVE-2023-5090 needs backporting (fixed from 6.6rc7)
+
+CVE_STATUS[CVE-2023-5158] = "cpe-stable-backport: Backported in 6.1.57"
+
+CVE_STATUS[CVE-2023-5178] = "cpe-stable-backport: Backported in 6.1.60"
+
+CVE_STATUS[CVE-2023-5197] = "cpe-stable-backport: Backported in 6.1.56"
+
+CVE_STATUS[CVE-2023-5345] = "cpe-stable-backport: Backported in 6.1.56"
+
+# CVE-2023-5633 needs backporting (fixed from 6.6rc6)
-# CVE-2023-5197 needs backporting (fixed from 6.6rc3)
+CVE_STATUS[CVE-2023-5717] = "cpe-stable-backport: Backported in 6.1.60"
diff --git a/poky/meta/recipes-kernel/linux/cve-exclusion_6.4.inc b/poky/meta/recipes-kernel/linux/cve-exclusion_6.4.inc
deleted file mode 100644
index eacb706a49..0000000000
--- a/poky/meta/recipes-kernel/linux/cve-exclusion_6.4.inc
+++ /dev/null
@@ -1,5072 +0,0 @@
-
-# Auto-generated CVE metadata, DO NOT EDIT BY HAND.
-# Generated at 2023-09-30 07:24:59.900581+00:00 for version 6.4.16
-
-python check_kernel_cve_status_version() {
- this_version = "6.4.16"
- kernel_version = d.getVar("LINUX_VERSION")
- if kernel_version != this_version:
- bb.warn("Kernel CVE status needs updating: generated for %s but kernel is %s" % (this_version, kernel_version))
-}
-do_cve_check[prefuncs] += "check_kernel_cve_status_version"
-
-CVE_STATUS[CVE-2003-1604] = "fixed-version: Fixed from version 2.6.12rc2"
-
-CVE_STATUS[CVE-2004-0230] = "fixed-version: Fixed from version 3.6rc1"
-
-# CVE-2005-3660 has no known resolution
-
-CVE_STATUS[CVE-2006-3635] = "fixed-version: Fixed from version 2.6.26rc5"
-
-CVE_STATUS[CVE-2006-5331] = "fixed-version: Fixed from version 2.6.19rc3"
-
-CVE_STATUS[CVE-2006-6128] = "fixed-version: Fixed from version 2.6.19rc2"
-
-# CVE-2007-3719 has no known resolution
-
-CVE_STATUS[CVE-2007-4774] = "fixed-version: Fixed from version 2.6.12rc2"
-
-CVE_STATUS[CVE-2007-6761] = "fixed-version: Fixed from version 2.6.24rc6"
-
-CVE_STATUS[CVE-2007-6762] = "fixed-version: Fixed from version 2.6.20rc5"
-
-# CVE-2008-2544 has no known resolution
-
-# CVE-2008-4609 has no known resolution
-
-CVE_STATUS[CVE-2008-7316] = "fixed-version: Fixed from version 2.6.25rc1"
-
-CVE_STATUS[CVE-2009-2692] = "fixed-version: Fixed from version 2.6.31rc6"
-
-CVE_STATUS[CVE-2010-0008] = "fixed-version: Fixed from version 2.6.23rc9"
-
-CVE_STATUS[CVE-2010-3432] = "fixed-version: Fixed from version 2.6.36rc5"
-
-# CVE-2010-4563 has no known resolution
-
-CVE_STATUS[CVE-2010-4648] = "fixed-version: Fixed from version 2.6.37rc6"
-
-CVE_STATUS[CVE-2010-5313] = "fixed-version: Fixed from version 2.6.38rc1"
-
-# CVE-2010-5321 has no known resolution
-
-CVE_STATUS[CVE-2010-5328] = "fixed-version: Fixed from version 2.6.35rc1"
-
-CVE_STATUS[CVE-2010-5329] = "fixed-version: Fixed from version 2.6.39rc1"
-
-CVE_STATUS[CVE-2010-5331] = "fixed-version: Fixed from version 2.6.34rc7"
-
-CVE_STATUS[CVE-2010-5332] = "fixed-version: Fixed from version 2.6.37rc1"
-
-CVE_STATUS[CVE-2011-4098] = "fixed-version: Fixed from version 3.2rc1"
-
-CVE_STATUS[CVE-2011-4131] = "fixed-version: Fixed from version 3.3rc1"
-
-CVE_STATUS[CVE-2011-4915] = "fixed-version: Fixed from version 3.2rc1"
-
-# CVE-2011-4916 has no known resolution
-
-# CVE-2011-4917 has no known resolution
-
-CVE_STATUS[CVE-2011-5321] = "fixed-version: Fixed from version 3.2rc1"
-
-CVE_STATUS[CVE-2011-5327] = "fixed-version: Fixed from version 3.1rc1"
-
-CVE_STATUS[CVE-2012-0957] = "fixed-version: Fixed from version 3.7rc2"
-
-CVE_STATUS[CVE-2012-2119] = "fixed-version: Fixed from version 3.5rc1"
-
-CVE_STATUS[CVE-2012-2136] = "fixed-version: Fixed from version 3.5rc1"
-
-CVE_STATUS[CVE-2012-2137] = "fixed-version: Fixed from version 3.5rc2"
-
-CVE_STATUS[CVE-2012-2313] = "fixed-version: Fixed from version 3.4rc6"
-
-CVE_STATUS[CVE-2012-2319] = "fixed-version: Fixed from version 3.4rc6"
-
-CVE_STATUS[CVE-2012-2372] = "fixed-version: Fixed from version 3.13rc4"
-
-CVE_STATUS[CVE-2012-2375] = "fixed-version: Fixed from version 3.4rc1"
-
-CVE_STATUS[CVE-2012-2390] = "fixed-version: Fixed from version 3.5rc1"
-
-CVE_STATUS[CVE-2012-2669] = "fixed-version: Fixed from version 3.5rc4"
-
-CVE_STATUS[CVE-2012-2744] = "fixed-version: Fixed from version 2.6.34rc1"
-
-CVE_STATUS[CVE-2012-2745] = "fixed-version: Fixed from version 3.4rc3"
-
-CVE_STATUS[CVE-2012-3364] = "fixed-version: Fixed from version 3.5rc6"
-
-CVE_STATUS[CVE-2012-3375] = "fixed-version: Fixed from version 3.4rc5"
-
-CVE_STATUS[CVE-2012-3400] = "fixed-version: Fixed from version 3.5rc5"
-
-CVE_STATUS[CVE-2012-3412] = "fixed-version: Fixed from version 3.6rc2"
-
-CVE_STATUS[CVE-2012-3430] = "fixed-version: Fixed from version 3.6rc1"
-
-CVE_STATUS[CVE-2012-3510] = "fixed-version: Fixed from version 2.6.19rc4"
-
-CVE_STATUS[CVE-2012-3511] = "fixed-version: Fixed from version 3.5rc6"
-
-CVE_STATUS[CVE-2012-3520] = "fixed-version: Fixed from version 3.6rc3"
-
-CVE_STATUS[CVE-2012-3552] = "fixed-version: Fixed from version 3.0rc1"
-
-# Skipping CVE-2012-4220, no affected_versions
-
-# Skipping CVE-2012-4221, no affected_versions
-
-# Skipping CVE-2012-4222, no affected_versions
-
-CVE_STATUS[CVE-2012-4398] = "fixed-version: Fixed from version 3.4rc1"
-
-CVE_STATUS[CVE-2012-4444] = "fixed-version: Fixed from version 2.6.36rc4"
-
-CVE_STATUS[CVE-2012-4461] = "fixed-version: Fixed from version 3.7rc6"
-
-CVE_STATUS[CVE-2012-4467] = "fixed-version: Fixed from version 3.6rc5"
-
-CVE_STATUS[CVE-2012-4508] = "fixed-version: Fixed from version 3.7rc3"
-
-CVE_STATUS[CVE-2012-4530] = "fixed-version: Fixed from version 3.8rc1"
-
-# CVE-2012-4542 has no known resolution
-
-CVE_STATUS[CVE-2012-4565] = "fixed-version: Fixed from version 3.7rc4"
-
-CVE_STATUS[CVE-2012-5374] = "fixed-version: Fixed from version 3.8rc1"
-
-CVE_STATUS[CVE-2012-5375] = "fixed-version: Fixed from version 3.8rc1"
-
-CVE_STATUS[CVE-2012-5517] = "fixed-version: Fixed from version 3.6rc1"
-
-CVE_STATUS[CVE-2012-6536] = "fixed-version: Fixed from version 3.6rc7"
-
-CVE_STATUS[CVE-2012-6537] = "fixed-version: Fixed from version 3.6rc7"
-
-CVE_STATUS[CVE-2012-6538] = "fixed-version: Fixed from version 3.6rc7"
-
-CVE_STATUS[CVE-2012-6539] = "fixed-version: Fixed from version 3.6rc3"
-
-CVE_STATUS[CVE-2012-6540] = "fixed-version: Fixed from version 3.6rc3"
-
-CVE_STATUS[CVE-2012-6541] = "fixed-version: Fixed from version 3.6rc3"
-
-CVE_STATUS[CVE-2012-6542] = "fixed-version: Fixed from version 3.6rc3"
-
-CVE_STATUS[CVE-2012-6543] = "fixed-version: Fixed from version 3.6rc3"
-
-CVE_STATUS[CVE-2012-6544] = "fixed-version: Fixed from version 3.6rc3"
-
-CVE_STATUS[CVE-2012-6545] = "fixed-version: Fixed from version 3.6rc3"
-
-CVE_STATUS[CVE-2012-6546] = "fixed-version: Fixed from version 3.6rc3"
-
-CVE_STATUS[CVE-2012-6547] = "fixed-version: Fixed from version 3.6rc1"
-
-CVE_STATUS[CVE-2012-6548] = "fixed-version: Fixed from version 3.6rc1"
-
-CVE_STATUS[CVE-2012-6549] = "fixed-version: Fixed from version 3.6rc1"
-
-CVE_STATUS[CVE-2012-6638] = "fixed-version: Fixed from version 3.3rc1"
-
-CVE_STATUS[CVE-2012-6647] = "fixed-version: Fixed from version 3.6rc2"
-
-CVE_STATUS[CVE-2012-6657] = "fixed-version: Fixed from version 3.6"
-
-CVE_STATUS[CVE-2012-6689] = "fixed-version: Fixed from version 3.6rc5"
-
-CVE_STATUS[CVE-2012-6701] = "fixed-version: Fixed from version 3.5rc1"
-
-CVE_STATUS[CVE-2012-6703] = "fixed-version: Fixed from version 3.7rc1"
-
-CVE_STATUS[CVE-2012-6704] = "fixed-version: Fixed from version 3.5rc1"
-
-CVE_STATUS[CVE-2012-6712] = "fixed-version: Fixed from version 3.4rc1"
-
-CVE_STATUS[CVE-2013-0160] = "fixed-version: Fixed from version 3.9rc1"
-
-CVE_STATUS[CVE-2013-0190] = "fixed-version: Fixed from version 3.8rc5"
-
-CVE_STATUS[CVE-2013-0216] = "fixed-version: Fixed from version 3.8rc7"
-
-CVE_STATUS[CVE-2013-0217] = "fixed-version: Fixed from version 3.8rc7"
-
-CVE_STATUS[CVE-2013-0228] = "fixed-version: Fixed from version 3.8"
-
-CVE_STATUS[CVE-2013-0231] = "fixed-version: Fixed from version 3.8rc7"
-
-CVE_STATUS[CVE-2013-0268] = "fixed-version: Fixed from version 3.8rc6"
-
-CVE_STATUS[CVE-2013-0290] = "fixed-version: Fixed from version 3.8"
-
-CVE_STATUS[CVE-2013-0309] = "fixed-version: Fixed from version 3.7rc1"
-
-CVE_STATUS[CVE-2013-0310] = "fixed-version: Fixed from version 3.5"
-
-CVE_STATUS[CVE-2013-0311] = "fixed-version: Fixed from version 3.7rc8"
-
-CVE_STATUS[CVE-2013-0313] = "fixed-version: Fixed from version 3.8rc5"
-
-CVE_STATUS[CVE-2013-0343] = "fixed-version: Fixed from version 3.11rc7"
-
-CVE_STATUS[CVE-2013-0349] = "fixed-version: Fixed from version 3.8rc6"
-
-CVE_STATUS[CVE-2013-0871] = "fixed-version: Fixed from version 3.8rc5"
-
-CVE_STATUS[CVE-2013-0913] = "fixed-version: Fixed from version 3.9rc4"
-
-CVE_STATUS[CVE-2013-0914] = "fixed-version: Fixed from version 3.9rc3"
-
-CVE_STATUS[CVE-2013-1059] = "fixed-version: Fixed from version 3.11rc1"
-
-CVE_STATUS[CVE-2013-1763] = "fixed-version: Fixed from version 3.9rc1"
-
-CVE_STATUS[CVE-2013-1767] = "fixed-version: Fixed from version 3.9rc1"
-
-CVE_STATUS[CVE-2013-1772] = "fixed-version: Fixed from version 3.5rc1"
-
-CVE_STATUS[CVE-2013-1773] = "fixed-version: Fixed from version 3.3rc1"
-
-CVE_STATUS[CVE-2013-1774] = "fixed-version: Fixed from version 3.8rc5"
-
-CVE_STATUS[CVE-2013-1792] = "fixed-version: Fixed from version 3.9rc3"
-
-CVE_STATUS[CVE-2013-1796] = "fixed-version: Fixed from version 3.9rc4"
-
-CVE_STATUS[CVE-2013-1797] = "fixed-version: Fixed from version 3.9rc4"
-
-CVE_STATUS[CVE-2013-1798] = "fixed-version: Fixed from version 3.9rc4"
-
-CVE_STATUS[CVE-2013-1819] = "fixed-version: Fixed from version 3.8rc6"
-
-CVE_STATUS[CVE-2013-1826] = "fixed-version: Fixed from version 3.6rc7"
-
-CVE_STATUS[CVE-2013-1827] = "fixed-version: Fixed from version 3.6rc3"
-
-CVE_STATUS[CVE-2013-1828] = "fixed-version: Fixed from version 3.9rc2"
-
-CVE_STATUS[CVE-2013-1848] = "fixed-version: Fixed from version 3.9rc3"
-
-CVE_STATUS[CVE-2013-1858] = "fixed-version: Fixed from version 3.9rc3"
-
-CVE_STATUS[CVE-2013-1860] = "fixed-version: Fixed from version 3.9rc3"
-
-CVE_STATUS[CVE-2013-1928] = "fixed-version: Fixed from version 3.7rc3"
-
-CVE_STATUS[CVE-2013-1929] = "fixed-version: Fixed from version 3.9rc6"
-
-# Skipping CVE-2013-1935, no affected_versions
-
-CVE_STATUS[CVE-2013-1943] = "fixed-version: Fixed from version 3.0rc1"
-
-CVE_STATUS[CVE-2013-1956] = "fixed-version: Fixed from version 3.9rc5"
-
-CVE_STATUS[CVE-2013-1957] = "fixed-version: Fixed from version 3.9rc5"
-
-CVE_STATUS[CVE-2013-1958] = "fixed-version: Fixed from version 3.9rc5"
-
-CVE_STATUS[CVE-2013-1959] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-1979] = "fixed-version: Fixed from version 3.9rc8"
-
-CVE_STATUS[CVE-2013-2015] = "fixed-version: Fixed from version 3.8rc2"
-
-CVE_STATUS[CVE-2013-2017] = "fixed-version: Fixed from version 2.6.34"
-
-CVE_STATUS[CVE-2013-2058] = "fixed-version: Fixed from version 3.8rc4"
-
-CVE_STATUS[CVE-2013-2094] = "fixed-version: Fixed from version 3.9rc8"
-
-CVE_STATUS[CVE-2013-2128] = "fixed-version: Fixed from version 2.6.34rc4"
-
-CVE_STATUS[CVE-2013-2140] = "fixed-version: Fixed from version 3.11rc3"
-
-CVE_STATUS[CVE-2013-2141] = "fixed-version: Fixed from version 3.9rc8"
-
-CVE_STATUS[CVE-2013-2146] = "fixed-version: Fixed from version 3.9rc8"
-
-CVE_STATUS[CVE-2013-2147] = "fixed-version: Fixed from version 3.12rc3"
-
-CVE_STATUS[CVE-2013-2148] = "fixed-version: Fixed from version 3.11rc1"
-
-CVE_STATUS[CVE-2013-2164] = "fixed-version: Fixed from version 3.11rc1"
-
-# Skipping CVE-2013-2188, no affected_versions
-
-CVE_STATUS[CVE-2013-2206] = "fixed-version: Fixed from version 3.9rc4"
-
-# Skipping CVE-2013-2224, no affected_versions
-
-CVE_STATUS[CVE-2013-2232] = "fixed-version: Fixed from version 3.10"
-
-CVE_STATUS[CVE-2013-2234] = "fixed-version: Fixed from version 3.10"
-
-CVE_STATUS[CVE-2013-2237] = "fixed-version: Fixed from version 3.9rc6"
-
-# Skipping CVE-2013-2239, no affected_versions
-
-CVE_STATUS[CVE-2013-2546] = "fixed-version: Fixed from version 3.9rc1"
-
-CVE_STATUS[CVE-2013-2547] = "fixed-version: Fixed from version 3.9rc1"
-
-CVE_STATUS[CVE-2013-2548] = "fixed-version: Fixed from version 3.9rc1"
-
-CVE_STATUS[CVE-2013-2596] = "fixed-version: Fixed from version 3.9rc8"
-
-CVE_STATUS[CVE-2013-2634] = "fixed-version: Fixed from version 3.9rc3"
-
-CVE_STATUS[CVE-2013-2635] = "fixed-version: Fixed from version 3.9rc3"
-
-CVE_STATUS[CVE-2013-2636] = "fixed-version: Fixed from version 3.9rc3"
-
-CVE_STATUS[CVE-2013-2850] = "fixed-version: Fixed from version 3.10rc4"
-
-CVE_STATUS[CVE-2013-2851] = "fixed-version: Fixed from version 3.11rc1"
-
-CVE_STATUS[CVE-2013-2852] = "fixed-version: Fixed from version 3.10rc6"
-
-CVE_STATUS[CVE-2013-2888] = "fixed-version: Fixed from version 3.12rc1"
-
-CVE_STATUS[CVE-2013-2889] = "fixed-version: Fixed from version 3.12rc2"
-
-CVE_STATUS[CVE-2013-2890] = "fixed-version: Fixed from version 3.12rc2"
-
-CVE_STATUS[CVE-2013-2891] = "fixed-version: Fixed from version 3.12rc2"
-
-CVE_STATUS[CVE-2013-2892] = "fixed-version: Fixed from version 3.12rc1"
-
-CVE_STATUS[CVE-2013-2893] = "fixed-version: Fixed from version 3.12rc2"
-
-CVE_STATUS[CVE-2013-2894] = "fixed-version: Fixed from version 3.12rc2"
-
-CVE_STATUS[CVE-2013-2895] = "fixed-version: Fixed from version 3.12rc2"
-
-CVE_STATUS[CVE-2013-2896] = "fixed-version: Fixed from version 3.12rc1"
-
-CVE_STATUS[CVE-2013-2897] = "fixed-version: Fixed from version 3.12rc2"
-
-CVE_STATUS[CVE-2013-2898] = "fixed-version: Fixed from version 3.12rc1"
-
-CVE_STATUS[CVE-2013-2899] = "fixed-version: Fixed from version 3.12rc1"
-
-CVE_STATUS[CVE-2013-2929] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-2930] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-3076] = "fixed-version: Fixed from version 3.9"
-
-CVE_STATUS[CVE-2013-3222] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3223] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3224] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3225] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3226] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3227] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3228] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3229] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3230] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3231] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3232] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3233] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3234] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3235] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3236] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3237] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3301] = "fixed-version: Fixed from version 3.9rc7"
-
-CVE_STATUS[CVE-2013-3302] = "fixed-version: Fixed from version 3.8rc3"
-
-CVE_STATUS[CVE-2013-4125] = "fixed-version: Fixed from version 3.11rc1"
-
-CVE_STATUS[CVE-2013-4127] = "fixed-version: Fixed from version 3.11rc1"
-
-CVE_STATUS[CVE-2013-4129] = "fixed-version: Fixed from version 3.11rc1"
-
-CVE_STATUS[CVE-2013-4162] = "fixed-version: Fixed from version 3.11rc1"
-
-CVE_STATUS[CVE-2013-4163] = "fixed-version: Fixed from version 3.11rc1"
-
-CVE_STATUS[CVE-2013-4205] = "fixed-version: Fixed from version 3.11rc5"
-
-CVE_STATUS[CVE-2013-4220] = "fixed-version: Fixed from version 3.10rc4"
-
-CVE_STATUS[CVE-2013-4247] = "fixed-version: Fixed from version 3.10rc5"
-
-CVE_STATUS[CVE-2013-4254] = "fixed-version: Fixed from version 3.11rc6"
-
-CVE_STATUS[CVE-2013-4270] = "fixed-version: Fixed from version 3.12rc4"
-
-CVE_STATUS[CVE-2013-4299] = "fixed-version: Fixed from version 3.12rc6"
-
-CVE_STATUS[CVE-2013-4300] = "fixed-version: Fixed from version 3.11"
-
-CVE_STATUS[CVE-2013-4312] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2013-4343] = "fixed-version: Fixed from version 3.12rc2"
-
-CVE_STATUS[CVE-2013-4345] = "fixed-version: Fixed from version 3.13rc2"
-
-CVE_STATUS[CVE-2013-4348] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-4350] = "fixed-version: Fixed from version 3.12rc2"
-
-CVE_STATUS[CVE-2013-4387] = "fixed-version: Fixed from version 3.12rc4"
-
-CVE_STATUS[CVE-2013-4470] = "fixed-version: Fixed from version 3.12rc7"
-
-CVE_STATUS[CVE-2013-4483] = "fixed-version: Fixed from version 3.10rc1"
-
-CVE_STATUS[CVE-2013-4511] = "fixed-version: Fixed from version 3.12"
-
-CVE_STATUS[CVE-2013-4512] = "fixed-version: Fixed from version 3.12"
-
-CVE_STATUS[CVE-2013-4513] = "fixed-version: Fixed from version 3.12"
-
-CVE_STATUS[CVE-2013-4514] = "fixed-version: Fixed from version 3.12"
-
-CVE_STATUS[CVE-2013-4515] = "fixed-version: Fixed from version 3.12"
-
-CVE_STATUS[CVE-2013-4516] = "fixed-version: Fixed from version 3.12"
-
-CVE_STATUS[CVE-2013-4563] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-4579] = "fixed-version: Fixed from version 3.13rc7"
-
-CVE_STATUS[CVE-2013-4587] = "fixed-version: Fixed from version 3.13rc4"
-
-CVE_STATUS[CVE-2013-4588] = "fixed-version: Fixed from version 2.6.33rc4"
-
-CVE_STATUS[CVE-2013-4591] = "fixed-version: Fixed from version 3.8rc1"
-
-CVE_STATUS[CVE-2013-4592] = "fixed-version: Fixed from version 3.7rc1"
-
-# Skipping CVE-2013-4737, no affected_versions
-
-# Skipping CVE-2013-4738, no affected_versions
-
-# Skipping CVE-2013-4739, no affected_versions
-
-CVE_STATUS[CVE-2013-5634] = "fixed-version: Fixed from version 3.10rc5"
-
-CVE_STATUS[CVE-2013-6282] = "fixed-version: Fixed from version 3.6rc6"
-
-CVE_STATUS[CVE-2013-6367] = "fixed-version: Fixed from version 3.13rc4"
-
-CVE_STATUS[CVE-2013-6368] = "fixed-version: Fixed from version 3.13rc4"
-
-CVE_STATUS[CVE-2013-6376] = "fixed-version: Fixed from version 3.13rc4"
-
-CVE_STATUS[CVE-2013-6378] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-6380] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-6381] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-6382] = "fixed-version: Fixed from version 3.13rc4"
-
-CVE_STATUS[CVE-2013-6383] = "fixed-version: Fixed from version 3.12"
-
-# Skipping CVE-2013-6392, no affected_versions
-
-CVE_STATUS[CVE-2013-6431] = "fixed-version: Fixed from version 3.12rc1"
-
-CVE_STATUS[CVE-2013-6432] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-6885] = "fixed-version: Fixed from version 3.14rc1"
-
-CVE_STATUS[CVE-2013-7026] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7027] = "fixed-version: Fixed from version 3.12rc7"
-
-CVE_STATUS[CVE-2013-7263] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7264] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7265] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7266] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7267] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7268] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7269] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7270] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7271] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7281] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7339] = "fixed-version: Fixed from version 3.13rc7"
-
-CVE_STATUS[CVE-2013-7348] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2013-7421] = "fixed-version: Fixed from version 3.19rc1"
-
-# CVE-2013-7445 has no known resolution
-
-CVE_STATUS[CVE-2013-7446] = "fixed-version: Fixed from version 4.4rc4"
-
-CVE_STATUS[CVE-2013-7470] = "fixed-version: Fixed from version 3.12rc7"
-
-CVE_STATUS[CVE-2014-0038] = "fixed-version: Fixed from version 3.14rc1"
-
-CVE_STATUS[CVE-2014-0049] = "fixed-version: Fixed from version 3.14rc5"
-
-CVE_STATUS[CVE-2014-0055] = "fixed-version: Fixed from version 3.14"
-
-CVE_STATUS[CVE-2014-0069] = "fixed-version: Fixed from version 3.14rc4"
-
-CVE_STATUS[CVE-2014-0077] = "fixed-version: Fixed from version 3.14"
-
-CVE_STATUS[CVE-2014-0100] = "fixed-version: Fixed from version 3.14rc7"
-
-CVE_STATUS[CVE-2014-0101] = "fixed-version: Fixed from version 3.14rc6"
-
-CVE_STATUS[CVE-2014-0102] = "fixed-version: Fixed from version 3.14rc6"
-
-CVE_STATUS[CVE-2014-0131] = "fixed-version: Fixed from version 3.14rc7"
-
-CVE_STATUS[CVE-2014-0155] = "fixed-version: Fixed from version 3.15rc2"
-
-CVE_STATUS[CVE-2014-0181] = "fixed-version: Fixed from version 3.15rc5"
-
-CVE_STATUS[CVE-2014-0196] = "fixed-version: Fixed from version 3.15rc5"
-
-CVE_STATUS[CVE-2014-0203] = "fixed-version: Fixed from version 2.6.33rc5"
-
-CVE_STATUS[CVE-2014-0205] = "fixed-version: Fixed from version 2.6.37rc1"
-
-CVE_STATUS[CVE-2014-0206] = "fixed-version: Fixed from version 3.16rc3"
-
-# Skipping CVE-2014-0972, no affected_versions
-
-CVE_STATUS[CVE-2014-1438] = "fixed-version: Fixed from version 3.13"
-
-CVE_STATUS[CVE-2014-1444] = "fixed-version: Fixed from version 3.12rc7"
-
-CVE_STATUS[CVE-2014-1445] = "fixed-version: Fixed from version 3.12rc7"
-
-CVE_STATUS[CVE-2014-1446] = "fixed-version: Fixed from version 3.13rc7"
-
-CVE_STATUS[CVE-2014-1690] = "fixed-version: Fixed from version 3.13rc8"
-
-CVE_STATUS[CVE-2014-1737] = "fixed-version: Fixed from version 3.15rc5"
-
-CVE_STATUS[CVE-2014-1738] = "fixed-version: Fixed from version 3.15rc5"
-
-CVE_STATUS[CVE-2014-1739] = "fixed-version: Fixed from version 3.15rc6"
-
-CVE_STATUS[CVE-2014-1874] = "fixed-version: Fixed from version 3.14rc2"
-
-CVE_STATUS[CVE-2014-2038] = "fixed-version: Fixed from version 3.14rc1"
-
-CVE_STATUS[CVE-2014-2039] = "fixed-version: Fixed from version 3.14rc3"
-
-CVE_STATUS[CVE-2014-2309] = "fixed-version: Fixed from version 3.14rc7"
-
-CVE_STATUS[CVE-2014-2523] = "fixed-version: Fixed from version 3.14rc1"
-
-CVE_STATUS[CVE-2014-2568] = "fixed-version: Fixed from version 3.14"
-
-CVE_STATUS[CVE-2014-2580] = "fixed-version: Fixed from version 3.15rc1"
-
-CVE_STATUS[CVE-2014-2672] = "fixed-version: Fixed from version 3.14rc6"
-
-CVE_STATUS[CVE-2014-2673] = "fixed-version: Fixed from version 3.14rc6"
-
-CVE_STATUS[CVE-2014-2678] = "fixed-version: Fixed from version 3.15rc1"
-
-CVE_STATUS[CVE-2014-2706] = "fixed-version: Fixed from version 3.14rc6"
-
-CVE_STATUS[CVE-2014-2739] = "fixed-version: Fixed from version 3.15rc1"
-
-CVE_STATUS[CVE-2014-2851] = "fixed-version: Fixed from version 3.15rc2"
-
-CVE_STATUS[CVE-2014-2889] = "fixed-version: Fixed from version 3.2rc7"
-
-CVE_STATUS[CVE-2014-3122] = "fixed-version: Fixed from version 3.15rc1"
-
-CVE_STATUS[CVE-2014-3144] = "fixed-version: Fixed from version 3.15rc2"
-
-CVE_STATUS[CVE-2014-3145] = "fixed-version: Fixed from version 3.15rc2"
-
-CVE_STATUS[CVE-2014-3153] = "fixed-version: Fixed from version 3.15"
-
-CVE_STATUS[CVE-2014-3180] = "fixed-version: Fixed from version 3.17rc4"
-
-CVE_STATUS[CVE-2014-3181] = "fixed-version: Fixed from version 3.17rc3"
-
-CVE_STATUS[CVE-2014-3182] = "fixed-version: Fixed from version 3.17rc2"
-
-CVE_STATUS[CVE-2014-3183] = "fixed-version: Fixed from version 3.17rc2"
-
-CVE_STATUS[CVE-2014-3184] = "fixed-version: Fixed from version 3.17rc2"
-
-CVE_STATUS[CVE-2014-3185] = "fixed-version: Fixed from version 3.17rc3"
-
-CVE_STATUS[CVE-2014-3186] = "fixed-version: Fixed from version 3.17rc3"
-
-# Skipping CVE-2014-3519, no affected_versions
-
-CVE_STATUS[CVE-2014-3534] = "fixed-version: Fixed from version 3.16rc7"
-
-CVE_STATUS[CVE-2014-3535] = "fixed-version: Fixed from version 2.6.36rc1"
-
-CVE_STATUS[CVE-2014-3601] = "fixed-version: Fixed from version 3.17rc2"
-
-CVE_STATUS[CVE-2014-3610] = "fixed-version: Fixed from version 3.18rc2"
-
-CVE_STATUS[CVE-2014-3611] = "fixed-version: Fixed from version 3.18rc2"
-
-CVE_STATUS[CVE-2014-3631] = "fixed-version: Fixed from version 3.17rc5"
-
-CVE_STATUS[CVE-2014-3645] = "fixed-version: Fixed from version 3.12rc1"
-
-CVE_STATUS[CVE-2014-3646] = "fixed-version: Fixed from version 3.18rc2"
-
-CVE_STATUS[CVE-2014-3647] = "fixed-version: Fixed from version 3.18rc2"
-
-CVE_STATUS[CVE-2014-3673] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2014-3687] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2014-3688] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2014-3690] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2014-3917] = "fixed-version: Fixed from version 3.16rc1"
-
-CVE_STATUS[CVE-2014-3940] = "fixed-version: Fixed from version 3.15"
-
-CVE_STATUS[CVE-2014-4014] = "fixed-version: Fixed from version 3.16rc1"
-
-CVE_STATUS[CVE-2014-4027] = "fixed-version: Fixed from version 3.14rc1"
-
-CVE_STATUS[CVE-2014-4157] = "fixed-version: Fixed from version 3.15rc1"
-
-CVE_STATUS[CVE-2014-4171] = "fixed-version: Fixed from version 3.16rc3"
-
-# Skipping CVE-2014-4322, no affected_versions
-
-# Skipping CVE-2014-4323, no affected_versions
-
-CVE_STATUS[CVE-2014-4508] = "fixed-version: Fixed from version 3.16rc3"
-
-CVE_STATUS[CVE-2014-4608] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2014-4611] = "fixed-version: Fixed from version 3.16rc3"
-
-CVE_STATUS[CVE-2014-4652] = "fixed-version: Fixed from version 3.16rc2"
-
-CVE_STATUS[CVE-2014-4653] = "fixed-version: Fixed from version 3.16rc2"
-
-CVE_STATUS[CVE-2014-4654] = "fixed-version: Fixed from version 3.16rc2"
-
-CVE_STATUS[CVE-2014-4655] = "fixed-version: Fixed from version 3.16rc2"
-
-CVE_STATUS[CVE-2014-4656] = "fixed-version: Fixed from version 3.16rc2"
-
-CVE_STATUS[CVE-2014-4667] = "fixed-version: Fixed from version 3.16rc1"
-
-CVE_STATUS[CVE-2014-4699] = "fixed-version: Fixed from version 3.16rc4"
-
-CVE_STATUS[CVE-2014-4943] = "fixed-version: Fixed from version 3.16rc6"
-
-CVE_STATUS[CVE-2014-5045] = "fixed-version: Fixed from version 3.16rc7"
-
-CVE_STATUS[CVE-2014-5077] = "fixed-version: Fixed from version 3.16"
-
-CVE_STATUS[CVE-2014-5206] = "fixed-version: Fixed from version 3.17rc1"
-
-CVE_STATUS[CVE-2014-5207] = "fixed-version: Fixed from version 3.17rc1"
-
-# Skipping CVE-2014-5332, no affected_versions
-
-CVE_STATUS[CVE-2014-5471] = "fixed-version: Fixed from version 3.17rc2"
-
-CVE_STATUS[CVE-2014-5472] = "fixed-version: Fixed from version 3.17rc2"
-
-CVE_STATUS[CVE-2014-6410] = "fixed-version: Fixed from version 3.17rc5"
-
-CVE_STATUS[CVE-2014-6416] = "fixed-version: Fixed from version 3.17rc5"
-
-CVE_STATUS[CVE-2014-6417] = "fixed-version: Fixed from version 3.17rc5"
-
-CVE_STATUS[CVE-2014-6418] = "fixed-version: Fixed from version 3.17rc5"
-
-CVE_STATUS[CVE-2014-7145] = "fixed-version: Fixed from version 3.17rc2"
-
-# Skipping CVE-2014-7207, no affected_versions
-
-CVE_STATUS[CVE-2014-7283] = "fixed-version: Fixed from version 3.15rc1"
-
-CVE_STATUS[CVE-2014-7284] = "fixed-version: Fixed from version 3.15rc7"
-
-CVE_STATUS[CVE-2014-7822] = "fixed-version: Fixed from version 3.16rc1"
-
-CVE_STATUS[CVE-2014-7825] = "fixed-version: Fixed from version 3.18rc3"
-
-CVE_STATUS[CVE-2014-7826] = "fixed-version: Fixed from version 3.18rc3"
-
-CVE_STATUS[CVE-2014-7841] = "fixed-version: Fixed from version 3.18rc5"
-
-CVE_STATUS[CVE-2014-7842] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2014-7843] = "fixed-version: Fixed from version 3.18rc5"
-
-CVE_STATUS[CVE-2014-7970] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2014-7975] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2014-8086] = "fixed-version: Fixed from version 3.18rc3"
-
-CVE_STATUS[CVE-2014-8133] = "fixed-version: Fixed from version 3.19rc1"
-
-CVE_STATUS[CVE-2014-8134] = "fixed-version: Fixed from version 3.19rc1"
-
-CVE_STATUS[CVE-2014-8159] = "fixed-version: Fixed from version 4.0rc7"
-
-CVE_STATUS[CVE-2014-8160] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2014-8171] = "fixed-version: Fixed from version 3.12rc1"
-
-CVE_STATUS[CVE-2014-8172] = "fixed-version: Fixed from version 3.13rc1"
-
-CVE_STATUS[CVE-2014-8173] = "fixed-version: Fixed from version 3.13rc5"
-
-# Skipping CVE-2014-8181, no affected_versions
-
-CVE_STATUS[CVE-2014-8369] = "fixed-version: Fixed from version 3.18rc2"
-
-CVE_STATUS[CVE-2014-8480] = "fixed-version: Fixed from version 3.18rc2"
-
-CVE_STATUS[CVE-2014-8481] = "fixed-version: Fixed from version 3.18rc2"
-
-CVE_STATUS[CVE-2014-8559] = "fixed-version: Fixed from version 3.19rc1"
-
-CVE_STATUS[CVE-2014-8709] = "fixed-version: Fixed from version 3.14rc3"
-
-CVE_STATUS[CVE-2014-8884] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2014-8989] = "fixed-version: Fixed from version 3.19rc1"
-
-CVE_STATUS[CVE-2014-9090] = "fixed-version: Fixed from version 3.18rc6"
-
-CVE_STATUS[CVE-2014-9322] = "fixed-version: Fixed from version 3.18rc6"
-
-CVE_STATUS[CVE-2014-9419] = "fixed-version: Fixed from version 3.19rc1"
-
-CVE_STATUS[CVE-2014-9420] = "fixed-version: Fixed from version 3.19rc1"
-
-CVE_STATUS[CVE-2014-9428] = "fixed-version: Fixed from version 3.19rc3"
-
-CVE_STATUS[CVE-2014-9529] = "fixed-version: Fixed from version 3.19rc4"
-
-CVE_STATUS[CVE-2014-9584] = "fixed-version: Fixed from version 3.19rc3"
-
-CVE_STATUS[CVE-2014-9585] = "fixed-version: Fixed from version 3.19rc4"
-
-CVE_STATUS[CVE-2014-9644] = "fixed-version: Fixed from version 3.19rc1"
-
-CVE_STATUS[CVE-2014-9683] = "fixed-version: Fixed from version 3.19rc1"
-
-CVE_STATUS[CVE-2014-9710] = "fixed-version: Fixed from version 3.19rc1"
-
-CVE_STATUS[CVE-2014-9715] = "fixed-version: Fixed from version 3.15rc1"
-
-CVE_STATUS[CVE-2014-9717] = "fixed-version: Fixed from version 4.1rc1"
-
-CVE_STATUS[CVE-2014-9728] = "fixed-version: Fixed from version 3.19rc3"
-
-CVE_STATUS[CVE-2014-9729] = "fixed-version: Fixed from version 3.19rc3"
-
-CVE_STATUS[CVE-2014-9730] = "fixed-version: Fixed from version 3.19rc3"
-
-CVE_STATUS[CVE-2014-9731] = "fixed-version: Fixed from version 3.19rc3"
-
-# Skipping CVE-2014-9777, no affected_versions
-
-# Skipping CVE-2014-9778, no affected_versions
-
-# Skipping CVE-2014-9779, no affected_versions
-
-# Skipping CVE-2014-9780, no affected_versions
-
-# Skipping CVE-2014-9781, no affected_versions
-
-# Skipping CVE-2014-9782, no affected_versions
-
-# Skipping CVE-2014-9783, no affected_versions
-
-# Skipping CVE-2014-9784, no affected_versions
-
-# Skipping CVE-2014-9785, no affected_versions
-
-# Skipping CVE-2014-9786, no affected_versions
-
-# Skipping CVE-2014-9787, no affected_versions
-
-# Skipping CVE-2014-9788, no affected_versions
-
-# Skipping CVE-2014-9789, no affected_versions
-
-CVE_STATUS[CVE-2014-9803] = "fixed-version: Fixed from version 3.16rc1"
-
-# Skipping CVE-2014-9863, no affected_versions
-
-# Skipping CVE-2014-9864, no affected_versions
-
-# Skipping CVE-2014-9865, no affected_versions
-
-# Skipping CVE-2014-9866, no affected_versions
-
-# Skipping CVE-2014-9867, no affected_versions
-
-# Skipping CVE-2014-9868, no affected_versions
-
-# Skipping CVE-2014-9869, no affected_versions
-
-CVE_STATUS[CVE-2014-9870] = "fixed-version: Fixed from version 3.11rc1"
-
-# Skipping CVE-2014-9871, no affected_versions
-
-# Skipping CVE-2014-9872, no affected_versions
-
-# Skipping CVE-2014-9873, no affected_versions
-
-# Skipping CVE-2014-9874, no affected_versions
-
-# Skipping CVE-2014-9875, no affected_versions
-
-# Skipping CVE-2014-9876, no affected_versions
-
-# Skipping CVE-2014-9877, no affected_versions
-
-# Skipping CVE-2014-9878, no affected_versions
-
-# Skipping CVE-2014-9879, no affected_versions
-
-# Skipping CVE-2014-9880, no affected_versions
-
-# Skipping CVE-2014-9881, no affected_versions
-
-# Skipping CVE-2014-9882, no affected_versions
-
-# Skipping CVE-2014-9883, no affected_versions
-
-# Skipping CVE-2014-9884, no affected_versions
-
-# Skipping CVE-2014-9885, no affected_versions
-
-# Skipping CVE-2014-9886, no affected_versions
-
-# Skipping CVE-2014-9887, no affected_versions
-
-CVE_STATUS[CVE-2014-9888] = "fixed-version: Fixed from version 3.13rc1"
-
-# Skipping CVE-2014-9889, no affected_versions
-
-# Skipping CVE-2014-9890, no affected_versions
-
-# Skipping CVE-2014-9891, no affected_versions
-
-# Skipping CVE-2014-9892, no affected_versions
-
-# Skipping CVE-2014-9893, no affected_versions
-
-# Skipping CVE-2014-9894, no affected_versions
-
-CVE_STATUS[CVE-2014-9895] = "fixed-version: Fixed from version 3.11rc1"
-
-# Skipping CVE-2014-9896, no affected_versions
-
-# Skipping CVE-2014-9897, no affected_versions
-
-# Skipping CVE-2014-9898, no affected_versions
-
-# Skipping CVE-2014-9899, no affected_versions
-
-# Skipping CVE-2014-9900, no affected_versions
-
-CVE_STATUS[CVE-2014-9903] = "fixed-version: Fixed from version 3.14rc4"
-
-CVE_STATUS[CVE-2014-9904] = "fixed-version: Fixed from version 3.17rc1"
-
-CVE_STATUS[CVE-2014-9914] = "fixed-version: Fixed from version 3.16rc1"
-
-CVE_STATUS[CVE-2014-9922] = "fixed-version: Fixed from version 3.18rc2"
-
-CVE_STATUS[CVE-2014-9940] = "fixed-version: Fixed from version 3.19rc1"
-
-CVE_STATUS[CVE-2015-0239] = "fixed-version: Fixed from version 3.19rc6"
-
-CVE_STATUS[CVE-2015-0274] = "fixed-version: Fixed from version 3.15rc5"
-
-CVE_STATUS[CVE-2015-0275] = "fixed-version: Fixed from version 4.1rc1"
-
-# Skipping CVE-2015-0777, no affected_versions
-
-# Skipping CVE-2015-1328, no affected_versions
-
-CVE_STATUS[CVE-2015-1333] = "fixed-version: Fixed from version 4.2rc5"
-
-CVE_STATUS[CVE-2015-1339] = "fixed-version: Fixed from version 4.4rc5"
-
-CVE_STATUS[CVE-2015-1350] = "fixed-version: Fixed from version 4.9rc1"
-
-CVE_STATUS[CVE-2015-1420] = "fixed-version: Fixed from version 4.1rc7"
-
-CVE_STATUS[CVE-2015-1421] = "fixed-version: Fixed from version 3.19rc7"
-
-CVE_STATUS[CVE-2015-1465] = "fixed-version: Fixed from version 3.19rc7"
-
-CVE_STATUS[CVE-2015-1573] = "fixed-version: Fixed from version 3.19rc5"
-
-CVE_STATUS[CVE-2015-1593] = "fixed-version: Fixed from version 4.0rc1"
-
-CVE_STATUS[CVE-2015-1805] = "fixed-version: Fixed from version 3.16rc1"
-
-CVE_STATUS[CVE-2015-2041] = "fixed-version: Fixed from version 3.19rc7"
-
-CVE_STATUS[CVE-2015-2042] = "fixed-version: Fixed from version 3.19"
-
-CVE_STATUS[CVE-2015-2150] = "fixed-version: Fixed from version 4.0rc4"
-
-CVE_STATUS[CVE-2015-2666] = "fixed-version: Fixed from version 4.0rc1"
-
-CVE_STATUS[CVE-2015-2672] = "fixed-version: Fixed from version 4.0rc3"
-
-CVE_STATUS[CVE-2015-2686] = "fixed-version: Fixed from version 4.0rc6"
-
-CVE_STATUS[CVE-2015-2830] = "fixed-version: Fixed from version 4.0rc3"
-
-# CVE-2015-2877 has no known resolution
-
-CVE_STATUS[CVE-2015-2922] = "fixed-version: Fixed from version 4.0rc7"
-
-CVE_STATUS[CVE-2015-2925] = "fixed-version: Fixed from version 4.3rc1"
-
-CVE_STATUS[CVE-2015-3212] = "fixed-version: Fixed from version 4.2rc1"
-
-CVE_STATUS[CVE-2015-3214] = "fixed-version: Fixed from version 2.6.33rc8"
-
-CVE_STATUS[CVE-2015-3288] = "fixed-version: Fixed from version 4.2rc2"
-
-CVE_STATUS[CVE-2015-3290] = "fixed-version: Fixed from version 4.2rc3"
-
-CVE_STATUS[CVE-2015-3291] = "fixed-version: Fixed from version 4.2rc3"
-
-CVE_STATUS[CVE-2015-3331] = "fixed-version: Fixed from version 4.0rc5"
-
-# Skipping CVE-2015-3332, no affected_versions
-
-CVE_STATUS[CVE-2015-3339] = "fixed-version: Fixed from version 4.1rc1"
-
-CVE_STATUS[CVE-2015-3636] = "fixed-version: Fixed from version 4.1rc2"
-
-CVE_STATUS[CVE-2015-4001] = "fixed-version: Fixed from version 4.1rc7"
-
-CVE_STATUS[CVE-2015-4002] = "fixed-version: Fixed from version 4.1rc7"
-
-CVE_STATUS[CVE-2015-4003] = "fixed-version: Fixed from version 4.1rc7"
-
-CVE_STATUS[CVE-2015-4004] = "fixed-version: Fixed from version 4.3rc1"
-
-CVE_STATUS[CVE-2015-4036] = "fixed-version: Fixed from version 4.0rc1"
-
-CVE_STATUS[CVE-2015-4167] = "fixed-version: Fixed from version 4.0rc1"
-
-CVE_STATUS[CVE-2015-4170] = "fixed-version: Fixed from version 3.13rc5"
-
-CVE_STATUS[CVE-2015-4176] = "fixed-version: Fixed from version 4.1rc1"
-
-CVE_STATUS[CVE-2015-4177] = "fixed-version: Fixed from version 4.1rc1"
-
-CVE_STATUS[CVE-2015-4178] = "fixed-version: Fixed from version 4.1rc1"
-
-CVE_STATUS[CVE-2015-4692] = "fixed-version: Fixed from version 4.2rc1"
-
-CVE_STATUS[CVE-2015-4700] = "fixed-version: Fixed from version 4.1rc6"
-
-CVE_STATUS[CVE-2015-5156] = "fixed-version: Fixed from version 4.2rc7"
-
-CVE_STATUS[CVE-2015-5157] = "fixed-version: Fixed from version 4.2rc3"
-
-CVE_STATUS[CVE-2015-5257] = "fixed-version: Fixed from version 4.3rc3"
-
-CVE_STATUS[CVE-2015-5283] = "fixed-version: Fixed from version 4.3rc3"
-
-CVE_STATUS[CVE-2015-5307] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2015-5327] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2015-5364] = "fixed-version: Fixed from version 4.1rc7"
-
-CVE_STATUS[CVE-2015-5366] = "fixed-version: Fixed from version 4.1rc7"
-
-CVE_STATUS[CVE-2015-5697] = "fixed-version: Fixed from version 4.2rc6"
-
-CVE_STATUS[CVE-2015-5706] = "fixed-version: Fixed from version 4.1rc3"
-
-CVE_STATUS[CVE-2015-5707] = "fixed-version: Fixed from version 4.1rc1"
-
-CVE_STATUS[CVE-2015-6252] = "fixed-version: Fixed from version 4.2rc5"
-
-CVE_STATUS[CVE-2015-6526] = "fixed-version: Fixed from version 4.1rc1"
-
-# CVE-2015-6619 has no known resolution
-
-# CVE-2015-6646 has no known resolution
-
-CVE_STATUS[CVE-2015-6937] = "fixed-version: Fixed from version 4.3rc1"
-
-# Skipping CVE-2015-7312, no affected_versions
-
-CVE_STATUS[CVE-2015-7509] = "fixed-version: Fixed from version 3.7rc1"
-
-CVE_STATUS[CVE-2015-7513] = "fixed-version: Fixed from version 4.4rc7"
-
-CVE_STATUS[CVE-2015-7515] = "fixed-version: Fixed from version 4.4rc6"
-
-CVE_STATUS[CVE-2015-7550] = "fixed-version: Fixed from version 4.4rc8"
-
-# Skipping CVE-2015-7553, no affected_versions
-
-CVE_STATUS[CVE-2015-7566] = "fixed-version: Fixed from version 4.5rc2"
-
-CVE_STATUS[CVE-2015-7613] = "fixed-version: Fixed from version 4.3rc4"
-
-CVE_STATUS[CVE-2015-7799] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2015-7833] = "fixed-version: Fixed from version 4.6rc6"
-
-# Skipping CVE-2015-7837, no affected_versions
-
-CVE_STATUS[CVE-2015-7872] = "fixed-version: Fixed from version 4.3rc7"
-
-CVE_STATUS[CVE-2015-7884] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2015-7885] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2015-7990] = "fixed-version: Fixed from version 4.4rc4"
-
-# Skipping CVE-2015-8019, no affected_versions
-
-CVE_STATUS[CVE-2015-8104] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2015-8215] = "fixed-version: Fixed from version 4.0rc3"
-
-CVE_STATUS[CVE-2015-8324] = "fixed-version: Fixed from version 2.6.34rc1"
-
-CVE_STATUS[CVE-2015-8374] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2015-8539] = "fixed-version: Fixed from version 4.4rc3"
-
-CVE_STATUS[CVE-2015-8543] = "fixed-version: Fixed from version 4.4rc6"
-
-CVE_STATUS[CVE-2015-8550] = "fixed-version: Fixed from version 4.4rc6"
-
-CVE_STATUS[CVE-2015-8551] = "fixed-version: Fixed from version 4.4rc6"
-
-CVE_STATUS[CVE-2015-8552] = "fixed-version: Fixed from version 4.4rc6"
-
-CVE_STATUS[CVE-2015-8553] = "fixed-version: Fixed from version 4.4rc6"
-
-CVE_STATUS[CVE-2015-8569] = "fixed-version: Fixed from version 4.4rc6"
-
-CVE_STATUS[CVE-2015-8575] = "fixed-version: Fixed from version 4.4rc6"
-
-CVE_STATUS[CVE-2015-8660] = "fixed-version: Fixed from version 4.4rc4"
-
-CVE_STATUS[CVE-2015-8709] = "fixed-version: Fixed from version 4.10rc1"
-
-CVE_STATUS[CVE-2015-8746] = "fixed-version: Fixed from version 4.3rc1"
-
-CVE_STATUS[CVE-2015-8767] = "fixed-version: Fixed from version 4.3rc4"
-
-CVE_STATUS[CVE-2015-8785] = "fixed-version: Fixed from version 4.4rc5"
-
-CVE_STATUS[CVE-2015-8787] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2015-8812] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2015-8816] = "fixed-version: Fixed from version 4.4rc6"
-
-CVE_STATUS[CVE-2015-8830] = "fixed-version: Fixed from version 4.1rc1"
-
-CVE_STATUS[CVE-2015-8839] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2015-8844] = "fixed-version: Fixed from version 4.4rc3"
-
-CVE_STATUS[CVE-2015-8845] = "fixed-version: Fixed from version 4.4rc3"
-
-# Skipping CVE-2015-8937, no affected_versions
-
-# Skipping CVE-2015-8938, no affected_versions
-
-# Skipping CVE-2015-8939, no affected_versions
-
-# Skipping CVE-2015-8940, no affected_versions
-
-# Skipping CVE-2015-8941, no affected_versions
-
-# Skipping CVE-2015-8942, no affected_versions
-
-# Skipping CVE-2015-8943, no affected_versions
-
-# Skipping CVE-2015-8944, no affected_versions
-
-CVE_STATUS[CVE-2015-8950] = "fixed-version: Fixed from version 4.1rc2"
-
-CVE_STATUS[CVE-2015-8952] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2015-8953] = "fixed-version: Fixed from version 4.3"
-
-CVE_STATUS[CVE-2015-8955] = "fixed-version: Fixed from version 4.1rc1"
-
-CVE_STATUS[CVE-2015-8956] = "fixed-version: Fixed from version 4.2rc1"
-
-CVE_STATUS[CVE-2015-8961] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2015-8962] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2015-8963] = "fixed-version: Fixed from version 4.4"
-
-CVE_STATUS[CVE-2015-8964] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2015-8966] = "fixed-version: Fixed from version 4.4rc8"
-
-CVE_STATUS[CVE-2015-8967] = "fixed-version: Fixed from version 4.0rc1"
-
-CVE_STATUS[CVE-2015-8970] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2015-9004] = "fixed-version: Fixed from version 3.19rc7"
-
-CVE_STATUS[CVE-2015-9016] = "fixed-version: Fixed from version 4.3rc1"
-
-CVE_STATUS[CVE-2015-9289] = "fixed-version: Fixed from version 4.2rc1"
-
-CVE_STATUS[CVE-2016-0617] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-0723] = "fixed-version: Fixed from version 4.5rc2"
-
-CVE_STATUS[CVE-2016-0728] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-0758] = "fixed-version: Fixed from version 4.6"
-
-# Skipping CVE-2016-0774, no affected_versions
-
-CVE_STATUS[CVE-2016-0821] = "fixed-version: Fixed from version 4.3rc1"
-
-CVE_STATUS[CVE-2016-0823] = "fixed-version: Fixed from version 4.0rc5"
-
-CVE_STATUS[CVE-2016-10044] = "fixed-version: Fixed from version 4.8rc7"
-
-CVE_STATUS[CVE-2016-10088] = "fixed-version: Fixed from version 4.10rc1"
-
-CVE_STATUS[CVE-2016-10147] = "fixed-version: Fixed from version 4.9"
-
-CVE_STATUS[CVE-2016-10150] = "fixed-version: Fixed from version 4.9rc8"
-
-CVE_STATUS[CVE-2016-10153] = "fixed-version: Fixed from version 4.10rc1"
-
-CVE_STATUS[CVE-2016-10154] = "fixed-version: Fixed from version 4.10rc1"
-
-CVE_STATUS[CVE-2016-10200] = "fixed-version: Fixed from version 4.9rc7"
-
-CVE_STATUS[CVE-2016-10208] = "fixed-version: Fixed from version 4.10rc1"
-
-CVE_STATUS[CVE-2016-10229] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-10318] = "fixed-version: Fixed from version 4.8rc6"
-
-CVE_STATUS[CVE-2016-10723] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2016-10741] = "fixed-version: Fixed from version 4.10rc1"
-
-CVE_STATUS[CVE-2016-10764] = "fixed-version: Fixed from version 4.10rc1"
-
-CVE_STATUS[CVE-2016-10905] = "fixed-version: Fixed from version 4.8rc1"
-
-CVE_STATUS[CVE-2016-10906] = "fixed-version: Fixed from version 4.5rc6"
-
-CVE_STATUS[CVE-2016-10907] = "fixed-version: Fixed from version 4.9rc1"
-
-CVE_STATUS[CVE-2016-1237] = "fixed-version: Fixed from version 4.7rc5"
-
-CVE_STATUS[CVE-2016-1575] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-1576] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-1583] = "fixed-version: Fixed from version 4.7rc3"
-
-CVE_STATUS[CVE-2016-2053] = "fixed-version: Fixed from version 4.3rc1"
-
-CVE_STATUS[CVE-2016-2069] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-2070] = "fixed-version: Fixed from version 4.4"
-
-CVE_STATUS[CVE-2016-2085] = "fixed-version: Fixed from version 4.5rc4"
-
-CVE_STATUS[CVE-2016-2117] = "fixed-version: Fixed from version 4.6rc5"
-
-CVE_STATUS[CVE-2016-2143] = "fixed-version: Fixed from version 4.5"
-
-CVE_STATUS[CVE-2016-2184] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-2185] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-2186] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-2187] = "fixed-version: Fixed from version 4.6rc5"
-
-CVE_STATUS[CVE-2016-2188] = "fixed-version: Fixed from version 4.11rc2"
-
-CVE_STATUS[CVE-2016-2383] = "fixed-version: Fixed from version 4.5rc4"
-
-CVE_STATUS[CVE-2016-2384] = "fixed-version: Fixed from version 4.5rc4"
-
-CVE_STATUS[CVE-2016-2543] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-2544] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-2545] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-2546] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-2547] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-2548] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-2549] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2016-2550] = "fixed-version: Fixed from version 4.5rc4"
-
-CVE_STATUS[CVE-2016-2782] = "fixed-version: Fixed from version 4.5rc2"
-
-CVE_STATUS[CVE-2016-2847] = "fixed-version: Fixed from version 4.5rc1"
-
-# Skipping CVE-2016-2853, no affected_versions
-
-# Skipping CVE-2016-2854, no affected_versions
-
-CVE_STATUS[CVE-2016-3044] = "fixed-version: Fixed from version 4.5"
-
-CVE_STATUS[CVE-2016-3070] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2016-3134] = "fixed-version: Fixed from version 4.6rc2"
-
-CVE_STATUS[CVE-2016-3135] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-3136] = "fixed-version: Fixed from version 4.6rc3"
-
-CVE_STATUS[CVE-2016-3137] = "fixed-version: Fixed from version 4.6rc3"
-
-CVE_STATUS[CVE-2016-3138] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-3139] = "fixed-version: Fixed from version 3.17rc1"
-
-CVE_STATUS[CVE-2016-3140] = "fixed-version: Fixed from version 4.6rc3"
-
-CVE_STATUS[CVE-2016-3156] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-3157] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-3672] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-3689] = "fixed-version: Fixed from version 4.6rc1"
-
-# Skipping CVE-2016-3695, no affected_versions
-
-# Skipping CVE-2016-3699, no affected_versions
-
-# Skipping CVE-2016-3707, no affected_versions
-
-CVE_STATUS[CVE-2016-3713] = "fixed-version: Fixed from version 4.7rc1"
-
-# CVE-2016-3775 has no known resolution
-
-# CVE-2016-3802 has no known resolution
-
-# CVE-2016-3803 has no known resolution
-
-CVE_STATUS[CVE-2016-3841] = "fixed-version: Fixed from version 4.4rc4"
-
-CVE_STATUS[CVE-2016-3857] = "fixed-version: Fixed from version 4.8rc2"
-
-CVE_STATUS[CVE-2016-3951] = "fixed-version: Fixed from version 4.5"
-
-CVE_STATUS[CVE-2016-3955] = "fixed-version: Fixed from version 4.6rc3"
-
-CVE_STATUS[CVE-2016-3961] = "fixed-version: Fixed from version 4.6rc5"
-
-CVE_STATUS[CVE-2016-4440] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2016-4470] = "fixed-version: Fixed from version 4.7rc4"
-
-CVE_STATUS[CVE-2016-4482] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2016-4485] = "fixed-version: Fixed from version 4.6"
-
-CVE_STATUS[CVE-2016-4486] = "fixed-version: Fixed from version 4.6"
-
-CVE_STATUS[CVE-2016-4557] = "fixed-version: Fixed from version 4.6rc6"
-
-CVE_STATUS[CVE-2016-4558] = "fixed-version: Fixed from version 4.6rc7"
-
-CVE_STATUS[CVE-2016-4565] = "fixed-version: Fixed from version 4.6rc6"
-
-CVE_STATUS[CVE-2016-4568] = "fixed-version: Fixed from version 4.6rc6"
-
-CVE_STATUS[CVE-2016-4569] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2016-4578] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2016-4580] = "fixed-version: Fixed from version 4.6"
-
-CVE_STATUS[CVE-2016-4581] = "fixed-version: Fixed from version 4.6rc7"
-
-CVE_STATUS[CVE-2016-4794] = "fixed-version: Fixed from version 4.7rc4"
-
-CVE_STATUS[CVE-2016-4805] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-4913] = "fixed-version: Fixed from version 4.6"
-
-CVE_STATUS[CVE-2016-4951] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2016-4997] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2016-4998] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2016-5195] = "fixed-version: Fixed from version 4.9rc2"
-
-CVE_STATUS[CVE-2016-5243] = "fixed-version: Fixed from version 4.7rc3"
-
-CVE_STATUS[CVE-2016-5244] = "fixed-version: Fixed from version 4.7rc3"
-
-# Skipping CVE-2016-5340, no affected_versions
-
-# Skipping CVE-2016-5342, no affected_versions
-
-# Skipping CVE-2016-5343, no affected_versions
-
-# Skipping CVE-2016-5344, no affected_versions
-
-CVE_STATUS[CVE-2016-5400] = "fixed-version: Fixed from version 4.7"
-
-CVE_STATUS[CVE-2016-5412] = "fixed-version: Fixed from version 4.8rc1"
-
-CVE_STATUS[CVE-2016-5696] = "fixed-version: Fixed from version 4.7"
-
-CVE_STATUS[CVE-2016-5728] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2016-5828] = "fixed-version: Fixed from version 4.7rc6"
-
-CVE_STATUS[CVE-2016-5829] = "fixed-version: Fixed from version 4.7rc5"
-
-# CVE-2016-5870 has no known resolution
-
-CVE_STATUS[CVE-2016-6130] = "fixed-version: Fixed from version 4.6rc6"
-
-CVE_STATUS[CVE-2016-6136] = "fixed-version: Fixed from version 4.8rc1"
-
-CVE_STATUS[CVE-2016-6156] = "fixed-version: Fixed from version 4.7rc7"
-
-CVE_STATUS[CVE-2016-6162] = "fixed-version: Fixed from version 4.7"
-
-CVE_STATUS[CVE-2016-6187] = "fixed-version: Fixed from version 4.7rc7"
-
-CVE_STATUS[CVE-2016-6197] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-6198] = "fixed-version: Fixed from version 4.6"
-
-CVE_STATUS[CVE-2016-6213] = "fixed-version: Fixed from version 4.9rc1"
-
-CVE_STATUS[CVE-2016-6327] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-6480] = "fixed-version: Fixed from version 4.8rc3"
-
-CVE_STATUS[CVE-2016-6516] = "fixed-version: Fixed from version 4.8rc1"
-
-# Skipping CVE-2016-6753, no affected_versions
-
-CVE_STATUS[CVE-2016-6786] = "fixed-version: Fixed from version 4.0rc1"
-
-CVE_STATUS[CVE-2016-6787] = "fixed-version: Fixed from version 4.0rc1"
-
-CVE_STATUS[CVE-2016-6828] = "fixed-version: Fixed from version 4.8rc5"
-
-CVE_STATUS[CVE-2016-7039] = "fixed-version: Fixed from version 4.9rc4"
-
-CVE_STATUS[CVE-2016-7042] = "fixed-version: Fixed from version 4.9rc3"
-
-CVE_STATUS[CVE-2016-7097] = "fixed-version: Fixed from version 4.9rc1"
-
-CVE_STATUS[CVE-2016-7117] = "fixed-version: Fixed from version 4.6rc1"
-
-# Skipping CVE-2016-7118, no affected_versions
-
-CVE_STATUS[CVE-2016-7425] = "fixed-version: Fixed from version 4.9rc1"
-
-CVE_STATUS[CVE-2016-7910] = "fixed-version: Fixed from version 4.8rc1"
-
-CVE_STATUS[CVE-2016-7911] = "fixed-version: Fixed from version 4.7rc7"
-
-CVE_STATUS[CVE-2016-7912] = "fixed-version: Fixed from version 4.6rc5"
-
-CVE_STATUS[CVE-2016-7913] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-7914] = "fixed-version: Fixed from version 4.6rc4"
-
-CVE_STATUS[CVE-2016-7915] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-7916] = "fixed-version: Fixed from version 4.6rc7"
-
-CVE_STATUS[CVE-2016-7917] = "fixed-version: Fixed from version 4.5rc6"
-
-CVE_STATUS[CVE-2016-8399] = "fixed-version: Fixed from version 4.9"
-
-# Skipping CVE-2016-8401, no affected_versions
-
-# Skipping CVE-2016-8402, no affected_versions
-
-# Skipping CVE-2016-8403, no affected_versions
-
-# Skipping CVE-2016-8404, no affected_versions
-
-CVE_STATUS[CVE-2016-8405] = "fixed-version: Fixed from version 4.10rc6"
-
-# Skipping CVE-2016-8406, no affected_versions
-
-# Skipping CVE-2016-8407, no affected_versions
-
-CVE_STATUS[CVE-2016-8630] = "fixed-version: Fixed from version 4.9rc4"
-
-CVE_STATUS[CVE-2016-8632] = "fixed-version: Fixed from version 4.9rc8"
-
-CVE_STATUS[CVE-2016-8633] = "fixed-version: Fixed from version 4.9rc4"
-
-CVE_STATUS[CVE-2016-8636] = "fixed-version: Fixed from version 4.10rc8"
-
-CVE_STATUS[CVE-2016-8645] = "fixed-version: Fixed from version 4.9rc6"
-
-CVE_STATUS[CVE-2016-8646] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2016-8650] = "fixed-version: Fixed from version 4.9rc7"
-
-CVE_STATUS[CVE-2016-8655] = "fixed-version: Fixed from version 4.9rc8"
-
-CVE_STATUS[CVE-2016-8658] = "fixed-version: Fixed from version 4.8rc7"
-
-# CVE-2016-8660 has no known resolution
-
-CVE_STATUS[CVE-2016-8666] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-9083] = "fixed-version: Fixed from version 4.9rc4"
-
-CVE_STATUS[CVE-2016-9084] = "fixed-version: Fixed from version 4.9rc4"
-
-CVE_STATUS[CVE-2016-9120] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-9178] = "fixed-version: Fixed from version 4.8rc7"
-
-CVE_STATUS[CVE-2016-9191] = "fixed-version: Fixed from version 4.10rc4"
-
-CVE_STATUS[CVE-2016-9313] = "fixed-version: Fixed from version 4.9rc3"
-
-CVE_STATUS[CVE-2016-9555] = "fixed-version: Fixed from version 4.9rc4"
-
-CVE_STATUS[CVE-2016-9576] = "fixed-version: Fixed from version 4.9"
-
-CVE_STATUS[CVE-2016-9588] = "fixed-version: Fixed from version 4.10rc1"
-
-CVE_STATUS[CVE-2016-9604] = "fixed-version: Fixed from version 4.11rc8"
-
-# Skipping CVE-2016-9644, no affected_versions
-
-CVE_STATUS[CVE-2016-9685] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2016-9754] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2016-9755] = "fixed-version: Fixed from version 4.9rc8"
-
-CVE_STATUS[CVE-2016-9756] = "fixed-version: Fixed from version 4.9rc7"
-
-CVE_STATUS[CVE-2016-9777] = "fixed-version: Fixed from version 4.9rc7"
-
-CVE_STATUS[CVE-2016-9793] = "fixed-version: Fixed from version 4.9rc8"
-
-CVE_STATUS[CVE-2016-9794] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2016-9806] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2016-9919] = "fixed-version: Fixed from version 4.9rc8"
-
-# Skipping CVE-2017-0403, no affected_versions
-
-# Skipping CVE-2017-0404, no affected_versions
-
-# Skipping CVE-2017-0426, no affected_versions
-
-# Skipping CVE-2017-0427, no affected_versions
-
-# CVE-2017-0507 has no known resolution
-
-# CVE-2017-0508 has no known resolution
-
-# Skipping CVE-2017-0510, no affected_versions
-
-# Skipping CVE-2017-0528, no affected_versions
-
-# Skipping CVE-2017-0537, no affected_versions
-
-# CVE-2017-0564 has no known resolution
-
-CVE_STATUS[CVE-2017-0605] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2017-0627] = "fixed-version: Fixed from version 4.14rc1"
-
-# CVE-2017-0630 has no known resolution
-
-# CVE-2017-0749 has no known resolution
-
-CVE_STATUS[CVE-2017-0750] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2017-0786] = "fixed-version: Fixed from version 4.14rc4"
-
-CVE_STATUS[CVE-2017-0861] = "fixed-version: Fixed from version 4.15rc3"
-
-CVE_STATUS[CVE-2017-1000] = "fixed-version: Fixed from version 4.13rc5"
-
-CVE_STATUS[CVE-2017-1000111] = "fixed-version: Fixed from version 4.13rc5"
-
-CVE_STATUS[CVE-2017-1000112] = "fixed-version: Fixed from version 4.13rc5"
-
-CVE_STATUS[CVE-2017-1000251] = "fixed-version: Fixed from version 4.14rc1"
-
-CVE_STATUS[CVE-2017-1000252] = "fixed-version: Fixed from version 4.14rc1"
-
-CVE_STATUS[CVE-2017-1000253] = "fixed-version: Fixed from version 4.1rc1"
-
-CVE_STATUS[CVE-2017-1000255] = "fixed-version: Fixed from version 4.14rc5"
-
-CVE_STATUS[CVE-2017-1000363] = "fixed-version: Fixed from version 4.12rc2"
-
-CVE_STATUS[CVE-2017-1000364] = "fixed-version: Fixed from version 4.12rc6"
-
-CVE_STATUS[CVE-2017-1000365] = "fixed-version: Fixed from version 4.12rc7"
-
-CVE_STATUS[CVE-2017-1000370] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-1000371] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-1000379] = "fixed-version: Fixed from version 4.12rc6"
-
-CVE_STATUS[CVE-2017-1000380] = "fixed-version: Fixed from version 4.12rc5"
-
-CVE_STATUS[CVE-2017-1000405] = "fixed-version: Fixed from version 4.15rc2"
-
-CVE_STATUS[CVE-2017-1000407] = "fixed-version: Fixed from version 4.15rc3"
-
-CVE_STATUS[CVE-2017-1000410] = "fixed-version: Fixed from version 4.15rc8"
-
-CVE_STATUS[CVE-2017-10661] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-10662] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2017-10663] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-10810] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2017-10911] = "fixed-version: Fixed from version 4.12rc7"
-
-CVE_STATUS[CVE-2017-11089] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-11176] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-11472] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2017-11473] = "fixed-version: Fixed from version 4.13rc2"
-
-CVE_STATUS[CVE-2017-11600] = "fixed-version: Fixed from version 4.13"
-
-CVE_STATUS[CVE-2017-12134] = "fixed-version: Fixed from version 4.13rc6"
-
-CVE_STATUS[CVE-2017-12146] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-12153] = "fixed-version: Fixed from version 4.14rc2"
-
-CVE_STATUS[CVE-2017-12154] = "fixed-version: Fixed from version 4.14rc1"
-
-CVE_STATUS[CVE-2017-12168] = "fixed-version: Fixed from version 4.9rc6"
-
-CVE_STATUS[CVE-2017-12188] = "fixed-version: Fixed from version 4.14rc5"
-
-CVE_STATUS[CVE-2017-12190] = "fixed-version: Fixed from version 4.14rc5"
-
-CVE_STATUS[CVE-2017-12192] = "fixed-version: Fixed from version 4.14rc3"
-
-CVE_STATUS[CVE-2017-12193] = "fixed-version: Fixed from version 4.14rc7"
-
-CVE_STATUS[CVE-2017-12762] = "fixed-version: Fixed from version 4.13rc4"
-
-CVE_STATUS[CVE-2017-13080] = "fixed-version: Fixed from version 4.14rc6"
-
-CVE_STATUS[CVE-2017-13166] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2017-13167] = "fixed-version: Fixed from version 4.5rc4"
-
-CVE_STATUS[CVE-2017-13168] = "fixed-version: Fixed from version 4.18rc4"
-
-CVE_STATUS[CVE-2017-13215] = "fixed-version: Fixed from version 4.5rc1"
-
-CVE_STATUS[CVE-2017-13216] = "fixed-version: Fixed from version 4.15rc8"
-
-CVE_STATUS[CVE-2017-13220] = "fixed-version: Fixed from version 3.19rc3"
-
-# CVE-2017-13221 has no known resolution
-
-# CVE-2017-13222 has no known resolution
-
-CVE_STATUS[CVE-2017-13305] = "fixed-version: Fixed from version 4.12rc5"
-
-CVE_STATUS[CVE-2017-13686] = "fixed-version: Fixed from version 4.13rc7"
-
-# CVE-2017-13693 has no known resolution
-
-# CVE-2017-13694 has no known resolution
-
-CVE_STATUS[CVE-2017-13695] = "fixed-version: Fixed from version 4.17rc1"
-
-CVE_STATUS[CVE-2017-13715] = "fixed-version: Fixed from version 4.3rc1"
-
-CVE_STATUS[CVE-2017-14051] = "fixed-version: Fixed from version 4.14rc1"
-
-CVE_STATUS[CVE-2017-14106] = "fixed-version: Fixed from version 4.12rc3"
-
-CVE_STATUS[CVE-2017-14140] = "fixed-version: Fixed from version 4.13rc6"
-
-CVE_STATUS[CVE-2017-14156] = "fixed-version: Fixed from version 4.14rc1"
-
-CVE_STATUS[CVE-2017-14340] = "fixed-version: Fixed from version 4.14rc1"
-
-CVE_STATUS[CVE-2017-14489] = "fixed-version: Fixed from version 4.14rc3"
-
-CVE_STATUS[CVE-2017-14497] = "fixed-version: Fixed from version 4.13"
-
-CVE_STATUS[CVE-2017-14954] = "fixed-version: Fixed from version 4.14rc3"
-
-CVE_STATUS[CVE-2017-14991] = "fixed-version: Fixed from version 4.14rc2"
-
-CVE_STATUS[CVE-2017-15102] = "fixed-version: Fixed from version 4.9rc1"
-
-CVE_STATUS[CVE-2017-15115] = "fixed-version: Fixed from version 4.14rc6"
-
-CVE_STATUS[CVE-2017-15116] = "fixed-version: Fixed from version 4.2rc1"
-
-CVE_STATUS[CVE-2017-15121] = "fixed-version: Fixed from version 3.11rc1"
-
-CVE_STATUS[CVE-2017-15126] = "fixed-version: Fixed from version 4.14rc4"
-
-CVE_STATUS[CVE-2017-15127] = "fixed-version: Fixed from version 4.13rc5"
-
-CVE_STATUS[CVE-2017-15128] = "fixed-version: Fixed from version 4.14rc8"
-
-CVE_STATUS[CVE-2017-15129] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-15265] = "fixed-version: Fixed from version 4.14rc5"
-
-CVE_STATUS[CVE-2017-15274] = "fixed-version: Fixed from version 4.12rc5"
-
-CVE_STATUS[CVE-2017-15299] = "fixed-version: Fixed from version 4.14rc6"
-
-CVE_STATUS[CVE-2017-15306] = "fixed-version: Fixed from version 4.14rc7"
-
-CVE_STATUS[CVE-2017-15537] = "fixed-version: Fixed from version 4.14rc3"
-
-CVE_STATUS[CVE-2017-15649] = "fixed-version: Fixed from version 4.14rc4"
-
-CVE_STATUS[CVE-2017-15868] = "fixed-version: Fixed from version 3.19rc3"
-
-CVE_STATUS[CVE-2017-15951] = "fixed-version: Fixed from version 4.14rc6"
-
-CVE_STATUS[CVE-2017-16525] = "fixed-version: Fixed from version 4.14rc5"
-
-CVE_STATUS[CVE-2017-16526] = "fixed-version: Fixed from version 4.14rc4"
-
-CVE_STATUS[CVE-2017-16527] = "fixed-version: Fixed from version 4.14rc5"
-
-CVE_STATUS[CVE-2017-16528] = "fixed-version: Fixed from version 4.14rc1"
-
-CVE_STATUS[CVE-2017-16529] = "fixed-version: Fixed from version 4.14rc4"
-
-CVE_STATUS[CVE-2017-16530] = "fixed-version: Fixed from version 4.14rc4"
-
-CVE_STATUS[CVE-2017-16531] = "fixed-version: Fixed from version 4.14rc4"
-
-CVE_STATUS[CVE-2017-16532] = "fixed-version: Fixed from version 4.14rc5"
-
-CVE_STATUS[CVE-2017-16533] = "fixed-version: Fixed from version 4.14rc5"
-
-CVE_STATUS[CVE-2017-16534] = "fixed-version: Fixed from version 4.14rc4"
-
-CVE_STATUS[CVE-2017-16535] = "fixed-version: Fixed from version 4.14rc6"
-
-CVE_STATUS[CVE-2017-16536] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2017-16537] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2017-16538] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2017-16643] = "fixed-version: Fixed from version 4.14rc7"
-
-CVE_STATUS[CVE-2017-16644] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2017-16645] = "fixed-version: Fixed from version 4.14rc6"
-
-CVE_STATUS[CVE-2017-16646] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2017-16647] = "fixed-version: Fixed from version 4.14"
-
-CVE_STATUS[CVE-2017-16648] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2017-16649] = "fixed-version: Fixed from version 4.14"
-
-CVE_STATUS[CVE-2017-16650] = "fixed-version: Fixed from version 4.14"
-
-CVE_STATUS[CVE-2017-16911] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-16912] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-16913] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-16914] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-16939] = "fixed-version: Fixed from version 4.14rc7"
-
-CVE_STATUS[CVE-2017-16994] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2017-16995] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-16996] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-17052] = "fixed-version: Fixed from version 4.13rc7"
-
-CVE_STATUS[CVE-2017-17053] = "fixed-version: Fixed from version 4.13rc7"
-
-CVE_STATUS[CVE-2017-17448] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-17449] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-17450] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-17558] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-17712] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-17741] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-17805] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-17806] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-17807] = "fixed-version: Fixed from version 4.15rc3"
-
-CVE_STATUS[CVE-2017-17852] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-17853] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-17854] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-17855] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-17856] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-17857] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-17862] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2017-17863] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-17864] = "fixed-version: Fixed from version 4.15rc5"
-
-CVE_STATUS[CVE-2017-17975] = "fixed-version: Fixed from version 4.17rc1"
-
-CVE_STATUS[CVE-2017-18017] = "fixed-version: Fixed from version 4.11rc7"
-
-CVE_STATUS[CVE-2017-18075] = "fixed-version: Fixed from version 4.15rc7"
-
-CVE_STATUS[CVE-2017-18079] = "fixed-version: Fixed from version 4.13rc1"
-
-# CVE-2017-18169 has no known resolution
-
-CVE_STATUS[CVE-2017-18174] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2017-18193] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-18200] = "fixed-version: Fixed from version 4.14rc5"
-
-CVE_STATUS[CVE-2017-18202] = "fixed-version: Fixed from version 4.15rc2"
-
-CVE_STATUS[CVE-2017-18203] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2017-18204] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2017-18208] = "fixed-version: Fixed from version 4.15rc2"
-
-CVE_STATUS[CVE-2017-18216] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2017-18218] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-18221] = "fixed-version: Fixed from version 4.12rc4"
-
-CVE_STATUS[CVE-2017-18222] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2017-18224] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2017-18232] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2017-18241] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-18249] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2017-18255] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-18257] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-18261] = "fixed-version: Fixed from version 4.13rc6"
-
-CVE_STATUS[CVE-2017-18270] = "fixed-version: Fixed from version 4.14rc3"
-
-CVE_STATUS[CVE-2017-18344] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2017-18360] = "fixed-version: Fixed from version 4.12rc2"
-
-CVE_STATUS[CVE-2017-18379] = "fixed-version: Fixed from version 4.14rc3"
-
-CVE_STATUS[CVE-2017-18509] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-18549] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-18550] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-18551] = "fixed-version: Fixed from version 4.15rc9"
-
-CVE_STATUS[CVE-2017-18552] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-18595] = "fixed-version: Fixed from version 4.15rc6"
-
-CVE_STATUS[CVE-2017-2583] = "fixed-version: Fixed from version 4.10rc4"
-
-CVE_STATUS[CVE-2017-2584] = "fixed-version: Fixed from version 4.10rc4"
-
-CVE_STATUS[CVE-2017-2596] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-2618] = "fixed-version: Fixed from version 4.10rc8"
-
-CVE_STATUS[CVE-2017-2634] = "fixed-version: Fixed from version 2.6.25rc1"
-
-CVE_STATUS[CVE-2017-2636] = "fixed-version: Fixed from version 4.11rc2"
-
-CVE_STATUS[CVE-2017-2647] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2017-2671] = "fixed-version: Fixed from version 4.11rc6"
-
-CVE_STATUS[CVE-2017-5123] = "fixed-version: Fixed from version 4.14rc5"
-
-CVE_STATUS[CVE-2017-5546] = "fixed-version: Fixed from version 4.10rc4"
-
-CVE_STATUS[CVE-2017-5547] = "fixed-version: Fixed from version 4.10rc5"
-
-CVE_STATUS[CVE-2017-5548] = "fixed-version: Fixed from version 4.10rc5"
-
-CVE_STATUS[CVE-2017-5549] = "fixed-version: Fixed from version 4.10rc4"
-
-CVE_STATUS[CVE-2017-5550] = "fixed-version: Fixed from version 4.10rc4"
-
-CVE_STATUS[CVE-2017-5551] = "fixed-version: Fixed from version 4.10rc4"
-
-CVE_STATUS[CVE-2017-5576] = "fixed-version: Fixed from version 4.10rc6"
-
-CVE_STATUS[CVE-2017-5577] = "fixed-version: Fixed from version 4.10rc6"
-
-CVE_STATUS[CVE-2017-5669] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-5715] = "fixed-version: Fixed from version 4.15rc8"
-
-CVE_STATUS[CVE-2017-5753] = "fixed-version: Fixed from version 4.15rc8"
-
-CVE_STATUS[CVE-2017-5754] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2017-5897] = "fixed-version: Fixed from version 4.10rc8"
-
-CVE_STATUS[CVE-2017-5967] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-5970] = "fixed-version: Fixed from version 4.10rc8"
-
-CVE_STATUS[CVE-2017-5972] = "fixed-version: Fixed from version 4.4rc1"
-
-CVE_STATUS[CVE-2017-5986] = "fixed-version: Fixed from version 4.10rc8"
-
-CVE_STATUS[CVE-2017-6001] = "fixed-version: Fixed from version 4.10rc4"
-
-CVE_STATUS[CVE-2017-6074] = "fixed-version: Fixed from version 4.10"
-
-CVE_STATUS[CVE-2017-6214] = "fixed-version: Fixed from version 4.10rc8"
-
-CVE_STATUS[CVE-2017-6345] = "fixed-version: Fixed from version 4.10"
-
-CVE_STATUS[CVE-2017-6346] = "fixed-version: Fixed from version 4.10"
-
-CVE_STATUS[CVE-2017-6347] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-6348] = "fixed-version: Fixed from version 4.10"
-
-CVE_STATUS[CVE-2017-6353] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-6874] = "fixed-version: Fixed from version 4.11rc2"
-
-CVE_STATUS[CVE-2017-6951] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2017-7184] = "fixed-version: Fixed from version 4.11rc5"
-
-CVE_STATUS[CVE-2017-7187] = "fixed-version: Fixed from version 4.11rc5"
-
-CVE_STATUS[CVE-2017-7261] = "fixed-version: Fixed from version 4.11rc6"
-
-CVE_STATUS[CVE-2017-7273] = "fixed-version: Fixed from version 4.10rc4"
-
-CVE_STATUS[CVE-2017-7277] = "fixed-version: Fixed from version 4.11rc4"
-
-CVE_STATUS[CVE-2017-7294] = "fixed-version: Fixed from version 4.11rc6"
-
-CVE_STATUS[CVE-2017-7308] = "fixed-version: Fixed from version 4.11rc6"
-
-CVE_STATUS[CVE-2017-7346] = "fixed-version: Fixed from version 4.12rc5"
-
-# CVE-2017-7369 has no known resolution
-
-CVE_STATUS[CVE-2017-7374] = "fixed-version: Fixed from version 4.11rc4"
-
-CVE_STATUS[CVE-2017-7472] = "fixed-version: Fixed from version 4.11rc8"
-
-CVE_STATUS[CVE-2017-7477] = "fixed-version: Fixed from version 4.11"
-
-CVE_STATUS[CVE-2017-7482] = "fixed-version: Fixed from version 4.12rc7"
-
-CVE_STATUS[CVE-2017-7487] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2017-7495] = "fixed-version: Fixed from version 4.7rc1"
-
-CVE_STATUS[CVE-2017-7518] = "fixed-version: Fixed from version 4.12rc7"
-
-CVE_STATUS[CVE-2017-7533] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-7541] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-7542] = "fixed-version: Fixed from version 4.13rc2"
-
-CVE_STATUS[CVE-2017-7558] = "fixed-version: Fixed from version 4.13"
-
-CVE_STATUS[CVE-2017-7616] = "fixed-version: Fixed from version 4.11rc6"
-
-CVE_STATUS[CVE-2017-7618] = "fixed-version: Fixed from version 4.11rc8"
-
-CVE_STATUS[CVE-2017-7645] = "fixed-version: Fixed from version 4.11"
-
-CVE_STATUS[CVE-2017-7889] = "fixed-version: Fixed from version 4.11rc7"
-
-CVE_STATUS[CVE-2017-7895] = "fixed-version: Fixed from version 4.11"
-
-CVE_STATUS[CVE-2017-7979] = "fixed-version: Fixed from version 4.11rc8"
-
-CVE_STATUS[CVE-2017-8061] = "fixed-version: Fixed from version 4.11rc4"
-
-CVE_STATUS[CVE-2017-8062] = "fixed-version: Fixed from version 4.11rc2"
-
-CVE_STATUS[CVE-2017-8063] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-8064] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-8065] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-8066] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-8067] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2017-8068] = "fixed-version: Fixed from version 4.10rc8"
-
-CVE_STATUS[CVE-2017-8069] = "fixed-version: Fixed from version 4.10rc8"
-
-CVE_STATUS[CVE-2017-8070] = "fixed-version: Fixed from version 4.10rc8"
-
-CVE_STATUS[CVE-2017-8071] = "fixed-version: Fixed from version 4.10rc7"
-
-CVE_STATUS[CVE-2017-8072] = "fixed-version: Fixed from version 4.10rc7"
-
-CVE_STATUS[CVE-2017-8106] = "fixed-version: Fixed from version 3.16rc1"
-
-CVE_STATUS[CVE-2017-8240] = "fixed-version: Fixed from version 3.19rc6"
-
-# CVE-2017-8242 has no known resolution
-
-# CVE-2017-8244 has no known resolution
-
-# CVE-2017-8245 has no known resolution
-
-# CVE-2017-8246 has no known resolution
-
-CVE_STATUS[CVE-2017-8797] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2017-8824] = "fixed-version: Fixed from version 4.15rc3"
-
-CVE_STATUS[CVE-2017-8831] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-8890] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2017-8924] = "fixed-version: Fixed from version 4.11rc2"
-
-CVE_STATUS[CVE-2017-8925] = "fixed-version: Fixed from version 4.11rc2"
-
-CVE_STATUS[CVE-2017-9059] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2017-9074] = "fixed-version: Fixed from version 4.12rc2"
-
-CVE_STATUS[CVE-2017-9075] = "fixed-version: Fixed from version 4.12rc2"
-
-CVE_STATUS[CVE-2017-9076] = "fixed-version: Fixed from version 4.12rc2"
-
-CVE_STATUS[CVE-2017-9077] = "fixed-version: Fixed from version 4.12rc2"
-
-CVE_STATUS[CVE-2017-9150] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2017-9211] = "fixed-version: Fixed from version 4.12rc3"
-
-CVE_STATUS[CVE-2017-9242] = "fixed-version: Fixed from version 4.12rc3"
-
-CVE_STATUS[CVE-2017-9605] = "fixed-version: Fixed from version 4.12rc5"
-
-CVE_STATUS[CVE-2017-9725] = "fixed-version: Fixed from version 4.3rc7"
-
-CVE_STATUS[CVE-2017-9984] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-9985] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2017-9986] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2018-1000004] = "fixed-version: Fixed from version 4.15rc9"
-
-CVE_STATUS[CVE-2018-1000026] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2018-1000028] = "fixed-version: Fixed from version 4.15"
-
-CVE_STATUS[CVE-2018-1000199] = "fixed-version: Fixed from version 4.16"
-
-CVE_STATUS[CVE-2018-1000200] = "fixed-version: Fixed from version 4.17rc5"
-
-CVE_STATUS[CVE-2018-1000204] = "fixed-version: Fixed from version 4.17rc7"
-
-CVE_STATUS[CVE-2018-10021] = "fixed-version: Fixed from version 4.16rc7"
-
-CVE_STATUS[CVE-2018-10074] = "fixed-version: Fixed from version 4.16rc7"
-
-CVE_STATUS[CVE-2018-10087] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2018-10124] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2018-10322] = "fixed-version: Fixed from version 4.17rc4"
-
-CVE_STATUS[CVE-2018-10323] = "fixed-version: Fixed from version 4.17rc4"
-
-CVE_STATUS[CVE-2018-1065] = "fixed-version: Fixed from version 4.16rc3"
-
-CVE_STATUS[CVE-2018-1066] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2018-10675] = "fixed-version: Fixed from version 4.13rc6"
-
-CVE_STATUS[CVE-2018-1068] = "fixed-version: Fixed from version 4.16rc5"
-
-CVE_STATUS[CVE-2018-10840] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-10853] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-1087] = "fixed-version: Fixed from version 4.16rc7"
-
-# CVE-2018-10872 has no known resolution
-
-CVE_STATUS[CVE-2018-10876] = "fixed-version: Fixed from version 4.18rc4"
-
-CVE_STATUS[CVE-2018-10877] = "fixed-version: Fixed from version 4.18rc4"
-
-CVE_STATUS[CVE-2018-10878] = "fixed-version: Fixed from version 4.18rc4"
-
-CVE_STATUS[CVE-2018-10879] = "fixed-version: Fixed from version 4.18rc4"
-
-CVE_STATUS[CVE-2018-10880] = "fixed-version: Fixed from version 4.18rc4"
-
-CVE_STATUS[CVE-2018-10881] = "fixed-version: Fixed from version 4.18rc4"
-
-CVE_STATUS[CVE-2018-10882] = "fixed-version: Fixed from version 4.18rc4"
-
-CVE_STATUS[CVE-2018-10883] = "fixed-version: Fixed from version 4.18rc4"
-
-CVE_STATUS[CVE-2018-10901] = "fixed-version: Fixed from version 2.6.36rc1"
-
-CVE_STATUS[CVE-2018-10902] = "fixed-version: Fixed from version 4.18rc6"
-
-CVE_STATUS[CVE-2018-1091] = "fixed-version: Fixed from version 4.14rc2"
-
-CVE_STATUS[CVE-2018-1092] = "fixed-version: Fixed from version 4.17rc1"
-
-CVE_STATUS[CVE-2018-1093] = "fixed-version: Fixed from version 4.17rc1"
-
-CVE_STATUS[CVE-2018-10938] = "fixed-version: Fixed from version 4.13rc5"
-
-CVE_STATUS[CVE-2018-1094] = "fixed-version: Fixed from version 4.17rc1"
-
-CVE_STATUS[CVE-2018-10940] = "fixed-version: Fixed from version 4.17rc3"
-
-CVE_STATUS[CVE-2018-1095] = "fixed-version: Fixed from version 4.17rc1"
-
-CVE_STATUS[CVE-2018-1108] = "fixed-version: Fixed from version 4.17rc2"
-
-CVE_STATUS[CVE-2018-1118] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-1120] = "fixed-version: Fixed from version 4.17rc6"
-
-# CVE-2018-1121 has no known resolution
-
-CVE_STATUS[CVE-2018-11232] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2018-1128] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-1129] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-1130] = "fixed-version: Fixed from version 4.16rc7"
-
-CVE_STATUS[CVE-2018-11412] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-11506] = "fixed-version: Fixed from version 4.17rc7"
-
-CVE_STATUS[CVE-2018-11508] = "fixed-version: Fixed from version 4.17rc5"
-
-# CVE-2018-11987 has no known resolution
-
-CVE_STATUS[CVE-2018-12126] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2018-12127] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2018-12130] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2018-12207] = "fixed-version: Fixed from version 5.4rc2"
-
-CVE_STATUS[CVE-2018-12232] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-12233] = "fixed-version: Fixed from version 4.18rc2"
-
-CVE_STATUS[CVE-2018-12633] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-12714] = "fixed-version: Fixed from version 4.18rc2"
-
-CVE_STATUS[CVE-2018-12896] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-12904] = "fixed-version: Fixed from version 4.18rc1"
-
-# CVE-2018-12928 has no known resolution
-
-# CVE-2018-12929 has no known resolution
-
-# CVE-2018-12930 has no known resolution
-
-# CVE-2018-12931 has no known resolution
-
-CVE_STATUS[CVE-2018-13053] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-13093] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-13094] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-13095] = "fixed-version: Fixed from version 4.18rc3"
-
-CVE_STATUS[CVE-2018-13096] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-13097] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-13098] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-13099] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-13100] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-13405] = "fixed-version: Fixed from version 4.18rc4"
-
-CVE_STATUS[CVE-2018-13406] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-14609] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-14610] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-14611] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-14612] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-14613] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-14614] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-14615] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-14616] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-14617] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-14619] = "fixed-version: Fixed from version 4.15rc4"
-
-CVE_STATUS[CVE-2018-14625] = "fixed-version: Fixed from version 4.20rc6"
-
-CVE_STATUS[CVE-2018-14633] = "fixed-version: Fixed from version 4.19rc6"
-
-CVE_STATUS[CVE-2018-14634] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2018-14641] = "fixed-version: Fixed from version 4.19rc4"
-
-CVE_STATUS[CVE-2018-14646] = "fixed-version: Fixed from version 4.15rc8"
-
-CVE_STATUS[CVE-2018-14656] = "fixed-version: Fixed from version 4.19rc2"
-
-CVE_STATUS[CVE-2018-14678] = "fixed-version: Fixed from version 4.18rc8"
-
-CVE_STATUS[CVE-2018-14734] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-15471] = "fixed-version: Fixed from version 4.19rc7"
-
-CVE_STATUS[CVE-2018-15572] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-15594] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-16276] = "fixed-version: Fixed from version 4.18rc5"
-
-CVE_STATUS[CVE-2018-16597] = "fixed-version: Fixed from version 4.8rc1"
-
-CVE_STATUS[CVE-2018-16658] = "fixed-version: Fixed from version 4.19rc2"
-
-CVE_STATUS[CVE-2018-16862] = "fixed-version: Fixed from version 4.20rc5"
-
-CVE_STATUS[CVE-2018-16871] = "fixed-version: Fixed from version 4.20rc3"
-
-CVE_STATUS[CVE-2018-16880] = "fixed-version: Fixed from version 5.0rc5"
-
-CVE_STATUS[CVE-2018-16882] = "fixed-version: Fixed from version 4.20"
-
-CVE_STATUS[CVE-2018-16884] = "fixed-version: Fixed from version 5.0rc1"
-
-# CVE-2018-16885 has no known resolution
-
-CVE_STATUS[CVE-2018-17182] = "fixed-version: Fixed from version 4.19rc4"
-
-CVE_STATUS[CVE-2018-17972] = "fixed-version: Fixed from version 4.19rc7"
-
-# CVE-2018-17977 has no known resolution
-
-CVE_STATUS[CVE-2018-18021] = "fixed-version: Fixed from version 4.19rc7"
-
-CVE_STATUS[CVE-2018-18281] = "fixed-version: Fixed from version 4.19"
-
-CVE_STATUS[CVE-2018-18386] = "fixed-version: Fixed from version 4.15rc6"
-
-CVE_STATUS[CVE-2018-18397] = "fixed-version: Fixed from version 4.20rc5"
-
-CVE_STATUS[CVE-2018-18445] = "fixed-version: Fixed from version 4.19rc7"
-
-CVE_STATUS[CVE-2018-18559] = "fixed-version: Fixed from version 4.15rc2"
-
-# CVE-2018-18653 has no known resolution
-
-CVE_STATUS[CVE-2018-18690] = "fixed-version: Fixed from version 4.17rc4"
-
-CVE_STATUS[CVE-2018-18710] = "fixed-version: Fixed from version 4.20rc1"
-
-CVE_STATUS[CVE-2018-18955] = "fixed-version: Fixed from version 4.20rc2"
-
-CVE_STATUS[CVE-2018-19406] = "fixed-version: Fixed from version 4.20rc5"
-
-CVE_STATUS[CVE-2018-19407] = "fixed-version: Fixed from version 4.20rc5"
-
-CVE_STATUS[CVE-2018-19824] = "fixed-version: Fixed from version 4.20rc6"
-
-CVE_STATUS[CVE-2018-19854] = "fixed-version: Fixed from version 4.20rc3"
-
-CVE_STATUS[CVE-2018-19985] = "fixed-version: Fixed from version 4.20"
-
-CVE_STATUS[CVE-2018-20169] = "fixed-version: Fixed from version 4.20rc6"
-
-CVE_STATUS[CVE-2018-20449] = "fixed-version: Fixed from version 4.15rc2"
-
-CVE_STATUS[CVE-2018-20509] = "fixed-version: Fixed from version 4.14rc1"
-
-CVE_STATUS[CVE-2018-20510] = "fixed-version: Fixed from version 4.16rc3"
-
-CVE_STATUS[CVE-2018-20511] = "fixed-version: Fixed from version 4.19rc5"
-
-CVE_STATUS[CVE-2018-20669] = "fixed-version: Fixed from version 5.0rc1"
-
-CVE_STATUS[CVE-2018-20784] = "fixed-version: Fixed from version 5.0rc1"
-
-CVE_STATUS[CVE-2018-20836] = "fixed-version: Fixed from version 4.20rc1"
-
-CVE_STATUS[CVE-2018-20854] = "fixed-version: Fixed from version 4.20rc1"
-
-CVE_STATUS[CVE-2018-20855] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-20856] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-20961] = "fixed-version: Fixed from version 4.17rc1"
-
-CVE_STATUS[CVE-2018-20976] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-21008] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2018-25015] = "fixed-version: Fixed from version 4.15rc9"
-
-CVE_STATUS[CVE-2018-25020] = "fixed-version: Fixed from version 4.17rc7"
-
-# CVE-2018-3574 has no known resolution
-
-CVE_STATUS[CVE-2018-3620] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-3639] = "fixed-version: Fixed from version 4.17rc7"
-
-CVE_STATUS[CVE-2018-3646] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-3665] = "fixed-version: Fixed from version 3.7rc1"
-
-CVE_STATUS[CVE-2018-3693] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-5332] = "fixed-version: Fixed from version 4.15rc8"
-
-CVE_STATUS[CVE-2018-5333] = "fixed-version: Fixed from version 4.15rc8"
-
-CVE_STATUS[CVE-2018-5344] = "fixed-version: Fixed from version 4.15rc8"
-
-CVE_STATUS[CVE-2018-5390] = "fixed-version: Fixed from version 4.18rc7"
-
-CVE_STATUS[CVE-2018-5391] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-5703] = "fixed-version: Fixed from version 4.16rc5"
-
-CVE_STATUS[CVE-2018-5750] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2018-5803] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2018-5814] = "fixed-version: Fixed from version 4.17rc6"
-
-CVE_STATUS[CVE-2018-5848] = "fixed-version: Fixed from version 4.16rc1"
-
-# Skipping CVE-2018-5856, no affected_versions
-
-CVE_STATUS[CVE-2018-5873] = "fixed-version: Fixed from version 4.11rc8"
-
-CVE_STATUS[CVE-2018-5953] = "fixed-version: Fixed from version 4.15rc2"
-
-CVE_STATUS[CVE-2018-5995] = "fixed-version: Fixed from version 4.15rc2"
-
-CVE_STATUS[CVE-2018-6412] = "fixed-version: Fixed from version 4.16rc5"
-
-CVE_STATUS[CVE-2018-6554] = "fixed-version: Fixed from version 4.17rc1"
-
-CVE_STATUS[CVE-2018-6555] = "fixed-version: Fixed from version 4.17rc1"
-
-# CVE-2018-6559 has no known resolution
-
-CVE_STATUS[CVE-2018-6927] = "fixed-version: Fixed from version 4.15rc9"
-
-CVE_STATUS[CVE-2018-7191] = "fixed-version: Fixed from version 4.14rc6"
-
-CVE_STATUS[CVE-2018-7273] = "fixed-version: Fixed from version 4.15rc2"
-
-CVE_STATUS[CVE-2018-7480] = "fixed-version: Fixed from version 4.11rc1"
-
-CVE_STATUS[CVE-2018-7492] = "fixed-version: Fixed from version 4.15rc3"
-
-CVE_STATUS[CVE-2018-7566] = "fixed-version: Fixed from version 4.16rc2"
-
-CVE_STATUS[CVE-2018-7740] = "fixed-version: Fixed from version 4.16rc7"
-
-CVE_STATUS[CVE-2018-7754] = "fixed-version: Fixed from version 4.15rc2"
-
-CVE_STATUS[CVE-2018-7755] = "fixed-version: Fixed from version 4.19rc5"
-
-CVE_STATUS[CVE-2018-7757] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2018-7995] = "fixed-version: Fixed from version 4.16rc5"
-
-CVE_STATUS[CVE-2018-8043] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2018-8087] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2018-8781] = "fixed-version: Fixed from version 4.16rc7"
-
-CVE_STATUS[CVE-2018-8822] = "fixed-version: Fixed from version 4.16rc7"
-
-CVE_STATUS[CVE-2018-8897] = "fixed-version: Fixed from version 4.16rc7"
-
-CVE_STATUS[CVE-2018-9363] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2018-9385] = "fixed-version: Fixed from version 4.17rc3"
-
-CVE_STATUS[CVE-2018-9415] = "fixed-version: Fixed from version 4.17rc3"
-
-CVE_STATUS[CVE-2018-9422] = "fixed-version: Fixed from version 4.6rc1"
-
-CVE_STATUS[CVE-2018-9465] = "fixed-version: Fixed from version 4.15rc6"
-
-CVE_STATUS[CVE-2018-9516] = "fixed-version: Fixed from version 4.18rc5"
-
-CVE_STATUS[CVE-2018-9517] = "fixed-version: Fixed from version 4.14rc1"
-
-CVE_STATUS[CVE-2018-9518] = "fixed-version: Fixed from version 4.16rc3"
-
-CVE_STATUS[CVE-2018-9568] = "fixed-version: Fixed from version 4.14rc4"
-
-CVE_STATUS[CVE-2019-0136] = "fixed-version: Fixed from version 5.2rc6"
-
-CVE_STATUS[CVE-2019-0145] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-0146] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-0147] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-0148] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-0149] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-0154] = "fixed-version: Fixed from version 5.4rc8"
-
-CVE_STATUS[CVE-2019-0155] = "fixed-version: Fixed from version 5.4rc8"
-
-CVE_STATUS[CVE-2019-10124] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-10125] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-10126] = "fixed-version: Fixed from version 5.2rc6"
-
-# CVE-2019-10140 has no known resolution
-
-CVE_STATUS[CVE-2019-10142] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-10207] = "fixed-version: Fixed from version 5.3rc3"
-
-CVE_STATUS[CVE-2019-10220] = "fixed-version: Fixed from version 5.4rc2"
-
-CVE_STATUS[CVE-2019-10638] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-10639] = "fixed-version: Fixed from version 5.1rc4"
-
-CVE_STATUS[CVE-2019-11085] = "fixed-version: Fixed from version 5.0rc3"
-
-CVE_STATUS[CVE-2019-11091] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-11135] = "fixed-version: Fixed from version 5.4rc8"
-
-CVE_STATUS[CVE-2019-11190] = "fixed-version: Fixed from version 4.8rc5"
-
-CVE_STATUS[CVE-2019-11191] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-1125] = "fixed-version: Fixed from version 5.3rc4"
-
-CVE_STATUS[CVE-2019-11477] = "fixed-version: Fixed from version 5.2rc6"
-
-CVE_STATUS[CVE-2019-11478] = "fixed-version: Fixed from version 5.2rc6"
-
-CVE_STATUS[CVE-2019-11479] = "fixed-version: Fixed from version 5.2rc6"
-
-CVE_STATUS[CVE-2019-11486] = "fixed-version: Fixed from version 5.1rc4"
-
-CVE_STATUS[CVE-2019-11487] = "fixed-version: Fixed from version 5.1rc5"
-
-CVE_STATUS[CVE-2019-11599] = "fixed-version: Fixed from version 5.1rc6"
-
-CVE_STATUS[CVE-2019-11683] = "fixed-version: Fixed from version 5.1"
-
-CVE_STATUS[CVE-2019-11810] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-11811] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-11815] = "fixed-version: Fixed from version 5.1rc4"
-
-CVE_STATUS[CVE-2019-11833] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-11884] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-12378] = "fixed-version: Fixed from version 5.2rc3"
-
-CVE_STATUS[CVE-2019-12379] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-12380] = "fixed-version: Fixed from version 5.2rc3"
-
-CVE_STATUS[CVE-2019-12381] = "fixed-version: Fixed from version 5.2rc3"
-
-CVE_STATUS[CVE-2019-12382] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-12454] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-12455] = "fixed-version: Fixed from version 5.3rc1"
-
-# CVE-2019-12456 has no known resolution
-
-CVE_STATUS[CVE-2019-12614] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-12615] = "fixed-version: Fixed from version 5.2rc4"
-
-CVE_STATUS[CVE-2019-12817] = "fixed-version: Fixed from version 5.2rc7"
-
-CVE_STATUS[CVE-2019-12818] = "fixed-version: Fixed from version 5.0"
-
-CVE_STATUS[CVE-2019-12819] = "fixed-version: Fixed from version 5.0rc8"
-
-CVE_STATUS[CVE-2019-12881] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2019-12984] = "fixed-version: Fixed from version 5.2rc6"
-
-CVE_STATUS[CVE-2019-13233] = "fixed-version: Fixed from version 5.2rc4"
-
-CVE_STATUS[CVE-2019-13272] = "fixed-version: Fixed from version 5.2"
-
-CVE_STATUS[CVE-2019-13631] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-13648] = "fixed-version: Fixed from version 5.3rc2"
-
-CVE_STATUS[CVE-2019-14283] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-14284] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-14615] = "fixed-version: Fixed from version 5.5rc7"
-
-CVE_STATUS[CVE-2019-14763] = "fixed-version: Fixed from version 4.17rc1"
-
-CVE_STATUS[CVE-2019-14814] = "fixed-version: Fixed from version 5.3"
-
-CVE_STATUS[CVE-2019-14815] = "fixed-version: Fixed from version 5.3"
-
-CVE_STATUS[CVE-2019-14816] = "fixed-version: Fixed from version 5.3"
-
-CVE_STATUS[CVE-2019-14821] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-14835] = "fixed-version: Fixed from version 5.3"
-
-CVE_STATUS[CVE-2019-14895] = "fixed-version: Fixed from version 5.5rc3"
-
-CVE_STATUS[CVE-2019-14896] = "fixed-version: Fixed from version 5.5"
-
-CVE_STATUS[CVE-2019-14897] = "fixed-version: Fixed from version 5.5"
-
-# CVE-2019-14898 has no known resolution
-
-CVE_STATUS[CVE-2019-14901] = "fixed-version: Fixed from version 5.5rc3"
-
-CVE_STATUS[CVE-2019-15030] = "fixed-version: Fixed from version 5.3rc8"
-
-CVE_STATUS[CVE-2019-15031] = "fixed-version: Fixed from version 5.3rc8"
-
-CVE_STATUS[CVE-2019-15090] = "fixed-version: Fixed from version 5.2rc2"
-
-CVE_STATUS[CVE-2019-15098] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-15099] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-15117] = "fixed-version: Fixed from version 5.3rc5"
-
-CVE_STATUS[CVE-2019-15118] = "fixed-version: Fixed from version 5.3rc5"
-
-CVE_STATUS[CVE-2019-15211] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-15212] = "fixed-version: Fixed from version 5.2rc3"
-
-CVE_STATUS[CVE-2019-15213] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-15214] = "fixed-version: Fixed from version 5.1rc6"
-
-CVE_STATUS[CVE-2019-15215] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-15216] = "fixed-version: Fixed from version 5.1"
-
-CVE_STATUS[CVE-2019-15217] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-15218] = "fixed-version: Fixed from version 5.2rc3"
-
-CVE_STATUS[CVE-2019-15219] = "fixed-version: Fixed from version 5.2rc3"
-
-CVE_STATUS[CVE-2019-15220] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-15221] = "fixed-version: Fixed from version 5.2"
-
-CVE_STATUS[CVE-2019-15222] = "fixed-version: Fixed from version 5.3rc3"
-
-CVE_STATUS[CVE-2019-15223] = "fixed-version: Fixed from version 5.2rc3"
-
-# CVE-2019-15239 has no known resolution
-
-# CVE-2019-15290 has no known resolution
-
-CVE_STATUS[CVE-2019-15291] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-15292] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-15504] = "fixed-version: Fixed from version 5.3"
-
-CVE_STATUS[CVE-2019-15505] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-15538] = "fixed-version: Fixed from version 5.3rc6"
-
-CVE_STATUS[CVE-2019-15666] = "fixed-version: Fixed from version 5.1"
-
-# CVE-2019-15791 has no known resolution
-
-# CVE-2019-15792 has no known resolution
-
-# CVE-2019-15793 has no known resolution
-
-CVE_STATUS[CVE-2019-15794] = "fixed-version: Fixed from version 5.12"
-
-CVE_STATUS[CVE-2019-15807] = "fixed-version: Fixed from version 5.2rc3"
-
-# CVE-2019-15902 has no known resolution
-
-CVE_STATUS[CVE-2019-15916] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-15917] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-15918] = "fixed-version: Fixed from version 5.1rc6"
-
-CVE_STATUS[CVE-2019-15919] = "fixed-version: Fixed from version 5.1rc6"
-
-CVE_STATUS[CVE-2019-15920] = "fixed-version: Fixed from version 5.1rc6"
-
-CVE_STATUS[CVE-2019-15921] = "fixed-version: Fixed from version 5.1rc3"
-
-CVE_STATUS[CVE-2019-15922] = "fixed-version: Fixed from version 5.1rc4"
-
-CVE_STATUS[CVE-2019-15923] = "fixed-version: Fixed from version 5.1rc4"
-
-CVE_STATUS[CVE-2019-15924] = "fixed-version: Fixed from version 5.1rc4"
-
-CVE_STATUS[CVE-2019-15925] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-15926] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-15927] = "fixed-version: Fixed from version 5.0rc2"
-
-# CVE-2019-16089 has no known resolution
-
-CVE_STATUS[CVE-2019-16229] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-16230] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-16231] = "fixed-version: Fixed from version 5.4rc6"
-
-CVE_STATUS[CVE-2019-16232] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-16233] = "fixed-version: Fixed from version 5.4rc5"
-
-CVE_STATUS[CVE-2019-16234] = "fixed-version: Fixed from version 5.4rc4"
-
-CVE_STATUS[CVE-2019-16413] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-16714] = "fixed-version: Fixed from version 5.3rc7"
-
-CVE_STATUS[CVE-2019-16746] = "fixed-version: Fixed from version 5.4rc2"
-
-CVE_STATUS[CVE-2019-16921] = "fixed-version: Fixed from version 4.17rc1"
-
-CVE_STATUS[CVE-2019-16994] = "fixed-version: Fixed from version 5.0"
-
-CVE_STATUS[CVE-2019-16995] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-17052] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-17053] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-17054] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-17055] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-17056] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-17075] = "fixed-version: Fixed from version 5.4rc3"
-
-CVE_STATUS[CVE-2019-17133] = "fixed-version: Fixed from version 5.4rc4"
-
-CVE_STATUS[CVE-2019-17351] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-17666] = "fixed-version: Fixed from version 5.4rc6"
-
-CVE_STATUS[CVE-2019-18198] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-18282] = "fixed-version: Fixed from version 5.4rc6"
-
-CVE_STATUS[CVE-2019-18660] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-18675] = "fixed-version: Fixed from version 4.17rc5"
-
-# CVE-2019-18680 has no known resolution
-
-CVE_STATUS[CVE-2019-18683] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-18786] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-18805] = "fixed-version: Fixed from version 5.1rc7"
-
-CVE_STATUS[CVE-2019-18806] = "fixed-version: Fixed from version 5.4rc2"
-
-CVE_STATUS[CVE-2019-18807] = "fixed-version: Fixed from version 5.4rc2"
-
-CVE_STATUS[CVE-2019-18808] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-18809] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-18810] = "fixed-version: Fixed from version 5.4rc2"
-
-CVE_STATUS[CVE-2019-18811] = "fixed-version: Fixed from version 5.4rc7"
-
-CVE_STATUS[CVE-2019-18812] = "fixed-version: Fixed from version 5.4rc7"
-
-CVE_STATUS[CVE-2019-18813] = "fixed-version: Fixed from version 5.4rc6"
-
-CVE_STATUS[CVE-2019-18814] = "fixed-version: Fixed from version 5.7rc7"
-
-CVE_STATUS[CVE-2019-18885] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-19036] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19037] = "fixed-version: Fixed from version 5.5rc3"
-
-CVE_STATUS[CVE-2019-19039] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2019-19043] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19044] = "fixed-version: Fixed from version 5.4rc6"
-
-CVE_STATUS[CVE-2019-19045] = "fixed-version: Fixed from version 5.4rc6"
-
-CVE_STATUS[CVE-2019-19046] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19047] = "fixed-version: Fixed from version 5.4rc6"
-
-CVE_STATUS[CVE-2019-19048] = "fixed-version: Fixed from version 5.4rc3"
-
-CVE_STATUS[CVE-2019-19049] = "fixed-version: Fixed from version 5.4rc5"
-
-CVE_STATUS[CVE-2019-19050] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19051] = "fixed-version: Fixed from version 5.4rc6"
-
-CVE_STATUS[CVE-2019-19052] = "fixed-version: Fixed from version 5.4rc7"
-
-CVE_STATUS[CVE-2019-19053] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19054] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19055] = "fixed-version: Fixed from version 5.4rc4"
-
-CVE_STATUS[CVE-2019-19056] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19057] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19058] = "fixed-version: Fixed from version 5.4rc4"
-
-CVE_STATUS[CVE-2019-19059] = "fixed-version: Fixed from version 5.4rc4"
-
-CVE_STATUS[CVE-2019-19060] = "fixed-version: Fixed from version 5.4rc3"
-
-CVE_STATUS[CVE-2019-19061] = "fixed-version: Fixed from version 5.4rc3"
-
-CVE_STATUS[CVE-2019-19062] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19063] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19064] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19065] = "fixed-version: Fixed from version 5.4rc3"
-
-CVE_STATUS[CVE-2019-19066] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19067] = "fixed-version: Fixed from version 5.4rc2"
-
-CVE_STATUS[CVE-2019-19068] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19069] = "fixed-version: Fixed from version 5.4rc3"
-
-CVE_STATUS[CVE-2019-19070] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19071] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19072] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19073] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19074] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19075] = "fixed-version: Fixed from version 5.4rc2"
-
-CVE_STATUS[CVE-2019-19076] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19077] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19078] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19079] = "fixed-version: Fixed from version 5.3"
-
-CVE_STATUS[CVE-2019-19080] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19081] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19082] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19083] = "fixed-version: Fixed from version 5.4rc2"
-
-CVE_STATUS[CVE-2019-19227] = "fixed-version: Fixed from version 5.1rc3"
-
-CVE_STATUS[CVE-2019-19241] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19252] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19318] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19319] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-19332] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19338] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19377] = "fixed-version: Fixed from version 5.7rc1"
-
-# CVE-2019-19378 has no known resolution
-
-CVE_STATUS[CVE-2019-19447] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19448] = "fixed-version: Fixed from version 5.9rc1"
-
-CVE_STATUS[CVE-2019-19449] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2019-19462] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2019-19523] = "fixed-version: Fixed from version 5.4rc3"
-
-CVE_STATUS[CVE-2019-19524] = "fixed-version: Fixed from version 5.4rc8"
-
-CVE_STATUS[CVE-2019-19525] = "fixed-version: Fixed from version 5.4rc2"
-
-CVE_STATUS[CVE-2019-19526] = "fixed-version: Fixed from version 5.4rc4"
-
-CVE_STATUS[CVE-2019-19527] = "fixed-version: Fixed from version 5.3rc4"
-
-CVE_STATUS[CVE-2019-19528] = "fixed-version: Fixed from version 5.4rc3"
-
-CVE_STATUS[CVE-2019-19529] = "fixed-version: Fixed from version 5.4rc7"
-
-CVE_STATUS[CVE-2019-19530] = "fixed-version: Fixed from version 5.3rc5"
-
-CVE_STATUS[CVE-2019-19531] = "fixed-version: Fixed from version 5.3rc4"
-
-CVE_STATUS[CVE-2019-19532] = "fixed-version: Fixed from version 5.4rc6"
-
-CVE_STATUS[CVE-2019-19533] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19534] = "fixed-version: Fixed from version 5.4rc7"
-
-CVE_STATUS[CVE-2019-19535] = "fixed-version: Fixed from version 5.3rc4"
-
-CVE_STATUS[CVE-2019-19536] = "fixed-version: Fixed from version 5.3rc4"
-
-CVE_STATUS[CVE-2019-19537] = "fixed-version: Fixed from version 5.3rc5"
-
-CVE_STATUS[CVE-2019-19543] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-19602] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19767] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2019-19768] = "fixed-version: Fixed from version 5.6rc4"
-
-CVE_STATUS[CVE-2019-19769] = "fixed-version: Fixed from version 5.6rc5"
-
-CVE_STATUS[CVE-2019-19770] = "fixed-version: Fixed from version 5.9rc1"
-
-CVE_STATUS[CVE-2019-19807] = "fixed-version: Fixed from version 5.4rc7"
-
-CVE_STATUS[CVE-2019-19813] = "fixed-version: Fixed from version 5.2rc1"
-
-# CVE-2019-19814 has no known resolution
-
-CVE_STATUS[CVE-2019-19815] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2019-19816] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-19922] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-19927] = "fixed-version: Fixed from version 5.1rc6"
-
-CVE_STATUS[CVE-2019-19947] = "fixed-version: Fixed from version 5.5rc3"
-
-CVE_STATUS[CVE-2019-19965] = "fixed-version: Fixed from version 5.5rc2"
-
-CVE_STATUS[CVE-2019-19966] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-1999] = "fixed-version: Fixed from version 5.1rc3"
-
-CVE_STATUS[CVE-2019-20054] = "fixed-version: Fixed from version 5.1rc3"
-
-CVE_STATUS[CVE-2019-20095] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-20096] = "fixed-version: Fixed from version 5.1rc4"
-
-CVE_STATUS[CVE-2019-2024] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2019-2025] = "fixed-version: Fixed from version 4.20rc5"
-
-CVE_STATUS[CVE-2019-20422] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-2054] = "fixed-version: Fixed from version 4.8rc1"
-
-CVE_STATUS[CVE-2019-20636] = "fixed-version: Fixed from version 5.5rc6"
-
-# CVE-2019-20794 has no known resolution
-
-CVE_STATUS[CVE-2019-20806] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-20810] = "fixed-version: Fixed from version 5.6rc1"
-
-CVE_STATUS[CVE-2019-20811] = "fixed-version: Fixed from version 5.1rc3"
-
-CVE_STATUS[CVE-2019-20812] = "fixed-version: Fixed from version 5.5rc3"
-
-CVE_STATUS[CVE-2019-20908] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2019-20934] = "fixed-version: Fixed from version 5.3rc2"
-
-CVE_STATUS[CVE-2019-2101] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-2181] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-2182] = "fixed-version: Fixed from version 4.16rc3"
-
-CVE_STATUS[CVE-2019-2213] = "fixed-version: Fixed from version 5.2rc6"
-
-CVE_STATUS[CVE-2019-2214] = "fixed-version: Fixed from version 5.3rc2"
-
-CVE_STATUS[CVE-2019-2215] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2019-25044] = "fixed-version: Fixed from version 5.2rc4"
-
-CVE_STATUS[CVE-2019-25045] = "fixed-version: Fixed from version 5.1"
-
-CVE_STATUS[CVE-2019-3016] = "fixed-version: Fixed from version 5.6rc1"
-
-CVE_STATUS[CVE-2019-3459] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-3460] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-3701] = "fixed-version: Fixed from version 5.0rc3"
-
-CVE_STATUS[CVE-2019-3819] = "fixed-version: Fixed from version 5.0rc6"
-
-CVE_STATUS[CVE-2019-3837] = "fixed-version: Fixed from version 3.18rc1"
-
-CVE_STATUS[CVE-2019-3846] = "fixed-version: Fixed from version 5.2rc6"
-
-CVE_STATUS[CVE-2019-3874] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-3882] = "fixed-version: Fixed from version 5.1rc4"
-
-CVE_STATUS[CVE-2019-3887] = "fixed-version: Fixed from version 5.1rc4"
-
-CVE_STATUS[CVE-2019-3892] = "fixed-version: Fixed from version 5.1rc6"
-
-CVE_STATUS[CVE-2019-3896] = "fixed-version: Fixed from version 2.6.35rc1"
-
-CVE_STATUS[CVE-2019-3900] = "fixed-version: Fixed from version 5.2rc4"
-
-CVE_STATUS[CVE-2019-3901] = "fixed-version: Fixed from version 4.6rc6"
-
-CVE_STATUS[CVE-2019-5108] = "fixed-version: Fixed from version 5.3"
-
-# Skipping CVE-2019-5489, no affected_versions
-
-CVE_STATUS[CVE-2019-6133] = "fixed-version: Fixed from version 5.0rc2"
-
-CVE_STATUS[CVE-2019-6974] = "fixed-version: Fixed from version 5.0rc6"
-
-CVE_STATUS[CVE-2019-7221] = "fixed-version: Fixed from version 5.0rc6"
-
-CVE_STATUS[CVE-2019-7222] = "fixed-version: Fixed from version 5.0rc6"
-
-CVE_STATUS[CVE-2019-7308] = "fixed-version: Fixed from version 5.0rc3"
-
-CVE_STATUS[CVE-2019-8912] = "fixed-version: Fixed from version 5.0rc8"
-
-CVE_STATUS[CVE-2019-8956] = "fixed-version: Fixed from version 5.0rc6"
-
-CVE_STATUS[CVE-2019-8980] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-9003] = "fixed-version: Fixed from version 5.0rc4"
-
-CVE_STATUS[CVE-2019-9162] = "fixed-version: Fixed from version 5.0rc7"
-
-CVE_STATUS[CVE-2019-9213] = "fixed-version: Fixed from version 5.0"
-
-CVE_STATUS[CVE-2019-9245] = "fixed-version: Fixed from version 5.0rc1"
-
-CVE_STATUS[CVE-2019-9444] = "fixed-version: Fixed from version 4.15rc2"
-
-CVE_STATUS[CVE-2019-9445] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-9453] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2019-9454] = "fixed-version: Fixed from version 4.15rc9"
-
-CVE_STATUS[CVE-2019-9455] = "fixed-version: Fixed from version 5.0rc1"
-
-CVE_STATUS[CVE-2019-9456] = "fixed-version: Fixed from version 4.16rc6"
-
-CVE_STATUS[CVE-2019-9457] = "fixed-version: Fixed from version 4.13rc1"
-
-CVE_STATUS[CVE-2019-9458] = "fixed-version: Fixed from version 4.19rc7"
-
-CVE_STATUS[CVE-2019-9466] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-9500] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-9503] = "fixed-version: Fixed from version 5.1rc1"
-
-CVE_STATUS[CVE-2019-9506] = "fixed-version: Fixed from version 5.2"
-
-CVE_STATUS[CVE-2019-9857] = "fixed-version: Fixed from version 5.1rc2"
-
-CVE_STATUS[CVE-2020-0009] = "fixed-version: Fixed from version 5.6rc3"
-
-CVE_STATUS[CVE-2020-0030] = "fixed-version: Fixed from version 4.16rc3"
-
-CVE_STATUS[CVE-2020-0041] = "fixed-version: Fixed from version 5.5rc2"
-
-CVE_STATUS[CVE-2020-0066] = "fixed-version: Fixed from version 4.3rc7"
-
-CVE_STATUS[CVE-2020-0067] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2020-0110] = "fixed-version: Fixed from version 5.6rc2"
-
-CVE_STATUS[CVE-2020-0255] = "fixed-version: Fixed from version 5.7rc4"
-
-CVE_STATUS[CVE-2020-0305] = "fixed-version: Fixed from version 5.5rc6"
-
-# CVE-2020-0347 has no known resolution
-
-CVE_STATUS[CVE-2020-0404] = "fixed-version: Fixed from version 5.6rc1"
-
-CVE_STATUS[CVE-2020-0423] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-0427] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2020-0429] = "fixed-version: Fixed from version 4.14rc4"
-
-CVE_STATUS[CVE-2020-0430] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2020-0431] = "fixed-version: Fixed from version 5.5rc6"
-
-CVE_STATUS[CVE-2020-0432] = "fixed-version: Fixed from version 5.6rc1"
-
-CVE_STATUS[CVE-2020-0433] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2020-0435] = "fixed-version: Fixed from version 4.19rc1"
-
-CVE_STATUS[CVE-2020-0444] = "fixed-version: Fixed from version 5.6rc4"
-
-CVE_STATUS[CVE-2020-0465] = "fixed-version: Fixed from version 5.9rc4"
-
-CVE_STATUS[CVE-2020-0466] = "fixed-version: Fixed from version 5.9rc2"
-
-CVE_STATUS[CVE-2020-0543] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-10135] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-10690] = "fixed-version: Fixed from version 5.5rc5"
-
-# CVE-2020-10708 has no known resolution
-
-CVE_STATUS[CVE-2020-10711] = "fixed-version: Fixed from version 5.7rc6"
-
-CVE_STATUS[CVE-2020-10720] = "fixed-version: Fixed from version 5.2rc3"
-
-CVE_STATUS[CVE-2020-10732] = "fixed-version: Fixed from version 5.7"
-
-CVE_STATUS[CVE-2020-10742] = "fixed-version: Fixed from version 3.16rc1"
-
-CVE_STATUS[CVE-2020-10751] = "fixed-version: Fixed from version 5.7rc4"
-
-CVE_STATUS[CVE-2020-10757] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-10766] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-10767] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-10768] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-10769] = "fixed-version: Fixed from version 5.0rc3"
-
-CVE_STATUS[CVE-2020-10773] = "fixed-version: Fixed from version 5.4rc6"
-
-# CVE-2020-10774 has no known resolution
-
-CVE_STATUS[CVE-2020-10781] = "fixed-version: Fixed from version 5.8rc6"
-
-CVE_STATUS[CVE-2020-10942] = "fixed-version: Fixed from version 5.6rc4"
-
-CVE_STATUS[CVE-2020-11494] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2020-11565] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2020-11608] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2020-11609] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2020-11668] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2020-11669] = "fixed-version: Fixed from version 5.2rc1"
-
-# CVE-2020-11725 has no known resolution
-
-CVE_STATUS[CVE-2020-11884] = "fixed-version: Fixed from version 5.7rc4"
-
-# CVE-2020-11935 has no known resolution
-
-CVE_STATUS[CVE-2020-12114] = "fixed-version: Fixed from version 5.3rc1"
-
-CVE_STATUS[CVE-2020-12351] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-12352] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-12362] = "fixed-version: Fixed from version 5.11rc1"
-
-CVE_STATUS[CVE-2020-12363] = "fixed-version: Fixed from version 5.11rc1"
-
-CVE_STATUS[CVE-2020-12364] = "fixed-version: Fixed from version 5.11rc1"
-
-CVE_STATUS[CVE-2020-12464] = "fixed-version: Fixed from version 5.7rc3"
-
-CVE_STATUS[CVE-2020-12465] = "fixed-version: Fixed from version 5.6rc6"
-
-CVE_STATUS[CVE-2020-12652] = "fixed-version: Fixed from version 5.5rc7"
-
-CVE_STATUS[CVE-2020-12653] = "fixed-version: Fixed from version 5.6rc1"
-
-CVE_STATUS[CVE-2020-12654] = "fixed-version: Fixed from version 5.6rc1"
-
-CVE_STATUS[CVE-2020-12655] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2020-12656] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-12657] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2020-12659] = "fixed-version: Fixed from version 5.7rc2"
-
-CVE_STATUS[CVE-2020-12768] = "fixed-version: Fixed from version 5.6rc4"
-
-CVE_STATUS[CVE-2020-12769] = "fixed-version: Fixed from version 5.5rc6"
-
-CVE_STATUS[CVE-2020-12770] = "fixed-version: Fixed from version 5.7rc3"
-
-CVE_STATUS[CVE-2020-12771] = "fixed-version: Fixed from version 5.8rc2"
-
-CVE_STATUS[CVE-2020-12826] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2020-12888] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-12912] = "fixed-version: Fixed from version 5.10rc4"
-
-CVE_STATUS[CVE-2020-13143] = "fixed-version: Fixed from version 5.7rc6"
-
-CVE_STATUS[CVE-2020-13974] = "fixed-version: Fixed from version 5.8rc1"
-
-# CVE-2020-14304 has no known resolution
-
-CVE_STATUS[CVE-2020-14305] = "fixed-version: Fixed from version 4.12rc1"
-
-CVE_STATUS[CVE-2020-14314] = "fixed-version: Fixed from version 5.9rc2"
-
-CVE_STATUS[CVE-2020-14331] = "fixed-version: Fixed from version 5.9rc1"
-
-CVE_STATUS[CVE-2020-14351] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-14353] = "fixed-version: Fixed from version 4.14rc3"
-
-CVE_STATUS[CVE-2020-14356] = "fixed-version: Fixed from version 5.8rc5"
-
-CVE_STATUS[CVE-2020-14381] = "fixed-version: Fixed from version 5.6rc6"
-
-CVE_STATUS[CVE-2020-14385] = "fixed-version: Fixed from version 5.9rc4"
-
-CVE_STATUS[CVE-2020-14386] = "fixed-version: Fixed from version 5.9rc4"
-
-CVE_STATUS[CVE-2020-14390] = "fixed-version: Fixed from version 5.9rc6"
-
-CVE_STATUS[CVE-2020-14416] = "fixed-version: Fixed from version 5.5"
-
-CVE_STATUS[CVE-2020-15393] = "fixed-version: Fixed from version 5.8rc3"
-
-CVE_STATUS[CVE-2020-15436] = "fixed-version: Fixed from version 5.8rc2"
-
-CVE_STATUS[CVE-2020-15437] = "fixed-version: Fixed from version 5.8rc7"
-
-CVE_STATUS[CVE-2020-15780] = "fixed-version: Fixed from version 5.8rc3"
-
-# CVE-2020-15802 has no known resolution
-
-CVE_STATUS[CVE-2020-15852] = "fixed-version: Fixed from version 5.8rc6"
-
-CVE_STATUS[CVE-2020-16119] = "fixed-version: Fixed from version 5.15rc2"
-
-CVE_STATUS[CVE-2020-16120] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-16166] = "fixed-version: Fixed from version 5.8"
-
-CVE_STATUS[CVE-2020-1749] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2020-24394] = "fixed-version: Fixed from version 5.8rc4"
-
-CVE_STATUS[CVE-2020-24490] = "fixed-version: Fixed from version 5.8"
-
-# CVE-2020-24502 has no known resolution
-
-# CVE-2020-24503 has no known resolution
-
-CVE_STATUS[CVE-2020-24504] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2020-24586] = "fixed-version: Fixed from version 5.13rc4"
-
-CVE_STATUS[CVE-2020-24587] = "fixed-version: Fixed from version 5.13rc4"
-
-CVE_STATUS[CVE-2020-24588] = "fixed-version: Fixed from version 5.13rc4"
-
-CVE_STATUS[CVE-2020-25211] = "fixed-version: Fixed from version 5.9rc7"
-
-CVE_STATUS[CVE-2020-25212] = "fixed-version: Fixed from version 5.9rc1"
-
-# CVE-2020-25220 has no known resolution
-
-CVE_STATUS[CVE-2020-25221] = "fixed-version: Fixed from version 5.9rc4"
-
-CVE_STATUS[CVE-2020-25284] = "fixed-version: Fixed from version 5.9rc5"
-
-CVE_STATUS[CVE-2020-25285] = "fixed-version: Fixed from version 5.9rc4"
-
-CVE_STATUS[CVE-2020-25639] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2020-25641] = "fixed-version: Fixed from version 5.9rc4"
-
-CVE_STATUS[CVE-2020-25643] = "fixed-version: Fixed from version 5.9rc7"
-
-CVE_STATUS[CVE-2020-25645] = "fixed-version: Fixed from version 5.9rc7"
-
-CVE_STATUS[CVE-2020-25656] = "fixed-version: Fixed from version 5.10rc2"
-
-# CVE-2020-25661 has no known resolution
-
-# CVE-2020-25662 has no known resolution
-
-CVE_STATUS[CVE-2020-25668] = "fixed-version: Fixed from version 5.10rc3"
-
-CVE_STATUS[CVE-2020-25669] = "fixed-version: Fixed from version 5.10rc5"
-
-CVE_STATUS[CVE-2020-25670] = "fixed-version: Fixed from version 5.12rc7"
-
-CVE_STATUS[CVE-2020-25671] = "fixed-version: Fixed from version 5.12rc7"
-
-CVE_STATUS[CVE-2020-25672] = "fixed-version: Fixed from version 5.12rc7"
-
-CVE_STATUS[CVE-2020-25673] = "fixed-version: Fixed from version 5.12rc7"
-
-CVE_STATUS[CVE-2020-25704] = "fixed-version: Fixed from version 5.10rc3"
-
-CVE_STATUS[CVE-2020-25705] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-26088] = "fixed-version: Fixed from version 5.9rc1"
-
-CVE_STATUS[CVE-2020-26139] = "fixed-version: Fixed from version 5.13rc4"
-
-# CVE-2020-26140 has no known resolution
-
-CVE_STATUS[CVE-2020-26141] = "fixed-version: Fixed from version 5.13rc4"
-
-# CVE-2020-26142 has no known resolution
-
-# CVE-2020-26143 has no known resolution
-
-CVE_STATUS[CVE-2020-26145] = "fixed-version: Fixed from version 5.13rc4"
-
-CVE_STATUS[CVE-2020-26147] = "fixed-version: Fixed from version 5.13rc4"
-
-CVE_STATUS[CVE-2020-26541] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2020-26555] = "fixed-version: Fixed from version 5.13rc1"
-
-# CVE-2020-26556 has no known resolution
-
-# CVE-2020-26557 has no known resolution
-
-CVE_STATUS[CVE-2020-26558] = "fixed-version: Fixed from version 5.13rc1"
-
-# CVE-2020-26559 has no known resolution
-
-# CVE-2020-26560 has no known resolution
-
-CVE_STATUS[CVE-2020-27066] = "fixed-version: Fixed from version 5.6"
-
-CVE_STATUS[CVE-2020-27067] = "fixed-version: Fixed from version 4.14rc4"
-
-CVE_STATUS[CVE-2020-27068] = "fixed-version: Fixed from version 5.6rc2"
-
-CVE_STATUS[CVE-2020-27152] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-27170] = "fixed-version: Fixed from version 5.12rc5"
-
-CVE_STATUS[CVE-2020-27171] = "fixed-version: Fixed from version 5.12rc5"
-
-CVE_STATUS[CVE-2020-27194] = "fixed-version: Fixed from version 5.9"
-
-CVE_STATUS[CVE-2020-2732] = "fixed-version: Fixed from version 5.6rc4"
-
-# CVE-2020-27418 has no known resolution
-
-CVE_STATUS[CVE-2020-27673] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-27675] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-27777] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-27784] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-27786] = "fixed-version: Fixed from version 5.7rc6"
-
-CVE_STATUS[CVE-2020-27815] = "fixed-version: Fixed from version 5.11rc1"
-
-CVE_STATUS[CVE-2020-27820] = "fixed-version: Fixed from version 5.16rc1"
-
-CVE_STATUS[CVE-2020-27825] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-27830] = "fixed-version: Fixed from version 5.10rc7"
-
-CVE_STATUS[CVE-2020-27835] = "fixed-version: Fixed from version 5.10rc6"
-
-CVE_STATUS[CVE-2020-28097] = "fixed-version: Fixed from version 5.9rc6"
-
-CVE_STATUS[CVE-2020-28374] = "fixed-version: Fixed from version 5.11rc4"
-
-CVE_STATUS[CVE-2020-28588] = "fixed-version: Fixed from version 5.10rc7"
-
-CVE_STATUS[CVE-2020-28915] = "fixed-version: Fixed from version 5.9"
-
-CVE_STATUS[CVE-2020-28941] = "fixed-version: Fixed from version 5.10rc5"
-
-CVE_STATUS[CVE-2020-28974] = "fixed-version: Fixed from version 5.10rc3"
-
-CVE_STATUS[CVE-2020-29368] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-29369] = "fixed-version: Fixed from version 5.8rc7"
-
-CVE_STATUS[CVE-2020-29370] = "fixed-version: Fixed from version 5.6rc7"
-
-CVE_STATUS[CVE-2020-29371] = "fixed-version: Fixed from version 5.9rc2"
-
-CVE_STATUS[CVE-2020-29372] = "fixed-version: Fixed from version 5.7rc3"
-
-CVE_STATUS[CVE-2020-29373] = "fixed-version: Fixed from version 5.6rc2"
-
-CVE_STATUS[CVE-2020-29374] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-29534] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-29568] = "fixed-version: Fixed from version 5.11rc1"
-
-CVE_STATUS[CVE-2020-29569] = "fixed-version: Fixed from version 5.11rc1"
-
-CVE_STATUS[CVE-2020-29660] = "fixed-version: Fixed from version 5.10rc7"
-
-CVE_STATUS[CVE-2020-29661] = "fixed-version: Fixed from version 5.10rc7"
-
-CVE_STATUS[CVE-2020-35499] = "fixed-version: Fixed from version 5.11rc1"
-
-# CVE-2020-35501 has no known resolution
-
-CVE_STATUS[CVE-2020-35508] = "fixed-version: Fixed from version 5.10rc3"
-
-CVE_STATUS[CVE-2020-35513] = "fixed-version: Fixed from version 4.17rc1"
-
-CVE_STATUS[CVE-2020-35519] = "fixed-version: Fixed from version 5.10rc7"
-
-CVE_STATUS[CVE-2020-36158] = "fixed-version: Fixed from version 5.11rc1"
-
-CVE_STATUS[CVE-2020-36310] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-36311] = "fixed-version: Fixed from version 5.9rc5"
-
-CVE_STATUS[CVE-2020-36312] = "fixed-version: Fixed from version 5.9rc5"
-
-CVE_STATUS[CVE-2020-36313] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2020-36322] = "fixed-version: Fixed from version 5.11rc1"
-
-CVE_STATUS[CVE-2020-36385] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2020-36386] = "fixed-version: Fixed from version 5.9rc1"
-
-CVE_STATUS[CVE-2020-36387] = "fixed-version: Fixed from version 5.9rc1"
-
-CVE_STATUS[CVE-2020-36516] = "fixed-version: Fixed from version 5.17rc2"
-
-CVE_STATUS[CVE-2020-36557] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2020-36558] = "fixed-version: Fixed from version 5.6rc3"
-
-CVE_STATUS[CVE-2020-36691] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2020-36694] = "fixed-version: Fixed from version 5.10"
-
-CVE_STATUS[CVE-2020-36766] = "fixed-version: Fixed from version 5.9rc1"
-
-CVE_STATUS[CVE-2020-3702] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2020-4788] = "fixed-version: Fixed from version 5.10rc5"
-
-CVE_STATUS[CVE-2020-7053] = "fixed-version: Fixed from version 5.2rc1"
-
-CVE_STATUS[CVE-2020-8428] = "fixed-version: Fixed from version 5.5"
-
-CVE_STATUS[CVE-2020-8647] = "fixed-version: Fixed from version 5.6rc5"
-
-CVE_STATUS[CVE-2020-8648] = "fixed-version: Fixed from version 5.6rc3"
-
-CVE_STATUS[CVE-2020-8649] = "fixed-version: Fixed from version 5.6rc5"
-
-CVE_STATUS[CVE-2020-8694] = "fixed-version: Fixed from version 5.10rc4"
-
-# CVE-2020-8832 has no known resolution
-
-CVE_STATUS[CVE-2020-8834] = "fixed-version: Fixed from version 4.18rc1"
-
-CVE_STATUS[CVE-2020-8835] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2020-8992] = "fixed-version: Fixed from version 5.6rc2"
-
-CVE_STATUS[CVE-2020-9383] = "fixed-version: Fixed from version 5.6rc4"
-
-CVE_STATUS[CVE-2020-9391] = "fixed-version: Fixed from version 5.6rc3"
-
-CVE_STATUS[CVE-2021-0129] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2021-0342] = "fixed-version: Fixed from version 5.8rc1"
-
-# CVE-2021-0399 has no known resolution
-
-CVE_STATUS[CVE-2021-0447] = "fixed-version: Fixed from version 4.15rc1"
-
-CVE_STATUS[CVE-2021-0448] = "fixed-version: Fixed from version 5.9rc7"
-
-CVE_STATUS[CVE-2021-0512] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2021-0605] = "fixed-version: Fixed from version 5.8"
-
-# CVE-2021-0606 has no known resolution
-
-# CVE-2021-0695 has no known resolution
-
-CVE_STATUS[CVE-2021-0707] = "fixed-version: Fixed from version 5.11rc3"
-
-CVE_STATUS[CVE-2021-0920] = "fixed-version: Fixed from version 5.14rc4"
-
-# CVE-2021-0924 has no known resolution
-
-CVE_STATUS[CVE-2021-0929] = "fixed-version: Fixed from version 5.6rc1"
-
-CVE_STATUS[CVE-2021-0935] = "fixed-version: Fixed from version 4.16rc7"
-
-# CVE-2021-0936 has no known resolution
-
-CVE_STATUS[CVE-2021-0937] = "fixed-version: Fixed from version 5.12rc8"
-
-CVE_STATUS[CVE-2021-0938] = "fixed-version: Fixed from version 5.10rc4"
-
-CVE_STATUS[CVE-2021-0941] = "fixed-version: Fixed from version 5.12rc1"
-
-# CVE-2021-0961 has no known resolution
-
-CVE_STATUS[CVE-2021-1048] = "fixed-version: Fixed from version 5.9rc4"
-
-CVE_STATUS[CVE-2021-20177] = "fixed-version: Fixed from version 5.5rc1"
-
-CVE_STATUS[CVE-2021-20194] = "fixed-version: Fixed from version 5.10rc1"
-
-# CVE-2021-20219 has no known resolution
-
-CVE_STATUS[CVE-2021-20226] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2021-20239] = "fixed-version: Fixed from version 5.9rc1"
-
-CVE_STATUS[CVE-2021-20261] = "fixed-version: Fixed from version 4.5rc5"
-
-CVE_STATUS[CVE-2021-20265] = "fixed-version: Fixed from version 4.5rc3"
-
-CVE_STATUS[CVE-2021-20268] = "fixed-version: Fixed from version 5.11rc5"
-
-CVE_STATUS[CVE-2021-20292] = "fixed-version: Fixed from version 5.9rc1"
-
-CVE_STATUS[CVE-2021-20317] = "fixed-version: Fixed from version 5.4rc1"
-
-CVE_STATUS[CVE-2021-20320] = "fixed-version: Fixed from version 5.15rc3"
-
-CVE_STATUS[CVE-2021-20321] = "fixed-version: Fixed from version 5.15rc5"
-
-CVE_STATUS[CVE-2021-20322] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2021-21781] = "fixed-version: Fixed from version 5.11rc7"
-
-CVE_STATUS[CVE-2021-22543] = "fixed-version: Fixed from version 5.13"
-
-CVE_STATUS[CVE-2021-22555] = "fixed-version: Fixed from version 5.12rc8"
-
-CVE_STATUS[CVE-2021-22600] = "fixed-version: Fixed from version 5.16rc6"
-
-CVE_STATUS[CVE-2021-23133] = "fixed-version: Fixed from version 5.12rc8"
-
-CVE_STATUS[CVE-2021-23134] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2021-26401] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2021-26708] = "fixed-version: Fixed from version 5.11rc7"
-
-CVE_STATUS[CVE-2021-26930] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2021-26931] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2021-26932] = "fixed-version: Fixed from version 5.12rc1"
-
-# CVE-2021-26934 has no known resolution
-
-CVE_STATUS[CVE-2021-27363] = "fixed-version: Fixed from version 5.12rc2"
-
-CVE_STATUS[CVE-2021-27364] = "fixed-version: Fixed from version 5.12rc2"
-
-CVE_STATUS[CVE-2021-27365] = "fixed-version: Fixed from version 5.12rc2"
-
-CVE_STATUS[CVE-2021-28038] = "fixed-version: Fixed from version 5.12rc2"
-
-CVE_STATUS[CVE-2021-28039] = "fixed-version: Fixed from version 5.12rc2"
-
-CVE_STATUS[CVE-2021-28375] = "fixed-version: Fixed from version 5.12rc3"
-
-CVE_STATUS[CVE-2021-28660] = "fixed-version: Fixed from version 5.12rc3"
-
-CVE_STATUS[CVE-2021-28688] = "fixed-version: Fixed from version 5.12rc6"
-
-CVE_STATUS[CVE-2021-28691] = "fixed-version: Fixed from version 5.13rc6"
-
-CVE_STATUS[CVE-2021-28711] = "fixed-version: Fixed from version 5.16rc7"
-
-CVE_STATUS[CVE-2021-28712] = "fixed-version: Fixed from version 5.16rc7"
-
-CVE_STATUS[CVE-2021-28713] = "fixed-version: Fixed from version 5.16rc7"
-
-CVE_STATUS[CVE-2021-28714] = "fixed-version: Fixed from version 5.16rc7"
-
-CVE_STATUS[CVE-2021-28715] = "fixed-version: Fixed from version 5.16rc7"
-
-CVE_STATUS[CVE-2021-28950] = "fixed-version: Fixed from version 5.12rc4"
-
-CVE_STATUS[CVE-2021-28951] = "fixed-version: Fixed from version 5.12rc2"
-
-CVE_STATUS[CVE-2021-28952] = "fixed-version: Fixed from version 5.12rc4"
-
-CVE_STATUS[CVE-2021-28964] = "fixed-version: Fixed from version 5.12rc4"
-
-CVE_STATUS[CVE-2021-28971] = "fixed-version: Fixed from version 5.12rc4"
-
-CVE_STATUS[CVE-2021-28972] = "fixed-version: Fixed from version 5.12rc4"
-
-CVE_STATUS[CVE-2021-29154] = "fixed-version: Fixed from version 5.12rc7"
-
-CVE_STATUS[CVE-2021-29155] = "fixed-version: Fixed from version 5.12rc8"
-
-CVE_STATUS[CVE-2021-29264] = "fixed-version: Fixed from version 5.12rc3"
-
-CVE_STATUS[CVE-2021-29265] = "fixed-version: Fixed from version 5.12rc3"
-
-CVE_STATUS[CVE-2021-29266] = "fixed-version: Fixed from version 5.12rc4"
-
-CVE_STATUS[CVE-2021-29646] = "fixed-version: Fixed from version 5.12rc5"
-
-CVE_STATUS[CVE-2021-29647] = "fixed-version: Fixed from version 5.12rc5"
-
-CVE_STATUS[CVE-2021-29648] = "fixed-version: Fixed from version 5.12rc5"
-
-CVE_STATUS[CVE-2021-29649] = "fixed-version: Fixed from version 5.12rc5"
-
-CVE_STATUS[CVE-2021-29650] = "fixed-version: Fixed from version 5.12rc5"
-
-CVE_STATUS[CVE-2021-29657] = "fixed-version: Fixed from version 5.12rc6"
-
-CVE_STATUS[CVE-2021-30002] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2021-30178] = "fixed-version: Fixed from version 5.12rc2"
-
-CVE_STATUS[CVE-2021-31440] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2021-3178] = "fixed-version: Fixed from version 5.11rc5"
-
-CVE_STATUS[CVE-2021-31829] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2021-31916] = "fixed-version: Fixed from version 5.12rc5"
-
-CVE_STATUS[CVE-2021-32078] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2021-32399] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2021-32606] = "fixed-version: Fixed from version 5.13rc4"
-
-CVE_STATUS[CVE-2021-33033] = "fixed-version: Fixed from version 5.12rc3"
-
-CVE_STATUS[CVE-2021-33034] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2021-33061] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2021-33098] = "fixed-version: Fixed from version 5.13rc4"
-
-CVE_STATUS[CVE-2021-33135] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2021-33200] = "fixed-version: Fixed from version 5.13rc4"
-
-CVE_STATUS[CVE-2021-3347] = "fixed-version: Fixed from version 5.11rc6"
-
-CVE_STATUS[CVE-2021-3348] = "fixed-version: Fixed from version 5.11rc6"
-
-CVE_STATUS[CVE-2021-33624] = "fixed-version: Fixed from version 5.13rc7"
-
-CVE_STATUS[CVE-2021-33655] = "fixed-version: Fixed from version 5.19rc6"
-
-CVE_STATUS[CVE-2021-33656] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2021-33909] = "fixed-version: Fixed from version 5.14rc3"
-
-CVE_STATUS[CVE-2021-3411] = "fixed-version: Fixed from version 5.10"
-
-CVE_STATUS[CVE-2021-3428] = "fixed-version: Fixed from version 5.9rc2"
-
-CVE_STATUS[CVE-2021-3444] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2021-34556] = "fixed-version: Fixed from version 5.14rc4"
-
-CVE_STATUS[CVE-2021-34693] = "fixed-version: Fixed from version 5.13rc7"
-
-CVE_STATUS[CVE-2021-3483] = "fixed-version: Fixed from version 5.12rc6"
-
-CVE_STATUS[CVE-2021-34866] = "fixed-version: Fixed from version 5.14"
-
-CVE_STATUS[CVE-2021-3489] = "fixed-version: Fixed from version 5.13rc4"
-
-CVE_STATUS[CVE-2021-3490] = "fixed-version: Fixed from version 5.13rc4"
-
-CVE_STATUS[CVE-2021-3491] = "fixed-version: Fixed from version 5.13rc1"
-
-# CVE-2021-3492 has no known resolution
-
-CVE_STATUS[CVE-2021-3493] = "fixed-version: Fixed from version 5.11rc1"
-
-CVE_STATUS[CVE-2021-34981] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2021-3501] = "fixed-version: Fixed from version 5.12rc8"
-
-CVE_STATUS[CVE-2021-35039] = "fixed-version: Fixed from version 5.13"
-
-CVE_STATUS[CVE-2021-3506] = "fixed-version: Fixed from version 5.13rc1"
-
-# CVE-2021-3542 has no known resolution
-
-CVE_STATUS[CVE-2021-3543] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2021-35477] = "fixed-version: Fixed from version 5.14rc4"
-
-CVE_STATUS[CVE-2021-3564] = "fixed-version: Fixed from version 5.13rc5"
-
-CVE_STATUS[CVE-2021-3573] = "fixed-version: Fixed from version 5.13rc5"
-
-CVE_STATUS[CVE-2021-3587] = "fixed-version: Fixed from version 5.13rc5"
-
-CVE_STATUS[CVE-2021-3600] = "fixed-version: Fixed from version 5.11"
-
-CVE_STATUS[CVE-2021-3609] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2021-3612] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2021-3635] = "fixed-version: Fixed from version 5.5rc7"
-
-CVE_STATUS[CVE-2021-3640] = "fixed-version: Fixed from version 5.16rc1"
-
-CVE_STATUS[CVE-2021-3653] = "fixed-version: Fixed from version 5.14rc7"
-
-CVE_STATUS[CVE-2021-3655] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2021-3656] = "fixed-version: Fixed from version 5.14rc7"
-
-CVE_STATUS[CVE-2021-3659] = "fixed-version: Fixed from version 5.12rc7"
-
-CVE_STATUS[CVE-2021-3669] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2021-3679] = "fixed-version: Fixed from version 5.14rc3"
-
-# CVE-2021-3714 has no known resolution
-
-CVE_STATUS[CVE-2021-3715] = "fixed-version: Fixed from version 5.6"
-
-CVE_STATUS[CVE-2021-37159] = "fixed-version: Fixed from version 5.14rc3"
-
-CVE_STATUS[CVE-2021-3732] = "fixed-version: Fixed from version 5.14rc6"
-
-CVE_STATUS[CVE-2021-3736] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2021-3739] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2021-3743] = "fixed-version: Fixed from version 5.13rc7"
-
-CVE_STATUS[CVE-2021-3744] = "fixed-version: Fixed from version 5.15rc4"
-
-CVE_STATUS[CVE-2021-3752] = "fixed-version: Fixed from version 5.16rc1"
-
-CVE_STATUS[CVE-2021-3753] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2021-37576] = "fixed-version: Fixed from version 5.14rc3"
-
-CVE_STATUS[CVE-2021-3759] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2021-3760] = "fixed-version: Fixed from version 5.15rc6"
-
-CVE_STATUS[CVE-2021-3764] = "fixed-version: Fixed from version 5.15rc4"
-
-CVE_STATUS[CVE-2021-3772] = "fixed-version: Fixed from version 5.15"
-
-CVE_STATUS[CVE-2021-38160] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2021-38166] = "fixed-version: Fixed from version 5.14rc6"
-
-CVE_STATUS[CVE-2021-38198] = "fixed-version: Fixed from version 5.13rc6"
-
-CVE_STATUS[CVE-2021-38199] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2021-38200] = "fixed-version: Fixed from version 5.13rc7"
-
-CVE_STATUS[CVE-2021-38201] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2021-38202] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2021-38203] = "fixed-version: Fixed from version 5.14rc2"
-
-CVE_STATUS[CVE-2021-38204] = "fixed-version: Fixed from version 5.14rc3"
-
-CVE_STATUS[CVE-2021-38205] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2021-38206] = "fixed-version: Fixed from version 5.13rc7"
-
-CVE_STATUS[CVE-2021-38207] = "fixed-version: Fixed from version 5.13rc7"
-
-CVE_STATUS[CVE-2021-38208] = "fixed-version: Fixed from version 5.13rc5"
-
-CVE_STATUS[CVE-2021-38209] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2021-38300] = "fixed-version: Fixed from version 5.15rc4"
-
-# CVE-2021-3847 has no known resolution
-
-# CVE-2021-3864 has no known resolution
-
-# CVE-2021-3892 has no known resolution
-
-CVE_STATUS[CVE-2021-3894] = "fixed-version: Fixed from version 5.15rc6"
-
-CVE_STATUS[CVE-2021-3896] = "fixed-version: Fixed from version 5.15rc6"
-
-CVE_STATUS[CVE-2021-3923] = "fixed-version: Fixed from version 5.16"
-
-CVE_STATUS[CVE-2021-39633] = "fixed-version: Fixed from version 5.14"
-
-CVE_STATUS[CVE-2021-39634] = "fixed-version: Fixed from version 5.9rc8"
-
-CVE_STATUS[CVE-2021-39636] = "fixed-version: Fixed from version 4.16rc1"
-
-CVE_STATUS[CVE-2021-39648] = "fixed-version: Fixed from version 5.11rc3"
-
-CVE_STATUS[CVE-2021-39656] = "fixed-version: Fixed from version 5.12rc3"
-
-CVE_STATUS[CVE-2021-39657] = "fixed-version: Fixed from version 5.11rc4"
-
-CVE_STATUS[CVE-2021-39685] = "fixed-version: Fixed from version 5.16rc5"
-
-CVE_STATUS[CVE-2021-39686] = "fixed-version: Fixed from version 5.16rc1"
-
-CVE_STATUS[CVE-2021-39698] = "fixed-version: Fixed from version 5.16rc5"
-
-CVE_STATUS[CVE-2021-39711] = "fixed-version: Fixed from version 4.18rc6"
-
-CVE_STATUS[CVE-2021-39713] = "fixed-version: Fixed from version 4.20rc1"
-
-CVE_STATUS[CVE-2021-39714] = "fixed-version: Fixed from version 4.12rc1"
-
-# CVE-2021-39800 has no known resolution
-
-# CVE-2021-39801 has no known resolution
-
-# CVE-2021-39802 has no known resolution
-
-CVE_STATUS[CVE-2021-4001] = "fixed-version: Fixed from version 5.16rc2"
-
-CVE_STATUS[CVE-2021-4002] = "fixed-version: Fixed from version 5.16rc3"
-
-CVE_STATUS[CVE-2021-4023] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2021-4028] = "fixed-version: Fixed from version 5.15rc4"
-
-CVE_STATUS[CVE-2021-4032] = "fixed-version: Fixed from version 5.15rc7"
-
-CVE_STATUS[CVE-2021-4037] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2021-40490] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2021-4083] = "fixed-version: Fixed from version 5.16rc4"
-
-CVE_STATUS[CVE-2021-4090] = "fixed-version: Fixed from version 5.16rc2"
-
-CVE_STATUS[CVE-2021-4093] = "fixed-version: Fixed from version 5.15rc7"
-
-CVE_STATUS[CVE-2021-4095] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2021-41073] = "fixed-version: Fixed from version 5.15rc2"
-
-CVE_STATUS[CVE-2021-4135] = "fixed-version: Fixed from version 5.16rc6"
-
-CVE_STATUS[CVE-2021-4148] = "fixed-version: Fixed from version 5.15"
-
-CVE_STATUS[CVE-2021-4149] = "fixed-version: Fixed from version 5.15rc6"
-
-CVE_STATUS[CVE-2021-4150] = "fixed-version: Fixed from version 5.15rc7"
-
-CVE_STATUS[CVE-2021-4154] = "fixed-version: Fixed from version 5.14rc2"
-
-CVE_STATUS[CVE-2021-4155] = "fixed-version: Fixed from version 5.16"
-
-CVE_STATUS[CVE-2021-4157] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2021-4159] = "fixed-version: Fixed from version 5.7rc1"
-
-CVE_STATUS[CVE-2021-41864] = "fixed-version: Fixed from version 5.15rc5"
-
-CVE_STATUS[CVE-2021-4197] = "fixed-version: Fixed from version 5.16"
-
-CVE_STATUS[CVE-2021-42008] = "fixed-version: Fixed from version 5.14rc7"
-
-CVE_STATUS[CVE-2021-4202] = "fixed-version: Fixed from version 5.16rc2"
-
-CVE_STATUS[CVE-2021-4203] = "fixed-version: Fixed from version 5.15rc4"
-
-CVE_STATUS[CVE-2021-4204] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2021-4218] = "fixed-version: Fixed from version 5.8rc1"
-
-CVE_STATUS[CVE-2021-42252] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2021-42327] = "fixed-version: Fixed from version 5.15"
-
-CVE_STATUS[CVE-2021-42739] = "fixed-version: Fixed from version 5.16rc1"
-
-CVE_STATUS[CVE-2021-43056] = "fixed-version: Fixed from version 5.15rc6"
-
-CVE_STATUS[CVE-2021-43057] = "fixed-version: Fixed from version 5.15rc3"
-
-CVE_STATUS[CVE-2021-43267] = "fixed-version: Fixed from version 5.15"
-
-CVE_STATUS[CVE-2021-43389] = "fixed-version: Fixed from version 5.15rc6"
-
-CVE_STATUS[CVE-2021-43975] = "fixed-version: Fixed from version 5.16rc2"
-
-CVE_STATUS[CVE-2021-43976] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2021-44733] = "fixed-version: Fixed from version 5.16rc7"
-
-CVE_STATUS[CVE-2021-44879] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2021-45095] = "fixed-version: Fixed from version 5.16rc6"
-
-CVE_STATUS[CVE-2021-45100] = "fixed-version: Fixed from version 5.16rc7"
-
-CVE_STATUS[CVE-2021-45402] = "fixed-version: Fixed from version 5.16rc6"
-
-CVE_STATUS[CVE-2021-45469] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2021-45480] = "fixed-version: Fixed from version 5.16rc6"
-
-CVE_STATUS[CVE-2021-45485] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2021-45486] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2021-45868] = "fixed-version: Fixed from version 5.16rc1"
-
-CVE_STATUS[CVE-2021-46283] = "fixed-version: Fixed from version 5.13rc7"
-
-CVE_STATUS[CVE-2022-0001] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-0002] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-0168] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-0171] = "fixed-version: Fixed from version 5.18rc4"
-
-CVE_STATUS[CVE-2022-0185] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2022-0264] = "fixed-version: Fixed from version 5.16rc6"
-
-CVE_STATUS[CVE-2022-0286] = "fixed-version: Fixed from version 5.14rc2"
-
-CVE_STATUS[CVE-2022-0322] = "fixed-version: Fixed from version 5.15rc6"
-
-CVE_STATUS[CVE-2022-0330] = "fixed-version: Fixed from version 5.17rc2"
-
-CVE_STATUS[CVE-2022-0382] = "fixed-version: Fixed from version 5.16"
-
-# CVE-2022-0400 has no known resolution
-
-CVE_STATUS[CVE-2022-0433] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2022-0435] = "fixed-version: Fixed from version 5.17rc4"
-
-CVE_STATUS[CVE-2022-0480] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2022-0487] = "fixed-version: Fixed from version 5.17rc4"
-
-CVE_STATUS[CVE-2022-0492] = "fixed-version: Fixed from version 5.17rc3"
-
-CVE_STATUS[CVE-2022-0494] = "fixed-version: Fixed from version 5.17rc5"
-
-CVE_STATUS[CVE-2022-0500] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2022-0516] = "fixed-version: Fixed from version 5.17rc4"
-
-CVE_STATUS[CVE-2022-0617] = "fixed-version: Fixed from version 5.17rc2"
-
-CVE_STATUS[CVE-2022-0644] = "fixed-version: Fixed from version 5.15rc7"
-
-CVE_STATUS[CVE-2022-0646] = "fixed-version: Fixed from version 5.17rc5"
-
-CVE_STATUS[CVE-2022-0742] = "fixed-version: Fixed from version 5.17rc7"
-
-CVE_STATUS[CVE-2022-0812] = "fixed-version: Fixed from version 5.8rc6"
-
-CVE_STATUS[CVE-2022-0847] = "fixed-version: Fixed from version 5.17rc6"
-
-CVE_STATUS[CVE-2022-0850] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2022-0854] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-0995] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-0998] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2022-1011] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-1012] = "fixed-version: Fixed from version 5.18rc6"
-
-CVE_STATUS[CVE-2022-1015] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-1016] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-1043] = "fixed-version: Fixed from version 5.14rc7"
-
-CVE_STATUS[CVE-2022-1048] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-1055] = "fixed-version: Fixed from version 5.17rc3"
-
-# CVE-2022-1116 has no known resolution
-
-CVE_STATUS[CVE-2022-1158] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-1184] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-1195] = "fixed-version: Fixed from version 5.16rc7"
-
-CVE_STATUS[CVE-2022-1198] = "fixed-version: Fixed from version 5.17rc6"
-
-CVE_STATUS[CVE-2022-1199] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-1204] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-1205] = "fixed-version: Fixed from version 5.18rc1"
-
-# CVE-2022-1247 has no known resolution
-
-CVE_STATUS[CVE-2022-1263] = "fixed-version: Fixed from version 5.18rc3"
-
-CVE_STATUS[CVE-2022-1280] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2022-1353] = "fixed-version: Fixed from version 5.17"
-
-CVE_STATUS[CVE-2022-1419] = "fixed-version: Fixed from version 5.6rc2"
-
-CVE_STATUS[CVE-2022-1462] = "fixed-version: Fixed from version 5.19rc7"
-
-CVE_STATUS[CVE-2022-1508] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2022-1516] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-1651] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-1652] = "fixed-version: Fixed from version 5.18rc6"
-
-CVE_STATUS[CVE-2022-1671] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-1678] = "fixed-version: Fixed from version 4.20rc1"
-
-CVE_STATUS[CVE-2022-1679] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-1729] = "fixed-version: Fixed from version 5.18"
-
-CVE_STATUS[CVE-2022-1734] = "fixed-version: Fixed from version 5.18rc6"
-
-CVE_STATUS[CVE-2022-1786] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2022-1789] = "fixed-version: Fixed from version 5.18"
-
-CVE_STATUS[CVE-2022-1836] = "fixed-version: Fixed from version 5.18rc5"
-
-CVE_STATUS[CVE-2022-1852] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-1882] = "fixed-version: Fixed from version 5.19rc8"
-
-CVE_STATUS[CVE-2022-1943] = "fixed-version: Fixed from version 5.18rc7"
-
-CVE_STATUS[CVE-2022-1966] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-1972] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-1973] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-1974] = "fixed-version: Fixed from version 5.18rc6"
-
-CVE_STATUS[CVE-2022-1975] = "fixed-version: Fixed from version 5.18rc6"
-
-CVE_STATUS[CVE-2022-1976] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-1998] = "fixed-version: Fixed from version 5.17rc3"
-
-CVE_STATUS[CVE-2022-20008] = "fixed-version: Fixed from version 5.17rc5"
-
-CVE_STATUS[CVE-2022-20132] = "fixed-version: Fixed from version 5.16rc5"
-
-CVE_STATUS[CVE-2022-20141] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2022-20148] = "fixed-version: Fixed from version 5.16rc1"
-
-CVE_STATUS[CVE-2022-20153] = "fixed-version: Fixed from version 5.13rc1"
-
-CVE_STATUS[CVE-2022-20154] = "fixed-version: Fixed from version 5.16rc8"
-
-CVE_STATUS[CVE-2022-20158] = "fixed-version: Fixed from version 5.17"
-
-CVE_STATUS[CVE-2022-20166] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2022-20368] = "fixed-version: Fixed from version 5.17"
-
-CVE_STATUS[CVE-2022-20369] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-20409] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2022-20421] = "fixed-version: Fixed from version 6.0rc4"
-
-CVE_STATUS[CVE-2022-20422] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-20423] = "fixed-version: Fixed from version 5.17"
-
-CVE_STATUS[CVE-2022-20424] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2022-20565] = "fixed-version: Fixed from version 5.9rc4"
-
-CVE_STATUS[CVE-2022-20566] = "fixed-version: Fixed from version 5.19"
-
-CVE_STATUS[CVE-2022-20567] = "fixed-version: Fixed from version 4.16rc5"
-
-CVE_STATUS[CVE-2022-20568] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2022-20572] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-2078] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-21123] = "fixed-version: Fixed from version 5.19rc3"
-
-CVE_STATUS[CVE-2022-21125] = "fixed-version: Fixed from version 5.19rc3"
-
-CVE_STATUS[CVE-2022-21166] = "fixed-version: Fixed from version 5.19rc3"
-
-CVE_STATUS[CVE-2022-21385] = "fixed-version: Fixed from version 4.20"
-
-CVE_STATUS[CVE-2022-21499] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-21505] = "fixed-version: Fixed from version 5.19rc8"
-
-CVE_STATUS[CVE-2022-2153] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-2196] = "fixed-version: Fixed from version 6.2rc1"
-
-# CVE-2022-2209 has no known resolution
-
-CVE_STATUS[CVE-2022-22942] = "fixed-version: Fixed from version 5.17rc2"
-
-CVE_STATUS[CVE-2022-23036] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-23037] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-23038] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-23039] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-23040] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-23041] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-23042] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-2308] = "fixed-version: Fixed from version 6.0"
-
-CVE_STATUS[CVE-2022-2318] = "fixed-version: Fixed from version 5.19rc5"
-
-CVE_STATUS[CVE-2022-23222] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2022-2327] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2022-2380] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-23816] = "fixed-version: Fixed from version 5.19rc7"
-
-# CVE-2022-23825 has no known resolution
-
-CVE_STATUS[CVE-2022-23960] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-24122] = "fixed-version: Fixed from version 5.17rc2"
-
-CVE_STATUS[CVE-2022-24448] = "fixed-version: Fixed from version 5.17rc2"
-
-CVE_STATUS[CVE-2022-24958] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2022-24959] = "fixed-version: Fixed from version 5.17rc2"
-
-CVE_STATUS[CVE-2022-2503] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-25258] = "fixed-version: Fixed from version 5.17rc4"
-
-# CVE-2022-25265 has no known resolution
-
-CVE_STATUS[CVE-2022-25375] = "fixed-version: Fixed from version 5.17rc4"
-
-CVE_STATUS[CVE-2022-25636] = "fixed-version: Fixed from version 5.17rc6"
-
-CVE_STATUS[CVE-2022-2585] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-2586] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-2588] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-2590] = "fixed-version: Fixed from version 6.0rc3"
-
-CVE_STATUS[CVE-2022-2602] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-26365] = "fixed-version: Fixed from version 5.19rc6"
-
-CVE_STATUS[CVE-2022-26373] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-2639] = "fixed-version: Fixed from version 5.18rc4"
-
-CVE_STATUS[CVE-2022-26490] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2022-2663] = "fixed-version: Fixed from version 6.0rc5"
-
-# CVE-2022-26878 has no known resolution
-
-CVE_STATUS[CVE-2022-26966] = "fixed-version: Fixed from version 5.17rc6"
-
-CVE_STATUS[CVE-2022-27223] = "fixed-version: Fixed from version 5.17rc6"
-
-CVE_STATUS[CVE-2022-27666] = "fixed-version: Fixed from version 5.17rc8"
-
-CVE_STATUS[CVE-2022-27672] = "fixed-version: Fixed from version 6.2"
-
-CVE_STATUS[CVE-2022-2785] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-27950] = "fixed-version: Fixed from version 5.17rc5"
-
-CVE_STATUS[CVE-2022-28356] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-28388] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-28389] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-28390] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-2873] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-28796] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-28893] = "fixed-version: Fixed from version 5.18rc2"
-
-CVE_STATUS[CVE-2022-2905] = "fixed-version: Fixed from version 6.0rc4"
-
-CVE_STATUS[CVE-2022-29156] = "fixed-version: Fixed from version 5.17rc6"
-
-CVE_STATUS[CVE-2022-2938] = "fixed-version: Fixed from version 5.17rc2"
-
-CVE_STATUS[CVE-2022-29581] = "fixed-version: Fixed from version 5.18rc4"
-
-CVE_STATUS[CVE-2022-29582] = "fixed-version: Fixed from version 5.18rc2"
-
-CVE_STATUS[CVE-2022-2959] = "fixed-version: Fixed from version 5.19rc1"
-
-# CVE-2022-2961 has no known resolution
-
-CVE_STATUS[CVE-2022-2964] = "fixed-version: Fixed from version 5.17rc4"
-
-CVE_STATUS[CVE-2022-2977] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-2978] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-29900] = "fixed-version: Fixed from version 5.19rc7"
-
-CVE_STATUS[CVE-2022-29901] = "fixed-version: Fixed from version 5.19rc7"
-
-CVE_STATUS[CVE-2022-2991] = "fixed-version: Fixed from version 5.15rc1"
-
-CVE_STATUS[CVE-2022-29968] = "fixed-version: Fixed from version 5.18rc5"
-
-CVE_STATUS[CVE-2022-3028] = "fixed-version: Fixed from version 6.0rc3"
-
-CVE_STATUS[CVE-2022-30594] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-3061] = "fixed-version: Fixed from version 5.18rc5"
-
-CVE_STATUS[CVE-2022-3077] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-3078] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-3103] = "fixed-version: Fixed from version 6.0rc3"
-
-CVE_STATUS[CVE-2022-3104] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-3105] = "fixed-version: Fixed from version 5.16"
-
-CVE_STATUS[CVE-2022-3106] = "fixed-version: Fixed from version 5.16rc6"
-
-CVE_STATUS[CVE-2022-3107] = "fixed-version: Fixed from version 5.17"
-
-CVE_STATUS[CVE-2022-3108] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2022-3110] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-3111] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-3112] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-3113] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-3114] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-3115] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-3169] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3170] = "fixed-version: Fixed from version 6.0rc4"
-
-CVE_STATUS[CVE-2022-3176] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2022-3202] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-32250] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-32296] = "fixed-version: Fixed from version 5.18rc6"
-
-# CVE-2022-3238 has no known resolution
-
-CVE_STATUS[CVE-2022-3239] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2022-32981] = "fixed-version: Fixed from version 5.19rc2"
-
-CVE_STATUS[CVE-2022-3303] = "fixed-version: Fixed from version 6.0rc5"
-
-CVE_STATUS[CVE-2022-3344] = "fixed-version: Fixed from version 6.1rc7"
-
-CVE_STATUS[CVE-2022-33740] = "fixed-version: Fixed from version 5.19rc6"
-
-CVE_STATUS[CVE-2022-33741] = "fixed-version: Fixed from version 5.19rc6"
-
-CVE_STATUS[CVE-2022-33742] = "fixed-version: Fixed from version 5.19rc6"
-
-CVE_STATUS[CVE-2022-33743] = "fixed-version: Fixed from version 5.19rc6"
-
-CVE_STATUS[CVE-2022-33744] = "fixed-version: Fixed from version 5.19rc6"
-
-CVE_STATUS[CVE-2022-33981] = "fixed-version: Fixed from version 5.18rc5"
-
-CVE_STATUS[CVE-2022-3424] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2022-3435] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-34494] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-34495] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-34918] = "fixed-version: Fixed from version 5.19rc6"
-
-CVE_STATUS[CVE-2022-3521] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3522] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3523] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3524] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3526] = "fixed-version: Fixed from version 5.18rc3"
-
-CVE_STATUS[CVE-2022-3531] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2022-3532] = "fixed-version: Fixed from version 6.2rc1"
-
-# CVE-2022-3533 has no known resolution
-
-CVE_STATUS[CVE-2022-3534] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2022-3535] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3541] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3542] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3543] = "fixed-version: Fixed from version 6.1rc1"
-
-# CVE-2022-3544 has no known resolution
-
-CVE_STATUS[CVE-2022-3545] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-3564] = "fixed-version: Fixed from version 6.1rc4"
-
-CVE_STATUS[CVE-2022-3565] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3566] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3567] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3577] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-3586] = "fixed-version: Fixed from version 6.0rc5"
-
-CVE_STATUS[CVE-2022-3594] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3595] = "fixed-version: Fixed from version 6.1rc1"
-
-# CVE-2022-3606 has no known resolution
-
-CVE_STATUS[CVE-2022-36123] = "fixed-version: Fixed from version 5.19rc6"
-
-CVE_STATUS[CVE-2022-3619] = "fixed-version: Fixed from version 6.1rc4"
-
-CVE_STATUS[CVE-2022-3621] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3623] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3624] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-3625] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-3628] = "fixed-version: Fixed from version 6.1rc5"
-
-CVE_STATUS[CVE-2022-36280] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2022-3629] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-3630] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-3633] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-3635] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-3636] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-3640] = "fixed-version: Fixed from version 6.1rc4"
-
-# CVE-2022-36402 has no known resolution
-
-# CVE-2022-3642 has no known resolution
-
-CVE_STATUS[CVE-2022-3643] = "fixed-version: Fixed from version 6.1"
-
-CVE_STATUS[CVE-2022-3646] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-3649] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-36879] = "fixed-version: Fixed from version 5.19rc8"
-
-CVE_STATUS[CVE-2022-36946] = "fixed-version: Fixed from version 5.19"
-
-CVE_STATUS[CVE-2022-3707] = "fixed-version: Fixed from version 6.2rc3"
-
-# CVE-2022-38096 has no known resolution
-
-CVE_STATUS[CVE-2022-38457] = "fixed-version: Fixed from version 6.2rc4"
-
-CVE_STATUS[CVE-2022-3903] = "fixed-version: Fixed from version 6.1rc2"
-
-CVE_STATUS[CVE-2022-3910] = "fixed-version: Fixed from version 6.0rc6"
-
-CVE_STATUS[CVE-2022-39188] = "fixed-version: Fixed from version 5.19rc8"
-
-CVE_STATUS[CVE-2022-39189] = "fixed-version: Fixed from version 5.19rc2"
-
-CVE_STATUS[CVE-2022-39190] = "fixed-version: Fixed from version 6.0rc3"
-
-CVE_STATUS[CVE-2022-3977] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-39842] = "fixed-version: Fixed from version 5.19rc4"
-
-CVE_STATUS[CVE-2022-40133] = "fixed-version: Fixed from version 6.2rc4"
-
-CVE_STATUS[CVE-2022-40307] = "fixed-version: Fixed from version 6.0rc5"
-
-CVE_STATUS[CVE-2022-40476] = "fixed-version: Fixed from version 5.19rc4"
-
-CVE_STATUS[CVE-2022-40768] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-4095] = "fixed-version: Fixed from version 6.0rc4"
-
-CVE_STATUS[CVE-2022-40982] = "cpe-stable-backport: Backported in 6.4.9"
-
-CVE_STATUS[CVE-2022-41218] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2022-41222] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2022-4127] = "fixed-version: Fixed from version 5.19rc6"
-
-CVE_STATUS[CVE-2022-4128] = "fixed-version: Fixed from version 5.19rc7"
-
-CVE_STATUS[CVE-2022-4129] = "fixed-version: Fixed from version 6.1rc6"
-
-CVE_STATUS[CVE-2022-4139] = "fixed-version: Fixed from version 6.1rc8"
-
-CVE_STATUS[CVE-2022-41674] = "fixed-version: Fixed from version 6.1rc1"
-
-# CVE-2022-41848 has no known resolution
-
-CVE_STATUS[CVE-2022-41849] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-41850] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-41858] = "fixed-version: Fixed from version 5.18rc2"
-
-CVE_STATUS[CVE-2022-42328] = "fixed-version: Fixed from version 6.1"
-
-CVE_STATUS[CVE-2022-42329] = "fixed-version: Fixed from version 6.1"
-
-CVE_STATUS[CVE-2022-42432] = "fixed-version: Fixed from version 6.0rc7"
-
-CVE_STATUS[CVE-2022-4269] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2022-42703] = "fixed-version: Fixed from version 6.0rc4"
-
-CVE_STATUS[CVE-2022-42719] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-42720] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-42721] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-42722] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-42895] = "fixed-version: Fixed from version 6.1rc4"
-
-CVE_STATUS[CVE-2022-42896] = "fixed-version: Fixed from version 6.1rc4"
-
-CVE_STATUS[CVE-2022-43750] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-4378] = "fixed-version: Fixed from version 6.1"
-
-CVE_STATUS[CVE-2022-4379] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2022-4382] = "fixed-version: Fixed from version 6.2rc5"
-
-CVE_STATUS[CVE-2022-43945] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2022-44032] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2022-44033] = "fixed-version: Fixed from version 6.4rc1"
-
-# CVE-2022-44034 has no known resolution
-
-# CVE-2022-4543 has no known resolution
-
-CVE_STATUS[CVE-2022-45869] = "fixed-version: Fixed from version 6.1rc7"
-
-# CVE-2022-45884 has no known resolution
-
-# CVE-2022-45885 has no known resolution
-
-CVE_STATUS[CVE-2022-45886] = "fixed-version: Fixed from version 6.4rc3"
-
-CVE_STATUS[CVE-2022-45887] = "fixed-version: Fixed from version 6.4rc3"
-
-CVE_STATUS[CVE-2022-45888] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2022-45919] = "fixed-version: Fixed from version 6.4rc3"
-
-CVE_STATUS[CVE-2022-45934] = "fixed-version: Fixed from version 6.1"
-
-CVE_STATUS[CVE-2022-4662] = "fixed-version: Fixed from version 6.0rc4"
-
-CVE_STATUS[CVE-2022-4696] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2022-4744] = "fixed-version: Fixed from version 5.16rc7"
-
-CVE_STATUS[CVE-2022-47518] = "fixed-version: Fixed from version 6.1rc8"
-
-CVE_STATUS[CVE-2022-47519] = "fixed-version: Fixed from version 6.1rc8"
-
-CVE_STATUS[CVE-2022-47520] = "fixed-version: Fixed from version 6.1rc8"
-
-CVE_STATUS[CVE-2022-47521] = "fixed-version: Fixed from version 6.1rc8"
-
-CVE_STATUS[CVE-2022-47929] = "fixed-version: Fixed from version 6.2rc4"
-
-CVE_STATUS[CVE-2022-47938] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-47939] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-47940] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2022-47941] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-47942] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-47943] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2022-47946] = "fixed-version: Fixed from version 5.12rc2"
-
-CVE_STATUS[CVE-2022-4842] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2022-48423] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2022-48424] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2022-48425] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2022-48502] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2023-0030] = "fixed-version: Fixed from version 5.0rc1"
-
-CVE_STATUS[CVE-2023-0045] = "fixed-version: Fixed from version 6.2rc3"
-
-CVE_STATUS[CVE-2023-0047] = "fixed-version: Fixed from version 5.16rc1"
-
-CVE_STATUS[CVE-2023-0122] = "fixed-version: Fixed from version 6.0rc4"
-
-CVE_STATUS[CVE-2023-0160] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-0179] = "fixed-version: Fixed from version 6.2rc5"
-
-CVE_STATUS[CVE-2023-0210] = "fixed-version: Fixed from version 6.2rc4"
-
-CVE_STATUS[CVE-2023-0240] = "fixed-version: Fixed from version 5.10rc1"
-
-CVE_STATUS[CVE-2023-0266] = "fixed-version: Fixed from version 6.2rc4"
-
-CVE_STATUS[CVE-2023-0386] = "fixed-version: Fixed from version 6.2rc6"
-
-CVE_STATUS[CVE-2023-0394] = "fixed-version: Fixed from version 6.2rc4"
-
-CVE_STATUS[CVE-2023-0458] = "fixed-version: Fixed from version 6.2rc5"
-
-CVE_STATUS[CVE-2023-0459] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-0461] = "fixed-version: Fixed from version 6.2rc3"
-
-CVE_STATUS[CVE-2023-0468] = "fixed-version: Fixed from version 6.1rc7"
-
-CVE_STATUS[CVE-2023-0469] = "fixed-version: Fixed from version 6.1rc7"
-
-CVE_STATUS[CVE-2023-0590] = "fixed-version: Fixed from version 6.1rc2"
-
-CVE_STATUS[CVE-2023-0597] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2023-0615] = "fixed-version: Fixed from version 6.1rc3"
-
-CVE_STATUS[CVE-2023-1032] = "fixed-version: Fixed from version 6.3rc2"
-
-CVE_STATUS[CVE-2023-1073] = "fixed-version: Fixed from version 6.2rc5"
-
-CVE_STATUS[CVE-2023-1074] = "fixed-version: Fixed from version 6.2rc6"
-
-CVE_STATUS[CVE-2023-1075] = "fixed-version: Fixed from version 6.2rc7"
-
-CVE_STATUS[CVE-2023-1076] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-1077] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-1078] = "fixed-version: Fixed from version 6.2rc8"
-
-CVE_STATUS[CVE-2023-1079] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-1095] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2023-1118] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-1192] = "fixed-version: Fixed from version 6.4rc1"
-
-# CVE-2023-1193 has no known resolution
-
-CVE_STATUS[CVE-2023-1194] = "fixed-version: Fixed from version 6.4rc6"
-
-CVE_STATUS[CVE-2023-1195] = "fixed-version: Fixed from version 6.1rc3"
-
-CVE_STATUS[CVE-2023-1206] = "cpe-stable-backport: Backported in 6.4.8"
-
-CVE_STATUS[CVE-2023-1249] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2023-1252] = "fixed-version: Fixed from version 5.16rc1"
-
-CVE_STATUS[CVE-2023-1281] = "fixed-version: Fixed from version 6.2"
-
-CVE_STATUS[CVE-2023-1295] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2023-1380] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-1382] = "fixed-version: Fixed from version 6.1rc7"
-
-CVE_STATUS[CVE-2023-1390] = "fixed-version: Fixed from version 5.11rc4"
-
-CVE_STATUS[CVE-2023-1513] = "fixed-version: Fixed from version 6.2"
-
-CVE_STATUS[CVE-2023-1582] = "fixed-version: Fixed from version 5.17rc4"
-
-CVE_STATUS[CVE-2023-1583] = "fixed-version: Fixed from version 6.3rc4"
-
-CVE_STATUS[CVE-2023-1611] = "fixed-version: Fixed from version 6.3rc5"
-
-CVE_STATUS[CVE-2023-1637] = "fixed-version: Fixed from version 5.18rc2"
-
-CVE_STATUS[CVE-2023-1652] = "fixed-version: Fixed from version 6.2rc5"
-
-CVE_STATUS[CVE-2023-1670] = "fixed-version: Fixed from version 6.3rc4"
-
-CVE_STATUS[CVE-2023-1829] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-1838] = "fixed-version: Fixed from version 5.18"
-
-CVE_STATUS[CVE-2023-1855] = "fixed-version: Fixed from version 6.3rc3"
-
-CVE_STATUS[CVE-2023-1859] = "fixed-version: Fixed from version 6.3rc7"
-
-CVE_STATUS[CVE-2023-1872] = "fixed-version: Fixed from version 5.18rc2"
-
-CVE_STATUS[CVE-2023-1989] = "fixed-version: Fixed from version 6.3rc4"
-
-CVE_STATUS[CVE-2023-1990] = "fixed-version: Fixed from version 6.3rc3"
-
-CVE_STATUS[CVE-2023-1998] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-2002] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-2006] = "fixed-version: Fixed from version 6.1rc7"
-
-CVE_STATUS[CVE-2023-2007] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2023-2008] = "fixed-version: Fixed from version 5.19rc4"
-
-CVE_STATUS[CVE-2023-2019] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2023-20569] = "cpe-stable-backport: Backported in 6.4.9"
-
-CVE_STATUS[CVE-2023-20588] = "cpe-stable-backport: Backported in 6.4.10"
-
-CVE_STATUS[CVE-2023-20593] = "cpe-stable-backport: Backported in 6.4.6"
-
-CVE_STATUS[CVE-2023-20928] = "fixed-version: Fixed from version 6.0rc1"
-
-# CVE-2023-20937 has no known resolution
-
-CVE_STATUS[CVE-2023-20938] = "fixed-version: Fixed from version 5.18rc5"
-
-# CVE-2023-20941 has no known resolution
-
-CVE_STATUS[CVE-2023-21102] = "fixed-version: Fixed from version 6.2rc4"
-
-CVE_STATUS[CVE-2023-21106] = "fixed-version: Fixed from version 6.2rc5"
-
-CVE_STATUS[CVE-2023-2124] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-21255] = "fixed-version: Fixed from version 6.4rc4"
-
-CVE_STATUS[CVE-2023-21264] = "fixed-version: Fixed from version 6.4rc5"
-
-# CVE-2023-21400 has no known resolution
-
-CVE_STATUS[CVE-2023-2156] = "fixed-version: Fixed from version 6.3"
-
-CVE_STATUS[CVE-2023-2162] = "fixed-version: Fixed from version 6.2rc6"
-
-CVE_STATUS[CVE-2023-2163] = "fixed-version: Fixed from version 6.3"
-
-CVE_STATUS[CVE-2023-2166] = "fixed-version: Fixed from version 6.1"
-
-CVE_STATUS[CVE-2023-2176] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-2177] = "fixed-version: Fixed from version 5.19"
-
-CVE_STATUS[CVE-2023-2194] = "fixed-version: Fixed from version 6.3rc4"
-
-CVE_STATUS[CVE-2023-2235] = "fixed-version: Fixed from version 6.3rc3"
-
-CVE_STATUS[CVE-2023-2236] = "fixed-version: Fixed from version 6.1rc7"
-
-CVE_STATUS[CVE-2023-2248] = "fixed-version: Fixed from version 6.3"
-
-CVE_STATUS[CVE-2023-2269] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-22995] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2023-22996] = "fixed-version: Fixed from version 5.18rc1"
-
-CVE_STATUS[CVE-2023-22997] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2023-22998] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2023-22999] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2023-23000] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2023-23001] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2023-23002] = "fixed-version: Fixed from version 5.17rc1"
-
-CVE_STATUS[CVE-2023-23003] = "fixed-version: Fixed from version 5.16rc6"
-
-CVE_STATUS[CVE-2023-23004] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2023-23005] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2023-23006] = "fixed-version: Fixed from version 5.16rc8"
-
-# CVE-2023-23039 has no known resolution
-
-CVE_STATUS[CVE-2023-23454] = "fixed-version: Fixed from version 6.2rc3"
-
-CVE_STATUS[CVE-2023-23455] = "fixed-version: Fixed from version 6.2rc3"
-
-CVE_STATUS[CVE-2023-23559] = "fixed-version: Fixed from version 6.2rc5"
-
-CVE_STATUS[CVE-2023-23586] = "fixed-version: Fixed from version 5.12rc1"
-
-CVE_STATUS[CVE-2023-2430] = "fixed-version: Fixed from version 6.2rc5"
-
-CVE_STATUS[CVE-2023-2483] = "fixed-version: Fixed from version 6.3rc4"
-
-CVE_STATUS[CVE-2023-25012] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-2513] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2023-25775] = "cpe-stable-backport: Backported in 6.4.16"
-
-CVE_STATUS[CVE-2023-2598] = "fixed-version: Fixed from version 6.4rc1"
-
-# CVE-2023-26242 has no known resolution
-
-# CVE-2023-2640 has no known resolution
-
-CVE_STATUS[CVE-2023-26544] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2023-26545] = "fixed-version: Fixed from version 6.2"
-
-CVE_STATUS[CVE-2023-26605] = "fixed-version: Fixed from version 6.1rc7"
-
-CVE_STATUS[CVE-2023-26606] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2023-26607] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2023-28327] = "fixed-version: Fixed from version 6.1"
-
-CVE_STATUS[CVE-2023-28328] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2023-28410] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2023-28464] = "fixed-version: Fixed from version 6.3rc7"
-
-CVE_STATUS[CVE-2023-28466] = "fixed-version: Fixed from version 6.3rc2"
-
-CVE_STATUS[CVE-2023-2860] = "fixed-version: Fixed from version 6.0rc5"
-
-CVE_STATUS[CVE-2023-28772] = "fixed-version: Fixed from version 5.14rc1"
-
-CVE_STATUS[CVE-2023-28866] = "fixed-version: Fixed from version 6.3rc4"
-
-CVE_STATUS[CVE-2023-2898] = "cpe-stable-backport: Backported in 6.4.4"
-
-CVE_STATUS[CVE-2023-2985] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-3006] = "fixed-version: Fixed from version 6.1rc1"
-
-# Skipping CVE-2023-3022, no affected_versions
-
-CVE_STATUS[CVE-2023-30456] = "fixed-version: Fixed from version 6.3rc3"
-
-CVE_STATUS[CVE-2023-30772] = "fixed-version: Fixed from version 6.3rc4"
-
-CVE_STATUS[CVE-2023-3090] = "fixed-version: Fixed from version 6.4rc2"
-
-CVE_STATUS[CVE-2023-3106] = "fixed-version: Fixed from version 4.8rc7"
-
-# Skipping CVE-2023-3108, no affected_versions
-
-# CVE-2023-31081 has no known resolution
-
-# CVE-2023-31082 has no known resolution
-
-# CVE-2023-31083 needs backporting (fixed from 6.6rc1)
-
-CVE_STATUS[CVE-2023-31084] = "fixed-version: Fixed from version 6.4rc3"
-
-# CVE-2023-31085 has no known resolution
-
-CVE_STATUS[CVE-2023-3111] = "fixed-version: Fixed from version 6.0rc2"
-
-CVE_STATUS[CVE-2023-3117] = "fixed-version: Fixed from version 6.4rc7"
-
-CVE_STATUS[CVE-2023-31248] = "cpe-stable-backport: Backported in 6.4.4"
-
-CVE_STATUS[CVE-2023-3141] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-31436] = "fixed-version: Fixed from version 6.3"
-
-CVE_STATUS[CVE-2023-3159] = "fixed-version: Fixed from version 5.18rc6"
-
-CVE_STATUS[CVE-2023-3161] = "fixed-version: Fixed from version 6.2rc7"
-
-CVE_STATUS[CVE-2023-3212] = "fixed-version: Fixed from version 6.4rc2"
-
-CVE_STATUS[CVE-2023-3220] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-32233] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-32247] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-32248] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-32250] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-32252] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-32254] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-32257] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-32258] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-32269] = "fixed-version: Fixed from version 6.2rc7"
-
-# CVE-2023-32629 has no known resolution
-
-CVE_STATUS[CVE-2023-3268] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-3269] = "cpe-stable-backport: Backported in 6.4.1"
-
-CVE_STATUS[CVE-2023-3312] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-3317] = "fixed-version: Fixed from version 6.3rc6"
-
-CVE_STATUS[CVE-2023-33203] = "fixed-version: Fixed from version 6.3rc4"
-
-CVE_STATUS[CVE-2023-33250] = "cpe-stable-backport: Backported in 6.4.4"
-
-CVE_STATUS[CVE-2023-33288] = "fixed-version: Fixed from version 6.3rc4"
-
-CVE_STATUS[CVE-2023-3338] = "fixed-version: Fixed from version 6.1rc1"
-
-CVE_STATUS[CVE-2023-3355] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-3357] = "fixed-version: Fixed from version 6.2rc1"
-
-CVE_STATUS[CVE-2023-3358] = "fixed-version: Fixed from version 6.2rc5"
-
-CVE_STATUS[CVE-2023-3359] = "fixed-version: Fixed from version 6.2rc7"
-
-CVE_STATUS[CVE-2023-3389] = "fixed-version: Fixed from version 6.0rc1"
-
-CVE_STATUS[CVE-2023-3390] = "fixed-version: Fixed from version 6.4rc7"
-
-CVE_STATUS[CVE-2023-33951] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-33952] = "fixed-version: Fixed from version 6.4rc1"
-
-# CVE-2023-3397 has no known resolution
-
-CVE_STATUS[CVE-2023-34255] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-34256] = "fixed-version: Fixed from version 6.4rc2"
-
-CVE_STATUS[CVE-2023-34319] = "cpe-stable-backport: Backported in 6.4.9"
-
-CVE_STATUS[CVE-2023-3439] = "fixed-version: Fixed from version 5.18rc5"
-
-CVE_STATUS[CVE-2023-35001] = "cpe-stable-backport: Backported in 6.4.4"
-
-CVE_STATUS[CVE-2023-3567] = "fixed-version: Fixed from version 6.2rc7"
-
-# CVE-2023-35693 has no known resolution
-
-CVE_STATUS[CVE-2023-35788] = "fixed-version: Fixed from version 6.4rc5"
-
-CVE_STATUS[CVE-2023-35823] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-35824] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-35826] = "fixed-version: Fixed from version 6.4rc1"
-
-# CVE-2023-35827 has no known resolution
-
-CVE_STATUS[CVE-2023-35828] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-35829] = "fixed-version: Fixed from version 6.4rc1"
-
-CVE_STATUS[CVE-2023-3609] = "fixed-version: Fixed from version 6.4rc7"
-
-CVE_STATUS[CVE-2023-3610] = "fixed-version: Fixed from version 6.4"
-
-CVE_STATUS[CVE-2023-3611] = "cpe-stable-backport: Backported in 6.4.5"
-
-# CVE-2023-3640 has no known resolution
-
-CVE_STATUS[CVE-2023-37453] = "cpe-stable-backport: Backported in 6.4.16"
-
-# CVE-2023-37454 has no known resolution
-
-CVE_STATUS[CVE-2023-3772] = "cpe-stable-backport: Backported in 6.4.12"
-
-CVE_STATUS[CVE-2023-3773] = "cpe-stable-backport: Backported in 6.4.12"
-
-CVE_STATUS[CVE-2023-3776] = "cpe-stable-backport: Backported in 6.4.5"
-
-CVE_STATUS[CVE-2023-3777] = "cpe-stable-backport: Backported in 6.4.7"
-
-CVE_STATUS[CVE-2023-3812] = "fixed-version: Fixed from version 6.1rc4"
-
-CVE_STATUS[CVE-2023-38409] = "fixed-version: Fixed from version 6.3rc7"
-
-CVE_STATUS[CVE-2023-38426] = "fixed-version: Fixed from version 6.4rc3"
-
-CVE_STATUS[CVE-2023-38427] = "fixed-version: Fixed from version 6.4rc6"
-
-CVE_STATUS[CVE-2023-38428] = "fixed-version: Fixed from version 6.4rc3"
-
-CVE_STATUS[CVE-2023-38429] = "fixed-version: Fixed from version 6.4rc3"
-
-CVE_STATUS[CVE-2023-38430] = "fixed-version: Fixed from version 6.4rc6"
-
-CVE_STATUS[CVE-2023-38431] = "fixed-version: Fixed from version 6.4rc6"
-
-CVE_STATUS[CVE-2023-38432] = "fixed-version: Fixed from version 6.4"
-
-CVE_STATUS[CVE-2023-3863] = "cpe-stable-backport: Backported in 6.4.4"
-
-CVE_STATUS[CVE-2023-3865] = "fixed-version: Fixed from version 6.4"
-
-CVE_STATUS[CVE-2023-3866] = "fixed-version: Fixed from version 6.4"
-
-CVE_STATUS[CVE-2023-3867] = "cpe-stable-backport: Backported in 6.4.5"
-
-CVE_STATUS[CVE-2023-4004] = "cpe-stable-backport: Backported in 6.4.7"
-
-# CVE-2023-4010 has no known resolution
-
-CVE_STATUS[CVE-2023-4015] = "cpe-stable-backport: Backported in 6.4.8"
-
-CVE_STATUS[CVE-2023-40283] = "cpe-stable-backport: Backported in 6.4.10"
-
-CVE_STATUS[CVE-2023-4128] = "cpe-stable-backport: Backported in 6.4.10"
-
-CVE_STATUS[CVE-2023-4132] = "cpe-stable-backport: Backported in 6.4.4"
-
-CVE_STATUS[CVE-2023-4133] = "fixed-version: Fixed from version 6.3"
-
-CVE_STATUS[CVE-2023-4134] = "cpe-stable-backport: Backported in 6.4.4"
-
-CVE_STATUS[CVE-2023-4147] = "cpe-stable-backport: Backported in 6.4.8"
-
-CVE_STATUS[CVE-2023-4155] = "cpe-stable-backport: Backported in 6.4.11"
-
-CVE_STATUS[CVE-2023-4194] = "cpe-stable-backport: Backported in 6.4.10"
-
-CVE_STATUS[CVE-2023-4206] = "cpe-stable-backport: Backported in 6.4.10"
-
-CVE_STATUS[CVE-2023-4207] = "cpe-stable-backport: Backported in 6.4.10"
-
-CVE_STATUS[CVE-2023-4208] = "cpe-stable-backport: Backported in 6.4.10"
-
-CVE_STATUS[CVE-2023-4244] = "cpe-stable-backport: Backported in 6.4.12"
-
-CVE_STATUS[CVE-2023-4273] = "cpe-stable-backport: Backported in 6.4.10"
-
-CVE_STATUS[CVE-2023-42752] = "cpe-stable-backport: Backported in 6.4.16"
-
-CVE_STATUS[CVE-2023-42753] = "cpe-stable-backport: Backported in 6.4.16"
-
-CVE_STATUS[CVE-2023-42755] = "fixed-version: Fixed from version 6.3rc1"
-
-CVE_STATUS[CVE-2023-4385] = "fixed-version: Fixed from version 5.19rc1"
-
-CVE_STATUS[CVE-2023-4387] = "fixed-version: Fixed from version 5.18"
-
-CVE_STATUS[CVE-2023-4389] = "fixed-version: Fixed from version 5.18rc3"
-
-CVE_STATUS[CVE-2023-4394] = "fixed-version: Fixed from version 6.0rc3"
-
-CVE_STATUS[CVE-2023-4459] = "fixed-version: Fixed from version 5.18"
-
-CVE_STATUS[CVE-2023-4563] = "cpe-stable-backport: Backported in 6.4.11"
-
-CVE_STATUS[CVE-2023-4569] = "cpe-stable-backport: Backported in 6.4.12"
-
-CVE_STATUS[CVE-2023-4611] = "cpe-stable-backport: Backported in 6.4.8"
-
-# CVE-2023-4622 needs backporting (fixed from 6.5rc1)
-
-CVE_STATUS[CVE-2023-4623] = "cpe-stable-backport: Backported in 6.4.16"
-
-# CVE-2023-4881 needs backporting (fixed from 6.6rc1)
-
-# CVE-2023-4921 needs backporting (fixed from 6.6rc1)
-
-# CVE-2023-5158 has no known resolution
-
-# CVE-2023-5197 needs backporting (fixed from 6.6rc3)
-
diff --git a/poky/meta/recipes-kernel/linux/cve-exclusion_6.5.inc b/poky/meta/recipes-kernel/linux/cve-exclusion_6.5.inc
index c88b6f7c59..b4086d436c 100644
--- a/poky/meta/recipes-kernel/linux/cve-exclusion_6.5.inc
+++ b/poky/meta/recipes-kernel/linux/cve-exclusion_6.5.inc
@@ -1,9 +1,9 @@
# Auto-generated CVE metadata, DO NOT EDIT BY HAND.
-# Generated at 2023-09-29 00:20:42.494116+00:00 for version 6.5.5
+# Generated at 2023-11-09 17:13:01.267965+00:00 for version 6.5.10
python check_kernel_cve_status_version() {
- this_version = "6.5.5"
+ this_version = "6.5.10"
kernel_version = d.getVar("LINUX_VERSION")
if kernel_version != this_version:
bb.warn("Kernel CVE status needs updating: generated for %s but kernel is %s" % (this_version, kernel_version))
@@ -3354,7 +3354,7 @@ CVE_STATUS[CVE-2020-27194] = "fixed-version: Fixed from version 5.9"
CVE_STATUS[CVE-2020-2732] = "fixed-version: Fixed from version 5.6rc4"
-# CVE-2020-27418 has no known resolution
+CVE_STATUS[CVE-2020-27418] = "fixed-version: Fixed from version 5.6rc5"
CVE_STATUS[CVE-2020-27673] = "fixed-version: Fixed from version 5.10rc1"
@@ -4644,7 +4644,7 @@ CVE_STATUS[CVE-2023-1118] = "fixed-version: Fixed from version 6.3rc1"
CVE_STATUS[CVE-2023-1192] = "fixed-version: Fixed from version 6.4rc1"
-# CVE-2023-1193 has no known resolution
+CVE_STATUS[CVE-2023-1193] = "fixed-version: Fixed from version 6.3rc6"
CVE_STATUS[CVE-2023-1194] = "fixed-version: Fixed from version 6.4rc6"
@@ -4796,7 +4796,7 @@ CVE_STATUS[CVE-2023-25012] = "fixed-version: Fixed from version 6.3rc1"
CVE_STATUS[CVE-2023-2513] = "fixed-version: Fixed from version 6.0rc1"
-# CVE-2023-25775 needs backporting (fixed from 6.6rc1)
+CVE_STATUS[CVE-2023-25775] = "cpe-stable-backport: Backported in 6.5.3"
CVE_STATUS[CVE-2023-2598] = "fixed-version: Fixed from version 6.4rc1"
@@ -4856,7 +4856,7 @@ CVE_STATUS[CVE-2023-3106] = "fixed-version: Fixed from version 4.8rc7"
CVE_STATUS[CVE-2023-31084] = "fixed-version: Fixed from version 6.4rc3"
-# CVE-2023-31085 has no known resolution
+CVE_STATUS[CVE-2023-31085] = "cpe-stable-backport: Backported in 6.5.7"
CVE_STATUS[CVE-2023-3111] = "fixed-version: Fixed from version 6.0rc2"
@@ -4936,6 +4936,8 @@ CVE_STATUS[CVE-2023-34256] = "fixed-version: Fixed from version 6.4rc2"
CVE_STATUS[CVE-2023-34319] = "fixed-version: Fixed from version 6.5rc6"
+CVE_STATUS[CVE-2023-34324] = "cpe-stable-backport: Backported in 6.5.7"
+
CVE_STATUS[CVE-2023-3439] = "fixed-version: Fixed from version 5.18rc5"
CVE_STATUS[CVE-2023-35001] = "fixed-version: Fixed from version 6.5rc2"
@@ -4952,7 +4954,7 @@ CVE_STATUS[CVE-2023-35824] = "fixed-version: Fixed from version 6.4rc1"
CVE_STATUS[CVE-2023-35826] = "fixed-version: Fixed from version 6.4rc1"
-# CVE-2023-35827 has no known resolution
+CVE_STATUS[CVE-2023-35827] = "cpe-stable-backport: Backported in 6.5.8"
CVE_STATUS[CVE-2023-35828] = "fixed-version: Fixed from version 6.4rc1"
@@ -4966,7 +4968,7 @@ CVE_STATUS[CVE-2023-3611] = "fixed-version: Fixed from version 6.5rc2"
# CVE-2023-3640 has no known resolution
-# CVE-2023-37453 needs backporting (fixed from 6.6rc1)
+CVE_STATUS[CVE-2023-37453] = "cpe-stable-backport: Backported in 6.5.3"
# CVE-2023-37454 has no known resolution
@@ -5004,6 +5006,16 @@ CVE_STATUS[CVE-2023-3866] = "fixed-version: Fixed from version 6.4"
CVE_STATUS[CVE-2023-3867] = "fixed-version: Fixed from version 6.5rc1"
+CVE_STATUS[CVE-2023-39189] = "cpe-stable-backport: Backported in 6.5.4"
+
+CVE_STATUS[CVE-2023-39191] = "fixed-version: Fixed from version 6.3rc1"
+
+CVE_STATUS[CVE-2023-39192] = "cpe-stable-backport: Backported in 6.5.3"
+
+CVE_STATUS[CVE-2023-39193] = "cpe-stable-backport: Backported in 6.5.3"
+
+CVE_STATUS[CVE-2023-39194] = "fixed-version: Fixed from version 6.5rc7"
+
CVE_STATUS[CVE-2023-4004] = "fixed-version: Fixed from version 6.5rc3"
# CVE-2023-4010 has no known resolution
@@ -5012,6 +5024,8 @@ CVE_STATUS[CVE-2023-4015] = "fixed-version: Fixed from version 6.5rc4"
CVE_STATUS[CVE-2023-40283] = "fixed-version: Fixed from version 6.5rc1"
+CVE_STATUS[CVE-2023-40791] = "fixed-version: Fixed from version 6.5rc6"
+
CVE_STATUS[CVE-2023-4128] = "fixed-version: Fixed from version 6.5rc5"
CVE_STATUS[CVE-2023-4132] = "fixed-version: Fixed from version 6.5rc1"
@@ -5036,12 +5050,16 @@ CVE_STATUS[CVE-2023-4244] = "fixed-version: Fixed from version 6.5rc7"
CVE_STATUS[CVE-2023-4273] = "fixed-version: Fixed from version 6.5rc5"
-# CVE-2023-42752 needs backporting (fixed from 6.6rc1)
+CVE_STATUS[CVE-2023-42752] = "cpe-stable-backport: Backported in 6.5.3"
+
+CVE_STATUS[CVE-2023-42753] = "cpe-stable-backport: Backported in 6.5.3"
-# CVE-2023-42753 needs backporting (fixed from 6.6rc1)
+CVE_STATUS[CVE-2023-42754] = "cpe-stable-backport: Backported in 6.5.6"
CVE_STATUS[CVE-2023-42755] = "fixed-version: Fixed from version 6.3rc1"
+CVE_STATUS[CVE-2023-42756] = "cpe-stable-backport: Backported in 6.5.6"
+
CVE_STATUS[CVE-2023-4385] = "fixed-version: Fixed from version 5.19rc1"
CVE_STATUS[CVE-2023-4387] = "fixed-version: Fixed from version 5.18"
@@ -5050,23 +5068,53 @@ CVE_STATUS[CVE-2023-4389] = "fixed-version: Fixed from version 5.18rc3"
CVE_STATUS[CVE-2023-4394] = "fixed-version: Fixed from version 6.0rc3"
+CVE_STATUS[CVE-2023-44466] = "fixed-version: Fixed from version 6.5rc2"
+
CVE_STATUS[CVE-2023-4459] = "fixed-version: Fixed from version 5.18"
CVE_STATUS[CVE-2023-4563] = "fixed-version: Fixed from version 6.5rc6"
CVE_STATUS[CVE-2023-4569] = "fixed-version: Fixed from version 6.5rc7"
+CVE_STATUS[CVE-2023-45862] = "fixed-version: Fixed from version 6.3rc1"
+
+CVE_STATUS[CVE-2023-45863] = "fixed-version: Fixed from version 6.3rc1"
+
+CVE_STATUS[CVE-2023-45871] = "cpe-stable-backport: Backported in 6.5.3"
+
+CVE_STATUS[CVE-2023-45898] = "cpe-stable-backport: Backported in 6.5.4"
+
+CVE_STATUS[CVE-2023-4610] = "fixed-version: Fixed from version 6.4"
+
CVE_STATUS[CVE-2023-4611] = "fixed-version: Fixed from version 6.5rc4"
CVE_STATUS[CVE-2023-4622] = "fixed-version: Fixed from version 6.5rc1"
-# CVE-2023-4623 needs backporting (fixed from 6.6rc1)
+CVE_STATUS[CVE-2023-4623] = "cpe-stable-backport: Backported in 6.5.3"
+
+CVE_STATUS[CVE-2023-46813] = "cpe-stable-backport: Backported in 6.5.9"
+
+CVE_STATUS[CVE-2023-46862] = "cpe-stable-backport: Backported in 6.5.10"
+
+# CVE-2023-47233 has no known resolution
+
+CVE_STATUS[CVE-2023-4732] = "fixed-version: Fixed from version 5.14rc1"
+
+CVE_STATUS[CVE-2023-4881] = "cpe-stable-backport: Backported in 6.5.4"
+
+CVE_STATUS[CVE-2023-4921] = "cpe-stable-backport: Backported in 6.5.4"
+
+CVE_STATUS[CVE-2023-5090] = "cpe-stable-backport: Backported in 6.5.9"
+
+CVE_STATUS[CVE-2023-5158] = "cpe-stable-backport: Backported in 6.5.7"
+
+CVE_STATUS[CVE-2023-5178] = "cpe-stable-backport: Backported in 6.5.9"
-# CVE-2023-4881 needs backporting (fixed from 6.6rc1)
+CVE_STATUS[CVE-2023-5197] = "cpe-stable-backport: Backported in 6.5.6"
-# CVE-2023-4921 needs backporting (fixed from 6.6rc1)
+CVE_STATUS[CVE-2023-5345] = "cpe-stable-backport: Backported in 6.5.6"
-# CVE-2023-5158 has no known resolution
+CVE_STATUS[CVE-2023-5633] = "cpe-stable-backport: Backported in 6.5.8"
-# CVE-2023-5197 needs backporting (fixed from 6.6rc3)
+CVE_STATUS[CVE-2023-5717] = "cpe-stable-backport: Backported in 6.5.9"
diff --git a/poky/meta/recipes-kernel/linux/linux-yocto-rt_6.1.bb b/poky/meta/recipes-kernel/linux/linux-yocto-rt_6.1.bb
index fd04c4c17a..6a92171f12 100644
--- a/poky/meta/recipes-kernel/linux/linux-yocto-rt_6.1.bb
+++ b/poky/meta/recipes-kernel/linux/linux-yocto-rt_6.1.bb
@@ -14,13 +14,13 @@ python () {
raise bb.parse.SkipRecipe("Set PREFERRED_PROVIDER_virtual/kernel to linux-yocto-rt to enable it")
}
-SRCREV_machine ?= "4b3040c1dc13aaac356ad4ef45a8926118c732d0"
-SRCREV_meta ?= "943c6fe5dac329c7e1c30d602788f409e692b3a8"
+SRCREV_machine ?= "f9bb1e96b7dcb1ba3649e84ca3ab9880509cee1b"
+SRCREV_meta ?= "29ec3dc6f4f59b731badcc864b212767023cc40c"
SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;branch=${KBRANCH};name=machine;protocol=https \
git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.1;destsuffix=${KMETA};protocol=https"
-LINUX_VERSION ?= "6.1.55"
+LINUX_VERSION ?= "6.1.61"
LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
diff --git a/poky/meta/recipes-kernel/linux/linux-yocto-rt_6.4.bb b/poky/meta/recipes-kernel/linux/linux-yocto-rt_6.4.bb
deleted file mode 100644
index deb2eea73f..0000000000
--- a/poky/meta/recipes-kernel/linux/linux-yocto-rt_6.4.bb
+++ /dev/null
@@ -1,48 +0,0 @@
-KBRANCH ?= "v6.4/standard/preempt-rt/base"
-
-require recipes-kernel/linux/linux-yocto.inc
-
-# CVE exclusions
-include recipes-kernel/linux/cve-exclusion_6.4.inc
-
-# Skip processing of this recipe if it is not explicitly specified as the
-# PREFERRED_PROVIDER for virtual/kernel. This avoids errors when trying
-# to build multiple virtual/kernel providers, e.g. as dependency of
-# core-image-rt-sdk, core-image-rt.
-python () {
- if d.getVar("KERNEL_PACKAGE_NAME") == "kernel" and d.getVar("PREFERRED_PROVIDER_virtual/kernel") != "linux-yocto-rt":
- raise bb.parse.SkipRecipe("Set PREFERRED_PROVIDER_virtual/kernel to linux-yocto-rt to enable it")
-}
-
-SRCREV_machine ?= "61c6d869af5ffb90ac64095eafdf8ba513eb21a6"
-SRCREV_meta ?= "13efe44fe9dd2626eaf6552288ea31770ec71cf1"
-
-SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;branch=${KBRANCH};name=machine;protocol=https \
- git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.4;destsuffix=${KMETA};protocol=https"
-
-LINUX_VERSION ?= "6.4.16"
-
-LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
-
-DEPENDS += "${@bb.utils.contains('ARCH', 'x86', 'elfutils-native', '', d)}"
-DEPENDS += "openssl-native util-linux-native"
-
-PV = "${LINUX_VERSION}+git"
-
-KMETA = "kernel-meta"
-KCONF_BSP_AUDIT_LEVEL = "1"
-
-LINUX_KERNEL_TYPE = "preempt-rt"
-
-COMPATIBLE_MACHINE = "^(qemux86|qemux86-64|qemuarm|qemuarmv5|qemuarm64|qemuppc|qemumips)$"
-
-KERNEL_DEVICETREE:qemuarmv5 = "versatile-pb.dtb"
-
-# Functionality flags
-KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
-KERNEL_FEATURES:append = " ${KERNEL_EXTRA_FEATURES}"
-KERNEL_FEATURES:append:qemuall=" cfg/virtio.scc features/drm-bochs/drm-bochs.scc"
-KERNEL_FEATURES:append:qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
-KERNEL_FEATURES:append:qemux86-64=" cfg/sound.scc cfg/paravirt_kvm.scc"
-KERNEL_FEATURES:append = "${@bb.utils.contains("DISTRO_FEATURES", "ptest", " features/scsi/scsi-debug.scc", "", d)}"
-KERNEL_FEATURES:append = "${@bb.utils.contains("DISTRO_FEATURES", "ptest", " features/gpio/mockup.scc", "", d)}"
diff --git a/poky/meta/recipes-kernel/linux/linux-yocto-rt_6.5.bb b/poky/meta/recipes-kernel/linux/linux-yocto-rt_6.5.bb
index f70d77e06a..f004339749 100644
--- a/poky/meta/recipes-kernel/linux/linux-yocto-rt_6.5.bb
+++ b/poky/meta/recipes-kernel/linux/linux-yocto-rt_6.5.bb
@@ -14,13 +14,13 @@ python () {
raise bb.parse.SkipRecipe("Set PREFERRED_PROVIDER_virtual/kernel to linux-yocto-rt to enable it")
}
-SRCREV_machine ?= "712b8fb1342bf829c9ca1e649adc9d112b9c209f"
-SRCREV_meta ?= "06cf3d8830fda41ff271eec7da6e3c8425df790f"
+SRCREV_machine ?= "833c5da68398da64271c26188b9e15286e8e725c"
+SRCREV_meta ?= "e4aaaaddfaf695039a7fc41815e24f57c29e30c0"
SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;branch=${KBRANCH};name=machine;protocol=https \
git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.5;destsuffix=${KMETA};protocol=https"
-LINUX_VERSION ?= "6.5.5"
+LINUX_VERSION ?= "6.5.10"
LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
@@ -36,7 +36,7 @@ LINUX_KERNEL_TYPE = "preempt-rt"
COMPATIBLE_MACHINE = "^(qemux86|qemux86-64|qemuarm|qemuarmv5|qemuarm64|qemuppc|qemumips)$"
-KERNEL_DEVICETREE:qemuarmv5 = "versatile-pb.dtb"
+KERNEL_DEVICETREE:qemuarmv5 = "arm/versatile-pb.dtb"
# Functionality flags
KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
diff --git a/poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.1.bb b/poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.1.bb
index 818c650368..fb48b8e043 100644
--- a/poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.1.bb
+++ b/poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.1.bb
@@ -8,7 +8,7 @@ require recipes-kernel/linux/linux-yocto.inc
# CVE exclusions
include recipes-kernel/linux/cve-exclusion_6.1.inc
-LINUX_VERSION ?= "6.1.55"
+LINUX_VERSION ?= "6.1.61"
LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
DEPENDS += "${@bb.utils.contains('ARCH', 'x86', 'elfutils-native', '', d)}"
@@ -17,8 +17,8 @@ DEPENDS += "openssl-native util-linux-native"
KMETA = "kernel-meta"
KCONF_BSP_AUDIT_LEVEL = "2"
-SRCREV_machine ?= "644e73fa089ade30c0db7bd54be960be92546ba2"
-SRCREV_meta ?= "943c6fe5dac329c7e1c30d602788f409e692b3a8"
+SRCREV_machine ?= "9e8c3b51334d4ca02a5ccdb5b4a1268b2f3174b9"
+SRCREV_meta ?= "29ec3dc6f4f59b731badcc864b212767023cc40c"
PV = "${LINUX_VERSION}+git"
diff --git a/poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.4.bb b/poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.4.bb
deleted file mode 100644
index c81f230139..0000000000
--- a/poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.4.bb
+++ /dev/null
@@ -1,33 +0,0 @@
-KBRANCH ?= "v6.4/standard/tiny/base"
-
-LINUX_KERNEL_TYPE = "tiny"
-KCONFIG_MODE = "--allnoconfig"
-
-require recipes-kernel/linux/linux-yocto.inc
-
-# CVE exclusions
-include recipes-kernel/linux/cve-exclusion_6.4.inc
-
-LINUX_VERSION ?= "6.4.16"
-LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
-
-DEPENDS += "${@bb.utils.contains('ARCH', 'x86', 'elfutils-native', '', d)}"
-DEPENDS += "openssl-native util-linux-native"
-
-KMETA = "kernel-meta"
-KCONF_BSP_AUDIT_LEVEL = "2"
-
-SRCREV_machine ?= "ef91ff6a4be36037808af1ca786fdd557f265a1d"
-SRCREV_meta ?= "13efe44fe9dd2626eaf6552288ea31770ec71cf1"
-
-PV = "${LINUX_VERSION}+git"
-
-SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;branch=${KBRANCH};name=machine;protocol=https \
- git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.4;destsuffix=${KMETA};protocol=https"
-
-COMPATIBLE_MACHINE = "^(qemux86|qemux86-64|qemuarm64|qemuarm|qemuarmv5)$"
-
-# Functionality flags
-KERNEL_FEATURES = ""
-
-KERNEL_DEVICETREE:qemuarmv5 = "versatile-pb.dtb"
diff --git a/poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.5.bb b/poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.5.bb
index 716c922c13..cc75c0c702 100644
--- a/poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.5.bb
+++ b/poky/meta/recipes-kernel/linux/linux-yocto-tiny_6.5.bb
@@ -8,7 +8,7 @@ require recipes-kernel/linux/linux-yocto.inc
# CVE exclusions
include recipes-kernel/linux/cve-exclusion_6.5.inc
-LINUX_VERSION ?= "6.5.5"
+LINUX_VERSION ?= "6.5.10"
LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
DEPENDS += "${@bb.utils.contains('ARCH', 'x86', 'elfutils-native', '', d)}"
@@ -17,8 +17,8 @@ DEPENDS += "openssl-native util-linux-native"
KMETA = "kernel-meta"
KCONF_BSP_AUDIT_LEVEL = "2"
-SRCREV_machine ?= "49e3d8448aeaecd8e2bb6b481f26b76514dbe0f5"
-SRCREV_meta ?= "06cf3d8830fda41ff271eec7da6e3c8425df790f"
+SRCREV_machine ?= "16b52743d64980d531e120aec62c9220b695a269"
+SRCREV_meta ?= "e4aaaaddfaf695039a7fc41815e24f57c29e30c0"
PV = "${LINUX_VERSION}+git"
@@ -30,4 +30,4 @@ COMPATIBLE_MACHINE = "^(qemux86|qemux86-64|qemuarm64|qemuarm|qemuarmv5)$"
# Functionality flags
KERNEL_FEATURES = ""
-KERNEL_DEVICETREE:qemuarmv5 = "versatile-pb.dtb"
+KERNEL_DEVICETREE:qemuarmv5 = "arm/versatile-pb.dtb"
diff --git a/poky/meta/recipes-kernel/linux/linux-yocto.inc b/poky/meta/recipes-kernel/linux/linux-yocto.inc
index 0cc303c009..0132fcffb3 100644
--- a/poky/meta/recipes-kernel/linux/linux-yocto.inc
+++ b/poky/meta/recipes-kernel/linux/linux-yocto.inc
@@ -65,7 +65,10 @@ KERNEL_DEBUG ?= ""
DEPENDS += '${@bb.utils.contains_any("ARCH", [ "x86", "arm64", "powerpc" ], "elfutils-native", "", d)}'
DEPENDS += "openssl-native util-linux-native"
DEPENDS += "gmp-native libmpc-native"
-DEPENDS += '${@bb.utils.contains("KERNEL_DEBUG", "True", "pahole-native", "", d)}'
+
+# Some options depend on CONFIG_PAHOLE_VERSION, so need to make pahole-native available before do_kernel_configme
+do_kernel_configme[depends] += '${@bb.utils.contains("KERNEL_DEBUG", "True", "pahole-native:do_populate_sysroot", "", d)}'
+
EXTRA_OEMAKE += '${@bb.utils.contains("KERNEL_DEBUG", "True", "", "PAHOLE=false", d)}'
do_devshell:prepend() {
diff --git a/poky/meta/recipes-kernel/linux/linux-yocto_6.1.bb b/poky/meta/recipes-kernel/linux/linux-yocto_6.1.bb
index a942d0c540..038c6dae71 100644
--- a/poky/meta/recipes-kernel/linux/linux-yocto_6.1.bb
+++ b/poky/meta/recipes-kernel/linux/linux-yocto_6.1.bb
@@ -18,25 +18,25 @@ KBRANCH:qemux86-64 ?= "v6.1/standard/base"
KBRANCH:qemuloongarch64 ?= "v6.1/standard/base"
KBRANCH:qemumips64 ?= "v6.1/standard/mti-malta64"
-SRCREV_machine:qemuarm ?= "cf771f6d6bc0344e048bdbf7d23d3aacbe3556d0"
-SRCREV_machine:qemuarm64 ?= "644e73fa089ade30c0db7bd54be960be92546ba2"
-SRCREV_machine:qemuloongarch64 ?= "644e73fa089ade30c0db7bd54be960be92546ba2"
-SRCREV_machine:qemumips ?= "4be1dcc270e6ddeea513af01d91ea3b48ec82470"
-SRCREV_machine:qemuppc ?= "644e73fa089ade30c0db7bd54be960be92546ba2"
-SRCREV_machine:qemuriscv64 ?= "644e73fa089ade30c0db7bd54be960be92546ba2"
-SRCREV_machine:qemuriscv32 ?= "644e73fa089ade30c0db7bd54be960be92546ba2"
-SRCREV_machine:qemux86 ?= "644e73fa089ade30c0db7bd54be960be92546ba2"
-SRCREV_machine:qemux86-64 ?= "644e73fa089ade30c0db7bd54be960be92546ba2"
-SRCREV_machine:qemumips64 ?= "aa0e978c979b84d620ad21132cfdbbf857be3878"
-SRCREV_machine ?= "644e73fa089ade30c0db7bd54be960be92546ba2"
-SRCREV_meta ?= "943c6fe5dac329c7e1c30d602788f409e692b3a8"
+SRCREV_machine:qemuarm ?= "ed4795c1e353e6a1fa57b5ba01c42f5b3f436a0c"
+SRCREV_machine:qemuarm64 ?= "9e8c3b51334d4ca02a5ccdb5b4a1268b2f3174b9"
+SRCREV_machine:qemuloongarch64 ?= "9e8c3b51334d4ca02a5ccdb5b4a1268b2f3174b9"
+SRCREV_machine:qemumips ?= "7c06c2693959032740dd1fdea4dedc9491845951"
+SRCREV_machine:qemuppc ?= "9e8c3b51334d4ca02a5ccdb5b4a1268b2f3174b9"
+SRCREV_machine:qemuriscv64 ?= "9e8c3b51334d4ca02a5ccdb5b4a1268b2f3174b9"
+SRCREV_machine:qemuriscv32 ?= "9e8c3b51334d4ca02a5ccdb5b4a1268b2f3174b9"
+SRCREV_machine:qemux86 ?= "9e8c3b51334d4ca02a5ccdb5b4a1268b2f3174b9"
+SRCREV_machine:qemux86-64 ?= "9e8c3b51334d4ca02a5ccdb5b4a1268b2f3174b9"
+SRCREV_machine:qemumips64 ?= "b05d04ae43806e87bf9f77484c72260350f6defe"
+SRCREV_machine ?= "9e8c3b51334d4ca02a5ccdb5b4a1268b2f3174b9"
+SRCREV_meta ?= "29ec3dc6f4f59b731badcc864b212767023cc40c"
# set your preferred provider of linux-yocto to 'linux-yocto-upstream', and you'll
# get the <version>/base branch, which is pure upstream -stable, and the same
# meta SRCREV as the linux-yocto-standard builds. Select your version using the
# normal PREFERRED_VERSION settings.
BBCLASSEXTEND = "devupstream:target"
-SRCREV_machine:class-devupstream ?= "d23900f974e0fb995b36ef47283a5aa74ca25f51"
+SRCREV_machine:class-devupstream ?= "4a61839152cc3e9e00ac059d73a28d148d622b30"
PN:class-devupstream = "linux-yocto-upstream"
KBRANCH:class-devupstream = "v6.1/base"
@@ -45,7 +45,7 @@ SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;name=machine;branch=${KBRA
SRC_URI += "file://0001-perf-cpumap-Make-counter-as-unsigned-ints.patch"
LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
-LINUX_VERSION ?= "6.1.55"
+LINUX_VERSION ?= "6.1.61"
PV = "${LINUX_VERSION}+git"
diff --git a/poky/meta/recipes-kernel/linux/linux-yocto_6.4.bb b/poky/meta/recipes-kernel/linux/linux-yocto_6.4.bb
deleted file mode 100644
index 5afd7b1ba7..0000000000
--- a/poky/meta/recipes-kernel/linux/linux-yocto_6.4.bb
+++ /dev/null
@@ -1,72 +0,0 @@
-KBRANCH ?= "v6.4/standard/base"
-
-require recipes-kernel/linux/linux-yocto.inc
-
-# CVE exclusions
-include recipes-kernel/linux/cve-exclusion.inc
-include recipes-kernel/linux/cve-exclusion_6.4.inc
-
-# board specific branches
-KBRANCH:qemuarm ?= "v6.4/standard/arm-versatile-926ejs"
-KBRANCH:qemuarm64 ?= "v6.4/standard/qemuarm64"
-KBRANCH:qemumips ?= "v6.4/standard/mti-malta32"
-KBRANCH:qemuppc ?= "v6.4/standard/qemuppc"
-KBRANCH:qemuriscv64 ?= "v6.4/standard/base"
-KBRANCH:qemuriscv32 ?= "v6.4/standard/base"
-KBRANCH:qemux86 ?= "v6.4/standard/base"
-KBRANCH:qemux86-64 ?= "v6.4/standard/base"
-KBRANCH:qemuloongarch64 ?= "v6.4/standard/base"
-KBRANCH:qemumips64 ?= "v6.4/standard/mti-malta64"
-
-SRCREV_machine:qemuarm ?= "871a4762a8f85550898b8992b29d5e1dbf60a459"
-SRCREV_machine:qemuarm64 ?= "ef91ff6a4be36037808af1ca786fdd557f265a1d"
-SRCREV_machine:qemuloongarch64 ?= "ef91ff6a4be36037808af1ca786fdd557f265a1d"
-SRCREV_machine:qemumips ?= "18bb71cbb388dd093c46d1777f607cfbf0d4c03b"
-SRCREV_machine:qemuppc ?= "ef91ff6a4be36037808af1ca786fdd557f265a1d"
-SRCREV_machine:qemuriscv64 ?= "ef91ff6a4be36037808af1ca786fdd557f265a1d"
-SRCREV_machine:qemuriscv32 ?= "ef91ff6a4be36037808af1ca786fdd557f265a1d"
-SRCREV_machine:qemux86 ?= "ef91ff6a4be36037808af1ca786fdd557f265a1d"
-SRCREV_machine:qemux86-64 ?= "ef91ff6a4be36037808af1ca786fdd557f265a1d"
-SRCREV_machine:qemumips64 ?= "5b9def2ea1065e44847b920c3a4185d0e5c22d58"
-SRCREV_machine ?= "ef91ff6a4be36037808af1ca786fdd557f265a1d"
-SRCREV_meta ?= "13efe44fe9dd2626eaf6552288ea31770ec71cf1"
-
-# set your preferred provider of linux-yocto to 'linux-yocto-upstream', and you'll
-# get the <version>/base branch, which is pure upstream -stable, and the same
-# meta SRCREV as the linux-yocto-standard builds. Select your version using the
-# normal PREFERRED_VERSION settings.
-BBCLASSEXTEND = "devupstream:target"
-SRCREV_machine:class-devupstream ?= "ae4e4fc35b4258626644c162a702e2bce2b79190"
-PN:class-devupstream = "linux-yocto-upstream"
-KBRANCH:class-devupstream = "v6.4/base"
-
-SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;name=machine;branch=${KBRANCH};protocol=https \
- git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.4;destsuffix=${KMETA};protocol=https"
-
-LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
-LINUX_VERSION ?= "6.4.16"
-
-PV = "${LINUX_VERSION}+git"
-
-KMETA = "kernel-meta"
-KCONF_BSP_AUDIT_LEVEL = "1"
-
-KERNEL_DEVICETREE:qemuarmv5 = "versatile-pb.dtb"
-
-COMPATIBLE_MACHINE = "^(qemuarm|qemuarmv5|qemuarm64|qemux86|qemuppc|qemuppc64|qemumips|qemumips64|qemux86-64|qemuriscv64|qemuriscv32|qemuloongarch64)$"
-
-# Functionality flags
-KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
-KERNEL_FEATURES:append = " ${KERNEL_EXTRA_FEATURES}"
-KERNEL_FEATURES:append:qemuall=" cfg/virtio.scc features/drm-bochs/drm-bochs.scc cfg/net/mdio.scc"
-KERNEL_FEATURES:append:qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
-KERNEL_FEATURES:append:qemux86-64=" cfg/sound.scc cfg/paravirt_kvm.scc"
-KERNEL_FEATURES:append = " ${@bb.utils.contains("TUNE_FEATURES", "mx32", " cfg/x32.scc", "", d)}"
-KERNEL_FEATURES:append = " ${@bb.utils.contains("DISTRO_FEATURES", "ptest", " features/scsi/scsi-debug.scc", "", d)}"
-KERNEL_FEATURES:append = " ${@bb.utils.contains("DISTRO_FEATURES", "ptest", " features/gpio/mockup.scc", "", d)}"
-KERNEL_FEATURES:append:powerpc =" arch/powerpc/powerpc-debug.scc"
-KERNEL_FEATURES:append:powerpc64 =" arch/powerpc/powerpc-debug.scc"
-KERNEL_FEATURES:append:powerpc64le =" arch/powerpc/powerpc-debug.scc"
-
-INSANE_SKIP:kernel-vmlinux:qemuppc64 = "textrel"
-
diff --git a/poky/meta/recipes-kernel/linux/linux-yocto_6.5.bb b/poky/meta/recipes-kernel/linux/linux-yocto_6.5.bb
index 64399e1e8d..5cdf0e02d0 100644
--- a/poky/meta/recipes-kernel/linux/linux-yocto_6.5.bb
+++ b/poky/meta/recipes-kernel/linux/linux-yocto_6.5.bb
@@ -18,25 +18,25 @@ KBRANCH:qemux86-64 ?= "v6.5/standard/base"
KBRANCH:qemuloongarch64 ?= "v6.5/standard/base"
KBRANCH:qemumips64 ?= "v6.5/standard/mti-malta64"
-SRCREV_machine:qemuarm ?= "ff312905898c587e8c8e1b82b59c01b6933c6339"
-SRCREV_machine:qemuarm64 ?= "49e3d8448aeaecd8e2bb6b481f26b76514dbe0f5"
-SRCREV_machine:qemuloongarch64 ?= "49e3d8448aeaecd8e2bb6b481f26b76514dbe0f5"
-SRCREV_machine:qemumips ?= "889d009f6f39c91fedb8c7431c2ce649f05a04a9"
-SRCREV_machine:qemuppc ?= "49e3d8448aeaecd8e2bb6b481f26b76514dbe0f5"
-SRCREV_machine:qemuriscv64 ?= "49e3d8448aeaecd8e2bb6b481f26b76514dbe0f5"
-SRCREV_machine:qemuriscv32 ?= "49e3d8448aeaecd8e2bb6b481f26b76514dbe0f5"
-SRCREV_machine:qemux86 ?= "49e3d8448aeaecd8e2bb6b481f26b76514dbe0f5"
-SRCREV_machine:qemux86-64 ?= "49e3d8448aeaecd8e2bb6b481f26b76514dbe0f5"
-SRCREV_machine:qemumips64 ?= "97c93107649bc6f7fafdf6c3a8b3521f4bfe2246"
-SRCREV_machine ?= "49e3d8448aeaecd8e2bb6b481f26b76514dbe0f5"
-SRCREV_meta ?= "06cf3d8830fda41ff271eec7da6e3c8425df790f"
+SRCREV_machine:qemuarm ?= "eb2eba60c726fd5c0257422e55117f46f792f72e"
+SRCREV_machine:qemuarm64 ?= "e709bc7ca85655ff5317fbcf4c8cb69365b6fc40"
+SRCREV_machine:qemuloongarch64 ?= "128116621dee1ddbc7cf5f58cddc708d7b823600"
+SRCREV_machine:qemumips ?= "0524fc1380569f39eb5473cc8344ce2e4e78a82d"
+SRCREV_machine:qemuppc ?= "0b23c1d5705f5efa91b3757377ec284b1d42a84a"
+SRCREV_machine:qemuriscv64 ?= "128116621dee1ddbc7cf5f58cddc708d7b823600"
+SRCREV_machine:qemuriscv32 ?= "128116621dee1ddbc7cf5f58cddc708d7b823600"
+SRCREV_machine:qemux86 ?= "128116621dee1ddbc7cf5f58cddc708d7b823600"
+SRCREV_machine:qemux86-64 ?= "128116621dee1ddbc7cf5f58cddc708d7b823600"
+SRCREV_machine:qemumips64 ?= "b63329018323409369e952c84ac6481e68a9b6af"
+SRCREV_machine ?= "128116621dee1ddbc7cf5f58cddc708d7b823600"
+SRCREV_meta ?= "e4aaaaddfaf695039a7fc41815e24f57c29e30c0"
# set your preferred provider of linux-yocto to 'linux-yocto-upstream', and you'll
# get the <version>/base branch, which is pure upstream -stable, and the same
# meta SRCREV as the linux-yocto-standard builds. Select your version using the
# normal PREFERRED_VERSION settings.
BBCLASSEXTEND = "devupstream:target"
-SRCREV_machine:class-devupstream ?= "2309983b0ac063045af3b01b0251dfd118d45449"
+SRCREV_machine:class-devupstream ?= "43a868577dfcd9be6930453dc5ec557ab2e9ad89"
PN:class-devupstream = "linux-yocto-upstream"
KBRANCH:class-devupstream = "v6.5/base"
@@ -44,14 +44,14 @@ SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;name=machine;branch=${KBRA
git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.5;destsuffix=${KMETA};protocol=https"
LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
-LINUX_VERSION ?= "6.5.5"
+LINUX_VERSION ?= "6.5.10"
PV = "${LINUX_VERSION}+git"
KMETA = "kernel-meta"
KCONF_BSP_AUDIT_LEVEL = "1"
-KERNEL_DEVICETREE:qemuarmv5 = "versatile-pb.dtb"
+KERNEL_DEVICETREE:qemuarmv5 = "arm/versatile-pb.dtb"
COMPATIBLE_MACHINE = "^(qemuarm|qemuarmv5|qemuarm64|qemux86|qemuppc|qemuppc64|qemumips|qemumips64|qemux86-64|qemuriscv64|qemuriscv32|qemuloongarch64)$"
diff --git a/poky/meta/recipes-kernel/perf/perf.bb b/poky/meta/recipes-kernel/perf/perf.bb
index 675acfaf26..32882afdf4 100644
--- a/poky/meta/recipes-kernel/perf/perf.bb
+++ b/poky/meta/recipes-kernel/perf/perf.bb
@@ -28,6 +28,9 @@ PACKAGECONFIG[audit] = ",NO_LIBAUDIT=1,audit"
PACKAGECONFIG[manpages] = ",,xmlto-native asciidoc-native"
PACKAGECONFIG[cap] = ",,libcap"
PACKAGECONFIG[libtraceevent] = ",NO_LIBTRACEEVENT=1,libtraceevent"
+# jevents requires host python for generating a .c file, but is
+# unrelated to the python item.
+PACKAGECONFIG[jevents] = ",NO_JEVENTS=1,python3-native"
# Arm CoreSight
PACKAGECONFIG[coresight] = "CORESIGHT=1,,opencsd"
PACKAGECONFIG[pfm4] = ",NO_LIBPFM4=1,libpfm4"
@@ -73,6 +76,15 @@ SPDX_S = "${S}/tools/perf"
# supported kernel.
LDFLAGS="-ldl -lutil"
+# Perf's build system adds its own optimization flags for most TUs,
+# overriding the flags included here. But for some, perf does not add
+# any -O option, so ensure the distro's chosen optimization gets used
+# for those. Since ${SELECTED_OPTIMIZATION} always includes
+# ${DEBUG_FLAGS} which in turn includes ${DEBUG_PREFIX_MAP}, this also
+# ensures perf is built with appropriate -f*-prefix-map options,
+# avoiding the 'buildpaths' QA warning.
+TARGET_CC_ARCH += "${SELECTED_OPTIMIZATION}"
+
EXTRA_OEMAKE = '\
V=1 \
VF=1 \
@@ -86,7 +98,7 @@ EXTRA_OEMAKE = '\
AR="${AR}" \
LD="${LD}" \
EXTRA_CFLAGS="-ldw -I${S}" \
- YFLAGS='-y --file-prefix-map=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}' \
+ YFLAGS='-y --file-prefix-map=${WORKDIR}=${TARGET_DBGSRC_DIR}' \
EXTRA_LDFLAGS="${PERF_EXTRA_LDFLAGS}" \
perfexecdir=${libexecdir} \
NO_GTK2=1 \
@@ -126,6 +138,7 @@ PERF_SRC ?= "Makefile \
tools/perf \
tools/scripts \
scripts/ \
+ arch/arm64/tools \
arch/${ARCH}/Makefile \
"
@@ -171,7 +184,8 @@ python copy_perf_source_from_kernel() {
src = oe.path.join(src_dir, s)
dest = oe.path.join(dest_dir, s)
if not os.path.exists(src):
- bb.fatal("Path does not exist: %s. Maybe PERF_SRC does not match the kernel version." % src)
+ bb.warn("Path does not exist: %s. Maybe PERF_SRC lists more files than what your kernel version provides and needs." % src)
+ continue
if os.path.isdir(src):
oe.path.copyhardlinktree(src, dest)
else:
@@ -391,7 +405,7 @@ PACKAGESPLITFUNCS =+ "perf_fix_sources"
perf_fix_sources () {
for f in util/parse-events-flex.h util/parse-events-flex.c util/pmu-flex.c \
util/pmu-flex.h util/expr-flex.h util/expr-flex.c; do
- f=${PKGD}/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR}/$f
+ f=${PKGD}${TARGET_DBGSRC_DIR}/$f
if [ -e $f ]; then
sed -i -e 's#${S}/##g' $f
fi
diff --git a/poky/meta/recipes-multimedia/ffmpeg/ffmpeg/0001-avcodec-x86-mathops-clip-constants-used-with-shift-i.patch b/poky/meta/recipes-multimedia/ffmpeg/ffmpeg/0001-avcodec-x86-mathops-clip-constants-used-with-shift-i.patch
deleted file mode 100644
index a47a20365f..0000000000
--- a/poky/meta/recipes-multimedia/ffmpeg/ffmpeg/0001-avcodec-x86-mathops-clip-constants-used-with-shift-i.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From effadce6c756247ea8bae32dc13bb3e6f464f0eb Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
-Date: Sun, 16 Jul 2023 18:18:02 +0300
-Subject: [PATCH] avcodec/x86/mathops: clip constants used with shift
- instructions within inline assembly
-
-Fixes assembling with binutil as >= 2.41
-
-Upstream-Status: Backport [https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/effadce6c756247ea8bae32dc13bb3e6f464f0eb]
-Signed-off-by: James Almer <jamrial@gmail.com>
----
- libavcodec/x86/mathops.h | 26 +++++++++++++++++++++++---
- 1 file changed, 23 insertions(+), 3 deletions(-)
-
-diff --git a/libavcodec/x86/mathops.h b/libavcodec/x86/mathops.h
-index 6298f5ed19..ca7e2dffc1 100644
---- a/libavcodec/x86/mathops.h
-+++ b/libavcodec/x86/mathops.h
-@@ -35,12 +35,20 @@
- static av_always_inline av_const int MULL(int a, int b, unsigned shift)
- {
- int rt, dummy;
-+ if (__builtin_constant_p(shift))
- __asm__ (
- "imull %3 \n\t"
- "shrdl %4, %%edx, %%eax \n\t"
- :"=a"(rt), "=d"(dummy)
-- :"a"(a), "rm"(b), "ci"((uint8_t)shift)
-+ :"a"(a), "rm"(b), "i"(shift & 0x1F)
- );
-+ else
-+ __asm__ (
-+ "imull %3 \n\t"
-+ "shrdl %4, %%edx, %%eax \n\t"
-+ :"=a"(rt), "=d"(dummy)
-+ :"a"(a), "rm"(b), "c"((uint8_t)shift)
-+ );
- return rt;
- }
-
-@@ -113,19 +121,31 @@ __asm__ volatile(\
- // avoid +32 for shift optimization (gcc should do that ...)
- #define NEG_SSR32 NEG_SSR32
- static inline int32_t NEG_SSR32( int32_t a, int8_t s){
-+ if (__builtin_constant_p(s))
- __asm__ ("sarl %1, %0\n\t"
- : "+r" (a)
-- : "ic" ((uint8_t)(-s))
-+ : "i" (-s & 0x1F)
- );
-+ else
-+ __asm__ ("sarl %1, %0\n\t"
-+ : "+r" (a)
-+ : "c" ((uint8_t)(-s))
-+ );
- return a;
- }
-
- #define NEG_USR32 NEG_USR32
- static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
-+ if (__builtin_constant_p(s))
- __asm__ ("shrl %1, %0\n\t"
- : "+r" (a)
-- : "ic" ((uint8_t)(-s))
-+ : "i" (-s & 0x1F)
- );
-+ else
-+ __asm__ ("shrl %1, %0\n\t"
-+ : "+r" (a)
-+ : "c" ((uint8_t)(-s))
-+ );
- return a;
- }
-
---
-2.41.0
-
diff --git a/poky/meta/recipes-multimedia/ffmpeg/ffmpeg/0001-libswscale-riscv-Fix-syntax-of-vsetvli.patch b/poky/meta/recipes-multimedia/ffmpeg/ffmpeg/0001-libswscale-riscv-Fix-syntax-of-vsetvli.patch
deleted file mode 100644
index 94e0ba6d10..0000000000
--- a/poky/meta/recipes-multimedia/ffmpeg/ffmpeg/0001-libswscale-riscv-Fix-syntax-of-vsetvli.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 85eefb65eb632d827e17a72518dd289dcd721084 Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Sun, 2 Jul 2023 19:29:55 -0700
-Subject: [PATCH] libswscale/riscv: Fix syntax of vsetvli
-
-Add missing operand which clang complains about but gcc assumes it to be
-'m1' if not specifiied.
-
-Fixes building with clang
-| src/libswscale/riscv/rgb2rgb_rvv.S:88:25: error: operand must be e[8|16|32|64|128|256|512|1024],m[1|2|4|8|f2|f4|f8],[ta|tu],[ma|mu]
-| vsetvli t4, t3, e8, ta, ma
-| ^
-
-Upstream-Status: Submitted [https://ffmpeg.org/pipermail/ffmpeg-devel/2023-July/311514.html]
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- libswscale/riscv/rgb2rgb_rvv.S | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/libswscale/riscv/rgb2rgb_rvv.S b/libswscale/riscv/rgb2rgb_rvv.S
-index 5626d90..bbdfdbe 100644
---- a/libswscale/riscv/rgb2rgb_rvv.S
-+++ b/libswscale/riscv/rgb2rgb_rvv.S
-@@ -85,7 +85,7 @@ func ff_interleave_bytes_rvv, zve32x
- mv t3, a3
- addi a4, a4, -1
- 2:
-- vsetvli t4, t3, e8, ta, ma
-+ vsetvli t4, t3, e8, m1, ta, ma
- sub t3, t3, t4
- vle8.v v8, (t0)
- add t0, t4, t0
---
-2.41.0
-
diff --git a/poky/meta/recipes-multimedia/ffmpeg/ffmpeg_6.0.bb b/poky/meta/recipes-multimedia/ffmpeg/ffmpeg_6.1.bb
index e65f80d64b..162eb414b1 100644
--- a/poky/meta/recipes-multimedia/ffmpeg/ffmpeg_6.0.bb
+++ b/poky/meta/recipes-multimedia/ffmpeg/ffmpeg_6.1.bb
@@ -22,11 +22,9 @@ LIC_FILES_CHKSUM = "file://COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
file://COPYING.LGPLv2.1;md5=bd7a443320af8c812e4c18d1b79df004 \
file://COPYING.LGPLv3;md5=e6a600fd5e1d9cbde2d983680233ad02"
-SRC_URI = "https://www.ffmpeg.org/releases/${BP}.tar.xz \
- file://0001-avcodec-x86-mathops-clip-constants-used-with-shift-i.patch \
- file://0001-libswscale-riscv-Fix-syntax-of-vsetvli.patch"
+SRC_URI = "https://www.ffmpeg.org/releases/${BP}.tar.xz"
-SRC_URI[sha256sum] = "57be87c22d9b49c112b6d24bc67d42508660e6b718b3db89c44e47e289137082"
+SRC_URI[sha256sum] = "488c76e57dd9b3bee901f71d5c95eaf1db4a5a31fe46a28654e837144207c270"
# https://nvd.nist.gov/vuln/detail/CVE-2023-39018
# https://github.com/bramp/ffmpeg-cli-wrapper/issues/291
@@ -151,7 +149,7 @@ do_configure() {
export TMPDIR="${B}/tmp"
mkdir -p ${B}/tmp
${S}/configure ${EXTRA_OECONF}
- sed -i -e "s,^X86ASMFLAGS=.*,& --debug-prefix-map=${S}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} --debug-prefix-map=${B}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR},g" ${B}/ffbuild/config.mak
+ sed -i -e "s,^X86ASMFLAGS=.*,& --debug-prefix-map=${S}=${TARGET_DBGSRC_DIR} --debug-prefix-map=${B}=${TARGET_DBGSRC_DIR},g" ${B}/ffbuild/config.mak
}
# patch out build host paths for reproducibility
diff --git a/poky/meta/recipes-multimedia/gstreamer/gst-devtools_1.22.6.bb b/poky/meta/recipes-multimedia/gstreamer/gst-devtools_1.22.7.bb
index 90bbd9c733..b545f020cf 100644
--- a/poky/meta/recipes-multimedia/gstreamer/gst-devtools_1.22.6.bb
+++ b/poky/meta/recipes-multimedia/gstreamer/gst-devtools_1.22.7.bb
@@ -12,7 +12,7 @@ SRC_URI = "https://gstreamer.freedesktop.org/src/gst-devtools/gst-devtools-${PV}
file://0001-connect-has-a-different-signature-on-musl.patch \
"
-SRC_URI[sha256sum] = "8928560efaf16137c30285e718708e5d0bab0777eb4ef8127e0274e120d3d86b"
+SRC_URI[sha256sum] = "157cf93fb2741cf0c3dea731be3af2ffae703c9f2cd3c0c91b380fbc685eb9f9"
DEPENDS = "json-glib glib-2.0 glib-2.0-native gstreamer1.0 gstreamer1.0-plugins-base"
RRECOMMENDS:${PN} = "git"
diff --git a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.22.6.bb b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.22.7.bb
index 8906556b44..7169223636 100644
--- a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.22.6.bb
+++ b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.22.7.bb
@@ -12,7 +12,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=69333daa044cb77e486cc36129f7a770 \
"
SRC_URI = "https://gstreamer.freedesktop.org/src/gst-libav/gst-libav-${PV}.tar.xz"
-SRC_URI[sha256sum] = "7789e6408388a25f23cbf948cfc5c6230d735bbcd8b7f37f4a01c9e348a1e3a7"
+SRC_URI[sha256sum] = "1525b917141b895fe5cf618fe8867622b2528278a0286e9f727b5f37317daca1"
S = "${WORKDIR}/gst-libav-${PV}"
diff --git a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.22.6.bb b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.22.7.bb
index 2579aa3d66..ad40cf5513 100644
--- a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.22.6.bb
+++ b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.22.7.bb
@@ -10,7 +10,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c \
SRC_URI = "https://gstreamer.freedesktop.org/src/gst-omx/gst-omx-${PV}.tar.xz"
-SRC_URI[sha256sum] = "223833c42518ad7eb1923bb4dd3726809f59a66d6e9aaaa69cb29ad0750c8758"
+SRC_URI[sha256sum] = "d7a18ec47d40a472bd5cba2015e0be72b732f1699895398cec5cd8e6a3a53b44"
S = "${WORKDIR}/gst-omx-${PV}"
diff --git a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.6.bb b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.7.bb
index 3db7ddff5f..b7d787b611 100644
--- a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.6.bb
+++ b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.7.bb
@@ -10,7 +10,7 @@ SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad
file://0002-avoid-including-sys-poll.h-directly.patch \
file://0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch \
"
-SRC_URI[sha256sum] = "b4029cd2908a089c55f1d902a565d007495c95b1442d838485dc47fb12df7137"
+SRC_URI[sha256sum] = "c716f8dffa8fac3fb646941af1c6ec72fff05a045131311bf2d049fdc87bce2e"
S = "${WORKDIR}/gst-plugins-bad-${PV}"
diff --git a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.6.bb b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.7.bb
index 1f67ca303a..3b8923e8f2 100644
--- a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.6.bb
+++ b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.22.7.bb
@@ -11,7 +11,7 @@ SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-ba
file://0003-viv-fb-Make-sure-config.h-is-included.patch \
file://0002-ssaparse-enhance-SSA-text-lines-parsing.patch \
"
-SRC_URI[sha256sum] = "50f2b4d17c02eefe430bbefa8c5cd134b1be78a53c0f60e951136d96cf49fd4b"
+SRC_URI[sha256sum] = "62519e0d8f969ebf62a9a7996f2d23efdda330217a635f4a32c0bf1c71577468"
S = "${WORKDIR}/gst-plugins-base-${PV}"
diff --git a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.6.bb b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.7.bb
index 6b76ba957e..b8496a1750 100644
--- a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.6.bb
+++ b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.22.7.bb
@@ -8,7 +8,7 @@ SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-go
file://0001-qt-include-ext-qt-gstqtgl.h-instead-of-gst-gl-gstglf.patch \
file://0001-v4l2-Define-ioctl_req_t-for-posix-linux-case.patch"
-SRC_URI[sha256sum] = "b3b07fe3f1ce7fe93aa9be7217866044548f35c4a7792280eec7e108a32f9817"
+SRC_URI[sha256sum] = "b6db0e18e398b52665b7cdce301c34a8750483d5f4fbac1ede9f80b03743cd15"
S = "${WORKDIR}/gst-plugins-good-${PV}"
diff --git a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.6.bb b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.7.bb
index 77f79a630a..8a67531123 100644
--- a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.6.bb
+++ b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.22.7.bb
@@ -14,7 +14,7 @@ LICENSE_FLAGS = "commercial"
SRC_URI = " \
https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-${PV}.tar.xz \
"
-SRC_URI[sha256sum] = "3e31454c98cb2f7f6d2d355eceb933a892fa0f1dc09bc36c9abc930d8e29ca48"
+SRC_URI[sha256sum] = "520b46bca637189ad86a298ff245b2d89375dbcac8b05d74daea910f81a9e9da"
S = "${WORKDIR}/gst-plugins-ugly-${PV}"
diff --git a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-python_1.22.6.bb b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-python_1.22.7.bb
index addf12c427..a387031635 100644
--- a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-python_1.22.6.bb
+++ b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-python_1.22.7.bb
@@ -8,7 +8,7 @@ LICENSE = "LGPL-2.1-or-later"
LIC_FILES_CHKSUM = "file://COPYING;md5=c34deae4e395ca07e725ab0076a5f740"
SRC_URI = "https://gstreamer.freedesktop.org/src/${PNREAL}/${PNREAL}-${PV}.tar.xz"
-SRC_URI[sha256sum] = "51de2d6d13b12ce095eac97c0b94ee59c2aeba3712bb7462b78c4d57dde176c5"
+SRC_URI[sha256sum] = "1ef8df7608012fa469329799c950ec087737a6dabad3003c230658b58c710172"
DEPENDS = "gstreamer1.0 gstreamer1.0-plugins-base python3-pygobject"
RDEPENDS:${PN} += "gstreamer1.0 gstreamer1.0-plugins-base python3-pygobject"
diff --git a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.22.6.bb b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.22.7.bb
index fd79fe4324..af1c2ced44 100644
--- a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.22.6.bb
+++ b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.22.7.bb
@@ -10,7 +10,7 @@ PNREAL = "gst-rtsp-server"
SRC_URI = "https://gstreamer.freedesktop.org/src/${PNREAL}/${PNREAL}-${PV}.tar.xz"
-SRC_URI[sha256sum] = "0ae33a8b50443b62f11581a9181e906b41cd3877b2d799dbea72912c3eda4bb3"
+SRC_URI[sha256sum] = "f7fac001e20ad21e36d18397741c4657c5d43571eb1cc3b49f9a93ae127dc88f"
S = "${WORKDIR}/${PNREAL}-${PV}"
diff --git a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi_1.22.6.bb b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi_1.22.7.bb
index bf4c105057..4cad50742d 100644
--- a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi_1.22.6.bb
+++ b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi_1.22.7.bb
@@ -11,7 +11,7 @@ LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=4fbd65380cdd255951079008b364516c"
SRC_URI = "https://gstreamer.freedesktop.org/src/${REALPN}/${REALPN}-${PV}.tar.xz"
-SRC_URI[sha256sum] = "d9ba2fc26bef98c78e982c599f585d46bbb65fe122da89c2d7ab41f468a52c7b"
+SRC_URI[sha256sum] = "0e9fff768b89de6d318b34146e4e781d82b9a0f4025dc541b2c8349c7bcb7f67"
S = "${WORKDIR}/${REALPN}-${PV}"
DEPENDS = "libva gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-bad"
diff --git a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.22.6.bb b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.22.7.bb
index a898464322..72161b272f 100644
--- a/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.22.6.bb
+++ b/poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.22.7.bb
@@ -22,7 +22,7 @@ SRC_URI = "https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-${PV}.tar.x
file://0003-tests-use-a-dictionaries-for-environment.patch;striplevel=3 \
file://0004-tests-add-helper-script-to-run-the-installed_tests.patch;striplevel=3 \
"
-SRC_URI[sha256sum] = "f500e6cfddff55908f937711fc26a0840de28a1e9ec49621c0b6f1adbd8f818e"
+SRC_URI[sha256sum] = "01e42c6352a06bdfa4456e64b06ab7d98c5c487a25557c761554631cbda64217"
PACKAGECONFIG ??= "${@bb.utils.contains('PTEST_ENABLED', '1', 'tests', '', d)} \
check \
diff --git a/poky/meta/recipes-multimedia/libsndfile/libsndfile1/cve-2022-33065.patch b/poky/meta/recipes-multimedia/libsndfile/libsndfile1/cve-2022-33065.patch
new file mode 100644
index 0000000000..fa4b2fc08b
--- /dev/null
+++ b/poky/meta/recipes-multimedia/libsndfile/libsndfile1/cve-2022-33065.patch
@@ -0,0 +1,739 @@
+From c7ce5b0ebeeb58934825077d1324960aa0747718 Mon Sep 17 00:00:00 2001
+From: Alex Stewart <alex.stewart@ni.com>
+Date: Tue, 10 Oct 2023 16:10:34 -0400
+Subject: [PATCH] mat4/mat5: fix int overflow in dataend calculation
+
+The clang sanitizer warns of a possible signed integer overflow when
+calculating the `dataend` value in `mat4_read_header()`.
+
+```
+src/mat4.c:323:41: runtime error: signed integer overflow: 205 * -100663296 cannot be represented in type 'int'
+SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior src/mat4.c:323:41 in
+src/mat4.c:323:48: runtime error: signed integer overflow: 838860800 * 4 cannot be represented in type 'int'
+SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior src/mat4.c:323:48 in
+```
+
+Cast the offending `rows` and `cols` ints to `sf_count_t` (the type of
+`dataend` before performing the calculation, to avoid the issue.
+
+CVE: CVE-2022-33065
+Fixes: https://github.com/libsndfile/libsndfile/issues/789
+Fixes: https://github.com/libsndfile/libsndfile/issues/833
+
+Upstream-Status: Backport [9a829113c88a51e57c1e46473e90609e4b7df151]
+
+Signed-off-by: Alex Stewart <alex.stewart@ni.com>
+---
+ src/mat4.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/mat4.c b/src/mat4.c
+index 0b1b414b..575683ba 100644
+--- a/src/mat4.c
++++ b/src/mat4.c
+@@ -320,7 +320,7 @@ mat4_read_header (SF_PRIVATE *psf)
+ psf->filelength - psf->dataoffset, psf->sf.channels * psf->sf.frames * psf->bytewidth) ;
+ }
+ else if ((psf->filelength - psf->dataoffset) > psf->sf.channels * psf->sf.frames * psf->bytewidth)
+- psf->dataend = psf->dataoffset + rows * cols * psf->bytewidth ;
++ psf->dataend = psf->dataoffset + (sf_count_t) rows * (sf_count_t) cols * psf->bytewidth ;
+
+ psf->datalength = psf->filelength - psf->dataoffset - psf->dataend ;
+
+From 842303f984b2081481e74cb84a9a24ecbe3dec1a Mon Sep 17 00:00:00 2001
+From: Alex Stewart <alex.stewart@ni.com>
+Date: Wed, 11 Oct 2023 16:36:02 -0400
+Subject: [PATCH] au: avoid int overflow while calculating data_end
+
+At several points in au_read_header(), we calculate the functional end
+of the data segment by adding the (int)au_fmt.dataoffset and the
+(int)au_fmt.datasize. This can overflow the implicit int_32 return value
+and cause undefined behavior.
+
+Instead, precalculate the value and assign it to a 64-bit
+(sf_count_t)data_end variable.
+
+CVE: CVE-2022-33065
+Fixes: https://github.com/libsndfile/libsndfile/issues/833
+
+Signed-off-by: Alex Stewart <alex.stewart@ni.com>
+---
+ src/au.c | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/src/au.c b/src/au.c
+index 62bd691d..f68f2587 100644
+--- a/src/au.c
++++ b/src/au.c
+@@ -291,6 +291,7 @@ static int
+ au_read_header (SF_PRIVATE *psf)
+ { AU_FMT au_fmt ;
+ int marker, dword ;
++ sf_count_t data_end ;
+
+ memset (&au_fmt, 0, sizeof (au_fmt)) ;
+ psf_binheader_readf (psf, "pm", 0, &marker) ;
+@@ -317,14 +318,15 @@ au_read_header (SF_PRIVATE *psf)
+ return SFE_AU_EMBED_BAD_LEN ;
+ } ;
+
++ data_end = (sf_count_t) au_fmt.dataoffset + (sf_count_t) au_fmt.datasize ;
+ if (psf->fileoffset > 0)
+- { psf->filelength = au_fmt.dataoffset + au_fmt.datasize ;
++ { psf->filelength = data_end ;
+ psf_log_printf (psf, " Data Size : %d\n", au_fmt.datasize) ;
+ }
+- else if (au_fmt.datasize == -1 || au_fmt.dataoffset + au_fmt.datasize == psf->filelength)
++ else if (au_fmt.datasize == -1 || data_end == psf->filelength)
+ psf_log_printf (psf, " Data Size : %d\n", au_fmt.datasize) ;
+- else if (au_fmt.dataoffset + au_fmt.datasize < psf->filelength)
+- { psf->filelength = au_fmt.dataoffset + au_fmt.datasize ;
++ else if (data_end < psf->filelength)
++ { psf->filelength = data_end ;
+ psf_log_printf (psf, " Data Size : %d\n", au_fmt.datasize) ;
+ }
+ else
+From 0754d3380a54e3fbdde0f684b88955c80c79f58f Mon Sep 17 00:00:00 2001
+From: Alex Stewart <alex.stewart@ni.com>
+Date: Wed, 11 Oct 2023 16:46:29 -0400
+Subject: [PATCH] avr: fix int overflow in avr_read_header()
+
+Pre-cast hdr.frames to sf_count_t, to provide the calculation with
+enough numeric space to avoid an int-overflow.
+
+CVE: CVE-2022-33065
+Fixes: https://github.com/libsndfile/libsndfile/issues/833
+
+Signed-off-by: Alex Stewart <alex.stewart@ni.com>
+---
+ src/avr.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/avr.c b/src/avr.c
+index 6c78ff69..1bc1ffc9 100644
+--- a/src/avr.c
++++ b/src/avr.c
+@@ -162,7 +162,7 @@ avr_read_header (SF_PRIVATE *psf)
+ psf->endian = SF_ENDIAN_BIG ;
+
+ psf->dataoffset = AVR_HDR_SIZE ;
+- psf->datalength = hdr.frames * (hdr.rez / 8) ;
++ psf->datalength = (sf_count_t) hdr.frames * (hdr.rez / 8) ;
+
+ if (psf->fileoffset > 0)
+ psf->filelength = AVR_HDR_SIZE + psf->datalength ;
+From 6ac31a68a614e2bba4a05b54e5558d6270c98376 Mon Sep 17 00:00:00 2001
+From: Alex Stewart <alex.stewart@ni.com>
+Date: Wed, 11 Oct 2023 16:54:21 -0400
+Subject: [PATCH] sds: fix int overflow warning in sample calculations
+
+The sds_*byte_read() functions compose their uint_32 sample buffers by
+shifting 7bit samples into a 32bit wide buffer, and adding them
+together. Because the 7bit samples are stored in 32bit ints, code
+fuzzers become concerned that the addition operation can overflow and
+cause undefined behavior.
+
+Instead, bitwise-OR the bytes together - which should accomplish the
+same arithmetic operation, without risking an int-overflow.
+
+CVE: CVE-2022-33065
+Fixes: https://github.com/libsndfile/libsndfile/issues/833
+
+Signed-off-by: Alex Stewart <alex.stewart@ni.com>
+
+Do the same for the 3byte and 4byte read functions.
+---
+ src/sds.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/sds.c b/src/sds.c
+index 6bc76171..2a0f164c 100644
+--- a/src/sds.c
++++ b/src/sds.c
+@@ -454,7 +454,7 @@ sds_2byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
+
+ ucptr = psds->read_data + 5 ;
+ for (k = 0 ; k < 120 ; k += 2)
+- { sample = arith_shift_left (ucptr [k], 25) + arith_shift_left (ucptr [k + 1], 18) ;
++ { sample = arith_shift_left (ucptr [k], 25) | arith_shift_left (ucptr [k + 1], 18) ;
+ psds->read_samples [k / 2] = (int) (sample - 0x80000000) ;
+ } ;
+
+@@ -498,7 +498,7 @@ sds_3byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
+
+ ucptr = psds->read_data + 5 ;
+ for (k = 0 ; k < 120 ; k += 3)
+- { sample = (((uint32_t) ucptr [k]) << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) ;
++ { sample = (((uint32_t) ucptr [k]) << 25) | (ucptr [k + 1] << 18) | (ucptr [k + 2] << 11) ;
+ psds->read_samples [k / 3] = (int) (sample - 0x80000000) ;
+ } ;
+
+@@ -542,7 +542,7 @@ sds_4byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
+
+ ucptr = psds->read_data + 5 ;
+ for (k = 0 ; k < 120 ; k += 4)
+- { sample = (((uint32_t) ucptr [k]) << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) + (ucptr [k + 3] << 4) ;
++ { sample = (((uint32_t) ucptr [k]) << 25) | (ucptr [k + 1] << 18) | (ucptr [k + 2] << 11) | (ucptr [k + 3] << 4) ;
+ psds->read_samples [k / 4] = (int) (sample - 0x80000000) ;
+ } ;
+
+From 96428e1dd4998f1cd47df24f8fe9b0da35d7b947 Mon Sep 17 00:00:00 2001
+From: Alex Stewart <alex.stewart@ni.com>
+Date: Wed, 11 Oct 2023 17:26:51 -0400
+Subject: [PATCH] aiff: fix int overflow when counting header elements
+
+aiff_read_basc_chunk() tries to count the AIFF header size by keeping
+track of the bytes returned by psf_binheader_readf(). Though improbable,
+it is technically possible for these added bytes to exceed the int-sized
+`count` accumulator.
+
+Use a 64-bit sf_count_t type for `count`, to ensure that it always has
+enough numeric space.
+
+CVE: CVE-2022-33065
+Fixes: https://github.com/libsndfile/libsndfile/issues/833
+
+Signed-off-by: Alex Stewart <alex.stewart@ni.com>
+---
+ src/aiff.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/aiff.c b/src/aiff.c
+index a2bda8f4..6b244302 100644
+--- a/src/aiff.c
++++ b/src/aiff.c
+@@ -1702,7 +1702,7 @@ static int
+ aiff_read_basc_chunk (SF_PRIVATE * psf, int datasize)
+ { const char * type_str ;
+ basc_CHUNK bc ;
+- int count ;
++ sf_count_t count ;
+
+ count = psf_binheader_readf (psf, "E442", &bc.version, &bc.numBeats, &bc.rootNote) ;
+ count += psf_binheader_readf (psf, "E222", &bc.scaleType, &bc.sigNumerator, &bc.sigDenominator) ;
+From b352c350d35bf978e4d3a32e5d9df1f2284445f4 Mon Sep 17 00:00:00 2001
+From: Alex Stewart <alex.stewart@ni.com>
+Date: Wed, 11 Oct 2023 17:43:02 -0400
+Subject: [PATCH] ircam: fix int overflow in ircam_read_header()
+
+When reading the IRCAM header, it is possible for the calculated
+blockwidth to exceed the bounds of a signed int32.
+
+Use a 64bit sf_count_t to store the blockwidth.
+
+CVE: CVE-2022-33065
+Fixes: https://github.com/libsndfile/libsndfile/issues/833
+
+Signed-off-by: Alex Stewart <alex.stewart@ni.com>
+---
+ src/common.h | 2 +-
+ src/ircam.c | 10 +++++-----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/src/common.h b/src/common.h
+index d92eabde..5369cb67 100644
+--- a/src/common.h
++++ b/src/common.h
+@@ -439,7 +439,7 @@ typedef struct sf_private_tag
+ sf_count_t datalength ; /* Length in bytes of the audio data. */
+ sf_count_t dataend ; /* Offset to file tailer. */
+
+- int blockwidth ; /* Size in bytes of one set of interleaved samples. */
++ sf_count_t blockwidth ; /* Size in bytes of one set of interleaved samples. */
+ int bytewidth ; /* Size in bytes of one sample (one channel). */
+
+ void *dither ;
+diff --git a/src/ircam.c b/src/ircam.c
+index 8e7cdba8..3d73ba44 100644
+--- a/src/ircam.c
++++ b/src/ircam.c
+@@ -171,35 +171,35 @@ ircam_read_header (SF_PRIVATE *psf)
+ switch (encoding)
+ { case IRCAM_PCM_16 :
+ psf->bytewidth = 2 ;
+- psf->blockwidth = psf->sf.channels * psf->bytewidth ;
++ psf->blockwidth = (sf_count_t) psf->sf.channels * psf->bytewidth ;
+
+ psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_16 ;
+ break ;
+
+ case IRCAM_PCM_32 :
+ psf->bytewidth = 4 ;
+- psf->blockwidth = psf->sf.channels * psf->bytewidth ;
++ psf->blockwidth = (sf_count_t) psf->sf.channels * psf->bytewidth ;
+
+ psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_32 ;
+ break ;
+
+ case IRCAM_FLOAT :
+ psf->bytewidth = 4 ;
+- psf->blockwidth = psf->sf.channels * psf->bytewidth ;
++ psf->blockwidth = (sf_count_t) psf->sf.channels * psf->bytewidth ;
+
+ psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_FLOAT ;
+ break ;
+
+ case IRCAM_ALAW :
+ psf->bytewidth = 1 ;
+- psf->blockwidth = psf->sf.channels * psf->bytewidth ;
++ psf->blockwidth = (sf_count_t) psf->sf.channels * psf->bytewidth ;
+
+ psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_ALAW ;
+ break ;
+
+ case IRCAM_ULAW :
+ psf->bytewidth = 1 ;
+- psf->blockwidth = psf->sf.channels * psf->bytewidth ;
++ psf->blockwidth = (sf_count_t) psf->sf.channels * psf->bytewidth ;
+
+ psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_ULAW ;
+ break ;
+From 3bcd291e57867f88f558fa6f80990e84311df78c Mon Sep 17 00:00:00 2001
+From: Alex Stewart <alex.stewart@ni.com>
+Date: Wed, 11 Oct 2023 16:12:22 -0400
+Subject: [PATCH] mat4/mat5: fix int overflow when calculating blockwidth
+
+Pre-cast the components of the blockwidth calculation to sf_count_t to
+avoid overflowing integers during calculation.
+
+CVE: CVE-2022-33065
+Fixes: https://github.com/libsndfile/libsndfile/issues/833
+
+Signed-off-by: Alex Stewart <alex.stewart@ni.com>
+---
+ src/mat4.c | 2 +-
+ src/mat5.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/mat4.c b/src/mat4.c
+index 575683ba..9f046f0c 100644
+--- a/src/mat4.c
++++ b/src/mat4.c
+@@ -104,7 +104,7 @@ mat4_open (SF_PRIVATE *psf)
+
+ psf->container_close = mat4_close ;
+
+- psf->blockwidth = psf->bytewidth * psf->sf.channels ;
++ psf->blockwidth = (sf_count_t) psf->bytewidth * psf->sf.channels ;
+
+ switch (subformat)
+ { case SF_FORMAT_PCM_16 :
+diff --git a/src/mat5.c b/src/mat5.c
+index da5a6eca..20f0ea64 100644
+--- a/src/mat5.c
++++ b/src/mat5.c
+@@ -114,7 +114,7 @@ mat5_open (SF_PRIVATE *psf)
+
+ psf->container_close = mat5_close ;
+
+- psf->blockwidth = psf->bytewidth * psf->sf.channels ;
++ psf->blockwidth = (sf_count_t) psf->bytewidth * psf->sf.channels ;
+
+ switch (subformat)
+ { case SF_FORMAT_PCM_U8 :
+From c177e292d47ef73b1d3c1bb391320299a0ed2ff9 Mon Sep 17 00:00:00 2001
+From: Alex Stewart <alex.stewart@ni.com>
+Date: Mon, 16 Oct 2023 12:37:47 -0400
+Subject: [PATCH] common: fix int overflow in psf_binheader_readf()
+
+The psf_binheader_readf() function attempts to count and return the
+number of bytes traversed in the header. During this accumulation, it is
+possible to overflow the int-sized byte_count variable.
+
+Avoid this overflow by checking that the accumulated bytes do not exceed
+INT_MAX and throwing an error if they do. This implies that files with
+multi-gigabyte headers threaten to produce this error, but I imagine
+those files don't really exist - and this error is better than the
+undefined behavior which would have resulted previously.
+
+CVE: CVE-2022-33065
+Fixes: https://github.com/libsndfile/libsndfile/issues/833
+
+Signed-off-by: Alex Stewart <alex.stewart@ni.com>
+---
+ src/common.c | 36 ++++++++++++++++++++++++------------
+ 1 file changed, 24 insertions(+), 12 deletions(-)
+
+diff --git a/src/common.c b/src/common.c
+index 1c3d951d..7f6cceca 100644
+--- a/src/common.c
++++ b/src/common.c
+@@ -18,6 +18,7 @@
+
+ #include <config.h>
+
++#include <limits.h>
+ #include <stdarg.h>
+ #include <string.h>
+ #if HAVE_UNISTD_H
+@@ -990,6 +991,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ double *doubleptr ;
+ char c ;
+ int byte_count = 0, count = 0 ;
++ int read_bytes = 0 ;
+
+ if (! format)
+ return psf_ftell (psf) ;
+@@ -998,6 +1000,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+
+ while ((c = *format++))
+ {
++ read_bytes = 0 ;
+ if (psf->header.indx + 16 >= psf->header.len && psf_bump_header_allocation (psf, 16))
+ break ;
+
+@@ -1014,7 +1017,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ intptr = va_arg (argptr, unsigned int*) ;
+ *intptr = 0 ;
+ ucptr = (unsigned char*) intptr ;
+- byte_count += header_read (psf, ucptr, sizeof (int)) ;
++ read_bytes = header_read (psf, ucptr, sizeof (int)) ;
+ *intptr = GET_MARKER (ucptr) ;
+ break ;
+
+@@ -1022,7 +1025,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ intptr = va_arg (argptr, unsigned int*) ;
+ *intptr = 0 ;
+ ucptr = (unsigned char*) intptr ;
+- byte_count += header_read (psf, sixteen_bytes, sizeof (sixteen_bytes)) ;
++ read_bytes = header_read (psf, sixteen_bytes, sizeof (sixteen_bytes)) ;
+ { int k ;
+ intdata = 0 ;
+ for (k = 0 ; k < 16 ; k++)
+@@ -1034,14 +1037,14 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ case '1' :
+ charptr = va_arg (argptr, char*) ;
+ *charptr = 0 ;
+- byte_count += header_read (psf, charptr, sizeof (char)) ;
++ read_bytes = header_read (psf, charptr, sizeof (char)) ;
+ break ;
+
+ case '2' : /* 2 byte value with the current endian-ness */
+ shortptr = va_arg (argptr, unsigned short*) ;
+ *shortptr = 0 ;
+ ucptr = (unsigned char*) shortptr ;
+- byte_count += header_read (psf, ucptr, sizeof (short)) ;
++ read_bytes = header_read (psf, ucptr, sizeof (short)) ;
+ if (psf->rwf_endian == SF_ENDIAN_BIG)
+ *shortptr = GET_BE_SHORT (ucptr) ;
+ else
+@@ -1051,7 +1054,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ case '3' : /* 3 byte value with the current endian-ness */
+ intptr = va_arg (argptr, unsigned int*) ;
+ *intptr = 0 ;
+- byte_count += header_read (psf, sixteen_bytes, 3) ;
++ read_bytes = header_read (psf, sixteen_bytes, 3) ;
+ if (psf->rwf_endian == SF_ENDIAN_BIG)
+ *intptr = GET_BE_3BYTE (sixteen_bytes) ;
+ else
+@@ -1062,7 +1065,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ intptr = va_arg (argptr, unsigned int*) ;
+ *intptr = 0 ;
+ ucptr = (unsigned char*) intptr ;
+- byte_count += header_read (psf, ucptr, sizeof (int)) ;
++ read_bytes = header_read (psf, ucptr, sizeof (int)) ;
+ if (psf->rwf_endian == SF_ENDIAN_BIG)
+ *intptr = psf_get_be32 (ucptr, 0) ;
+ else
+@@ -1072,7 +1075,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ case '8' : /* 8 byte value with the current endian-ness */
+ countptr = va_arg (argptr, sf_count_t *) ;
+ *countptr = 0 ;
+- byte_count += header_read (psf, sixteen_bytes, 8) ;
++ read_bytes = header_read (psf, sixteen_bytes, 8) ;
+ if (psf->rwf_endian == SF_ENDIAN_BIG)
+ countdata = psf_get_be64 (sixteen_bytes, 0) ;
+ else
+@@ -1083,7 +1086,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ case 'f' : /* Float conversion */
+ floatptr = va_arg (argptr, float *) ;
+ *floatptr = 0.0 ;
+- byte_count += header_read (psf, floatptr, sizeof (float)) ;
++ read_bytes = header_read (psf, floatptr, sizeof (float)) ;
+ if (psf->rwf_endian == SF_ENDIAN_BIG)
+ *floatptr = float32_be_read ((unsigned char*) floatptr) ;
+ else
+@@ -1093,7 +1096,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ case 'd' : /* double conversion */
+ doubleptr = va_arg (argptr, double *) ;
+ *doubleptr = 0.0 ;
+- byte_count += header_read (psf, doubleptr, sizeof (double)) ;
++ read_bytes = header_read (psf, doubleptr, sizeof (double)) ;
+ if (psf->rwf_endian == SF_ENDIAN_BIG)
+ *doubleptr = double64_be_read ((unsigned char*) doubleptr) ;
+ else
+@@ -1117,7 +1120,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ charptr = va_arg (argptr, char*) ;
+ count = va_arg (argptr, size_t) ;
+ memset (charptr, 0, count) ;
+- byte_count += header_read (psf, charptr, count) ;
++ read_bytes = header_read (psf, charptr, count) ;
+ break ;
+
+ case 'G' :
+@@ -1128,7 +1131,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ if (psf->header.indx + count >= psf->header.len && psf_bump_header_allocation (psf, count))
+ break ;
+
+- byte_count += header_gets (psf, charptr, count) ;
++ read_bytes = header_gets (psf, charptr, count) ;
+ break ;
+
+ case 'z' :
+@@ -1152,7 +1155,7 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ case 'j' : /* Seek to position from current position. */
+ count = va_arg (argptr, size_t) ;
+ header_seek (psf, count, SEEK_CUR) ;
+- byte_count += count ;
++ read_bytes = count ;
+ break ;
+
+ case '!' : /* Clear buffer, forcing re-read. */
+@@ -1164,8 +1167,17 @@ psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+ psf->error = SFE_INTERNAL ;
+ break ;
+ } ;
++
++ if (read_bytes > 0 && byte_count > (INT_MAX - read_bytes))
++ { psf_log_printf (psf, "Header size exceeds INT_MAX. Aborting.", c) ;
++ psf->error = SFE_INTERNAL ;
++ break ;
++ } else
++ { byte_count += read_bytes ;
+ } ;
+
++ } ; /*end while*/
++
+ va_end (argptr) ;
+
+ return byte_count ;
+From a23d563386e7c8d93dcdbe7d5b1d63cad6009116 Mon Sep 17 00:00:00 2001
+From: Alex Stewart <alex.stewart@ni.com>
+Date: Thu, 19 Oct 2023 14:07:19 -0400
+Subject: [PATCH] nms_adpcm: fix int overflow in signal estimate
+
+It is possible (though functionally incorrect) for the signal estimate
+calculation in nms_adpcm_update() to overflow the int value of s_e,
+resulting in undefined behavior.
+
+Since adpcm state signal values are never practically larger than
+16 bits, use smaller numeric sizes throughout the file to avoid the
+overflow.
+
+CVE: CVE-2022-33065
+Fixes: https://github.com/libsndfile/libsndfile/issues/833
+
+Authored-by: Arthur Taylor <art@ified.ca>
+Signed-off-by: Alex Stewart <alex.stewart@ni.com>
+Rebased-by: Alex Stewart <alex.stewart@ni.com>
+---
+ src/nms_adpcm.c | 85 ++++++++++++++++++++++++-------------------------
+ 1 file changed, 42 insertions(+), 43 deletions(-)
+
+diff --git a/src/nms_adpcm.c b/src/nms_adpcm.c
+index 96d6ad26..460ea077 100644
+--- a/src/nms_adpcm.c
++++ b/src/nms_adpcm.c
+@@ -48,36 +48,36 @@
+ /* Variable names from ITU G.726 spec */
+ struct nms_adpcm_state
+ { /* Log of the step size multiplier. Operated on by codewords. */
+- int yl ;
++ short yl ;
+
+ /* Quantizer step size multiplier. Generated from yl. */
+- int y ;
++ short y ;
+
+- /* Coefficents of the pole predictor */
+- int a [2] ;
++ /* Coefficients of the pole predictor */
++ short a [2] ;
+
+- /* Coefficents of the zero predictor */
+- int b [6] ;
++ /* Coefficients of the zero predictor */
++ short b [6] ;
+
+ /* Previous quantized deltas (multiplied by 2^14) */
+- int d_q [7] ;
++ short d_q [7] ;
+
+ /* d_q [x] + s_ez [x], used by the pole-predictor for signs only. */
+- int p [3] ;
++ short p [3] ;
+
+ /* Previous reconstructed signal values. */
+- int s_r [2] ;
++ short s_r [2] ;
+
+ /* Zero predictor components of the signal estimate. */
+- int s_ez ;
++ short s_ez ;
+
+ /* Signal estimate, (including s_ez). */
+- int s_e ;
++ short s_e ;
+
+ /* The most recent codeword (enc:generated, dec:inputted) */
+- int Ik ;
++ char Ik ;
+
+- int parity ;
++ char parity ;
+
+ /*
+ ** Offset into code tables for the bitrate.
+@@ -109,7 +109,7 @@ typedef struct
+ } NMS_ADPCM_PRIVATE ;
+
+ /* Pre-computed exponential interval used in the antilog approximation. */
+-static unsigned int table_expn [] =
++static unsigned short table_expn [] =
+ { 0x4000, 0x4167, 0x42d5, 0x444c, 0x45cb, 0x4752, 0x48e2, 0x4a7a,
+ 0x4c1b, 0x4dc7, 0x4f7a, 0x5138, 0x52ff, 0x54d1, 0x56ac, 0x5892,
+ 0x5a82, 0x5c7e, 0x5e84, 0x6096, 0x62b4, 0x64dd, 0x6712, 0x6954,
+@@ -117,21 +117,21 @@ static unsigned int table_expn [] =
+ } ;
+
+ /* Table mapping codewords to scale factor deltas. */
+-static int table_scale_factor_step [] =
++static short table_scale_factor_step [] =
+ { 0x0, 0x0, 0x0, 0x0, 0x4b0, 0x0, 0x0, 0x0, /* 2-bit */
+ -0x3c, 0x0, 0x90, 0x0, 0x2ee, 0x0, 0x898, 0x0, /* 3-bit */
+ -0x30, 0x12, 0x6b, 0xc8, 0x188, 0x2e0, 0x551, 0x1150, /* 4-bit */
+ } ;
+
+ /* Table mapping codewords to quantized delta interval steps. */
+-static unsigned int table_step [] =
++static unsigned short table_step [] =
+ { 0x73F, 0, 0, 0, 0x1829, 0, 0, 0, /* 2-bit */
+ 0x3EB, 0, 0xC18, 0, 0x1581, 0, 0x226E, 0, /* 3-bit */
+ 0x20C, 0x635, 0xA83, 0xF12, 0x1418, 0x19E3, 0x211A, 0x2BBA, /* 4-bit */
+ } ;
+
+ /* Binary search lookup table for quantizing using table_step. */
+-static int table_step_search [] =
++static short table_step_search [] =
+ { 0, 0x1F6D, 0, -0x1F6D, 0, 0, 0, 0, /* 2-bit */
+ 0x1008, 0x1192, 0, -0x219A, 0x1656, -0x1656, 0, 0, /* 3-bit */
+ 0x872, 0x1277, -0x8E6, -0x232B, 0xD06, -0x17D7, -0x11D3, 0, /* 4-bit */
+@@ -179,23 +179,23 @@ static sf_count_t nms_adpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
+ ** Maps [1,20480] to [1,1024] in an exponential relationship. This is
+ ** approximately ret = b^exp where b = e^(ln(1024)/ln(20480)) ~= 1.0003385
+ */
+-static inline int
+-nms_adpcm_antilog (int exp)
+-{ int ret ;
++static inline short
++nms_adpcm_antilog (short exp)
++{ int_fast32_t r ;
+
+- ret = 0x1000 ;
+- ret += (((exp & 0x3f) * 0x166b) >> 12) ;
+- ret *= table_expn [(exp & 0x7c0) >> 6] ;
+- ret >>= (26 - (exp >> 11)) ;
++ r = 0x1000 ;
++ r += (((int_fast32_t) (exp & 0x3f) * 0x166b) >> 12) ;
++ r *= table_expn [(exp & 0x7c0) >> 6] ;
++ r >>= (26 - (exp >> 11)) ;
+
+- return ret ;
++ return (short) r ;
+ } /* nms_adpcm_antilog */
+
+ static void
+ nms_adpcm_update (struct nms_adpcm_state *s)
+ { /* Variable names from ITU G.726 spec */
+- int a1ul ;
+- int fa1 ;
++ short a1ul, fa1 ;
++ int_fast32_t se ;
+ int i ;
+
+ /* Decay and Modify the scale factor in the log domain based on the codeword. */
+@@ -222,7 +222,7 @@ nms_adpcm_update (struct nms_adpcm_state *s)
+ else if (fa1 > 256)
+ fa1 = 256 ;
+
+- s->a [0] = (0xff * s->a [0]) >> 8 ;
++ s->a [0] = (s->a [0] * 0xff) >> 8 ;
+ if (s->p [0] != 0 && s->p [1] != 0 && ((s->p [0] ^ s->p [1]) < 0))
+ s->a [0] -= 192 ;
+ else
+@@ -230,7 +230,7 @@ nms_adpcm_update (struct nms_adpcm_state *s)
+ fa1 = -fa1 ;
+ }
+
+- s->a [1] = fa1 + ((0xfe * s->a [1]) >> 8) ;
++ s->a [1] = fa1 + ((s->a [1] * 0xfe) >> 8) ;
+ if (s->p [0] != 0 && s->p [2] != 0 && ((s->p [0] ^ s->p [2]) < 0))
+ s->a [1] -= 128 ;
+ else
+@@ -250,19 +250,18 @@ nms_adpcm_update (struct nms_adpcm_state *s)
+ s->a [0] = a1ul ;
+ } ;
+
+- /* Compute the zero predictor estimate. Rotate past deltas too. */
+- s->s_ez = 0 ;
++ /* Compute the zero predictor estimate and rotate past deltas. */
++ se = 0 ;
+ for (i = 5 ; i >= 0 ; i--)
+- { s->s_ez += s->d_q [i] * s->b [i] ;
++ { se += (int_fast32_t) s->d_q [i] * s->b [i] ;
+ s->d_q [i + 1] = s->d_q [i] ;
+ } ;
++ s->s_ez = se >> 14 ;
+
+- /* Compute the signal estimate. */
+- s->s_e = s->a [0] * s->s_r [0] + s->a [1] * s->s_r [1] + s->s_ez ;
+-
+- /* Return to scale */
+- s->s_ez >>= 14 ;
+- s->s_e >>= 14 ;
++ /* Complete the signal estimate. */
++ se += (int_fast32_t) s->a [0] * s->s_r [0] ;
++ se += (int_fast32_t) s->a [1] * s->s_r [1] ;
++ s->s_e = se >> 14 ;
+
+ /* Rotate members to prepare for next iteration. */
+ s->s_r [1] = s->s_r [0] ;
+@@ -274,7 +273,7 @@ nms_adpcm_update (struct nms_adpcm_state *s)
+ static int16_t
+ nms_adpcm_reconstruct_sample (struct nms_adpcm_state *s, uint8_t I)
+ { /* Variable names from ITU G.726 spec */
+- int dqx ;
++ int_fast32_t dqx ;
+
+ /*
+ ** The ordering of the 12-bit right-shift is a precision loss. It agrees
+@@ -308,17 +307,17 @@ nms_adpcm_codec_init (struct nms_adpcm_state *s, enum nms_enc_type type)
+ /*
+ ** nms_adpcm_encode_sample()
+ **
+-** Encode a linear 16-bit pcm sample into a 2,3, or 4 bit NMS-ADPCM codeword
++** Encode a linear 16-bit pcm sample into a 2, 3, or 4 bit NMS-ADPCM codeword
+ ** using and updating the predictor state.
+ */
+ static uint8_t
+ nms_adpcm_encode_sample (struct nms_adpcm_state *s, int16_t sl)
+ { /* Variable names from ITU G.726 spec */
+- int d ;
++ int_fast32_t d ;
+ uint8_t I ;
+
+ /* Down scale the sample from 16 => ~14 bits. */
+- sl = (sl * 0x1fdf) / 0x7fff ;
++ sl = ((int_fast32_t) sl * 0x1fdf) / 0x7fff ;
+
+ /* Compute estimate, and delta from actual value */
+ nms_adpcm_update (s) ;
+@@ -407,7 +406,7 @@ nms_adpcm_encode_sample (struct nms_adpcm_state *s, int16_t sl)
+ */
+ static int16_t
+ nms_adpcm_decode_sample (struct nms_adpcm_state *s, uint8_t I)
+-{ int sl ;
++{ int_fast32_t sl ;
+
+ nms_adpcm_update (s) ;
+ sl = nms_adpcm_reconstruct_sample (s, I) ;
diff --git a/poky/meta/recipes-multimedia/libsndfile/libsndfile1_1.2.2.bb b/poky/meta/recipes-multimedia/libsndfile/libsndfile1_1.2.2.bb
index 9c1f601aab..a9ee7c3575 100644
--- a/poky/meta/recipes-multimedia/libsndfile/libsndfile1_1.2.2.bb
+++ b/poky/meta/recipes-multimedia/libsndfile/libsndfile1_1.2.2.bb
@@ -9,6 +9,7 @@ LICENSE = "LGPL-2.1-only"
SRC_URI = "${GITHUB_BASE_URI}/download/${PV}/libsndfile-${PV}.tar.xz \
file://noopus.patch \
+ file://cve-2022-33065.patch \
"
GITHUB_BASE_URI = "https://github.com/libsndfile/libsndfile/releases/"
diff --git a/poky/meta/recipes-rt/README b/poky/meta/recipes-rt/README
index 7d7558de49..0144d68b70 100644
--- a/poky/meta/recipes-rt/README
+++ b/poky/meta/recipes-rt/README
@@ -10,4 +10,4 @@ If you are creating a new BSP which should use linux-yocto-rt by default,
use the line above in the $MACHINE.conf in your BSP layer, and specify the
following in a linux-yocto-rt bbappend recipe:
-COMPATIBLE_MACHINE_$MACHINE = $MACHINE
+COMPATIBLE_MACHINE:$MACHINE = $MACHINE
diff --git a/poky/meta/recipes-sato/puzzles/puzzles_git.bb b/poky/meta/recipes-sato/puzzles/puzzles_git.bb
index d7089ef95d..d0a9af7cb6 100644
--- a/poky/meta/recipes-sato/puzzles/puzzles_git.bb
+++ b/poky/meta/recipes-sato/puzzles/puzzles_git.bb
@@ -10,7 +10,7 @@ REQUIRED_DISTRO_FEATURES = "x11"
SRC_URI = "git://git.tartarus.org/simon/puzzles.git;branch=main;protocol=https"
UPSTREAM_CHECK_COMMITS = "1"
-SRCREV = "2d9e414ee316b37143954150016e8f4f18358497"
+SRCREV = "96d65e852cea8a95001fa70e3ec2996d4ea5e2b4"
PE = "2"
PV = "0.0+git"
diff --git a/poky/meta/recipes-support/debianutils/debianutils_5.13.bb b/poky/meta/recipes-support/debianutils/debianutils_5.14.bb
index 915277b42c..deec8d1fe8 100644
--- a/poky/meta/recipes-support/debianutils/debianutils_5.13.bb
+++ b/poky/meta/recipes-support/debianutils/debianutils_5.14.bb
@@ -6,12 +6,12 @@ HOMEPAGE = "https://packages.debian.org/sid/debianutils"
BUGTRACKER = "https://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=debianutils;dist=unstable"
SECTION = "base"
LICENSE = "GPL-2.0-only & SMAIL_GPL"
-LIC_FILES_CHKSUM = "file://debian/copyright;md5=74765f57ae5dd2b10ffbc39528d98753"
+LIC_FILES_CHKSUM = "file://debian/copyright;md5=4b667f30411d21bc8fd7db85d502a8e9"
SRC_URI = "git://salsa.debian.org/debian/debianutils.git;protocol=https;branch=master \
"
-SRCREV = "d49a78eb264c1b2ad3d0d6de8e1fb776bda9c943"
+SRCREV = "7e63b32ea4126c70a5da958f0106add267810a94"
inherit autotools update-alternatives
@@ -31,6 +31,7 @@ do_install:append() {
mv ${D}${bindir}/$app ${D}${base_bindir}/$app
done
fi
+ mv ${D}${bindir}/which.debianutils ${D}${bindir}/which
}
# Note that we package the update-alternatives name.
@@ -47,9 +48,6 @@ ALTERNATIVE:${PN} = "add-shell installkernel remove-shell savelog which"
ALTERNATIVE_PRIORITY_${PN}-run-parts = "60"
ALTERNATIVE:${PN}-run-parts = "run-parts"
-ALTERNATIVE:${PN}-doc = "which.1"
-ALTERNATIVE_LINK_NAME[which.1] = "${mandir}/man1/which.1"
-
ALTERNATIVE_LINK_NAME[add-shell] = "${sbindir}/add-shell"
ALTERNATIVE_LINK_NAME[installkernel] = "${sbindir}/installkernel"
ALTERNATIVE_LINK_NAME[remove-shell] = "${sbindir}/remove-shell"
diff --git a/poky/meta/recipes-support/diffoscope/diffoscope_249.bb b/poky/meta/recipes-support/diffoscope/diffoscope_251.bb
index b679103694..8862509e05 100644
--- a/poky/meta/recipes-support/diffoscope/diffoscope_249.bb
+++ b/poky/meta/recipes-support/diffoscope/diffoscope_251.bb
@@ -12,7 +12,7 @@ PYPI_PACKAGE = "diffoscope"
inherit pypi setuptools3
-SRC_URI[sha256sum] = "bc4d8cb3198025013784ef7e3fa61b7a642de39e5b790c45d7c29d153306fbdd"
+SRC_URI[sha256sum] = "c9ba2fc24379b2ba4457dc7be6970884cc2ee94c20d44f3889c2a4741e6178d3"
RDEPENDS:${PN} += "\
binutils \
diff --git a/poky/meta/recipes-support/enchant/enchant2_2.6.1.bb b/poky/meta/recipes-support/enchant/enchant2_2.6.2.bb
index a3510a8705..38d3245d20 100644
--- a/poky/meta/recipes-support/enchant/enchant2_2.6.1.bb
+++ b/poky/meta/recipes-support/enchant/enchant2_2.6.2.bb
@@ -12,7 +12,7 @@ DEPENDS = "glib-2.0 groff-native"
inherit autotools pkgconfig github-releases
SRC_URI = "${GITHUB_BASE_URI}/download/v${PV}/enchant-${PV}.tar.gz"
-SRC_URI[sha256sum] = "f24e12469137ae1d03140bb9032a47a5947c36f4d1e2f12b929061005eb15279"
+SRC_URI[sha256sum] = "6686a728e56e760f8dee09a22f0fb53b46ee9dbe7d64cf9e5bb35a658bff7e1d"
GITHUB_BASE_URI = "https://github.com/AbiWord/enchant/releases"
diff --git a/poky/meta/recipes-support/gpgme/gpgme_1.22.0.bb b/poky/meta/recipes-support/gpgme/gpgme_1.23.1.bb
index 84c8fa9f8a..e029b73a8f 100644
--- a/poky/meta/recipes-support/gpgme/gpgme_1.22.0.bb
+++ b/poky/meta/recipes-support/gpgme/gpgme_1.23.1.bb
@@ -24,7 +24,7 @@ SRC_URI = "${GNUPG_MIRROR}/gpgme/${BP}.tar.bz2 \
file://0001-autogen.sh-remove-unknown-in-version.patch \
"
-SRC_URI[sha256sum] = "9551e37081ad3bde81018a0d24f245c3f8206990549598fb31a97a68380a7b71"
+SRC_URI[sha256sum] = "a0c316f7ab7d3bfb01a8753c3370dc906e5b61436021f3b54ff1483b513769bd"
PYTHON_DEPS = "${@bb.utils.contains('LANGUAGES', 'python', 'swig-native', '', d)}"
diff --git a/poky/meta/recipes-support/libcroco/files/CVE-2020-12825.patch b/poky/meta/recipes-support/libcroco/files/CVE-2020-12825.patch
deleted file mode 100644
index 42f92e3607..0000000000
--- a/poky/meta/recipes-support/libcroco/files/CVE-2020-12825.patch
+++ /dev/null
@@ -1,192 +0,0 @@
-From fdf78a4877afa987ba646a8779b513f258e6d04c Mon Sep 17 00:00:00 2001
-From: Michael Catanzaro <mcatanzaro@gnome.org>
-Date: Fri, 31 Jul 2020 15:21:53 -0500
-Subject: [PATCH] libcroco: Limit recursion in block and any productions
-
- (CVE-2020-12825)
-
-If we don't have any limits, we can recurse forever and overflow the
-stack.
-
-Fixes #8
-This is per https://gitlab.gnome.org/Archive/libcroco/-/issues/8
-
-https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1404
-
-CVE: CVE-2020-12825
-Upstream-Status: Backport [https://gitlab.gnome.org/Archive/libcroco/-/commit/6eb257e5c731c691eb137fca94e916ca73941a5a]
-Comment: No refreshing changes done.
-Signed-off-by: Saloni Jain <Saloni.Jain@kpit.com>
-
----
- src/cr-parser.c | 44 +++++++++++++++++++++++++++++---------------
- 1 file changed, 29 insertions(+), 15 deletions(-)
-
-diff --git a/src/cr-parser.c b/src/cr-parser.c
-index 18c9a01..f4a62e3 100644
---- a/src/cr-parser.c
-+++ b/src/cr-parser.c
-@@ -136,6 +136,8 @@ struct _CRParserPriv {
-
- #define CHARS_TAB_SIZE 12
-
-+#define RECURSIVE_CALLERS_LIMIT 100
-+
- /**
- * IS_NUM:
- *@a_char: the char to test.
-@@ -344,9 +346,11 @@ static enum CRStatus cr_parser_parse_selector_core (CRParser * a_this);
-
- static enum CRStatus cr_parser_parse_declaration_core (CRParser * a_this);
-
--static enum CRStatus cr_parser_parse_any_core (CRParser * a_this);
-+static enum CRStatus cr_parser_parse_any_core (CRParser * a_this,
-+ guint n_calls);
-
--static enum CRStatus cr_parser_parse_block_core (CRParser * a_this);
-+static enum CRStatus cr_parser_parse_block_core (CRParser * a_this,
-+ guint n_calls);
-
- static enum CRStatus cr_parser_parse_value_core (CRParser * a_this);
-
-@@ -784,7 +788,7 @@ cr_parser_parse_atrule_core (CRParser * a_this)
- cr_parser_try_to_skip_spaces_and_comments (a_this);
-
- do {
-- status = cr_parser_parse_any_core (a_this);
-+ status = cr_parser_parse_any_core (a_this, 0);
- } while (status == CR_OK);
-
- status = cr_tknzr_get_next_token (PRIVATE (a_this)->tknzr,
-@@ -795,7 +799,7 @@ cr_parser_parse_atrule_core (CRParser * a_this)
- cr_tknzr_unget_token (PRIVATE (a_this)->tknzr,
- token);
- token = NULL;
-- status = cr_parser_parse_block_core (a_this);
-+ status = cr_parser_parse_block_core (a_this, 0);
- CHECK_PARSING_STATUS (status,
- FALSE);
- goto done;
-@@ -930,11 +934,11 @@ cr_parser_parse_selector_core (CRParser * a_this)
-
- RECORD_INITIAL_POS (a_this, &init_pos);
-
-- status = cr_parser_parse_any_core (a_this);
-+ status = cr_parser_parse_any_core (a_this, 0);
- CHECK_PARSING_STATUS (status, FALSE);
-
- do {
-- status = cr_parser_parse_any_core (a_this);
-+ status = cr_parser_parse_any_core (a_this, 0);
-
- } while (status == CR_OK);
-
-@@ -956,10 +960,12 @@ cr_parser_parse_selector_core (CRParser * a_this)
- *in chapter 4.1 of the css2 spec.
- *block ::= '{' S* [ any | block | ATKEYWORD S* | ';' ]* '}' S*;
- *@param a_this the current instance of #CRParser.
-+ *@param n_calls used to limit recursion depth
- *FIXME: code this function.
- */
- static enum CRStatus
--cr_parser_parse_block_core (CRParser * a_this)
-+cr_parser_parse_block_core (CRParser * a_this,
-+ guint n_calls)
- {
- CRToken *token = NULL;
- CRInputPos init_pos;
-@@ -967,6 +973,9 @@ cr_parser_parse_block_core (CRParser * a_this)
-
- g_return_val_if_fail (a_this && PRIVATE (a_this), CR_BAD_PARAM_ERROR);
-
-+ if (n_calls > RECURSIVE_CALLERS_LIMIT)
-+ return CR_ERROR;
-+
- RECORD_INITIAL_POS (a_this, &init_pos);
-
- status = cr_tknzr_get_next_token (PRIVATE (a_this)->tknzr, &token);
-@@ -996,13 +1005,13 @@ cr_parser_parse_block_core (CRParser * a_this)
- } else if (token->type == CBO_TK) {
- cr_tknzr_unget_token (PRIVATE (a_this)->tknzr, token);
- token = NULL;
-- status = cr_parser_parse_block_core (a_this);
-+ status = cr_parser_parse_block_core (a_this, n_calls + 1);
- CHECK_PARSING_STATUS (status, FALSE);
- goto parse_block_content;
- } else {
- cr_tknzr_unget_token (PRIVATE (a_this)->tknzr, token);
- token = NULL;
-- status = cr_parser_parse_any_core (a_this);
-+ status = cr_parser_parse_any_core (a_this, n_calls + 1);
- CHECK_PARSING_STATUS (status, FALSE);
- goto parse_block_content;
- }
-@@ -1109,7 +1118,7 @@ cr_parser_parse_value_core (CRParser * a_this)
- status = cr_tknzr_unget_token (PRIVATE (a_this)->tknzr,
- token);
- token = NULL;
-- status = cr_parser_parse_block_core (a_this);
-+ status = cr_parser_parse_block_core (a_this, 0);
- CHECK_PARSING_STATUS (status, FALSE);
- ref++;
- goto continue_parsing;
-@@ -1123,7 +1132,7 @@ cr_parser_parse_value_core (CRParser * a_this)
- status = cr_tknzr_unget_token (PRIVATE (a_this)->tknzr,
- token);
- token = NULL;
-- status = cr_parser_parse_any_core (a_this);
-+ status = cr_parser_parse_any_core (a_this, 0);
- if (status == CR_OK) {
- ref++;
- goto continue_parsing;
-@@ -1162,10 +1171,12 @@ cr_parser_parse_value_core (CRParser * a_this)
- * | FUNCTION | DASHMATCH | '(' any* ')' | '[' any* ']' ] S*;
- *
- *@param a_this the current instance of #CRParser.
-+ *@param n_calls used to limit recursion depth
- *@return CR_OK upon successfull completion, an error code otherwise.
- */
- static enum CRStatus
--cr_parser_parse_any_core (CRParser * a_this)
-+cr_parser_parse_any_core (CRParser * a_this,
-+ guint n_calls)
- {
- CRToken *token1 = NULL,
- *token2 = NULL;
-@@ -1174,6 +1185,9 @@ cr_parser_parse_any_core (CRParser * a_this)
-
- g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR);
-
-+ if (n_calls > RECURSIVE_CALLERS_LIMIT)
-+ return CR_ERROR;
-+
- RECORD_INITIAL_POS (a_this, &init_pos);
-
- status = cr_tknzr_get_next_token (PRIVATE (a_this)->tknzr, &token1);
-@@ -1212,7 +1226,7 @@ cr_parser_parse_any_core (CRParser * a_this)
- *We consider parameter as being an "any*" production.
- */
- do {
-- status = cr_parser_parse_any_core (a_this);
-+ status = cr_parser_parse_any_core (a_this, n_calls + 1);
- } while (status == CR_OK);
-
- ENSURE_PARSING_COND (status == CR_PARSING_ERROR);
-@@ -1237,7 +1251,7 @@ cr_parser_parse_any_core (CRParser * a_this)
- }
-
- do {
-- status = cr_parser_parse_any_core (a_this);
-+ status = cr_parser_parse_any_core (a_this, n_calls + 1);
- } while (status == CR_OK);
-
- ENSURE_PARSING_COND (status == CR_PARSING_ERROR);
-@@ -1265,7 +1279,7 @@ cr_parser_parse_any_core (CRParser * a_this)
- }
-
- do {
-- status = cr_parser_parse_any_core (a_this);
-+ status = cr_parser_parse_any_core (a_this, n_calls + 1);
- } while (status == CR_OK);
-
- ENSURE_PARSING_COND (status == CR_PARSING_ERROR);
diff --git a/poky/meta/recipes-support/libcroco/libcroco_0.6.13.bb b/poky/meta/recipes-support/libcroco/libcroco_0.6.13.bb
deleted file mode 100644
index 419c962657..0000000000
--- a/poky/meta/recipes-support/libcroco/libcroco_0.6.13.bb
+++ /dev/null
@@ -1,26 +0,0 @@
-SUMMARY = "Cascading Style Sheet (CSS) parsing and manipulation toolkit"
-DESCRIPTION = "The Libcroco project is an effort to build a generic \
-Cascading Style Sheet (CSS) parsing and manipulation toolkit that can be \
-used by GNOME applications in need of CSS support."
-HOMEPAGE = "http://www.gnome.org/"
-BUGTRACKER = "https://bugzilla.gnome.org/"
-
-LICENSE = "LGPL-2.0-only & LGPL-2.1-only"
-LIC_FILES_CHKSUM = "file://COPYING;md5=55ca817ccb7d5b5b66355690e9abc605 \
- file://src/cr-rgb.c;endline=22;md5=31d5f0944d556c8589d04ea6055fcc66 \
- file://tests/cr-test-utils.c;endline=21;md5=2382c27934cae1d3792fcb17a6142c4e"
-
-SECTION = "x11/utils"
-DEPENDS = "glib-2.0 libxml2 zlib"
-BBCLASSEXTEND = "native nativesdk"
-EXTRA_OECONF += "--enable-Bsymbolic=auto"
-
-BINCONFIG = "${bindir}/croco-0.6-config"
-
-inherit gnomebase gtk-doc binconfig-disabled
-
-SRC_URI[archive.md5sum] = "c80c5a8385011a0260dce6bd0da93dce"
-SRC_URI[archive.sha256sum] = "767ec234ae7aa684695b3a735548224888132e063f92db585759b422570621d4"
-
-SRC_URI +="file://CVE-2020-12825.patch \
-"
diff --git a/poky/meta/recipes-support/libical/libical_3.0.16.bb b/poky/meta/recipes-support/libical/libical_3.0.17.bb
index 61599b20dd..b91912b048 100644
--- a/poky/meta/recipes-support/libical/libical_3.0.16.bb
+++ b/poky/meta/recipes-support/libical/libical_3.0.17.bb
@@ -15,7 +15,7 @@ SECTION = "libs"
SRC_URI = "${GITHUB_BASE_URI}/download/v${PV}/${BP}.tar.gz \
file://0001-cmake-Do-not-export-CC-into-gir-compiler.patch \
"
-SRC_URI[sha256sum] = "b44705dd71ca4538c86fb16248483ab4b48978524fb1da5097bd76aa2e0f0c33"
+SRC_URI[sha256sum] = "bcda9a6db6870240328752854d1ea475af9bbc6356e6771018200e475e5f781b"
inherit cmake pkgconfig gobject-introspection vala github-releases
diff --git a/poky/meta/recipes-support/libsoup/libsoup_3.4.2.bb b/poky/meta/recipes-support/libsoup/libsoup_3.4.4.bb
index 3996ae6836..6d382a7852 100644
--- a/poky/meta/recipes-support/libsoup/libsoup_3.4.2.bb
+++ b/poky/meta/recipes-support/libsoup/libsoup_3.4.4.bb
@@ -12,7 +12,7 @@ DEPENDS = "glib-2.0 glib-2.0-native libxml2 sqlite3 libpsl nghttp2"
SHRT_VER = "${@d.getVar('PV').split('.')[0]}.${@d.getVar('PV').split('.')[1]}"
SRC_URI = "${GNOME_MIRROR}/libsoup/${SHRT_VER}/libsoup-${PV}.tar.xz"
-SRC_URI[sha256sum] = "78c8fa37cb152d40ec8c4a148d6155e2f6947f3f1602a7cda3a31ad40f5ee2f3"
+SRC_URI[sha256sum] = "291c67725f36ed90ea43efff25064b69c5a2d1981488477c05c481a3b4b0c5aa"
PROVIDES = "libsoup-3.0"
CVE_PRODUCT = "libsoup"
diff --git a/poky/meta/recipes-support/shared-mime-info/shared-mime-info_git.bb b/poky/meta/recipes-support/shared-mime-info/shared-mime-info_2.4.bb
index 387dd7bbad..5ba4023609 100644
--- a/poky/meta/recipes-support/shared-mime-info/shared-mime-info_git.bb
+++ b/poky/meta/recipes-support/shared-mime-info/shared-mime-info_2.4.bb
@@ -9,8 +9,8 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
DEPENDS = "libxml2 itstool-native glib-2.0 shared-mime-info-native xmlto-native"
SRC_URI = "git://gitlab.freedesktop.org/xdg/shared-mime-info.git;protocol=https;branch=master"
-SRCREV = "13695c7225c2f525a435e72739c33ac32bbfbbb9"
-PV = "2.2"
+SRCREV = "9a6d6b8e963935f145f3a1ef446552de6996dada"
+
S = "${WORKDIR}/git"
inherit meson pkgconfig gettext python3native mime
diff --git a/poky/meta/recipes-support/sqlite/sqlite3_3.43.1.bb b/poky/meta/recipes-support/sqlite/sqlite3_3.44.0.bb
index 93146358c7..d498154889 100644
--- a/poky/meta/recipes-support/sqlite/sqlite3_3.43.1.bb
+++ b/poky/meta/recipes-support/sqlite/sqlite3_3.44.0.bb
@@ -4,7 +4,7 @@ LICENSE = "PD"
LIC_FILES_CHKSUM = "file://sqlite3.h;endline=11;md5=786d3dc581eff03f4fd9e4a77ed00c66"
SRC_URI = "http://www.sqlite.org/2023/sqlite-autoconf-${SQLITE_PV}.tar.gz"
-SRC_URI[sha256sum] = "39116c94e76630f22d54cd82c3cea308565f1715f716d1b2527f1c9c969ba4d9"
+SRC_URI[sha256sum] = "b9cd386e7cd22af6e0d2a0f06d0404951e1bef109e42ea06cc0450e10cd15550"
CVE_STATUS[CVE-2023-36191] = "disputed: The error is a bug. It has been fixed upstream. But it is not a vulnerability"
diff --git a/poky/meta/recipes-support/vim/vim.inc b/poky/meta/recipes-support/vim/vim.inc
index 5f55f590e6..a37310afd8 100644
--- a/poky/meta/recipes-support/vim/vim.inc
+++ b/poky/meta/recipes-support/vim/vim.inc
@@ -19,8 +19,8 @@ SRC_URI = "git://github.com/vim/vim.git;branch=master;protocol=https \
file://no-path-adjust.patch \
"
-PV .= ".1894"
-SRCREV = "e5f7cd0a60d0eeab84f7aeb35c13d3af7e50072e"
+PV .= ".2068"
+SRCREV = "9198c1f2b1ddecde22af918541e0de2a32f0f45a"
# Do not consider .z in x.y.z, as that is updated with every commit
UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+\.\d+)\.0"
@@ -40,22 +40,18 @@ do_configure () {
cd src
rm -f auto/*
touch auto/config.mk
+ # git timestamps aren't reliable, so touch the shipped .po files so they aren't regenerated
+ touch -c po/cs.cp1250.po po/ja.euc-jp.po po/ja.sjis.po po/ko.po po/pl.UTF-8.po po/pl.cp1250.po po/ru.cp1251.po po/sk.cp1250.po po/uk.cp1251.po po/zh_CN.po po/zh_CN.cp936.po po/zh_TW.po
+ # ru.cp1251.po uses CP1251 rather than cp1251, fix that
+ sed -i -e s/CP1251/cp1251/ po/ru.cp1251.po
aclocal
autoconf
cd ..
oe_runconf
touch src/auto/configure
touch src/auto/config.mk src/auto/config.h
-}
-
-do_compile() {
- # We do not support fully / correctly the following locales. Attempting
- # to use these with msgfmt in order to update the ".desktop" files exposes
- # this problem and leads to the compile failing.
- for LOCALE in cs fr ko pl sk zh_CN zh_TW;do
- echo -n > src/po/${LOCALE}.po
- done
- autotools_do_compile
+ # need a native tool, not a target one
+ ${BUILD_CC} src/po/sjiscorr.c -o src/po/sjiscorr
}
PACKAGECONFIG ??= "\
diff --git a/poky/meta/recipes-support/vte/vte_0.72.2.bb b/poky/meta/recipes-support/vte/vte_0.72.2.bb
index 4249b75ac0..44e71491f6 100644
--- a/poky/meta/recipes-support/vte/vte_0.72.2.bb
+++ b/poky/meta/recipes-support/vte/vte_0.72.2.bb
@@ -13,7 +13,6 @@ LIC_FILES_CHKSUM = " \
DEPENDS = "glib-2.0 glib-2.0-native gtk+3 libpcre2 libxml2-native gperf-native icu"
-GNOMEBASEBUILDCLASS = "meson"
GIR_MESON_OPTION = 'gir'
GIDOCGEN_MESON_OPTION = "docs"
diff --git a/poky/scripts/bitbake-whatchanged b/poky/scripts/bitbake-whatchanged
deleted file mode 100755
index cdb730dbdb..0000000000
--- a/poky/scripts/bitbake-whatchanged
+++ /dev/null
@@ -1,318 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2013 Wind River Systems, Inc.
-#
-# SPDX-License-Identifier: GPL-2.0-only
-#
-
-import os
-import sys
-import getopt
-import shutil
-import re
-import warnings
-import subprocess
-import argparse
-
-scripts_path = os.path.abspath(os.path.dirname(os.path.abspath(sys.argv[0])))
-lib_path = scripts_path + '/lib'
-sys.path = sys.path + [lib_path]
-
-import scriptpath
-
-# Figure out where is the bitbake/lib/bb since we need bb.siggen and bb.process
-bitbakepath = scriptpath.add_bitbake_lib_path()
-if not bitbakepath:
- sys.stderr.write("Unable to find bitbake by searching parent directory of this script or PATH\n")
- sys.exit(1)
-scriptpath.add_oe_lib_path()
-import argparse_oe
-
-import bb.siggen
-import bb.process
-
-# Match the stamp's filename
-# group(1): PE_PV (may no PE)
-# group(2): PR
-# group(3): TASK
-# group(4): HASH
-stamp_re = re.compile("(?P<pv>.*)-(?P<pr>r\d+)\.(?P<task>do_\w+)\.(?P<hash>[^\.]*)")
-sigdata_re = re.compile(".*\.sigdata\..*")
-
-def gen_dict(stamps):
- """
- Generate the dict from the stamps dir.
- The output dict format is:
- {fake_f: {pn: PN, pv: PV, pr: PR, task: TASK, path: PATH}}
- Where:
- fake_f: pv + task + hash
- path: the path to the stamp file
- """
- # The member of the sub dict (A "path" will be appended below)
- sub_mem = ("pv", "pr", "task")
- d = {}
- for dirpath, _, files in os.walk(stamps):
- for f in files:
- # The "bitbake -S" would generate ".sigdata", but no "_setscene".
- fake_f = re.sub('_setscene.', '.', f)
- fake_f = re.sub('.sigdata', '', fake_f)
- subdict = {}
- tmp = stamp_re.match(fake_f)
- if tmp:
- for i in sub_mem:
- subdict[i] = tmp.group(i)
- if len(subdict) != 0:
- pn = os.path.basename(dirpath)
- subdict['pn'] = pn
- # The path will be used by os.stat() and bb.siggen
- subdict['path'] = dirpath + "/" + f
- fake_f = tmp.group('pv') + tmp.group('task') + tmp.group('hash')
- d[fake_f] = subdict
- return d
-
-# Re-construct the dict
-def recon_dict(dict_in):
- """
- The output dict format is:
- {pn_task: {pv: PV, pr: PR, path: PATH}}
- """
- dict_out = {}
- for k in dict_in.keys():
- subdict = {}
- # The key
- pn_task = "%s_%s" % (dict_in.get(k).get('pn'), dict_in.get(k).get('task'))
- # If more than one stamps are found, use the latest one.
- if pn_task in dict_out:
- full_path_pre = dict_out.get(pn_task).get('path')
- full_path_cur = dict_in.get(k).get('path')
- if os.stat(full_path_pre).st_mtime > os.stat(full_path_cur).st_mtime:
- continue
- subdict['pv'] = dict_in.get(k).get('pv')
- subdict['pr'] = dict_in.get(k).get('pr')
- subdict['path'] = dict_in.get(k).get('path')
- dict_out[pn_task] = subdict
-
- return dict_out
-
-def split_pntask(s):
- """
- Split the pn_task in to (pn, task) and return it
- """
- tmp = re.match("(.*)_(do_.*)", s)
- return (tmp.group(1), tmp.group(2))
-
-
-def print_added(d_new = None, d_old = None):
- """
- Print the newly added tasks
- """
- added = {}
- for k in list(d_new.keys()):
- if k not in d_old:
- # Add the new one to added dict, and remove it from
- # d_new, so the remaining ones are the changed ones
- added[k] = d_new.get(k)
- del(d_new[k])
-
- if not added:
- return 0
-
- # Format the output, the dict format is:
- # {pn: task1, task2 ...}
- added_format = {}
- counter = 0
- for k in added.keys():
- pn, task = split_pntask(k)
- if pn in added_format:
- # Append the value
- added_format[pn] = "%s %s" % (added_format.get(pn), task)
- else:
- added_format[pn] = task
- counter += 1
- print("=== Newly added tasks: (%s tasks)" % counter)
- for k in added_format.keys():
- print(" %s: %s" % (k, added_format.get(k)))
-
- return counter
-
-def print_vrchanged(d_new = None, d_old = None, vr = None):
- """
- Print the pv or pr changed tasks.
- The arg "vr" is "pv" or "pr"
- """
- pvchanged = {}
- counter = 0
- for k in list(d_new.keys()):
- if d_new.get(k).get(vr) != d_old.get(k).get(vr):
- counter += 1
- pn, task = split_pntask(k)
- if pn not in pvchanged:
- # Format the output, we only print pn (no task) since
- # all the tasks would be changed when pn or pr changed,
- # the dict format is:
- # {pn: pv/pr_old -> pv/pr_new}
- pvchanged[pn] = "%s -> %s" % (d_old.get(k).get(vr), d_new.get(k).get(vr))
- del(d_new[k])
-
- if not pvchanged:
- return 0
-
- print("\n=== %s changed: (%s tasks)" % (vr.upper(), counter))
- for k in pvchanged.keys():
- print(" %s: %s" % (k, pvchanged.get(k)))
-
- return counter
-
-def print_depchanged(d_new = None, d_old = None, verbose = False):
- """
- Print the dependency changes
- """
- depchanged = {}
- counter = 0
- for k in d_new.keys():
- counter += 1
- pn, task = split_pntask(k)
- if (verbose):
- full_path_old = d_old.get(k).get("path")
- full_path_new = d_new.get(k).get("path")
- # No counter since it is not ready here
- if sigdata_re.match(full_path_old) and sigdata_re.match(full_path_new):
- output = bb.siggen.compare_sigfiles(full_path_old, full_path_new)
- if output:
- print("\n=== The verbose changes of %s.%s:" % (pn, task))
- print('\n'.join(output))
- else:
- # Format the output, the format is:
- # {pn: task1, task2, ...}
- if pn in depchanged:
- depchanged[pn] = "%s %s" % (depchanged.get(pn), task)
- else:
- depchanged[pn] = task
-
- if len(depchanged) > 0:
- print("\n=== Dependencies changed: (%s tasks)" % counter)
- for k in depchanged.keys():
- print(" %s: %s" % (k, depchanged[k]))
-
- return counter
-
-
-def main():
- """
- Print what will be done between the current and last builds:
- 1) Run "STAMPS_DIR=<path> bitbake -S recipe" to re-generate the stamps
- 2) Figure out what are newly added and changed, can't figure out
- what are removed since we can't know the previous stamps
- clearly, for example, if there are several builds, we can't know
- which stamps the last build has used exactly.
- 3) Use bb.siggen.compare_sigfiles to diff the old and new stamps
- """
-
- parser = argparse_oe.ArgumentParser(usage = """%(prog)s [options] [package ...]
-print what will be done between the current and last builds, for example:
-
- $ bitbake core-image-sato
- # Edit the recipes
- $ bitbake-whatchanged core-image-sato
-
-The changes will be printed.
-
-Note:
- The amount of tasks is not accurate when the task is "do_build" since
- it usually depends on other tasks.
- The "nostamp" task is not included.
-"""
-)
- parser.add_argument("recipe", help="recipe to check")
- parser.add_argument("-v", "--verbose", help = "print the verbose changes", action = "store_true")
- args = parser.parse_args()
-
- # Get the STAMPS_DIR
- print("Figuring out the STAMPS_DIR ...")
- cmdline = "bitbake -e | sed -ne 's/^STAMPS_DIR=\"\(.*\)\"/\\1/p'"
- try:
- stampsdir, err = bb.process.run(cmdline)
- except:
- raise
- if not stampsdir:
- print("ERROR: No STAMPS_DIR found for '%s'" % args.recipe, file=sys.stderr)
- return 2
- stampsdir = stampsdir.rstrip("\n")
- if not os.path.isdir(stampsdir):
- print("ERROR: stamps directory \"%s\" not found!" % stampsdir, file=sys.stderr)
- return 2
-
- # The new stamps dir
- new_stampsdir = stampsdir + ".bbs"
- if os.path.exists(new_stampsdir):
- print("ERROR: %s already exists!" % new_stampsdir, file=sys.stderr)
- return 2
-
- try:
- # Generate the new stamps dir
- print("Generating the new stamps ... (need several minutes)")
- cmdline = "STAMPS_DIR=%s bitbake -S none %s" % (new_stampsdir, args.recipe)
- # FIXME
- # The "bitbake -S" may fail, not fatal error, the stamps will still
- # be generated, this might be a bug of "bitbake -S".
- try:
- bb.process.run(cmdline)
- except Exception as exc:
- print(exc)
-
- # The dict for the new and old stamps.
- old_dict = gen_dict(stampsdir)
- new_dict = gen_dict(new_stampsdir)
-
- # Remove the same one from both stamps.
- cnt_unchanged = 0
- for k in list(new_dict.keys()):
- if k in old_dict:
- cnt_unchanged += 1
- del(new_dict[k])
- del(old_dict[k])
-
- # Re-construct the dict to easily find out what is added or changed.
- # The dict format is:
- # {pn_task: {pv: PV, pr: PR, path: PATH}}
- new_recon = recon_dict(new_dict)
- old_recon = recon_dict(old_dict)
-
- del new_dict
- del old_dict
-
- # Figure out what are changed, the new_recon would be changed
- # by the print_xxx function.
- # Newly added
- cnt_added = print_added(new_recon, old_recon)
-
- # PV (including PE) and PR changed
- # Let the bb.siggen handle them if verbose
- cnt_rv = {}
- if not args.verbose:
- for i in ('pv', 'pr'):
- cnt_rv[i] = print_vrchanged(new_recon, old_recon, i)
-
- # Dependencies changed (use bitbake-diffsigs)
- cnt_dep = print_depchanged(new_recon, old_recon, args.verbose)
-
- total_changed = cnt_added + (cnt_rv.get('pv') or 0) + (cnt_rv.get('pr') or 0) + cnt_dep
-
- print("\n=== Summary: (%s changed, %s unchanged)" % (total_changed, cnt_unchanged))
- if args.verbose:
- print("Newly added: %s\nDependencies changed: %s\n" % \
- (cnt_added, cnt_dep))
- else:
- print("Newly added: %s\nPV changed: %s\nPR changed: %s\nDependencies changed: %s\n" % \
- (cnt_added, cnt_rv.get('pv') or 0, cnt_rv.get('pr') or 0, cnt_dep))
- except:
- print("ERROR occurred!")
- raise
- finally:
- # Remove the newly generated stamps dir
- if os.path.exists(new_stampsdir):
- print("Removing the newly generated stamps dir ...")
- shutil.rmtree(new_stampsdir)
-
-if __name__ == "__main__":
- sys.exit(main())
diff --git a/poky/scripts/contrib/bb-perf/bb-matrix-plot.sh b/poky/scripts/contrib/bb-perf/bb-matrix-plot.sh
index e7bd129e9e..6672189c95 100755
--- a/poky/scripts/contrib/bb-perf/bb-matrix-plot.sh
+++ b/poky/scripts/contrib/bb-perf/bb-matrix-plot.sh
@@ -16,8 +16,8 @@
# Setup the defaults
DATFILE="bb-matrix.dat"
-XLABEL="BB_NUMBER_THREADS"
-YLABEL="PARALLEL_MAKE"
+XLABEL="BB\\\\_NUMBER\\\\_THREADS"
+YLABEL="PARALLEL\\\\_MAKE"
FIELD=3
DEF_TITLE="Elapsed Time (seconds)"
PM3D_FRAGMENT="unset surface; set pm3d at s hidden3d 100"
diff --git a/poky/scripts/contrib/patchreview.py b/poky/scripts/contrib/patchreview.py
index b22cc07f0a..bceae06561 100755
--- a/poky/scripts/contrib/patchreview.py
+++ b/poky/scripts/contrib/patchreview.py
@@ -5,6 +5,15 @@
# SPDX-License-Identifier: GPL-2.0-only
#
+import argparse
+import collections
+import json
+import os
+import os.path
+import pathlib
+import re
+import subprocess
+
# TODO
# - option to just list all broken files
# - test suite
@@ -35,14 +44,12 @@ def blame_patch(patch):
From a patch filename, return a list of "commit summary (author name <author
email>)" strings representing the history.
"""
- import subprocess
return subprocess.check_output(("git", "log",
"--follow", "--find-renames", "--diff-filter=A",
"--format=%s (%aN <%aE>)",
"--", patch)).decode("utf-8").splitlines()
-def patchreview(path, patches):
- import re, os.path
+def patchreview(patches):
# General pattern: start of line, optional whitespace, tag with optional
# hyphen or spaces, maybe a colon, some whitespace, then the value, all case
@@ -56,11 +63,10 @@ def patchreview(path, patches):
for patch in patches:
- fullpath = os.path.join(path, patch)
result = Result()
- results[fullpath] = result
+ results[patch] = result
- content = open(fullpath, encoding='ascii', errors='ignore').read()
+ content = open(patch, encoding='ascii', errors='ignore').read()
# Find the Signed-off-by tag
match = sob_re.search(content)
@@ -193,29 +199,56 @@ Patches in Pending state: %s""" % (total_patches,
def histogram(results):
from toolz import recipes, dicttoolz
import math
+
counts = recipes.countby(lambda r: r.upstream_status, results.values())
bars = dicttoolz.valmap(lambda v: "#" * int(math.ceil(float(v) / len(results) * 100)), counts)
for k in bars:
print("%-20s %s (%d)" % (k.capitalize() if k else "No status", bars[k], counts[k]))
+def find_layers(candidate):
+ # candidate can either be the path to a layer directly (eg meta-intel), or a
+ # repository that contains other layers (meta-arm). We can determine what by
+ # looking for a conf/layer.conf file. If that file exists then it's a layer,
+ # otherwise its a repository of layers and we can assume they're called
+ # meta-*.
+
+ if (candidate / "conf" / "layer.conf").exists():
+ return [candidate.absolute()]
+ else:
+ return [d.absolute() for d in candidate.iterdir() if d.is_dir() and (d.name == "meta" or d.name.startswith("meta-"))]
+
+# TODO these don't actually handle dynamic-layers/
+
+def gather_patches(layers):
+ patches = []
+ for directory in layers:
+ filenames = subprocess.check_output(("git", "-C", directory, "ls-files", "recipes-*/**/*.patch", "recipes-*/**/*.diff"), universal_newlines=True).split()
+ patches += [os.path.join(directory, f) for f in filenames]
+ return patches
+
+def count_recipes(layers):
+ count = 0
+ for directory in layers:
+ output = subprocess.check_output(["git", "-C", directory, "ls-files", "recipes-*/**/*.bb"], universal_newlines=True)
+ count += len(output.splitlines())
+ return count
if __name__ == "__main__":
- import argparse, subprocess, os
-
args = argparse.ArgumentParser(description="Patch Review Tool")
args.add_argument("-b", "--blame", action="store_true", help="show blame for malformed patches")
args.add_argument("-v", "--verbose", action="store_true", help="show per-patch results")
args.add_argument("-g", "--histogram", action="store_true", help="show patch histogram")
args.add_argument("-j", "--json", help="update JSON")
- args.add_argument("directory", help="directory to scan")
+ args.add_argument("directory", type=pathlib.Path, metavar="DIRECTORY", help="directory to scan (layer, or repository of layers)")
args = args.parse_args()
- patches = subprocess.check_output(("git", "-C", args.directory, "ls-files", "recipes-*/**/*.patch", "recipes-*/**/*.diff")).decode("utf-8").split()
- results = patchreview(args.directory, patches)
+ layers = find_layers(args.directory)
+ print(f"Found layers {' '.join((d.name for d in layers))}")
+ patches = gather_patches(layers)
+ results = patchreview(patches)
analyse(results, want_blame=args.blame, verbose=args.verbose)
if args.json:
- import json, os.path, collections
if os.path.isfile(args.json):
data = json.load(open(args.json))
else:
@@ -223,8 +256,11 @@ if __name__ == "__main__":
row = collections.Counter()
row["total"] = len(results)
- row["date"] = subprocess.check_output(["git", "-C", args.directory, "show", "-s", "--pretty=format:%cd", "--date=format:%s"]).decode("utf-8").strip()
- row["commit"] = subprocess.check_output(["git", "-C", args.directory, "show", "-s", "--pretty=format:%H"]).decode("utf-8").strip()
+ row["date"] = subprocess.check_output(["git", "-C", args.directory, "show", "-s", "--pretty=format:%cd", "--date=format:%s"], universal_newlines=True).strip()
+ row["commit"] = subprocess.check_output(["git", "-C", args.directory, "rev-parse", "HEAD"], universal_newlines=True).strip()
+ row['commit_count'] = subprocess.check_output(["git", "-C", args.directory, "rev-list", "--count", "HEAD"], universal_newlines=True).strip()
+ row['recipe_count'] = count_recipes(layers)
+
for r in results.values():
if r.upstream_status in status_values:
row[r.upstream_status] += 1
diff --git a/poky/scripts/esdk-tools/devtool b/poky/scripts/esdk-tools/devtool
new file mode 120000
index 0000000000..176a01ca68
--- /dev/null
+++ b/poky/scripts/esdk-tools/devtool
@@ -0,0 +1 @@
+../devtool \ No newline at end of file
diff --git a/poky/scripts/esdk-tools/oe-find-native-sysroot b/poky/scripts/esdk-tools/oe-find-native-sysroot
new file mode 120000
index 0000000000..d3493f3310
--- /dev/null
+++ b/poky/scripts/esdk-tools/oe-find-native-sysroot
@@ -0,0 +1 @@
+../oe-find-native-sysroot \ No newline at end of file
diff --git a/poky/scripts/esdk-tools/recipetool b/poky/scripts/esdk-tools/recipetool
new file mode 120000
index 0000000000..60a95dd936
--- /dev/null
+++ b/poky/scripts/esdk-tools/recipetool
@@ -0,0 +1 @@
+../recipetool \ No newline at end of file
diff --git a/poky/scripts/esdk-tools/runqemu b/poky/scripts/esdk-tools/runqemu
new file mode 120000
index 0000000000..ae7e7ad7c2
--- /dev/null
+++ b/poky/scripts/esdk-tools/runqemu
@@ -0,0 +1 @@
+../runqemu \ No newline at end of file
diff --git a/poky/scripts/esdk-tools/runqemu-addptable2image b/poky/scripts/esdk-tools/runqemu-addptable2image
new file mode 120000
index 0000000000..afcd00e79d
--- /dev/null
+++ b/poky/scripts/esdk-tools/runqemu-addptable2image
@@ -0,0 +1 @@
+../runqemu-addptable2image \ No newline at end of file
diff --git a/poky/scripts/esdk-tools/runqemu-export-rootfs b/poky/scripts/esdk-tools/runqemu-export-rootfs
new file mode 120000
index 0000000000..a26fcf6110
--- /dev/null
+++ b/poky/scripts/esdk-tools/runqemu-export-rootfs
@@ -0,0 +1 @@
+../runqemu-export-rootfs \ No newline at end of file
diff --git a/poky/scripts/esdk-tools/runqemu-extract-sdk b/poky/scripts/esdk-tools/runqemu-extract-sdk
new file mode 120000
index 0000000000..cc858aaad5
--- /dev/null
+++ b/poky/scripts/esdk-tools/runqemu-extract-sdk
@@ -0,0 +1 @@
+../runqemu-extract-sdk \ No newline at end of file
diff --git a/poky/scripts/esdk-tools/runqemu-gen-tapdevs b/poky/scripts/esdk-tools/runqemu-gen-tapdevs
new file mode 120000
index 0000000000..dbdf79134c
--- /dev/null
+++ b/poky/scripts/esdk-tools/runqemu-gen-tapdevs
@@ -0,0 +1 @@
+../runqemu-gen-tapdevs \ No newline at end of file
diff --git a/poky/scripts/esdk-tools/runqemu-ifdown b/poky/scripts/esdk-tools/runqemu-ifdown
new file mode 120000
index 0000000000..0097693ca3
--- /dev/null
+++ b/poky/scripts/esdk-tools/runqemu-ifdown
@@ -0,0 +1 @@
+../runqemu-ifdown \ No newline at end of file
diff --git a/poky/scripts/esdk-tools/runqemu-ifup b/poky/scripts/esdk-tools/runqemu-ifup
new file mode 120000
index 0000000000..41026d2c0a
--- /dev/null
+++ b/poky/scripts/esdk-tools/runqemu-ifup
@@ -0,0 +1 @@
+../runqemu-ifup \ No newline at end of file
diff --git a/poky/scripts/esdk-tools/wic b/poky/scripts/esdk-tools/wic
new file mode 120000
index 0000000000..a9d908aa25
--- /dev/null
+++ b/poky/scripts/esdk-tools/wic
@@ -0,0 +1 @@
+../wic \ No newline at end of file
diff --git a/poky/scripts/lib/checklayer/__init__.py b/poky/scripts/lib/checklayer/__init__.py
index 0a0db2f02a..8271ed7fe3 100644
--- a/poky/scripts/lib/checklayer/__init__.py
+++ b/poky/scripts/lib/checklayer/__init__.py
@@ -307,7 +307,7 @@ def get_signatures(builddir, failsafe=False, machine=None, extravars=None):
cmd += 'bitbake '
if failsafe:
cmd += '-k '
- cmd += '-S none world'
+ cmd += '-S lockedsigs world'
sigs_file = os.path.join(builddir, 'locked-sigs.inc')
if os.path.exists(sigs_file):
os.unlink(sigs_file)
diff --git a/poky/scripts/lib/recipetool/create.py b/poky/scripts/lib/recipetool/create.py
index 143bc63e9d..293198d1c8 100644
--- a/poky/scripts/lib/recipetool/create.py
+++ b/poky/scripts/lib/recipetool/create.py
@@ -1212,7 +1212,7 @@ def guess_license(srctree, d):
licenses = []
licspecs = ['*LICEN[CS]E*', 'COPYING*', '*[Ll]icense*', 'LEGAL*', '[Ll]egal*', '*GPL*', 'README.lic*', 'COPYRIGHT*', '[Cc]opyright*', 'e[dp]l-v10']
- skip_extensions = (".html", ".js", ".json", ".svg", ".ts")
+ skip_extensions = (".html", ".js", ".json", ".svg", ".ts", ".go")
licfiles = []
for root, dirs, files in os.walk(srctree):
for fn in files:
diff --git a/poky/scripts/lib/recipetool/create_buildsys_python.py b/poky/scripts/lib/recipetool/create_buildsys_python.py
index 92468b2254..9312e4abf1 100644
--- a/poky/scripts/lib/recipetool/create_buildsys_python.py
+++ b/poky/scripts/lib/recipetool/create_buildsys_python.py
@@ -37,63 +37,8 @@ class PythonRecipeHandler(RecipeHandler):
assume_provided = ['builtins', 'os.path']
# Assumes that the host python3 builtin_module_names is sane for target too
assume_provided = assume_provided + list(sys.builtin_module_names)
+ excluded_fields = []
- bbvar_map = {
- 'Name': 'PN',
- 'Version': 'PV',
- 'Home-page': 'HOMEPAGE',
- 'Summary': 'SUMMARY',
- 'Description': 'DESCRIPTION',
- 'License': 'LICENSE',
- 'Requires': 'RDEPENDS:${PN}',
- 'Provides': 'RPROVIDES:${PN}',
- 'Obsoletes': 'RREPLACES:${PN}',
- }
- # PN/PV are already set by recipetool core & desc can be extremely long
- excluded_fields = [
- 'Description',
- ]
- setup_parse_map = {
- 'Url': 'Home-page',
- 'Classifiers': 'Classifier',
- 'Description': 'Summary',
- }
- setuparg_map = {
- 'Home-page': 'url',
- 'Classifier': 'classifiers',
- 'Summary': 'description',
- 'Description': 'long-description',
- }
- # Values which are lists, used by the setup.py argument based metadata
- # extraction method, to determine how to process the setup.py output.
- setuparg_list_fields = [
- 'Classifier',
- 'Requires',
- 'Provides',
- 'Obsoletes',
- 'Platform',
- 'Supported-Platform',
- ]
- setuparg_multi_line_values = ['Description']
- replacements = [
- ('License', r' +$', ''),
- ('License', r'^ +', ''),
- ('License', r' ', '-'),
- ('License', r'^GNU-', ''),
- ('License', r'-[Ll]icen[cs]e(,?-[Vv]ersion)?', ''),
- ('License', r'^UNKNOWN$', ''),
-
- # Remove currently unhandled version numbers from these variables
- ('Requires', r' *\([^)]*\)', ''),
- ('Provides', r' *\([^)]*\)', ''),
- ('Obsoletes', r' *\([^)]*\)', ''),
- ('Install-requires', r'^([^><= ]+).*', r'\1'),
- ('Extras-require', r'^([^><= ]+).*', r'\1'),
- ('Tests-require', r'^([^><= ]+).*', r'\1'),
-
- # Remove unhandled dependency on particular features (e.g. foo[PDF])
- ('Install-requires', r'\[[^\]]+\]$', ''),
- ]
classifier_license_map = {
'License :: OSI Approved :: Academic Free License (AFL)': 'AFL',
@@ -166,7 +111,398 @@ class PythonRecipeHandler(RecipeHandler):
def __init__(self):
pass
+ def handle_classifier_license(self, classifiers, existing_licenses=""):
+
+ licenses = []
+ for classifier in classifiers:
+ if classifier in self.classifier_license_map:
+ license = self.classifier_license_map[classifier]
+ if license == 'Apache' and 'Apache-2.0' in existing_licenses:
+ license = 'Apache-2.0'
+ elif license == 'GPL':
+ if 'GPL-2.0' in existing_licenses or 'GPLv2' in existing_licenses:
+ license = 'GPL-2.0'
+ elif 'GPL-3.0' in existing_licenses or 'GPLv3' in existing_licenses:
+ license = 'GPL-3.0'
+ elif license == 'LGPL':
+ if 'LGPL-2.1' in existing_licenses or 'LGPLv2.1' in existing_licenses:
+ license = 'LGPL-2.1'
+ elif 'LGPL-2.0' in existing_licenses or 'LGPLv2' in existing_licenses:
+ license = 'LGPL-2.0'
+ elif 'LGPL-3.0' in existing_licenses or 'LGPLv3' in existing_licenses:
+ license = 'LGPL-3.0'
+ licenses.append(license)
+
+ if licenses:
+ return ' & '.join(licenses)
+
+ return None
+
+ def map_info_to_bbvar(self, info, extravalues):
+
+ # Map PKG-INFO & setup.py fields to bitbake variables
+ for field, values in info.items():
+ if field in self.excluded_fields:
+ continue
+
+ if field not in self.bbvar_map:
+ continue
+
+ if isinstance(values, str):
+ value = values
+ else:
+ value = ' '.join(str(v) for v in values if v)
+
+ bbvar = self.bbvar_map[field]
+ if bbvar == "PN":
+ # by convention python recipes start with "python3-"
+ if not value.startswith('python'):
+ value = 'python3-' + value
+
+ if bbvar not in extravalues and value:
+ extravalues[bbvar] = value
+
+ def apply_info_replacements(self, info):
+ if not self.replacements:
+ return
+
+ for variable, search, replace in self.replacements:
+ if variable not in info:
+ continue
+
+ def replace_value(search, replace, value):
+ if replace is None:
+ if re.search(search, value):
+ return None
+ else:
+ new_value = re.sub(search, replace, value)
+ if value != new_value:
+ return new_value
+ return value
+
+ value = info[variable]
+ if isinstance(value, str):
+ new_value = replace_value(search, replace, value)
+ if new_value is None:
+ del info[variable]
+ elif new_value != value:
+ info[variable] = new_value
+ elif hasattr(value, 'items'):
+ for dkey, dvalue in list(value.items()):
+ new_list = []
+ for pos, a_value in enumerate(dvalue):
+ new_value = replace_value(search, replace, a_value)
+ if new_value is not None and new_value != value:
+ new_list.append(new_value)
+
+ if value != new_list:
+ value[dkey] = new_list
+ else:
+ new_list = []
+ for pos, a_value in enumerate(value):
+ new_value = replace_value(search, replace, a_value)
+ if new_value is not None and new_value != value:
+ new_list.append(new_value)
+
+ if value != new_list:
+ info[variable] = new_list
+
+
+ def scan_python_dependencies(self, paths):
+ deps = set()
+ try:
+ dep_output = self.run_command(['pythondeps', '-d'] + paths)
+ except (OSError, subprocess.CalledProcessError):
+ pass
+ else:
+ for line in dep_output.splitlines():
+ line = line.rstrip()
+ dep, filename = line.split('\t', 1)
+ if filename.endswith('/setup.py'):
+ continue
+ deps.add(dep)
+
+ try:
+ provides_output = self.run_command(['pythondeps', '-p'] + paths)
+ except (OSError, subprocess.CalledProcessError):
+ pass
+ else:
+ provides_lines = (l.rstrip() for l in provides_output.splitlines())
+ provides = set(l for l in provides_lines if l and l != 'setup')
+ deps -= provides
+
+ return deps
+
+ def parse_pkgdata_for_python_packages(self):
+ pkgdata_dir = tinfoil.config_data.getVar('PKGDATA_DIR')
+
+ ldata = tinfoil.config_data.createCopy()
+ bb.parse.handle('classes-recipe/python3-dir.bbclass', ldata, True)
+ python_sitedir = ldata.getVar('PYTHON_SITEPACKAGES_DIR')
+
+ dynload_dir = os.path.join(os.path.dirname(python_sitedir), 'lib-dynload')
+ python_dirs = [python_sitedir + os.sep,
+ os.path.join(os.path.dirname(python_sitedir), 'dist-packages') + os.sep,
+ os.path.dirname(python_sitedir) + os.sep]
+ packages = {}
+ for pkgdatafile in glob.glob('{}/runtime/*'.format(pkgdata_dir)):
+ files_info = None
+ with open(pkgdatafile, 'r') as f:
+ for line in f.readlines():
+ field, value = line.split(': ', 1)
+ if field.startswith('FILES_INFO'):
+ files_info = ast.literal_eval(value)
+ break
+ else:
+ continue
+
+ for fn in files_info:
+ for suffix in importlib.machinery.all_suffixes():
+ if fn.endswith(suffix):
+ break
+ else:
+ continue
+
+ if fn.startswith(dynload_dir + os.sep):
+ if '/.debug/' in fn:
+ continue
+ base = os.path.basename(fn)
+ provided = base.split('.', 1)[0]
+ packages[provided] = os.path.basename(pkgdatafile)
+ continue
+
+ for python_dir in python_dirs:
+ if fn.startswith(python_dir):
+ relpath = fn[len(python_dir):]
+ relstart, _, relremaining = relpath.partition(os.sep)
+ if relstart.endswith('.egg'):
+ relpath = relremaining
+ base, _ = os.path.splitext(relpath)
+
+ if '/.debug/' in base:
+ continue
+ if os.path.basename(base) == '__init__':
+ base = os.path.dirname(base)
+ base = base.replace(os.sep + os.sep, os.sep)
+ provided = base.replace(os.sep, '.')
+ packages[provided] = os.path.basename(pkgdatafile)
+ return packages
+
+ @classmethod
+ def run_command(cls, cmd, **popenargs):
+ if 'stderr' not in popenargs:
+ popenargs['stderr'] = subprocess.STDOUT
+ try:
+ return subprocess.check_output(cmd, **popenargs).decode('utf-8')
+ except OSError as exc:
+ logger.error('Unable to run `{}`: {}', ' '.join(cmd), exc)
+ raise
+ except subprocess.CalledProcessError as exc:
+ logger.error('Unable to run `{}`: {}', ' '.join(cmd), exc.output)
+ raise
+
+class PythonSetupPyRecipeHandler(PythonRecipeHandler):
+ bbvar_map = {
+ 'Name': 'PN',
+ 'Version': 'PV',
+ 'Home-page': 'HOMEPAGE',
+ 'Summary': 'SUMMARY',
+ 'Description': 'DESCRIPTION',
+ 'License': 'LICENSE',
+ 'Requires': 'RDEPENDS:${PN}',
+ 'Provides': 'RPROVIDES:${PN}',
+ 'Obsoletes': 'RREPLACES:${PN}',
+ }
+ # PN/PV are already set by recipetool core & desc can be extremely long
+ excluded_fields = [
+ 'Description',
+ ]
+ setup_parse_map = {
+ 'Url': 'Home-page',
+ 'Classifiers': 'Classifier',
+ 'Description': 'Summary',
+ }
+ setuparg_map = {
+ 'Home-page': 'url',
+ 'Classifier': 'classifiers',
+ 'Summary': 'description',
+ 'Description': 'long-description',
+ }
+ # Values which are lists, used by the setup.py argument based metadata
+ # extraction method, to determine how to process the setup.py output.
+ setuparg_list_fields = [
+ 'Classifier',
+ 'Requires',
+ 'Provides',
+ 'Obsoletes',
+ 'Platform',
+ 'Supported-Platform',
+ ]
+ setuparg_multi_line_values = ['Description']
+
+ replacements = [
+ ('License', r' +$', ''),
+ ('License', r'^ +', ''),
+ ('License', r' ', '-'),
+ ('License', r'^GNU-', ''),
+ ('License', r'-[Ll]icen[cs]e(,?-[Vv]ersion)?', ''),
+ ('License', r'^UNKNOWN$', ''),
+
+ # Remove currently unhandled version numbers from these variables
+ ('Requires', r' *\([^)]*\)', ''),
+ ('Provides', r' *\([^)]*\)', ''),
+ ('Obsoletes', r' *\([^)]*\)', ''),
+ ('Install-requires', r'^([^><= ]+).*', r'\1'),
+ ('Extras-require', r'^([^><= ]+).*', r'\1'),
+ ('Tests-require', r'^([^><= ]+).*', r'\1'),
+
+ # Remove unhandled dependency on particular features (e.g. foo[PDF])
+ ('Install-requires', r'\[[^\]]+\]$', ''),
+ ]
+
+ def __init__(self):
+ pass
+
+ def parse_setup_py(self, setupscript='./setup.py'):
+ with codecs.open(setupscript) as f:
+ info, imported_modules, non_literals, extensions = gather_setup_info(f)
+
+ def _map(key):
+ key = key.replace('_', '-')
+ key = key[0].upper() + key[1:]
+ if key in self.setup_parse_map:
+ key = self.setup_parse_map[key]
+ return key
+
+ # Naive mapping of setup() arguments to PKG-INFO field names
+ for d in [info, non_literals]:
+ for key, value in list(d.items()):
+ if key is None:
+ continue
+ new_key = _map(key)
+ if new_key != key:
+ del d[key]
+ d[new_key] = value
+
+ return info, 'setuptools' in imported_modules, non_literals, extensions
+
+ def get_setup_args_info(self, setupscript='./setup.py'):
+ cmd = ['python3', setupscript]
+ info = {}
+ keys = set(self.bbvar_map.keys())
+ keys |= set(self.setuparg_list_fields)
+ keys |= set(self.setuparg_multi_line_values)
+ grouped_keys = itertools.groupby(keys, lambda k: (k in self.setuparg_list_fields, k in self.setuparg_multi_line_values))
+ for index, keys in grouped_keys:
+ if index == (True, False):
+ # Splitlines output for each arg as a list value
+ for key in keys:
+ arg = self.setuparg_map.get(key, key.lower())
+ try:
+ arg_info = self.run_command(cmd + ['--' + arg], cwd=os.path.dirname(setupscript))
+ except (OSError, subprocess.CalledProcessError):
+ pass
+ else:
+ info[key] = [l.rstrip() for l in arg_info.splitlines()]
+ elif index == (False, True):
+ # Entire output for each arg
+ for key in keys:
+ arg = self.setuparg_map.get(key, key.lower())
+ try:
+ arg_info = self.run_command(cmd + ['--' + arg], cwd=os.path.dirname(setupscript))
+ except (OSError, subprocess.CalledProcessError):
+ pass
+ else:
+ info[key] = arg_info
+ else:
+ info.update(self.get_setup_byline(list(keys), setupscript))
+ return info
+
+ def get_setup_byline(self, fields, setupscript='./setup.py'):
+ info = {}
+
+ cmd = ['python3', setupscript]
+ cmd.extend('--' + self.setuparg_map.get(f, f.lower()) for f in fields)
+ try:
+ info_lines = self.run_command(cmd, cwd=os.path.dirname(setupscript)).splitlines()
+ except (OSError, subprocess.CalledProcessError):
+ pass
+ else:
+ if len(fields) != len(info_lines):
+ logger.error('Mismatch between setup.py output lines and number of fields')
+ sys.exit(1)
+
+ for lineno, line in enumerate(info_lines):
+ line = line.rstrip()
+ info[fields[lineno]] = line
+ return info
+
+ def get_pkginfo(self, pkginfo_fn):
+ msg = email.message_from_file(open(pkginfo_fn, 'r'))
+ msginfo = {}
+ for field in msg.keys():
+ values = msg.get_all(field)
+ if len(values) == 1:
+ msginfo[field] = values[0]
+ else:
+ msginfo[field] = values
+ return msginfo
+
+ def scan_setup_python_deps(self, srctree, setup_info, setup_non_literals):
+ if 'Package-dir' in setup_info:
+ package_dir = setup_info['Package-dir']
+ else:
+ package_dir = {}
+
+ dist = setuptools.Distribution()
+
+ class PackageDir(setuptools.command.build_py.build_py):
+ def __init__(self, package_dir):
+ self.package_dir = package_dir
+ self.dist = dist
+ super().__init__(self.dist)
+
+ pd = PackageDir(package_dir)
+ to_scan = []
+ if not any(v in setup_non_literals for v in ['Py-modules', 'Scripts', 'Packages']):
+ if 'Py-modules' in setup_info:
+ for module in setup_info['Py-modules']:
+ try:
+ package, module = module.rsplit('.', 1)
+ except ValueError:
+ package, module = '.', module
+ module_path = os.path.join(pd.get_package_dir(package), module + '.py')
+ to_scan.append(module_path)
+
+ if 'Packages' in setup_info:
+ for package in setup_info['Packages']:
+ to_scan.append(pd.get_package_dir(package))
+
+ if 'Scripts' in setup_info:
+ to_scan.extend(setup_info['Scripts'])
+ else:
+ logger.info("Scanning the entire source tree, as one or more of the following setup keywords are non-literal: py_modules, scripts, packages.")
+
+ if not to_scan:
+ to_scan = ['.']
+
+ logger.info("Scanning paths for packages & dependencies: %s", ', '.join(to_scan))
+
+ provided_packages = self.parse_pkgdata_for_python_packages()
+ scanned_deps = self.scan_python_dependencies([os.path.join(srctree, p) for p in to_scan])
+ mapped_deps, unmapped_deps = set(self.base_pkgdeps), set()
+ for dep in scanned_deps:
+ mapped = provided_packages.get(dep)
+ if mapped:
+ logger.debug('Mapped %s to %s' % (dep, mapped))
+ mapped_deps.add(mapped)
+ else:
+ logger.debug('Could not map %s' % dep)
+ unmapped_deps.add(dep)
+ return mapped_deps, unmapped_deps
+
def process(self, srctree, classes, lines_before, lines_after, handled, extravalues):
+
if 'buildsystem' in handled:
return False
@@ -254,51 +590,16 @@ class PythonRecipeHandler(RecipeHandler):
if license_str:
for i, line in enumerate(lines_before):
- if line.startswith('LICENSE = '):
+ if line.startswith('##LICENSE_PLACEHOLDER##'):
lines_before.insert(i, '# NOTE: License in setup.py/PKGINFO is: %s' % license_str)
break
if 'Classifier' in info:
- existing_licenses = info.get('License', '')
- licenses = []
- for classifier in info['Classifier']:
- if classifier in self.classifier_license_map:
- license = self.classifier_license_map[classifier]
- if license == 'Apache' and 'Apache-2.0' in existing_licenses:
- license = 'Apache-2.0'
- elif license == 'GPL':
- if 'GPL-2.0' in existing_licenses or 'GPLv2' in existing_licenses:
- license = 'GPL-2.0'
- elif 'GPL-3.0' in existing_licenses or 'GPLv3' in existing_licenses:
- license = 'GPL-3.0'
- elif license == 'LGPL':
- if 'LGPL-2.1' in existing_licenses or 'LGPLv2.1' in existing_licenses:
- license = 'LGPL-2.1'
- elif 'LGPL-2.0' in existing_licenses or 'LGPLv2' in existing_licenses:
- license = 'LGPL-2.0'
- elif 'LGPL-3.0' in existing_licenses or 'LGPLv3' in existing_licenses:
- license = 'LGPL-3.0'
- licenses.append(license)
-
- if licenses:
- info['License'] = ' & '.join(licenses)
-
- # Map PKG-INFO & setup.py fields to bitbake variables
- for field, values in info.items():
- if field in self.excluded_fields:
- continue
-
- if field not in self.bbvar_map:
- continue
+ license = self.handle_classifier_license(info['Classifier'], info.get('License', ''))
+ if license:
+ info['License'] = license
- if isinstance(values, str):
- value = values
- else:
- value = ' '.join(str(v) for v in values if v)
-
- bbvar = self.bbvar_map[field]
- if bbvar not in extravalues and value:
- extravalues[bbvar] = value
+ self.map_info_to_bbvar(info, extravalues)
mapped_deps, unmapped_deps = self.scan_setup_python_deps(srctree, setup_info, setup_non_literals)
@@ -355,278 +656,272 @@ class PythonRecipeHandler(RecipeHandler):
handled.append('buildsystem')
- def get_pkginfo(self, pkginfo_fn):
- msg = email.message_from_file(open(pkginfo_fn, 'r'))
- msginfo = {}
- for field in msg.keys():
- values = msg.get_all(field)
- if len(values) == 1:
- msginfo[field] = values[0]
- else:
- msginfo[field] = values
- return msginfo
+class PythonPyprojectTomlRecipeHandler(PythonRecipeHandler):
+ """Base class to support PEP517 and PEP518
+
+ PEP517 https://peps.python.org/pep-0517/#source-trees
+ PEP518 https://peps.python.org/pep-0518/#build-system-table
+ """
+ # bitbake currently supports the 4 following backends
+ build_backend_map = {
+ "setuptools.build_meta": "python_setuptools_build_meta",
+ "poetry.core.masonry.api": "python_poetry_core",
+ "flit_core.buildapi": "python_flit_core",
+ "hatchling.build": "python_hatchling",
+ }
- def parse_setup_py(self, setupscript='./setup.py'):
- with codecs.open(setupscript) as f:
- info, imported_modules, non_literals, extensions = gather_setup_info(f)
+ # setuptools.build_meta and flit declare project metadata into the "project" section of pyproject.toml
+ # according to PEP-621: https://packaging.python.org/en/latest/specifications/declaring-project-metadata/#declaring-project-metadata
+ # while poetry uses the "tool.poetry" section according to its official documentation: https://python-poetry.org/docs/pyproject/
+ # keys from "project" and "tool.poetry" sections are almost the same except for the HOMEPAGE which is "homepage" for tool.poetry
+ # and "Homepage" for "project" section. So keep both
+ bbvar_map = {
+ "name": "PN",
+ "version": "PV",
+ "Homepage": "HOMEPAGE",
+ "homepage": "HOMEPAGE",
+ "description": "SUMMARY",
+ "license": "LICENSE",
+ "dependencies": "RDEPENDS:${PN}",
+ "requires": "DEPENDS",
+ }
- def _map(key):
- key = key.replace('_', '-')
- key = key[0].upper() + key[1:]
- if key in self.setup_parse_map:
- key = self.setup_parse_map[key]
- return key
+ replacements = [
+ ("license", r" +$", ""),
+ ("license", r"^ +", ""),
+ ("license", r" ", "-"),
+ ("license", r"^GNU-", ""),
+ ("license", r"-[Ll]icen[cs]e(,?-[Vv]ersion)?", ""),
+ ("license", r"^UNKNOWN$", ""),
+ # Remove currently unhandled version numbers from these variables
+ ("requires", r"\[[^\]]+\]$", ""),
+ ("requires", r"^([^><= ]+).*", r"\1"),
+ ("dependencies", r"\[[^\]]+\]$", ""),
+ ("dependencies", r"^([^><= ]+).*", r"\1"),
+ ]
- # Naive mapping of setup() arguments to PKG-INFO field names
- for d in [info, non_literals]:
- for key, value in list(d.items()):
- if key is None:
- continue
- new_key = _map(key)
- if new_key != key:
- del d[key]
- d[new_key] = value
+ excluded_native_pkgdeps = [
+ # already provided by python_setuptools_build_meta.bbclass
+ "python3-setuptools-native",
+ "python3-wheel-native",
+ # already provided by python_poetry_core.bbclass
+ "python3-poetry-core-native",
+ # already provided by python_flit_core.bbclass
+ "python3-flit-core-native",
+ ]
- return info, 'setuptools' in imported_modules, non_literals, extensions
+ # add here a list of known and often used packages and the corresponding bitbake package
+ known_deps_map = {
+ "setuptools": "python3-setuptools",
+ "wheel": "python3-wheel",
+ "poetry-core": "python3-poetry-core",
+ "flit_core": "python3-flit-core",
+ "setuptools-scm": "python3-setuptools-scm",
+ "hatchling": "python3-hatchling",
+ "hatch-vcs": "python3-hatch-vcs",
+ }
- def get_setup_args_info(self, setupscript='./setup.py'):
- cmd = ['python3', setupscript]
- info = {}
- keys = set(self.bbvar_map.keys())
- keys |= set(self.setuparg_list_fields)
- keys |= set(self.setuparg_multi_line_values)
- grouped_keys = itertools.groupby(keys, lambda k: (k in self.setuparg_list_fields, k in self.setuparg_multi_line_values))
- for index, keys in grouped_keys:
- if index == (True, False):
- # Splitlines output for each arg as a list value
- for key in keys:
- arg = self.setuparg_map.get(key, key.lower())
- try:
- arg_info = self.run_command(cmd + ['--' + arg], cwd=os.path.dirname(setupscript))
- except (OSError, subprocess.CalledProcessError):
- pass
- else:
- info[key] = [l.rstrip() for l in arg_info.splitlines()]
- elif index == (False, True):
- # Entire output for each arg
- for key in keys:
- arg = self.setuparg_map.get(key, key.lower())
- try:
- arg_info = self.run_command(cmd + ['--' + arg], cwd=os.path.dirname(setupscript))
- except (OSError, subprocess.CalledProcessError):
- pass
- else:
- info[key] = arg_info
- else:
- info.update(self.get_setup_byline(list(keys), setupscript))
- return info
+ def __init__(self):
+ pass
- def get_setup_byline(self, fields, setupscript='./setup.py'):
+ def process(self, srctree, classes, lines_before, lines_after, handled, extravalues):
info = {}
- cmd = ['python3', setupscript]
- cmd.extend('--' + self.setuparg_map.get(f, f.lower()) for f in fields)
- try:
- info_lines = self.run_command(cmd, cwd=os.path.dirname(setupscript)).splitlines()
- except (OSError, subprocess.CalledProcessError):
- pass
- else:
- if len(fields) != len(info_lines):
- logger.error('Mismatch between setup.py output lines and number of fields')
- sys.exit(1)
-
- for lineno, line in enumerate(info_lines):
- line = line.rstrip()
- info[fields[lineno]] = line
- return info
-
- def apply_info_replacements(self, info):
- for variable, search, replace in self.replacements:
- if variable not in info:
- continue
-
- def replace_value(search, replace, value):
- if replace is None:
- if re.search(search, value):
- return None
- else:
- new_value = re.sub(search, replace, value)
- if value != new_value:
- return new_value
- return value
-
- value = info[variable]
- if isinstance(value, str):
- new_value = replace_value(search, replace, value)
- if new_value is None:
- del info[variable]
- elif new_value != value:
- info[variable] = new_value
- elif hasattr(value, 'items'):
- for dkey, dvalue in list(value.items()):
- new_list = []
- for pos, a_value in enumerate(dvalue):
- new_value = replace_value(search, replace, a_value)
- if new_value is not None and new_value != value:
- new_list.append(new_value)
-
- if value != new_list:
- value[dkey] = new_list
- else:
- new_list = []
- for pos, a_value in enumerate(value):
- new_value = replace_value(search, replace, a_value)
- if new_value is not None and new_value != value:
- new_list.append(new_value)
-
- if value != new_list:
- info[variable] = new_list
-
- def scan_setup_python_deps(self, srctree, setup_info, setup_non_literals):
- if 'Package-dir' in setup_info:
- package_dir = setup_info['Package-dir']
- else:
- package_dir = {}
-
- dist = setuptools.Distribution()
-
- class PackageDir(setuptools.command.build_py.build_py):
- def __init__(self, package_dir):
- self.package_dir = package_dir
- self.dist = dist
- super().__init__(self.dist)
-
- pd = PackageDir(package_dir)
- to_scan = []
- if not any(v in setup_non_literals for v in ['Py-modules', 'Scripts', 'Packages']):
- if 'Py-modules' in setup_info:
- for module in setup_info['Py-modules']:
- try:
- package, module = module.rsplit('.', 1)
- except ValueError:
- package, module = '.', module
- module_path = os.path.join(pd.get_package_dir(package), module + '.py')
- to_scan.append(module_path)
-
- if 'Packages' in setup_info:
- for package in setup_info['Packages']:
- to_scan.append(pd.get_package_dir(package))
+ if 'buildsystem' in handled:
+ return False
- if 'Scripts' in setup_info:
- to_scan.extend(setup_info['Scripts'])
+ # Check for non-zero size setup.py files
+ setupfiles = RecipeHandler.checkfiles(srctree, ["pyproject.toml"])
+ for fn in setupfiles:
+ if os.path.getsize(fn):
+ break
else:
- logger.info("Scanning the entire source tree, as one or more of the following setup keywords are non-literal: py_modules, scripts, packages.")
-
- if not to_scan:
- to_scan = ['.']
-
- logger.info("Scanning paths for packages & dependencies: %s", ', '.join(to_scan))
+ return False
- provided_packages = self.parse_pkgdata_for_python_packages()
- scanned_deps = self.scan_python_dependencies([os.path.join(srctree, p) for p in to_scan])
- mapped_deps, unmapped_deps = set(self.base_pkgdeps), set()
- for dep in scanned_deps:
- mapped = provided_packages.get(dep)
- if mapped:
- logger.debug('Mapped %s to %s' % (dep, mapped))
- mapped_deps.add(mapped)
- else:
- logger.debug('Could not map %s' % dep)
- unmapped_deps.add(dep)
- return mapped_deps, unmapped_deps
+ setupscript = os.path.join(srctree, "pyproject.toml")
- def scan_python_dependencies(self, paths):
- deps = set()
try:
- dep_output = self.run_command(['pythondeps', '-d'] + paths)
- except (OSError, subprocess.CalledProcessError):
- pass
- else:
- for line in dep_output.splitlines():
- line = line.rstrip()
- dep, filename = line.split('\t', 1)
- if filename.endswith('/setup.py'):
- continue
- deps.add(dep)
+ try:
+ import tomllib
+ except ImportError:
+ try:
+ import tomli as tomllib
+ except ImportError:
+ logger.exception("Neither 'tomllib' nor 'tomli' could be imported. Please use python3.11 or above or install tomli module")
+ return False
+ except Exception:
+ logger.exception("Failed to parse pyproject.toml")
+ return False
+
+ with open(setupscript, "rb") as f:
+ config = tomllib.load(f)
+ build_backend = config["build-system"]["build-backend"]
+ if build_backend in self.build_backend_map:
+ classes.append(self.build_backend_map[build_backend])
+ else:
+ logger.error(
+ "Unsupported build-backend: %s, cannot use pyproject.toml. Will try to use legacy setup.py"
+ % build_backend
+ )
+ return False
- try:
- provides_output = self.run_command(['pythondeps', '-p'] + paths)
- except (OSError, subprocess.CalledProcessError):
- pass
- else:
- provides_lines = (l.rstrip() for l in provides_output.splitlines())
- provides = set(l for l in provides_lines if l and l != 'setup')
- deps -= provides
+ licfile = ""
- return deps
+ if build_backend == "poetry.core.masonry.api":
+ if "tool" in config and "poetry" in config["tool"]:
+ metadata = config["tool"]["poetry"]
+ else:
+ if "project" in config:
+ metadata = config["project"]
+
+ if metadata:
+ for field, values in metadata.items():
+ if field == "license":
+ # For setuptools.build_meta and flit, licence is a table
+ # but for poetry licence is a string
+ # for hatchling, both table (jsonschema) and string (iniconfig) have been used
+ if build_backend == "poetry.core.masonry.api":
+ value = values
+ else:
+ value = values.get("text", "")
+ if not value:
+ licfile = values.get("file", "")
+ continue
+ elif field == "dependencies" and build_backend == "poetry.core.masonry.api":
+ # For poetry backend, "dependencies" section looks like:
+ # [tool.poetry.dependencies]
+ # requests = "^2.13.0"
+ # requests = { version = "^2.13.0", source = "private" }
+ # See https://python-poetry.org/docs/master/pyproject/#dependencies-and-dependency-groups for more details
+ # This class doesn't handle versions anyway, so we just get the dependencies name here and construct a list
+ value = []
+ for k in values.keys():
+ value.append(k)
+ elif isinstance(values, dict):
+ for k, v in values.items():
+ info[k] = v
+ continue
+ else:
+ value = values
- def parse_pkgdata_for_python_packages(self):
- pkgdata_dir = tinfoil.config_data.getVar('PKGDATA_DIR')
+ info[field] = value
- ldata = tinfoil.config_data.createCopy()
- bb.parse.handle('classes-recipe/python3-dir.bbclass', ldata, True)
- python_sitedir = ldata.getVar('PYTHON_SITEPACKAGES_DIR')
+ # Grab the license value before applying replacements
+ license_str = info.get("license", "").strip()
- dynload_dir = os.path.join(os.path.dirname(python_sitedir), 'lib-dynload')
- python_dirs = [python_sitedir + os.sep,
- os.path.join(os.path.dirname(python_sitedir), 'dist-packages') + os.sep,
- os.path.dirname(python_sitedir) + os.sep]
- packages = {}
- for pkgdatafile in glob.glob('{}/runtime/*'.format(pkgdata_dir)):
- files_info = None
- with open(pkgdatafile, 'r') as f:
- for line in f.readlines():
- field, value = line.split(': ', 1)
- if field.startswith('FILES_INFO'):
- files_info = ast.literal_eval(value)
+ if license_str:
+ for i, line in enumerate(lines_before):
+ if line.startswith("##LICENSE_PLACEHOLDER##"):
+ lines_before.insert(
+ i, "# NOTE: License in pyproject.toml is: %s" % license_str
+ )
break
- else:
- continue
- for fn in files_info:
- for suffix in importlib.machinery.all_suffixes():
- if fn.endswith(suffix):
- break
- else:
- continue
+ info["requires"] = config["build-system"]["requires"]
+
+ self.apply_info_replacements(info)
+
+ if "classifiers" in info:
+ license = self.handle_classifier_license(
+ info["classifiers"], info.get("license", "")
+ )
+ if license:
+ if licfile:
+ lines = []
+ md5value = bb.utils.md5_file(os.path.join(srctree, licfile))
+ lines.append('LICENSE = "%s"' % license)
+ lines.append(
+ 'LIC_FILES_CHKSUM = "file://%s;md5=%s"'
+ % (licfile, md5value)
+ )
+ lines.append("")
+
+ # Replace the placeholder so we get the values in the right place in the recipe file
+ try:
+ pos = lines_before.index("##LICENSE_PLACEHOLDER##")
+ except ValueError:
+ pos = -1
+ if pos == -1:
+ lines_before.extend(lines)
+ else:
+ lines_before[pos : pos + 1] = lines
- if fn.startswith(dynload_dir + os.sep):
- if '/.debug/' in fn:
- continue
- base = os.path.basename(fn)
- provided = base.split('.', 1)[0]
- packages[provided] = os.path.basename(pkgdatafile)
- continue
+ handled.append(("license", [license, licfile, md5value]))
+ else:
+ info["license"] = license
- for python_dir in python_dirs:
- if fn.startswith(python_dir):
- relpath = fn[len(python_dir):]
- relstart, _, relremaining = relpath.partition(os.sep)
- if relstart.endswith('.egg'):
- relpath = relremaining
- base, _ = os.path.splitext(relpath)
+ provided_packages = self.parse_pkgdata_for_python_packages()
+ provided_packages.update(self.known_deps_map)
+ native_mapped_deps, native_unmapped_deps = set(), set()
+ mapped_deps, unmapped_deps = set(), set()
- if '/.debug/' in base:
- continue
- if os.path.basename(base) == '__init__':
- base = os.path.dirname(base)
- base = base.replace(os.sep + os.sep, os.sep)
- provided = base.replace(os.sep, '.')
- packages[provided] = os.path.basename(pkgdatafile)
- return packages
+ if "requires" in info:
+ for require in info["requires"]:
+ mapped = provided_packages.get(require)
- @classmethod
- def run_command(cls, cmd, **popenargs):
- if 'stderr' not in popenargs:
- popenargs['stderr'] = subprocess.STDOUT
- try:
- return subprocess.check_output(cmd, **popenargs).decode('utf-8')
- except OSError as exc:
- logger.error('Unable to run `{}`: {}', ' '.join(cmd), exc)
- raise
- except subprocess.CalledProcessError as exc:
- logger.error('Unable to run `{}`: {}', ' '.join(cmd), exc.output)
- raise
+ if mapped:
+ logger.debug("Mapped %s to %s" % (require, mapped))
+ native_mapped_deps.add(mapped)
+ else:
+ logger.debug("Could not map %s" % require)
+ native_unmapped_deps.add(require)
+
+ info.pop("requires")
+
+ if native_mapped_deps != set():
+ native_mapped_deps = {
+ item + "-native" for item in native_mapped_deps
+ }
+ native_mapped_deps -= set(self.excluded_native_pkgdeps)
+ if native_mapped_deps != set():
+ info["requires"] = " ".join(sorted(native_mapped_deps))
+
+ if native_unmapped_deps:
+ lines_after.append("")
+ lines_after.append(
+ "# WARNING: We were unable to map the following python package/module"
+ )
+ lines_after.append(
+ "# dependencies to the bitbake packages which include them:"
+ )
+ lines_after.extend(
+ "# {}".format(d) for d in sorted(native_unmapped_deps)
+ )
+
+ if "dependencies" in info:
+ for dependency in info["dependencies"]:
+ mapped = provided_packages.get(dependency)
+ if mapped:
+ logger.debug("Mapped %s to %s" % (dependency, mapped))
+ mapped_deps.add(mapped)
+ else:
+ logger.debug("Could not map %s" % dependency)
+ unmapped_deps.add(dependency)
+
+ info.pop("dependencies")
+
+ if mapped_deps != set():
+ if mapped_deps != set():
+ info["dependencies"] = " ".join(sorted(mapped_deps))
+
+ if unmapped_deps:
+ lines_after.append("")
+ lines_after.append(
+ "# WARNING: We were unable to map the following python package/module"
+ )
+ lines_after.append(
+ "# runtime dependencies to the bitbake packages which include them:"
+ )
+ lines_after.extend(
+ "# {}".format(d) for d in sorted(unmapped_deps)
+ )
+
+ self.map_info_to_bbvar(info, extravalues)
+
+ handled.append("buildsystem")
+ except Exception:
+ logger.exception("Failed to correctly handle pyproject.toml, falling back to another method")
+ return False
def gather_setup_info(fileobj):
@@ -742,5 +1037,7 @@ def has_non_literals(value):
def register_recipe_handlers(handlers):
- # We need to make sure this is ahead of the makefile fallback handler
- handlers.append((PythonRecipeHandler(), 70))
+ # We need to make sure these are ahead of the makefile fallback handler
+ # and the pyproject.toml handler ahead of the setup.py handler
+ handlers.append((PythonPyprojectTomlRecipeHandler(), 75))
+ handlers.append((PythonSetupPyRecipeHandler(), 70))
diff --git a/poky/scripts/lib/recipetool/create_go.py b/poky/scripts/lib/recipetool/create_go.py
new file mode 100644
index 0000000000..21dcb41271
--- /dev/null
+++ b/poky/scripts/lib/recipetool/create_go.py
@@ -0,0 +1,751 @@
+# Recipe creation tool - go support plugin
+#
+# The code is based on golang internals. See the afftected
+# methods for further reference and information.
+#
+# Copyright (C) 2023 Weidmueller GmbH & Co KG
+# Author: Lukas Funke <lukas.funke@weidmueller.com>
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+
+from collections import namedtuple
+from enum import Enum
+from html.parser import HTMLParser
+from recipetool.create import RecipeHandler, handle_license_vars
+from recipetool.create import guess_license, tidy_licenses, fixup_license
+from recipetool.create import determine_from_url
+from urllib.error import URLError
+
+import bb.utils
+import json
+import logging
+import os
+import re
+import subprocess
+import sys
+import shutil
+import tempfile
+import urllib.parse
+import urllib.request
+
+
+GoImport = namedtuple('GoImport', 'root vcs url suffix')
+logger = logging.getLogger('recipetool')
+CodeRepo = namedtuple(
+ 'CodeRepo', 'path codeRoot codeDir pathMajor pathPrefix pseudoMajor')
+
+tinfoil = None
+
+# Regular expression to parse pseudo semantic version
+# see https://go.dev/ref/mod#pseudo-versions
+re_pseudo_semver = re.compile(
+ r"^v[0-9]+\.(0\.0-|\d+\.\d+-([^+]*\.)?0\.)(?P<utc>\d{14})-(?P<commithash>[A-Za-z0-9]+)(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$")
+# Regular expression to parse semantic version
+re_semver = re.compile(
+ r"^v(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$")
+
+
+def tinfoil_init(instance):
+ global tinfoil
+ tinfoil = instance
+
+
+class GoRecipeHandler(RecipeHandler):
+ """Class to handle the go recipe creation"""
+
+ @staticmethod
+ def __ensure_go():
+ """Check if the 'go' command is available in the recipes"""
+ recipe = "go-native"
+ if not tinfoil.recipes_parsed:
+ tinfoil.parse_recipes()
+ try:
+ rd = tinfoil.parse_recipe(recipe)
+ except bb.providers.NoProvider:
+ bb.error(
+ "Nothing provides '%s' which is required for the build" % (recipe))
+ bb.note(
+ "You will likely need to add a layer that provides '%s'" % (recipe))
+ return None
+
+ bindir = rd.getVar('STAGING_BINDIR_NATIVE')
+ gopath = os.path.join(bindir, 'go')
+
+ if not os.path.exists(gopath):
+ tinfoil.build_targets(recipe, 'addto_recipe_sysroot')
+
+ if not os.path.exists(gopath):
+ logger.error(
+ '%s required to process specified source, but %s did not seem to populate it' % 'go', recipe)
+ return None
+
+ return bindir
+
+ def __resolve_repository_static(self, modulepath):
+ """Resolve the repository in a static manner
+
+ The method is based on the go implementation of
+ `repoRootFromVCSPaths` in
+ https://github.com/golang/go/blob/master/src/cmd/go/internal/vcs/vcs.go
+ """
+
+ url = urllib.parse.urlparse("https://" + modulepath)
+ req = urllib.request.Request(url.geturl())
+
+ try:
+ resp = urllib.request.urlopen(req)
+ # Some modulepath are just redirects to github (or some other vcs
+ # hoster). Therefore, we check if this modulepath redirects to
+ # somewhere else
+ if resp.geturl() != url.geturl():
+ bb.debug(1, "%s is redirectred to %s" %
+ (url.geturl(), resp.geturl()))
+ url = urllib.parse.urlparse(resp.geturl())
+ modulepath = url.netloc + url.path
+
+ except URLError as url_err:
+ # This is probably because the module path
+ # contains the subdir and major path. Thus,
+ # we ignore this error for now
+ logger.debug(
+ 1, "Failed to fetch page from [%s]: %s" % (url, str(url_err)))
+
+ host, _, _ = modulepath.partition('/')
+
+ class vcs(Enum):
+ pathprefix = "pathprefix"
+ regexp = "regexp"
+ type = "type"
+ repo = "repo"
+ check = "check"
+ schemelessRepo = "schemelessRepo"
+
+ # GitHub
+ vcsGitHub = {}
+ vcsGitHub[vcs.pathprefix] = "github.com"
+ vcsGitHub[vcs.regexp] = re.compile(
+ r'^(?P<root>github\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/(?P<suffix>[A-Za-z0-9_.\-]+))*$')
+ vcsGitHub[vcs.type] = "git"
+ vcsGitHub[vcs.repo] = "https://\\g<root>"
+
+ # Bitbucket
+ vcsBitbucket = {}
+ vcsBitbucket[vcs.pathprefix] = "bitbucket.org"
+ vcsBitbucket[vcs.regexp] = re.compile(
+ r'^(?P<root>bitbucket\.org/(?P<bitname>[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+))(/(?P<suffix>[A-Za-z0-9_.\-]+))*$')
+ vcsBitbucket[vcs.type] = "git"
+ vcsBitbucket[vcs.repo] = "https://\\g<root>"
+
+ # IBM DevOps Services (JazzHub)
+ vcsIBMDevOps = {}
+ vcsIBMDevOps[vcs.pathprefix] = "hub.jazz.net/git"
+ vcsIBMDevOps[vcs.regexp] = re.compile(
+ r'^(?P<root>hub\.jazz\.net/git/[a-z0-9]+/[A-Za-z0-9_.\-]+)(/(?P<suffix>[A-Za-z0-9_.\-]+))*$')
+ vcsIBMDevOps[vcs.type] = "git"
+ vcsIBMDevOps[vcs.repo] = "https://\\g<root>"
+
+ # Git at Apache
+ vcsApacheGit = {}
+ vcsApacheGit[vcs.pathprefix] = "git.apache.org"
+ vcsApacheGit[vcs.regexp] = re.compile(
+ r'^(?P<root>git\.apache\.org/[a-z0-9_.\-]+\.git)(/(?P<suffix>[A-Za-z0-9_.\-]+))*$')
+ vcsApacheGit[vcs.type] = "git"
+ vcsApacheGit[vcs.repo] = "https://\\g<root>"
+
+ # Git at OpenStack
+ vcsOpenStackGit = {}
+ vcsOpenStackGit[vcs.pathprefix] = "git.openstack.org"
+ vcsOpenStackGit[vcs.regexp] = re.compile(
+ r'^(?P<root>git\.openstack\.org/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(\.git)?(/(?P<suffix>[A-Za-z0-9_.\-]+))*$')
+ vcsOpenStackGit[vcs.type] = "git"
+ vcsOpenStackGit[vcs.repo] = "https://\\g<root>"
+
+ # chiselapp.com for fossil
+ vcsChiselapp = {}
+ vcsChiselapp[vcs.pathprefix] = "chiselapp.com"
+ vcsChiselapp[vcs.regexp] = re.compile(
+ r'^(?P<root>chiselapp\.com/user/[A-Za-z0-9]+/repository/[A-Za-z0-9_.\-]+)$')
+ vcsChiselapp[vcs.type] = "fossil"
+ vcsChiselapp[vcs.repo] = "https://\\g<root>"
+
+ # General syntax for any server.
+ # Must be last.
+ vcsGeneralServer = {}
+ vcsGeneralServer[vcs.regexp] = re.compile(
+ "(?P<root>(?P<repo>([a-z0-9.\\-]+\\.)+[a-z0-9.\\-]+(:[0-9]+)?(/~?[A-Za-z0-9_.\\-]+)+?)\\.(?P<vcs>bzr|fossil|git|hg|svn))(/~?(?P<suffix>[A-Za-z0-9_.\\-]+))*$")
+ vcsGeneralServer[vcs.schemelessRepo] = True
+
+ vcsPaths = [vcsGitHub, vcsBitbucket, vcsIBMDevOps,
+ vcsApacheGit, vcsOpenStackGit, vcsChiselapp,
+ vcsGeneralServer]
+
+ if modulepath.startswith("example.net") or modulepath == "rsc.io":
+ logger.warning("Suspicious module path %s" % modulepath)
+ return None
+ if modulepath.startswith("http:") or modulepath.startswith("https:"):
+ logger.warning("Import path should not start with %s %s" %
+ ("http", "https"))
+ return None
+
+ rootpath = None
+ vcstype = None
+ repourl = None
+ suffix = None
+
+ for srv in vcsPaths:
+ m = srv[vcs.regexp].match(modulepath)
+ if vcs.pathprefix in srv:
+ if host == srv[vcs.pathprefix]:
+ rootpath = m.group('root')
+ vcstype = srv[vcs.type]
+ repourl = m.expand(srv[vcs.repo])
+ suffix = m.group('suffix')
+ break
+ elif m and srv[vcs.schemelessRepo]:
+ rootpath = m.group('root')
+ vcstype = m[vcs.type]
+ repourl = m[vcs.repo]
+ suffix = m.group('suffix')
+ break
+
+ return GoImport(rootpath, vcstype, repourl, suffix)
+
+ def __resolve_repository_dynamic(self, modulepath):
+ """Resolve the repository root in a dynamic manner.
+
+ The method is based on the go implementation of
+ `repoRootForImportDynamic` in
+ https://github.com/golang/go/blob/master/src/cmd/go/internal/vcs/vcs.go
+ """
+ url = urllib.parse.urlparse("https://" + modulepath)
+
+ class GoImportHTMLParser(HTMLParser):
+
+ def __init__(self):
+ super().__init__()
+ self.__srv = []
+
+ def handle_starttag(self, tag, attrs):
+ if tag == 'meta' and list(
+ filter(lambda a: (a[0] == 'name' and a[1] == 'go-import'), attrs)):
+ content = list(
+ filter(lambda a: (a[0] == 'content'), attrs))
+ if content:
+ self.__srv = content[0][1].split()
+
+ @property
+ def import_prefix(self):
+ return self.__srv[0] if len(self.__srv) else None
+
+ @property
+ def vcs(self):
+ return self.__srv[1] if len(self.__srv) else None
+
+ @property
+ def repourl(self):
+ return self.__srv[2] if len(self.__srv) else None
+
+ url = url.geturl() + "?go-get=1"
+ req = urllib.request.Request(url)
+
+ try:
+ resp = urllib.request.urlopen(req)
+
+ except URLError as url_err:
+ logger.warning(
+ "Failed to fetch page from [%s]: %s", url, str(url_err))
+ return None
+
+ parser = GoImportHTMLParser()
+ parser.feed(resp.read().decode('utf-8'))
+ parser.close()
+
+ return GoImport(parser.import_prefix, parser.vcs, parser.repourl, None)
+
+ def __resolve_from_golang_proxy(self, modulepath, version):
+ """
+ Resolves repository data from golang proxy
+ """
+ url = urllib.parse.urlparse("https://proxy.golang.org/"
+ + modulepath
+ + "/@v/"
+ + version
+ + ".info")
+
+ # Transform url to lower case, golang proxy doesn't like mixed case
+ req = urllib.request.Request(url.geturl().lower())
+
+ try:
+ resp = urllib.request.urlopen(req)
+ except URLError as url_err:
+ logger.warning(
+ "Failed to fetch page from [%s]: %s", url, str(url_err))
+ return None
+
+ golang_proxy_res = resp.read().decode('utf-8')
+ modinfo = json.loads(golang_proxy_res)
+
+ if modinfo and 'Origin' in modinfo:
+ origin = modinfo['Origin']
+ _root_url = urllib.parse.urlparse(origin['URL'])
+
+ # We normalize the repo URL since we don't want the scheme in it
+ _subdir = origin['Subdir'] if 'Subdir' in origin else None
+ _root, _, _ = self.__split_path_version(modulepath)
+ if _subdir:
+ _root = _root[:-len(_subdir)].strip('/')
+
+ _commit = origin['Hash']
+ _vcs = origin['VCS']
+ return (GoImport(_root, _vcs, _root_url.geturl(), None), _commit)
+
+ return None
+
+ def __resolve_repository(self, modulepath):
+ """
+ Resolves src uri from go module-path
+ """
+ repodata = self.__resolve_repository_static(modulepath)
+ if not repodata or not repodata.url:
+ repodata = self.__resolve_repository_dynamic(modulepath)
+ if not repodata or not repodata.url:
+ logger.error(
+ "Could not resolve repository for module path '%s'" % modulepath)
+ # There is no way to recover from this
+ sys.exit(14)
+ if repodata:
+ logger.debug(1, "Resolved download path for import '%s' => %s" % (
+ modulepath, repodata.url))
+ return repodata
+
+ def __split_path_version(self, path):
+ i = len(path)
+ dot = False
+ for j in range(i, 0, -1):
+ if path[j - 1] < '0' or path[j - 1] > '9':
+ break
+ if path[j - 1] == '.':
+ dot = True
+ break
+ i = j - 1
+
+ if i <= 1 or i == len(
+ path) or path[i - 1] != 'v' or path[i - 2] != '/':
+ return path, "", True
+
+ prefix, pathMajor = path[:i - 2], path[i - 2:]
+ if dot or len(
+ pathMajor) <= 2 or pathMajor[2] == '0' or pathMajor == "/v1":
+ return path, "", False
+
+ return prefix, pathMajor, True
+
+ def __get_path_major(self, pathMajor):
+ if not pathMajor:
+ return ""
+
+ if pathMajor[0] != '/' and pathMajor[0] != '.':
+ logger.error(
+ "pathMajor suffix %s passed to PathMajorPrefix lacks separator", pathMajor)
+
+ if pathMajor.startswith(".v") and pathMajor.endswith("-unstable"):
+ pathMajor = pathMajor[:len("-unstable") - 2]
+
+ return pathMajor[1:]
+
+ def __build_coderepo(self, repo, path):
+ codedir = ""
+ pathprefix, pathMajor, _ = self.__split_path_version(path)
+ if repo.root == path:
+ pathprefix = path
+ elif path.startswith(repo.root):
+ codedir = pathprefix[len(repo.root):].strip('/')
+
+ pseudoMajor = self.__get_path_major(pathMajor)
+
+ logger.debug("root='%s', codedir='%s', prefix='%s', pathMajor='%s', pseudoMajor='%s'",
+ repo.root, codedir, pathprefix, pathMajor, pseudoMajor)
+
+ return CodeRepo(path, repo.root, codedir,
+ pathMajor, pathprefix, pseudoMajor)
+
+ def __resolve_version(self, repo, path, version):
+ hash = None
+ coderoot = self.__build_coderepo(repo, path)
+
+ def vcs_fetch_all():
+ tmpdir = tempfile.mkdtemp()
+ clone_cmd = "%s clone --bare %s %s" % ('git', repo.url, tmpdir)
+ bb.process.run(clone_cmd)
+ log_cmd = "git log --all --pretty='%H %d' --decorate=short"
+ output, _ = bb.process.run(
+ log_cmd, shell=True, stderr=subprocess.PIPE, cwd=tmpdir)
+ bb.utils.prunedir(tmpdir)
+ return output.strip().split('\n')
+
+ def vcs_fetch_remote(tag):
+ # add * to grab ^{}
+ refs = {}
+ ls_remote_cmd = "git ls-remote -q --tags {} {}*".format(
+ repo.url, tag)
+ output, _ = bb.process.run(ls_remote_cmd)
+ output = output.strip().split('\n')
+ for line in output:
+ f = line.split(maxsplit=1)
+ if len(f) != 2:
+ continue
+
+ for prefix in ["HEAD", "refs/heads/", "refs/tags/"]:
+ if f[1].startswith(prefix):
+ refs[f[1][len(prefix):]] = f[0]
+
+ for key, hash in refs.items():
+ if key.endswith(r"^{}"):
+ refs[key.strip(r"^{}")] = hash
+
+ return refs[tag]
+
+ m_pseudo_semver = re_pseudo_semver.match(version)
+
+ if m_pseudo_semver:
+ remote_refs = vcs_fetch_all()
+ short_commit = m_pseudo_semver.group('commithash')
+ for l in remote_refs:
+ r = l.split(maxsplit=1)
+ sha1 = r[0] if len(r) else None
+ if not sha1:
+ logger.error(
+ "Ups: could not resolve abbref commit for %s" % short_commit)
+
+ elif sha1.startswith(short_commit):
+ hash = sha1
+ break
+ else:
+ m_semver = re_semver.match(version)
+ if m_semver:
+
+ def get_sha1_remote(re):
+ rsha1 = None
+ for line in remote_refs:
+ # Split lines of the following format:
+ # 22e90d9b964610628c10f673ca5f85b8c2a2ca9a (tag: sometag)
+ lineparts = line.split(maxsplit=1)
+ sha1 = lineparts[0] if len(lineparts) else None
+ refstring = lineparts[1] if len(
+ lineparts) == 2 else None
+ if refstring:
+ # Normalize tag string and split in case of multiple
+ # regs e.g. (tag: speech/v1.10.0, tag: orchestration/v1.5.0 ...)
+ refs = refstring.strip('(), ').split(',')
+ for ref in refs:
+ if re.match(ref.strip()):
+ rsha1 = sha1
+ return rsha1
+
+ semver = "v" + m_semver.group('major') + "."\
+ + m_semver.group('minor') + "."\
+ + m_semver.group('patch') \
+ + (("-" + m_semver.group('prerelease'))
+ if m_semver.group('prerelease') else "")
+
+ tag = os.path.join(
+ coderoot.codeDir, semver) if coderoot.codeDir else semver
+
+ # probe tag using 'ls-remote', which is faster than fetching
+ # complete history
+ hash = vcs_fetch_remote(tag)
+ if not hash:
+ # backup: fetch complete history
+ remote_refs = vcs_fetch_all()
+ hash = get_sha1_remote(
+ re.compile(fr"(tag:|HEAD ->) ({tag})"))
+
+ logger.debug(
+ "Resolving commit for tag '%s' -> '%s'", tag, hash)
+ return hash
+
+ def __generate_srcuri_inline_fcn(self, path, version, replaces=None):
+ """Generate SRC_URI functions for go imports"""
+
+ logger.info("Resolving repository for module %s", path)
+ # First try to resolve repo and commit from golang proxy
+ # Most info is already there and we don't have to go through the
+ # repository or even perform the version resolve magic
+ golang_proxy_info = self.__resolve_from_golang_proxy(path, version)
+ if golang_proxy_info:
+ repo = golang_proxy_info[0]
+ commit = golang_proxy_info[1]
+ else:
+ # Fallback
+ # Resolve repository by 'hand'
+ repo = self.__resolve_repository(path)
+ commit = self.__resolve_version(repo, path, version)
+
+ url = urllib.parse.urlparse(repo.url)
+ repo_url = url.netloc + url.path
+
+ coderoot = self.__build_coderepo(repo, path)
+
+ inline_fcn = "${@go_src_uri("
+ inline_fcn += f"'{repo_url}','{version}'"
+ if repo_url != path:
+ inline_fcn += f",path='{path}'"
+ if coderoot.codeDir:
+ inline_fcn += f",subdir='{coderoot.codeDir}'"
+ if repo.vcs != 'git':
+ inline_fcn += f",vcs='{repo.vcs}'"
+ if replaces:
+ inline_fcn += f",replaces='{replaces}'"
+ if coderoot.pathMajor:
+ inline_fcn += f",pathmajor='{coderoot.pathMajor}'"
+ inline_fcn += ")}"
+
+ return inline_fcn, commit
+
+ def __go_handle_dependencies(self, go_mod, localfilesdir, extravalues, d):
+
+ src_uris = []
+ src_revs = []
+
+ def generate_src_rev(path, version, commithash):
+ src_rev = f"# {path}@{version} => {commithash}\n"
+ # Ups...maybe someone manipulated the source repository and the
+ # version or commit could not be resolved. This is a sign of
+ # a) the supply chain was manipulated (bad)
+ # b) the implementation for the version resolving didn't work
+ # anymore (less bad)
+ if not commithash:
+ src_rev += f"#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
+ src_rev += f"#!!! Could not resolve version !!!\n"
+ src_rev += f"#!!! Possible supply chain attack !!!\n"
+ src_rev += f"#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
+ src_rev += f"SRCREV_{path.replace('/', '.')} = \"{commithash}\""
+
+ return src_rev
+
+ for require in go_mod['Require']:
+ path = require['Path']
+ version = require['Version']
+
+ inline_fcn, commithash = self.__generate_srcuri_inline_fcn(
+ path, version)
+ src_uris.append(inline_fcn)
+ src_revs.append(generate_src_rev(path, version, commithash))
+
+ if go_mod['Replace']:
+ for replacement in go_mod['Replace']:
+ oldpath = replacement['Old']['Path']
+ path = replacement['New']['Path']
+ version = replacement['New']['Version']
+
+ inline_fcn, commithash = self.__generate_srcuri_inline_fcn(
+ path, version, oldpath)
+ src_uris.append(inline_fcn)
+ src_revs.append(generate_src_rev(path, version, commithash))
+
+ pn, _ = determine_from_url(go_mod['Module']['Path'])
+ go_mods_basename = "%s-modules.inc" % pn
+
+ go_mods_filename = os.path.join(localfilesdir, go_mods_basename)
+ with open(go_mods_filename, "w") as f:
+ # We introduce this indirection to make the tests a little easier
+ f.write("SRC_URI += \"${GO_DEPENDENCIES_SRC_URI}\"\n")
+ f.write("GO_DEPENDENCIES_SRC_URI = \"\\\n")
+ for uri in src_uris:
+ f.write(" " + uri + " \\\n")
+ f.write("\"\n\n")
+ for rev in src_revs:
+ f.write(rev + "\n")
+
+ extravalues['extrafiles'][go_mods_basename] = go_mods_filename
+
+ def __go_run_cmd(self, cmd, cwd, d):
+ return bb.process.run(cmd, env=dict(os.environ, PATH=d.getVar('PATH')),
+ shell=True, cwd=cwd)
+
+ def __go_native_version(self, d):
+ stdout, _ = self.__go_run_cmd("go version", None, d)
+ m = re.match(r".*\sgo((\d+).(\d+).(\d+))\s([\w\/]*)", stdout)
+ major = int(m.group(2))
+ minor = int(m.group(3))
+ patch = int(m.group(4))
+
+ return major, minor, patch
+
+ def __go_mod_patch(self, srctree, localfilesdir, extravalues, d):
+
+ patchfilename = "go.mod.patch"
+ go_native_version_major, go_native_version_minor, _ = self.__go_native_version(
+ d)
+ self.__go_run_cmd("go mod tidy -go=%d.%d" %
+ (go_native_version_major, go_native_version_minor), srctree, d)
+ stdout, _ = self.__go_run_cmd("go mod edit -json", srctree, d)
+
+ # Create patch in order to upgrade go version
+ self.__go_run_cmd("git diff go.mod > %s" % (patchfilename), srctree, d)
+ # Restore original state
+ self.__go_run_cmd("git checkout HEAD go.mod go.sum", srctree, d)
+
+ go_mod = json.loads(stdout)
+ tmpfile = os.path.join(localfilesdir, patchfilename)
+ shutil.move(os.path.join(srctree, patchfilename), tmpfile)
+
+ extravalues['extrafiles'][patchfilename] = tmpfile
+
+ return go_mod, patchfilename
+
+ def __go_mod_vendor(self, go_mod, srctree, localfilesdir, extravalues, d):
+ # Perform vendoring to retrieve the correct modules.txt
+ tmp_vendor_dir = tempfile.mkdtemp()
+
+ # -v causes to go to print modules.txt to stderr
+ _, stderr = self.__go_run_cmd(
+ "go mod vendor -v -o %s" % (tmp_vendor_dir), srctree, d)
+
+ modules_txt_basename = "modules.txt"
+ modules_txt_filename = os.path.join(localfilesdir, modules_txt_basename)
+ with open(modules_txt_filename, "w") as f:
+ f.write(stderr)
+
+ extravalues['extrafiles'][modules_txt_basename] = modules_txt_filename
+
+ licenses = []
+ lic_files_chksum = []
+ licvalues = guess_license(tmp_vendor_dir, d)
+ shutil.rmtree(tmp_vendor_dir)
+
+ if licvalues:
+ for licvalue in licvalues:
+ license = licvalue[0]
+ lics = tidy_licenses(fixup_license(license))
+ lics = [lic for lic in lics if lic not in licenses]
+ if len(lics):
+ licenses.extend(lics)
+ lic_files_chksum.append(
+ 'file://src/${GO_IMPORT}/vendor/%s;md5=%s' % (licvalue[1], licvalue[2]))
+
+ pn, _ = determine_from_url(go_mod['Module']['Path'])
+ licenses_basename = "%s-licenses.inc" % pn
+
+ licenses_filename = os.path.join(localfilesdir, licenses_basename)
+ with open(licenses_filename, "w") as f:
+ f.write("GO_MOD_LICENSES = \"%s\"\n\n" %
+ ' & '.join(sorted(licenses, key=str.casefold)))
+ # We introduce this indirection to make the tests a little easier
+ f.write("LIC_FILES_CHKSUM += \"${VENDORED_LIC_FILES_CHKSUM}\"\n")
+ f.write("VENDORED_LIC_FILES_CHKSUM = \"\\\n")
+ for lic in lic_files_chksum:
+ f.write(" " + lic + " \\\n")
+ f.write("\"\n")
+
+ extravalues['extrafiles'][licenses_basename] = licenses_filename
+
+ def process(self, srctree, classes, lines_before,
+ lines_after, handled, extravalues):
+
+ if 'buildsystem' in handled:
+ return False
+
+ files = RecipeHandler.checkfiles(srctree, ['go.mod'])
+ if not files:
+ return False
+
+ d = bb.data.createCopy(tinfoil.config_data)
+ go_bindir = self.__ensure_go()
+ if not go_bindir:
+ sys.exit(14)
+
+ d.prependVar('PATH', '%s:' % go_bindir)
+ handled.append('buildsystem')
+ classes.append("go-vendor")
+
+ stdout, _ = self.__go_run_cmd("go mod edit -json", srctree, d)
+
+ go_mod = json.loads(stdout)
+ go_import = go_mod['Module']['Path']
+ go_version_match = re.match("([0-9]+).([0-9]+)", go_mod['Go'])
+ go_version_major = int(go_version_match.group(1))
+ go_version_minor = int(go_version_match.group(2))
+ src_uris = []
+
+ localfilesdir = tempfile.mkdtemp(prefix='recipetool-go-')
+ extravalues.setdefault('extrafiles', {})
+ # go.mod files with version < 1.17 may not include all indirect
+ # dependencies. Thus, we have to upgrade the go version.
+ if go_version_major == 1 and go_version_minor < 17:
+ logger.warning(
+ "go.mod files generated by Go < 1.17 might have incomplete indirect dependencies.")
+ go_mod, patchfilename = self.__go_mod_patch(srctree, localfilesdir,
+ extravalues, d)
+ src_uris.append(
+ "file://%s;patchdir=src/${GO_IMPORT}" % (patchfilename))
+
+ # Check whether the module is vendored. If so, we have nothing to do.
+ # Otherwise we gather all dependencies and add them to the recipe
+ if not os.path.exists(os.path.join(srctree, "vendor")):
+
+ # Write additional $BPN-modules.inc file
+ self.__go_mod_vendor(go_mod, srctree, localfilesdir, extravalues, d)
+ lines_before.append("LICENSE += \" & ${GO_MOD_LICENSES}\"")
+ lines_before.append("require ${BPN}-licenses.inc")
+
+ self.__rewrite_src_uri(lines_before, ["file://modules.txt"])
+
+ self.__go_handle_dependencies(go_mod, localfilesdir, extravalues, d)
+ lines_before.append("require ${BPN}-modules.inc")
+
+ # Do generic license handling
+ handle_license_vars(srctree, lines_before, handled, extravalues, d)
+ self.__rewrite_lic_uri(lines_before)
+
+ lines_before.append("GO_IMPORT = \"{}\"".format(go_import))
+ lines_before.append("SRCREV_FORMAT = \"${BPN}\"")
+
+ def __update_lines_before(self, updated, newlines, lines_before):
+ if updated:
+ del lines_before[:]
+ for line in newlines:
+ # Hack to avoid newlines that edit_metadata inserts
+ if line.endswith('\n'):
+ line = line[:-1]
+ lines_before.append(line)
+ return updated
+
+ def __rewrite_lic_uri(self, lines_before):
+
+ def varfunc(varname, origvalue, op, newlines):
+ if varname == 'LIC_FILES_CHKSUM':
+ new_licenses = []
+ licenses = origvalue.split('\\')
+ for license in licenses:
+ license = license.strip()
+ uri, chksum = license.split(';', 1)
+ url = urllib.parse.urlparse(uri)
+ new_uri = os.path.join(
+ url.scheme + "://", "src", "${GO_IMPORT}", url.netloc + url.path) + ";" + chksum
+ new_licenses.append(new_uri)
+
+ return new_licenses, None, -1, True
+ return origvalue, None, 0, True
+
+ updated, newlines = bb.utils.edit_metadata(
+ lines_before, ['LIC_FILES_CHKSUM'], varfunc)
+ return self.__update_lines_before(updated, newlines, lines_before)
+
+ def __rewrite_src_uri(self, lines_before, additional_uris = []):
+
+ def varfunc(varname, origvalue, op, newlines):
+ if varname == 'SRC_URI':
+ src_uri = ["git://${GO_IMPORT};destsuffix=git/src/${GO_IMPORT};nobranch=1;name=${BPN};protocol=https"]
+ src_uri.extend(additional_uris)
+ return src_uri, None, -1, True
+ return origvalue, None, 0, True
+
+ updated, newlines = bb.utils.edit_metadata(lines_before, ['SRC_URI'], varfunc)
+ return self.__update_lines_before(updated, newlines, lines_before)
+
+
+def register_recipe_handlers(handlers):
+ handlers.append((GoRecipeHandler(), 60))
diff --git a/poky/scripts/lib/resulttool/regression.py b/poky/scripts/lib/resulttool/regression.py
index 3d64b8f4af..10e7d13841 100644
--- a/poky/scripts/lib/resulttool/regression.py
+++ b/poky/scripts/lib/resulttool/regression.py
@@ -78,6 +78,11 @@ STATUS_STRINGS = {
"None": "No matching test result"
}
+REGRESSIONS_DISPLAY_LIMIT=50
+
+MISSING_TESTS_BANNER = "-------------------------- Missing tests --------------------------"
+ADDITIONAL_DATA_BANNER = "--------------------- Matches and improvements --------------------"
+
def test_has_at_least_one_matching_tag(test, tag_list):
return "oetags" in test and any(oetag in tag_list for oetag in test["oetags"])
@@ -181,11 +186,29 @@ def get_status_str(raw_status):
raw_status_lower = raw_status.lower() if raw_status else "None"
return STATUS_STRINGS.get(raw_status_lower, raw_status)
-def compare_result(logger, base_name, target_name, base_result, target_result):
+def get_additional_info_line(new_pass_count, new_tests):
+ result=[]
+ if new_tests:
+ result.append(f'+{new_tests} test(s) present')
+ if new_pass_count:
+ result.append(f'+{new_pass_count} test(s) now passing')
+
+ if not result:
+ return ""
+
+ return ' -> ' + ', '.join(result) + '\n'
+
+def compare_result(logger, base_name, target_name, base_result, target_result, display_limit=None):
base_result = base_result.get('result')
target_result = target_result.get('result')
result = {}
new_tests = 0
+ regressions = {}
+ resultstring = ""
+ new_tests = 0
+ new_pass_count = 0
+
+ display_limit = int(display_limit) if display_limit else REGRESSIONS_DISPLAY_LIMIT
if base_result and target_result:
for k in base_result:
@@ -212,17 +235,33 @@ def compare_result(logger, base_name, target_name, base_result, target_result):
resultstring = "Regression: %s\n %s\n" % (base_name, target_name)
for k in sorted(result):
if not result[k]['target'] or not result[k]['target'].startswith("PASS"):
- resultstring += ' %s: %s -> %s\n' % (k, get_status_str(result[k]['base']), get_status_str(result[k]['target']))
+ # Differentiate each ptest kind when listing regressions
+ key_parts = k.split('.')
+ key = '.'.join(key_parts[:2]) if k.startswith('ptest') else key_parts[0]
+ # Append new regression to corresponding test family
+ regressions[key] = regressions.setdefault(key, []) + [' %s: %s -> %s\n' % (k, get_status_str(result[k]['base']), get_status_str(result[k]['target']))]
+ resultstring += f" Total: {sum([len(regressions[r]) for r in regressions])} new regression(s):\n"
+ for k in regressions:
+ resultstring += f" {len(regressions[k])} regression(s) for {k}\n"
+ count_to_print=min([display_limit, len(regressions[k])]) if display_limit > 0 else len(regressions[k])
+ resultstring += ''.join(regressions[k][:count_to_print])
+ if count_to_print < len(regressions[k]):
+ resultstring+=' [...]\n'
if new_pass_count > 0:
resultstring += f' Additionally, {new_pass_count} previously failing test(s) is/are now passing\n'
+ if new_tests > 0:
+ resultstring += f' Additionally, {new_tests} new test(s) is/are present\n'
else:
- resultstring = "Improvement: %s\n %s\n (+%d test(s) passing)\n" % (base_name, target_name, new_pass_count)
+ resultstring = "%s\n%s\n" % (base_name, target_name)
result = None
else:
- resultstring = "Match: %s\n %s\n" % (base_name, target_name)
+ resultstring = "%s\n%s\n" % (base_name, target_name)
+
+ if not result:
+ additional_info = get_additional_info_line(new_pass_count, new_tests)
+ if additional_info:
+ resultstring += additional_info
- if new_tests > 0:
- resultstring += f' Additionally, {new_tests} new test(s) is/are present\n'
return result, resultstring
def get_results(logger, source):
@@ -280,7 +319,7 @@ def regression_common(args, logger, base_results, target_results):
for b in target.copy():
if not can_be_compared(logger, base_results[a][c], target_results[a][b]):
continue
- res, resstr = compare_result(logger, c, b, base_results[a][c], target_results[a][b])
+ res, resstr = compare_result(logger, c, b, base_results[a][c], target_results[a][b], args.limit)
if not res:
matches.append(resstr)
base.remove(c)
@@ -291,15 +330,16 @@ def regression_common(args, logger, base_results, target_results):
for b in target:
if not can_be_compared(logger, base_results[a][c], target_results[a][b]):
continue
- res, resstr = compare_result(logger, c, b, base_results[a][c], target_results[a][b])
+ res, resstr = compare_result(logger, c, b, base_results[a][c], target_results[a][b], args.limit)
if res:
regressions.append(resstr)
else:
notfound.append("%s not found in target" % a)
- print("\n".join(sorted(matches)))
- print("\n")
print("\n".join(sorted(regressions)))
+ print("\n" + MISSING_TESTS_BANNER + "\n")
print("\n".join(sorted(notfound)))
+ print("\n" + ADDITIONAL_DATA_BANNER + "\n")
+ print("\n".join(sorted(matches)))
return 0
def regression_git(args, logger):
@@ -403,4 +443,5 @@ def register_commands(subparsers):
parser_build.add_argument('--commit-number', help="Revision number to search for, redundant if --commit is specified")
parser_build.add_argument('--commit2', help="Revision to compare with")
parser_build.add_argument('--commit-number2', help="Revision number to compare with, redundant if --commit2 is specified")
+ parser_build.add_argument('-l', '--limit', default=REGRESSIONS_DISPLAY_LIMIT, help="Maximum number of changes to display per test. Can be set to 0 to print all changes")
diff --git a/poky/scripts/patchtest b/poky/scripts/patchtest
new file mode 100755
index 0000000000..a1c824f7b7
--- /dev/null
+++ b/poky/scripts/patchtest
@@ -0,0 +1,225 @@
+#!/usr/bin/env python3
+# ex:ts=4:sw=4:sts=4:et
+# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
+#
+# patchtest: execute all unittest test cases discovered for a single patch
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+import sys
+import os
+import unittest
+import logging
+import traceback
+import json
+
+# Include current path so test cases can see it
+sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))
+
+# Include patchtest library
+sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), '../meta/lib/patchtest'))
+
+from data import PatchTestInput
+from repo import PatchTestRepo
+
+import utils
+logger = utils.logger_create('patchtest')
+info = logger.info
+error = logger.error
+
+import repo
+
+def getResult(patch, mergepatch, logfile=None):
+
+ class PatchTestResult(unittest.TextTestResult):
+ """ Patchtest TextTestResult """
+ shouldStop = True
+ longMessage = False
+
+ success = 'PASS'
+ fail = 'FAIL'
+ skip = 'SKIP'
+
+ def startTestRun(self):
+ # let's create the repo already, it can be used later on
+ repoargs = {
+ 'repodir': PatchTestInput.repodir,
+ 'commit' : PatchTestInput.basecommit,
+ 'branch' : PatchTestInput.basebranch,
+ 'patch' : patch,
+ }
+
+ self.repo_error = False
+ self.test_error = False
+ self.test_failure = False
+
+ try:
+ self.repo = PatchTestInput.repo = PatchTestRepo(**repoargs)
+ except:
+ logger.error(traceback.print_exc())
+ self.repo_error = True
+ self.stop()
+ return
+
+ if mergepatch:
+ self.repo.merge()
+
+ def addError(self, test, err):
+ self.test_error = True
+ (ty, va, trace) = err
+ logger.error(traceback.print_exc())
+
+ def addFailure(self, test, err):
+ test_description = test.id().split('.')[-1].replace('_', ' ').replace("cve", "CVE").replace("signed off by",
+ "Signed-off-by").replace("upstream status",
+ "Upstream-Status").replace("non auh",
+ "non-AUH").replace("presence format", "presence")
+ self.test_failure = True
+ fail_str = '{}: {}: {} ({})'.format(self.fail,
+ test_description, json.loads(str(err[1]))["issue"],
+ test.id())
+ print(fail_str)
+ if logfile:
+ with open(logfile, "a") as f:
+ f.write(fail_str + "\n")
+
+ def addSuccess(self, test):
+ test_description = test.id().split('.')[-1].replace('_', ' ').replace("cve", "CVE").replace("signed off by",
+ "Signed-off-by").replace("upstream status",
+ "Upstream-Status").replace("non auh",
+ "non-AUH").replace("presence format", "presence")
+ success_str = '{}: {} ({})'.format(self.success,
+ test_description, test.id())
+ print(success_str)
+ if logfile:
+ with open(logfile, "a") as f:
+ f.write(success_str + "\n")
+
+ def addSkip(self, test, reason):
+ test_description = test.id().split('.')[-1].replace('_', ' ').replace("cve", "CVE").replace("signed off by",
+ "Signed-off-by").replace("upstream status",
+ "Upstream-Status").replace("non auh",
+ "non-AUH").replace("presence format", "presence")
+ skip_str = '{}: {}: {} ({})'.format(self.skip,
+ test_description, json.loads(str(reason))["issue"],
+ test.id())
+ print(skip_str)
+ if logfile:
+ with open(logfile, "a") as f:
+ f.write(skip_str + "\n")
+
+ def stopTestRun(self):
+
+ # in case there was an error on repo object creation, just return
+ if self.repo_error:
+ return
+
+ self.repo.clean()
+
+ return PatchTestResult
+
+def _runner(resultklass, prefix=None):
+ # load test with the corresponding prefix
+ loader = unittest.TestLoader()
+ if prefix:
+ loader.testMethodPrefix = prefix
+
+ # create the suite with discovered tests and the corresponding runner
+ suite = loader.discover(start_dir=PatchTestInput.testdir, pattern=PatchTestInput.pattern, top_level_dir=PatchTestInput.topdir)
+ ntc = suite.countTestCases()
+
+ # if there are no test cases, just quit
+ if not ntc:
+ return 2
+ runner = unittest.TextTestRunner(resultclass=resultklass, verbosity=0)
+
+ try:
+ result = runner.run(suite)
+ except:
+ logger.error(traceback.print_exc())
+ logger.error('patchtest: something went wrong')
+ return 1
+
+ return 0
+
+def run(patch, logfile=None):
+ """ Load, setup and run pre and post-merge tests """
+ # Get the result class and install the control-c handler
+ unittest.installHandler()
+
+ # run pre-merge tests, meaning those methods with 'pretest' as prefix
+ premerge_resultklass = getResult(patch, False, logfile)
+ premerge_result = _runner(premerge_resultklass, 'pretest')
+
+ # run post-merge tests, meaning those methods with 'test' as prefix
+ postmerge_resultklass = getResult(patch, True, logfile)
+ postmerge_result = _runner(postmerge_resultklass, 'test')
+
+ if premerge_result == 2 and postmerge_result == 2:
+ logger.error('patchtest: any test cases found - did you specify the correct suite directory?')
+
+ return premerge_result or postmerge_result
+
+def main():
+ tmp_patch = False
+ patch_path = PatchTestInput.patch_path
+ log_results = PatchTestInput.log_results
+ log_path = None
+ patch_list = None
+
+ git_status = os.popen("(cd %s && git status)" % PatchTestInput.repodir).read()
+ status_matches = ["Changes not staged for commit", "Changes to be committed"]
+ if any([match in git_status for match in status_matches]):
+ logger.error("patchtest: there are uncommitted changes in the target repo that would be overwritten. Please commit or restore them before running patchtest")
+ return 1
+
+ if os.path.isdir(patch_path):
+ patch_list = [os.path.join(patch_path, filename) for filename in sorted(os.listdir(patch_path))]
+ else:
+ patch_list = [patch_path]
+
+ for patch in patch_list:
+ if os.path.getsize(patch) == 0:
+ logger.error('patchtest: patch is empty')
+ return 1
+
+ logger.info('Testing patch %s' % patch)
+
+ if log_results:
+ log_path = patch + ".testresult"
+ with open(log_path, "a") as f:
+ f.write("Patchtest results for patch '%s':\n\n" % patch)
+
+ try:
+ if log_path:
+ run(patch, log_path)
+ else:
+ run(patch)
+ finally:
+ if tmp_patch:
+ os.remove(patch)
+
+if __name__ == '__main__':
+ ret = 1
+
+ # Parse the command line arguments and store it on the PatchTestInput namespace
+ PatchTestInput.set_namespace()
+
+ # set debugging level
+ if PatchTestInput.debug:
+ logger.setLevel(logging.DEBUG)
+
+ # if topdir not define, default it to testdir
+ if not PatchTestInput.topdir:
+ PatchTestInput.topdir = PatchTestInput.testdir
+
+ try:
+ ret = main()
+ except Exception:
+ import traceback
+ traceback.print_exc(5)
+
+ sys.exit(ret)
diff --git a/poky/scripts/patchtest-get-branch b/poky/scripts/patchtest-get-branch
new file mode 100755
index 0000000000..b5fb2b0f04
--- /dev/null
+++ b/poky/scripts/patchtest-get-branch
@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+
+# Get target branch from the corresponding mbox
+#
+# NOTE: this script was based on patches coming to the openembedded-core
+# where target branch is defined inside brackets as subject prefix
+# i.e. [master], [rocko], etc.
+#
+# Copyright (C) 2016 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+import mailbox
+import argparse
+import re
+import git
+
+re_prefix = re.compile("(\[.*\])", re.DOTALL)
+
+def get_branch(filepath_repo, filepath_mbox, default_branch):
+ branch = None
+
+ # get all remotes branches
+ gitbranches = git.Git(filepath_repo).branch('-a').splitlines()
+
+ # from gitbranches, just get the names
+ branches = [b.split('/')[-1] for b in gitbranches]
+
+ subject = ' '.join(mailbox.mbox(filepath_mbox)[0]['subject'].splitlines())
+
+ # we expect that patches will have somewhere between one and three
+ # consecutive sets of square brackets with tokens inside, e.g.:
+ # 1. [PATCH]
+ # 2. [OE-core][PATCH]
+ # 3. [OE-core][kirkstone][PATCH]
+ # Some of them may also be part of a series, in which case the PATCH
+ # token will be formatted like:
+ # [PATCH 1/4]
+ # or they will be revisions to previous patches, where it will be:
+ # [PATCH v2]
+ # Or they may contain both:
+ # [PATCH v2 3/4]
+ # In any case, we want mprefix to contain all of these tokens so
+ # that we can search for branch names within them.
+ mprefix = re.findall(r'\[.*?\]', subject)
+ found_branch = None
+ if mprefix:
+ # Iterate over the tokens and compare against the branch list to
+ # figure out which one the patch is targeting
+ for token in mprefix:
+ stripped = token.lower().strip('[]')
+ if default_branch in stripped:
+ found_branch = default_branch
+ break
+ else:
+ for branch in branches:
+ # ignore branches named "core"
+ if branch != "core" and stripped.rfind(branch) != -1:
+ found_branch = token.split(' ')[0].strip('[]')
+ break
+
+ # if there's no mprefix content or no known branches were found in
+ # the tokens, assume the target is master
+ if found_branch is None:
+ found_branch = "master"
+
+ return (subject, found_branch)
+
+if __name__ == '__main__':
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument('repo', metavar='REPO', help='Main repository')
+ parser.add_argument('mbox', metavar='MBOX', help='mbox filename')
+ parser.add_argument('--default-branch', metavar='DEFAULT_BRANCH', default='master', help='Use this branch if no one is found')
+ parser.add_argument('--separator', '-s', metavar='SEPARATOR', default=' ', help='Char separator for output data')
+ args = parser.parse_args()
+
+ subject, branch = get_branch(args.repo, args.mbox, args.default_branch)
+ print("branch: %s" % branch)
+
diff --git a/poky/scripts/patchtest-get-series b/poky/scripts/patchtest-get-series
new file mode 100755
index 0000000000..908442089f
--- /dev/null
+++ b/poky/scripts/patchtest-get-series
@@ -0,0 +1,115 @@
+#!/bin/bash -e
+#
+# get-latest-series: Download latest patch series from Patchwork
+#
+# Copyright (C) 2023 BayLibre Inc.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+# the interval into the past which we want to check for new series, in minutes
+INTERVAL_MINUTES=30
+
+# Maximum number of series to retrieve. the Patchwork API can support up to 250
+# at once
+SERIES_LIMIT=250
+
+# Location to save patches
+DOWNLOAD_PATH="."
+
+# Name of the file to use/check as a log of previously-tested series IDs
+SERIES_TEST_LOG=".series_test.log"
+
+# Patchwork project to pull series patches from
+PROJECT="oe-core"
+
+# The Patchwork server to pull from
+SERVER="https://patchwork.yoctoproject.org/api/1.2/"
+
+help()
+{
+ echo "Usage: get-latest-series [ -i | --interval MINUTES ]
+ [ -d | --directory DIRECTORY ]
+ [ -l | --limit COUNT ]
+ [ -h | --help ]
+ [ -t | --tested-series LOGFILE]
+ [ -p | --project PROJECT ]
+ [ -s | --server SERVER ]"
+ exit 2
+}
+
+while [ "$1" != "" ]; do
+ case $1 in
+ -i|--interval)
+ INTERVAL_MINUTES=$2
+ shift 2
+ ;;
+ -l|--limit)
+ SERIES_LIMIT=$2
+ shift 2
+ ;;
+ -d|--directory)
+ DOWNLOAD_PATH=$2
+ shift 2
+ ;;
+ -p|--project)
+ PROJECT=$2
+ shift 2
+ ;;
+ -s|--server)
+ SERVER=$2
+ shift 2
+ ;;
+ -t|--tested-series)
+ SERIES_TEST_LOG=$2
+ shift 2
+ ;;
+ -h|--help)
+ help
+ ;;
+ *)
+ echo "Unknown option $1"
+ help
+ ;;
+ esac
+done
+
+# The time this script is running at
+START_TIME=$(date --date "now" +"%Y-%m-%dT%H:%M:%S")
+
+# the corresponding timestamp we want to check against for new patch series
+SERIES_CHECK_LIMIT=$(date --date "now - ${INTERVAL_MINUTES} minutes" +"%Y-%m-%dT%H:%M:%S")
+
+echo "Start time is $START_TIME"
+echo "Series check limit is $SERIES_CHECK_LIMIT"
+
+# Create DOWNLOAD_PATH if it doesn't exist
+if [ ! -d "$DOWNLOAD_PATH" ]; then
+ mkdir "${DOWNLOAD_PATH}"
+fi
+
+# Create SERIES_TEST_LOG if it doesn't exist
+if [ ! -f "$SERIES_TEST_LOG" ]; then
+ touch "${SERIES_TEST_LOG}"
+fi
+
+# Retrieve a list of series IDs from the 'git-pw series list' output. The API
+# supports a maximum of 250 results, so make sure we allow that when required
+SERIES_LIST=$(git-pw --project "${PROJECT}" --server "${SERVER}" series list --since "${SERIES_CHECK_LIMIT}" --limit "${SERIES_LIMIT}" | awk '{print $2}' | xargs | sed -e 's/[^0-9 ]//g')
+
+if [ -z "$SERIES_LIST" ]; then
+ echo "No new series for project ${PROJECT} since ${SERIES_CHECK_LIMIT}"
+ exit 0
+fi
+
+# Check each series ID
+for SERIES in $SERIES_LIST; do
+ # Download the series only if it's not found in the SERIES_TEST_LOG
+ if ! grep -w --quiet "${SERIES}" "${SERIES_TEST_LOG}"; then
+ echo "Downloading $SERIES..."
+ git-pw series download --separate "${SERIES}" "${DOWNLOAD_PATH}"
+ echo "${SERIES}" >> "${SERIES_TEST_LOG}"
+ else
+ echo "Already tested ${SERIES}. Skipping..."
+ fi
+done
diff --git a/poky/scripts/patchtest-send-results b/poky/scripts/patchtest-send-results
new file mode 100755
index 0000000000..71b73f0940
--- /dev/null
+++ b/poky/scripts/patchtest-send-results
@@ -0,0 +1,96 @@
+#!/usr/bin/env python3
+# ex:ts=4:sw=4:sts=4:et
+# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
+#
+# patchtest: execute all unittest test cases discovered for a single patch
+# Note that this script is currently under development and has been
+# hard-coded with default values for testing purposes. This script
+# should not be used without changing the default recipient, at minimum.
+#
+# Copyright (C) 2023 BayLibre Inc.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+import argparse
+import boto3
+import configparser
+import mailbox
+import os
+import re
+import sys
+
+greeting = """Thank you for your submission. Patchtest identified one
+or more issues with the patch. Please see the log below for
+more information:\n\n---\n"""
+
+suggestions = """\n---\n\nPlease address the issues identified and
+submit a new revision of the patch, or alternatively, reply to this
+email with an explanation of why the patch should be accepted. If you
+believe these results are due to an error in patchtest, please submit a
+bug at https://bugzilla.yoctoproject.org/ (use the 'Patchtest' category
+under 'Yocto Project Subprojects'). For more information on specific
+failures, see: https://wiki.yoctoproject.org/wiki/Patchtest. Thank
+you!"""
+
+parser = argparse.ArgumentParser(description="Send patchtest results to a submitter for a given patch")
+parser.add_argument("-p", "--patch", dest="patch", required=True, help="The patch file to summarize")
+args = parser.parse_args()
+
+if not os.path.exists(args.patch):
+ print(f"Patch '{args.patch}' not found - did you provide the right path?")
+ sys.exit(1)
+elif not os.path.exists(args.patch + ".testresult"):
+ print(f"Found patch '{args.patch}' but '{args.patch}.testresult' was not present. Have you run patchtest on the patch?")
+ sys.exit(1)
+
+result_file = args.patch + ".testresult"
+result_basename = os.path.basename(args.patch)
+testresult = None
+
+with open(result_file, "r") as f:
+ testresult = f.read()
+
+# we know these patch files will only contain a single patch, so only
+# worry about the first element for getting the subject
+mbox = mailbox.mbox(args.patch)
+mbox_subject = mbox[0]['subject']
+subject_line = f"Patchtest results for {mbox_subject}"
+
+# extract the submitter email address and use it as the reply address
+# for the results
+reply_address = mbox[0]['from']
+
+# extract the message ID and use that as the in-reply-to address
+in_reply_to = re.findall("<(.*)>", mbox[0]['Message-ID'])[0]
+
+# the address the results email is sent from
+from_address = "patchtest@automation.yoctoproject.org"
+
+# mailing list to CC
+cc_address = "openembedded-core@lists.openembedded.org"
+
+if "FAIL" in testresult:
+ reply_contents = None
+ if len(max(open(result_file, 'r'), key=len)) > 220:
+ warning = "Tests failed for the patch, but the results log could not be processed due to excessive result line length."
+ reply_contents = greeting + warning + suggestions
+ else:
+ reply_contents = greeting + testresult + suggestions
+
+ ses_client = boto3.client('ses', region_name='us-west-2')
+ raw_data = 'From: ' + from_address + '\nTo: ' + reply_address + \
+ '\nCC: ' + cc_address + '\nSubject:' + subject_line + \
+ '\nIn-Reply-To:' + in_reply_to + \
+ '\nMIME-Version: 1.0" + \
+ "\nContent-type: Multipart/Mixed;boundary="NextPart"\n\n--NextPart\nContent-Type: text/plain\n\n' + \
+ reply_contents + '\n\n--NextPart'
+ response = ses_client.send_raw_email(
+ Source="patchtest@automation.yoctoproject.org",
+ RawMessage={
+ "Data": raw_data,
+ },
+ )
+
+else:
+ print(f"No failures identified for {args.patch}.")
diff --git a/poky/scripts/patchtest-setup-sharedir b/poky/scripts/patchtest-setup-sharedir
new file mode 100755
index 0000000000..277677e527
--- /dev/null
+++ b/poky/scripts/patchtest-setup-sharedir
@@ -0,0 +1,83 @@
+#!/bin/bash -e
+#
+# patchtest-setup-sharedir: Setup a directory for storing mboxes and
+# repositories to be shared with the guest machine, including updates to
+# the repos if the directory already exists
+#
+# Copyright (C) 2023 BayLibre Inc.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+# poky repository
+POKY_REPO="https://git.yoctoproject.org/poky"
+
+# patchtest repository
+PATCHTEST_REPO="https://git.yoctoproject.org/patchtest"
+
+# the name of the directory
+SHAREDIR="patchtest_share"
+
+help()
+{
+ echo "Usage: patchtest-setup-sharedir [ -d | --directory SHAREDIR ]
+ [ -p | --patchtest PATCHTEST_REPO ]
+ [ -y | --poky POKY_REPO ]"
+ exit 2
+}
+
+while [ "$1" != "" ]; do
+ case $1 in
+ -d|--directory)
+ SHAREDIR=$2
+ shift 2
+ ;;
+ -p|--patchtest)
+ PATCHTEST_REPO=$2
+ shift 2
+ ;;
+ -y|--poky)
+ POKY_REPO=$2
+ shift 2
+ ;;
+ -h|--help)
+ help
+ ;;
+ *)
+ echo "Unknown option $1"
+ help
+ ;;
+ esac
+done
+
+# define MBOX_DIR where the patch series will be stored by
+# get-latest-series
+MBOX_DIR="${SHAREDIR}/mboxes"
+
+# Create SHAREDIR if it doesn't exist
+if [ ! -d "$SHAREDIR" ]; then
+ mkdir -p "${SHAREDIR}"
+ echo "Created ${SHAREDIR}"
+fi
+
+# Create the mboxes directory if it doesn't exist
+if [ ! -d "$MBOX_DIR" ]; then
+ mkdir -p "${MBOX_DIR}"
+ echo "Created ${MBOX_DIR}"
+fi
+
+# clone poky if it's not already present; otherwise, update it
+if [ ! -d "$POKY_REPO" ]; then
+ BASENAME=$(basename ${POKY_REPO})
+ git clone "${POKY_REPO}" "${SHAREDIR}/${BASENAME}"
+else
+ (cd "${SHAREDIR}/$BASENAME" && git pull)
+fi
+
+# clone patchtest if it's not already present; otherwise, update it
+if [ ! -d "$PATCHTEST_REPO" ]; then
+ BASENAME=$(basename ${PATCHTEST_REPO})
+ git clone "${PATCHTEST_REPO}" "${SHAREDIR}/${BASENAME}"
+else
+ (cd "${SHAREDIR}/$BASENAME" && git pull)
+fi
diff --git a/poky/scripts/patchtest.README b/poky/scripts/patchtest.README
new file mode 100644
index 0000000000..ad46b02ad6
--- /dev/null
+++ b/poky/scripts/patchtest.README
@@ -0,0 +1,156 @@
+# Patchtest
+
+## Introduction
+
+Patchtest is a test framework for community patches based on the standard
+unittest python module. As input, it needs tree elements to work properly:
+a patch in mbox format (either created with `git format-patch` or fetched
+from 'patchwork'), a test suite and a target repository.
+
+The first test suite intended to be used with patchtest is found in the
+openembedded-core repository [1] targeted for patches that get into the
+openembedded-core mailing list [2]. This suite is also intended as a
+baseline for development of similar suites for other layers as needed.
+
+Patchtest can either run on a host or a guest machine, depending on which
+environment the execution needs to be done. If you plan to test your own patches
+(a good practice before these are sent to the mailing list), the easiest way is
+to install and execute on your local host; in the other hand, if automatic
+testing is intended, the guest method is strongly recommended. The guest
+method requires the use of the patchtest layer, in addition to the tools
+available in oe-core: https://git.yoctoproject.org/patchtest/
+
+## Installation
+
+As a tool for use with the Yocto Project, the [quick start guide](https://docs.yoctoproject.org/brief-yoctoprojectqs/index.html)
+contains the necessary prerequisites for a basic project. In addition,
+patchtest relies on the following Python modules:
+
+- boto3 (for sending automated results emails only)
+- git-pw>=2.5.0
+- jinja2
+- pylint
+- pyparsing>=3.0.9
+- unidiff
+
+These can be installed by running `pip install -r
+meta/lib/patchtest/requirements.txt`. Note that git-pw is not
+automatically added to the user's PATH; by default, it is installed at
+~/.local/bin/git-pw.
+
+For git-pw (and therefore scripts such as patchtest-get--series) to work, you need
+to provide a Patchwork instance in your user's .gitconfig, like so (the project
+can be specified using the --project argument):
+
+ git config --global pw.server "https://patchwork.yoctoproject.org/api/1.2/"
+
+To work with patchtest, you should have the following repositories cloned:
+
+1. https://git.openembedded.org/openembedded-core/ (or https://git.yoctoproject.org/poky/)
+2. https://git.openembedded.org/bitbake/ (if not using poky)
+3. https://git.yoctoproject.org/patchtest (if using guest mode)
+
+## Usage
+
+### Obtaining Patches
+
+Patch files can be obtained directly from cloned repositories using `git
+format-patch -N` (where N is the number of patches starting from HEAD to
+generate). git-pw can also be used with filters for users, patch/series IDs,
+and timeboxes if specific patches are desired. For more information, see the
+git-pw [documentation](https://patchwork.readthedocs.io/projects/git-pw/en/latest/).
+
+Alternatively, `scripts/patchtest-get-series` can be used to pull mbox files from
+the Patchwork instance configured previously in .gitconfig. It uses a log file
+called ".series_test.log" to store and compare series IDs so that the same
+versions of a patch are not tested multiple times unintentionally. By default,
+it will pull up to five patch series from the last 30 minutes using oe-core as
+the target project, but these parameters can be configured using the `--limit`,
+`--interval`, and `--project` arguments respectively. For more information, run
+`patchtest-get-series -h`.
+
+### Host Mode
+
+To run patchtest on the host, do the following:
+
+1. In openembedded-core/poky, do `source oe-init-build-env`
+2. Generate patch files from the target repository by doing `git-format patch -N`,
+ where N is the number of patches starting at HEAD, or by using git-pw
+ or patchtest-get-series
+3. Run patchtest on a patch file by doing the following:
+
+ patchtest --patch /path/to/patch/file
+
+ or, if you have stored the patch files in a directory, do:
+
+ patchtest --directory /path/to/patch/directory
+
+ For example, to test `master-gcc-Fix--fstack-protector-issue-on-aarch64.patch` against the oe-core test suite:
+
+ patchtest --patch master-gcc-Fix--fstack-protector-issue-on-aarch64.patch
+
+ If you want to use a different test suite or target repository, you can use the --testdir and --repodir flags:
+
+ patchtest --patch /path/to/patch/file --repodir /path/to/repo --testdir /path/to/test/dir
+
+### Guest Mode
+
+Patchtest's guest mode has been refactored to more closely mirror the
+typical Yocto Project image build workflow, but there are still some key
+differences to keep in mind. The primary objective is to provide a level
+of isolation from the host when testing patches pulled automatically
+from the mailing lists. When executed this way, the test process is
+essentially running random code from the internet and could be
+catastrophic if malicious bits or even poorly-handled edge cases aren't
+protected against. In order to use this mode, the
+https://git.yoctoproject.org/patchtest/ repository must be cloned and
+the meta-patchtest layer added to bblayers.conf.
+
+The general flow of guest mode is:
+
+1. Run patchtest-setup-sharedir --directory <dirname> to create a
+ directory for mounting
+2. Collect patches via patchtest-get-series (or other manual step) into the
+ <dirname>/mboxes path
+3. Ensure that a user with ID 1200 has appropriate read/write
+ permissions to <dirname> and <dirname>/mboxes, so that the
+ "patchtest" user in the core-image-patchtest image can function
+4. Build the core-image-patchtest image
+5. Run the core-image-patchtest image with the mounted sharedir, like
+ so:
+ `runqemu kvm nographic qemuparams="-snapshot -fsdev
+ local,id=test_mount,path=/workspace/yocto/poky/build/patchtestdir,security_model=mapped
+ -device virtio-9p-pci,fsdev=test_mount,mount_tag=test_mount -smp 4 -m
+ 2048"`
+
+Patchtest runs as an initscript for the core-image-patchtest image and
+shuts down after completion, so there is no input required from a user
+during operation. Unlike in host mode, the guest is designed to
+automatically generate test result files, in the same directory as the
+targeted patch files but with .testresult as an extension. These contain
+the entire output of the patchtest run for each respective pass,
+including the PASS, FAIL, and SKIP indicators for each test run.
+
+## Contributing
+
+The yocto mailing list (yocto@lists.yoctoproject.org) is used for questions,
+comments and patch review. It is subscriber only, so please register before
+posting.
+
+Send pull requests to yocto@lists.yoctoproject.org with '[patchtest]' in the
+subject.
+
+When sending single patches, please use something like:
+
+ git send-email -M -1 --to=yocto@lists.yoctoproject.org --subject-prefix=patchtest][PATCH
+
+## Maintenance
+-----------
+
+Maintainers:
+ Trevor Gamblin <tgamblin@baylibre.com>
+
+## Links
+-----
+[1] https://git.openembedded.org/openembedded-core/
+[2] https://www.yoctoproject.org/community/mailing-lists/
diff --git a/poky/scripts/runqemu b/poky/scripts/runqemu
index 6fca7439a1..18aeb7f5f0 100755
--- a/poky/scripts/runqemu
+++ b/poky/scripts/runqemu
@@ -198,7 +198,9 @@ class BaseConfig(object):
self.snapshot = False
self.wictypes = ('wic', 'wic.vmdk', 'wic.qcow2', 'wic.vdi', "wic.vhd", "wic.vhdx")
self.fstypes = ('ext2', 'ext3', 'ext4', 'jffs2', 'nfs', 'btrfs',
- 'cpio.gz', 'cpio', 'ramfs', 'tar.bz2', 'tar.gz')
+ 'cpio.gz', 'cpio', 'ramfs', 'tar.bz2', 'tar.gz',
+ 'squashfs', 'squashfs-xz', 'squashfs-lzo',
+ 'squashfs-lz4', 'squashfs-zst')
self.vmtypes = ('hddimg', 'iso')
self.fsinfo = {}
self.network_device = "-device e1000,netdev=net0,mac=@MAC@"
diff --git a/poky/scripts/yocto_testresults_query.py b/poky/scripts/yocto_testresults_query.py
index a5073736aa..521ead8473 100755
--- a/poky/scripts/yocto_testresults_query.py
+++ b/poky/scripts/yocto_testresults_query.py
@@ -56,9 +56,12 @@ def fetch_testresults(workdir, sha1):
subprocess.check_call(["git", "fetch", "--depth", "1", "origin", f"{rev}:{rev}"], cwd=workdir)
return branch
-def compute_regression_report(workdir, basebranch, baserevision, targetbranch, targetrevision):
+def compute_regression_report(workdir, basebranch, baserevision, targetbranch, targetrevision, args):
logger.info(f"Running resulttool regression between SHA1 {baserevision} and {targetrevision}")
- report = subprocess.check_output([resulttool, "regression-git", "--branch", basebranch, "--commit", baserevision, "--branch2", targetbranch, "--commit2", targetrevision, workdir]).decode("utf-8")
+ command = [resulttool, "regression-git", "--branch", basebranch, "--commit", baserevision, "--branch2", targetbranch, "--commit2", targetrevision, workdir]
+ if args.limit:
+ command.extend(["-l", args.limit])
+ report = subprocess.check_output(command).decode("utf-8")
return report
def print_report_with_header(report, baseversion, baserevision, targetversion, targetrevision):
@@ -85,7 +88,7 @@ def regression(args):
sys.exit(1)
basebranch = fetch_testresults(workdir, baserevision)
targetbranch = fetch_testresults(workdir, targetrevision)
- report = compute_regression_report(workdir, basebranch, baserevision, targetbranch, targetrevision)
+ report = compute_regression_report(workdir, basebranch, baserevision, targetbranch, targetrevision, args)
print_report_with_header(report, args.base, baserevision, args.target, targetrevision)
finally:
if not args.testresultsdir:
@@ -109,6 +112,10 @@ def main():
'-t',
'--testresultsdir',
help=f"An existing test results directory. {sys.argv[0]} will automatically clone it and use default branch if not provided")
+ parser_regression_report.add_argument(
+ '-l',
+ '--limit',
+ help=f"Maximum number of changes to display per test. Can be set to 0 to print all changes")
parser_regression_report.set_defaults(func=regression)
args = parser.parse_args()