diff --git a/.github/workflows/build-yocto.yml b/.github/workflows/build-yocto.yml new file mode 100644 index 00000000..77cde694 --- /dev/null +++ b/.github/workflows/build-yocto.yml @@ -0,0 +1,285 @@ +name: Build Yocto + +on: + workflow_call: + inputs: + sdk: + required: false + type: string + default: "0" + outputs: + artifacts_url: + description: "URL to retrieve build artifacts" + value: ${{ jobs.create-output.outputs.url }} + +# Concurrency is used to prevent multiple workflows from running for the same PR +concurrency: + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || format('push-{0}', github.sha) }} + cancel-in-progress: true + +env: + CACHE_DIR: /efs/qli/meta-qcom + KAS_CLONE_DEPTH: 1 + +jobs: + kas-setup: + if: github.repository_owner == 'qualcomm-linux' + runs-on: [self-hosted, qcom-u2404, amd64] + steps: + - name: Setting up kas-container + run: | + KAS_CONTAINER=$RUNNER_TEMP/kas-container + echo "KAS_CONTAINER=$KAS_CONTAINER" >> $GITHUB_ENV + LATEST=$(git ls-remote --tags --refs --sort="v:refname" https://github.com/siemens/kas | tail -n1 | sed 's/.*\///') + wget -qO ${KAS_CONTAINER} https://raw.githubusercontent.com/siemens/kas/refs/tags/$LATEST/kas-container + chmod +x ${KAS_CONTAINER} + + - uses: actions/checkout@v4 + + - name: Run kas lock + run: | + ${KAS_CONTAINER} lock --update ci/base.yml:ci/qcom-distro.yml + + - name: Upload kas lockfile + uses: actions/upload-artifact@v6 + with: + name: kas-lockfile + path: ci/*.lock.yml + + - name: Upload kas-container + uses: actions/upload-artifact@v4 + with: + name: kas-container + path: ${{ env.KAS_CONTAINER }} + + yocto-run-checks: + needs: kas-setup + if: github.repository_owner == 'qualcomm-linux' + runs-on: [self-hosted, qcom-u2404, amd64] + steps: + - uses: actions/checkout@v4 + + - name: Download kas lockfile + uses: actions/download-artifact@v6 + with: + name: kas-lockfile + path: ci + + - name: Download kas-container + uses: actions/download-artifact@v6 + with: + name: kas-container + path: ${{ runner.temp }} + + - name: Setting up kas-container + run: | + KAS_CONTAINER=$RUNNER_TEMP/kas-container + echo "KAS_CONTAINER=$KAS_CONTAINER" >> $GITHUB_ENV + chmod +x $KAS_CONTAINER + + - name: Run yocto-check-layer + run: | + ci/kas-container-shell-helper.sh ci/yocto-check-layer.sh + + - name: Run Yocto patchreview + run: | + ci/kas-container-shell-helper.sh ci/yocto-patchreview.sh + + compile_warm_up: + needs: [kas-setup, yocto-run-checks] + if: github.repository_owner == 'qualcomm-linux' + runs-on: [self-hosted, qcom-u2404, amd64] + strategy: + fail-fast: true + matrix: + machine: + - rb3gen2-core-kit + - qcom-armv8a + distro: + - name: qcom-distro + yamlfile: ':ci/qcom-distro-prop-image.yml' + - name: qcom-distro-catchall + yamlfile: ':ci/qcom-distro-catchall.yml' + - name: performance + yamlfile: ':ci/qcom-distro-prop-image.yml:ci/performance.yml' + kernel: + - type: default + dirname: "" + yamlfile: "" + - type: 6.18 + dirname: "+linux-qcom-6.18" + yamlfile: ":ci/linux-qcom-6.18.yml" + - type: rt-6.18 + dirname: "+linux-qcom-rt-6.18" + yamlfile: ":ci/linux-qcom-rt-6.18.yml" + name: ${{ matrix.machine }}/${{ matrix.distro.name }}${{ matrix.kernel.dirname }} + steps: + - uses: actions/checkout@v4 + + - name: Run kas build + uses: qualcomm-linux/meta-qcom/.github/actions/compile@master + with: + machine: ${{matrix.machine}} + distro_yaml: ${{matrix.distro.yamlfile}} + distro_name: ${{matrix.distro.name}} + kernel_yaml: ${{matrix.kernel.yamlfile}} + kernel_dirname: ${{matrix.kernel.dirname}} + cache_dir: ${CACHE_DIR} + sdk: ${{inputs.sdk}} + + compile: + needs: compile_warm_up + if: github.repository_owner == 'qualcomm-linux' + runs-on: [self-hosted, qcom-u2404, amd64] + outputs: + url: ${{ steps.compile_kas.outputs.url }} + strategy: + fail-fast: true + matrix: + machine: + - iq-615-evk + - iq-8275-evk + - iq-9075-evk + - iq-x7181-evk + - kaanapali-mtp + - qcm6490-idp + - qcs615-ride + - qcs8300-ride-sx + - qcs9100-ride-sx + - rb1-core-kit + - sm8750-mtp + distro: + - name: qcom-distro + yamlfile: ':ci/qcom-distro-prop-image.yml' + - name: qcom-distro-catchall + yamlfile: ':ci/qcom-distro-catchall.yml' + - name: performance + yamlfile: ':ci/qcom-distro-prop-image.yml:ci/performance.yml' + kernel: + - type: default + dirname: "" + yamlfile: "" + - type: 6.18 + dirname: "+linux-qcom-6.18" + yamlfile: ":ci/linux-qcom-6.18.yml" + - type: rt-6.18 + dirname: "+linux-qcom-rt-6.18" + yamlfile: ":ci/linux-qcom-rt-6.18.yml" + include: + # Additional builds for specific machines + - machine: qcom-armv8a + distro: + name: qcom-distro + yamlfile: ':ci/qcom-distro-prop-image.yml' + kernel: + type: additional + dirname: "+linux-yocto-dev" + yamlfile: ":ci/linux-yocto-dev.yml" + - machine: iq-9075-evk + distro: + name: qcom-distro + yamlfile: ':ci/qcom-distro-prop-image.yml' + kernel: + type: qcom-next-rt + dirname: "+linux-qcom-next-rt" + yamlfile: ":ci/linux-qcom-next-rt.yml" + - machine: iq-9075-evk + distro: + name: qcom-distro-kvm + yamlfile: ':ci/qcom-distro-kvm.yml' + kernel: + type: default + dirname: "" + yamlfile: "" + - machine: iq-8275-evk + distro: + name: qcom-distro-kvm + yamlfile: ':ci/qcom-distro-kvm.yml' + kernel: + type: default + dirname: "" + yamlfile: "" + - machine: qcom-armv7a + distro: + name: qcom-distro + yamlfile: ':ci/qcom-distro.yml' + kernel: + type: default + dirname: "" + yamlfile: "" + name: ${{ matrix.machine }}/${{ matrix.distro.name }}${{ matrix.kernel.dirname }} + steps: + - uses: actions/checkout@v4 + + - name: Run kas build + uses: qualcomm-linux/meta-qcom/.github/actions/compile@master + id: compile_kas + with: + machine: ${{matrix.machine}} + distro_yaml: ${{matrix.distro.yamlfile}} + distro_name: ${{matrix.distro.name}} + kernel_yaml: ${{matrix.kernel.yamlfile}} + kernel_dirname: ${{matrix.kernel.dirname}} + cache_dir: ${CACHE_DIR} + sdk: ${{inputs.sdk}} + + publish_summary: + needs: compile + runs-on: [self-hosted, qcom-u2404, amd64] + steps: + - name: 'Download build URLs' + uses: actions/download-artifact@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + pattern: build-url* + path: urlfiles + merge-multiple: true + + - name: "Print output" + shell: python + id: print-output + run: | + import os + ftable = {} + oslist = set() + machinelist = set() + for fname in os.listdir("./urlfiles"): + if fname.startswith("build-url"): + b, m, o = fname.split("_", 2) + oslist.add(o) + machinelist.add(m) + url = "" + with open(f"./urlfiles/{fname}", "r") as urlfile: + url = urlfile.read() + if not o in ftable: + ftable.update({o:{m: url}}) + else: + ftable[o].update({m: url}) + + table_str = "| |" + + for m in sorted(machinelist): + table_str += f" {m} |" + + table_str += "\n|" + for i in range(len(machinelist) + 1): + table_str += " ---- |" + + table_str += "\n" + + for o in sorted(ftable.keys()): + table_str += f"| {o} |" + for m in sorted(machinelist): + url = ftable[o].get(m) + if url: + url = url.strip() + table_str += f" [Files]({url}/{o}/{m}/) |" + else: + table_str += " |" + table_str += "\n" + summary_file_name = os.environ.get("GITHUB_STEP_SUMMARY") + if summary_file_name: + with open(summary_file_name, "a") as summaryfile: + summaryfile.write("## Download URLs\n") + summaryfile.write(table_str) + print(table_str) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 00000000..fe893ef1 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,28 @@ +name: Build on PR + +on: + pull_request: + paths-ignore: + - 'README.md' + - 'README' + - 'SECURITY.md' + +permissions: + checks: write + pull-requests: write + contents: read + packages: read + +jobs: + event-file: + name: "Upload event file" + runs-on: ubuntu-latest + steps: + - name: Upload + uses: actions/upload-artifact@v6 + with: + name: Event File + path: ${{ github.event_path }} + build-pr: + uses: ./.github/workflows/build-yocto.yml + diff --git a/.github/workflows/publish-results.yml b/.github/workflows/publish-results.yml new file mode 100644 index 00000000..1567eb85 --- /dev/null +++ b/.github/workflows/publish-results.yml @@ -0,0 +1,73 @@ +name: Publish test results + +on: + workflow_call: + inputs: + workflow_id: + required: true + type: string + event_name: + required: true + type: string + event_file: + required: true + type: string + commit: + required: true + type: string + +permissions: + checks: write + pull-requests: write + contents: read + packages: read + +jobs: + publish-test-results: + name: "Publish Tests Results" + runs-on: ubuntu-latest + steps: + - name: Download result files + uses: actions/download-artifact@v6 + with: + run-id: ${{ inputs.workflow_id }} + path: artifacts + github-token: ${{ github.token }} + + - name: Download result files PR + if: ${{ github.run_id != inputs.workflow_id }} + uses: actions/download-artifact@v6 + with: + path: artifacts + github-token: ${{ github.token }} + + - name: "List files" + id: listfiles + run: | + echo $GITHUB_WORKSPACE + ls -R $GITHUB_WORKSPACE + if ! find "${{ github.workspace }}/artifacts/" -name '*.xml' -print -quit | grep -q .; then + echo "Error: no .xml files found" + exit 1 + fi + + - id: app_token + uses: actions/create-github-app-token@v2 + if: always() + with: + app-id: 2291458 + private-key: ${{ secrets.TEST_REPORTING_APP_TOKEN }} + + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action@v2 + if: | + always() + && contains(steps.listfiles.outcome, 'success') + with: + commit: ${{ inputs.commit }} + event_file: ${{ inputs.event_file}} + event_name: ${{ inputs.event_name }} + files: "${{ github.workspace }}/artifacts/**/*.xml" + action_fail: true + action_fail_on_inconclusive: true + github_token: ${{ steps.app_token.outputs.token }} diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml new file mode 100644 index 00000000..a3f2d605 --- /dev/null +++ b/.github/workflows/push.yml @@ -0,0 +1,16 @@ +name: Build on push + +on: + push: + branches: + - main + +permissions: + checks: write + pull-requests: write + contents: read + packages: read + +jobs: + build: + uses: ./.github/workflows/build-yocto.yml diff --git a/.github/workflows/repolinter.yml b/.github/workflows/repolinter.yml new file mode 100644 index 00000000..aff3ca2e --- /dev/null +++ b/.github/workflows/repolinter.yml @@ -0,0 +1,31 @@ +name: QuIC Organization Repolinter + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + workflow_dispatch: + +jobs: + repolinter: + if: github.repository_owner == 'qualcomm-linux' + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + - name: Verify repolinter config file is present + id: check_files + uses: andstor/file-existence-action@v3 + with: + files: "repolint.json" + - name: Run Repolinter with local repolint.json + if: steps.check_files.outputs.files_exists == 'true' + uses: todogroup/repolinter-action@v1 + with: + config_file: "repolint.json" + - name: Run Repolinter with default ruleset + if: steps.check_files.outputs.files_exists == 'false' + uses: todogroup/repolinter-action@v1 + with: + config_url: "https://raw.githubusercontent.com/quic/.github/main/repolint.json" diff --git a/.github/workflows/stales.yml b/.github/workflows/stales.yml new file mode 100644 index 00000000..0a8685c0 --- /dev/null +++ b/.github/workflows/stales.yml @@ -0,0 +1,25 @@ +name: 'Close stale issues and pull requests with no recent activity' +on: + schedule: + - cron: "30 1 * * *" + +permissions: + issues: write + pull-requests: write + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + stale-issue-message: 'This issue has been marked as stale due to 30 days of inactivity. Please add a comment and close if it is resolved or if it is no longer relevant.' + stale-pr-message: 'This pull request has been marked as stale due to 30 days of inactivity. To prevent automatic closure in 5 days, remove the stale label or add a comment. You can reopen a closed pull request at any time.' + exempt-issue-labels: bug,enhancement + exempt-pr-labels: bug,enhancement + days-before-stale: 30 + days-before-close: 5 + days-before-issue-close: -1 + remove-stale-when-updated: true + remove-issue-stale-when-updated: true + remove-pr-stale-when-updated: true diff --git a/ci/base.yml b/ci/base.yml new file mode 100644 index 00000000..3fd82396 --- /dev/null +++ b/ci/base.yml @@ -0,0 +1,71 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + +distro: poky-altcfg + +defaults: + repos: + branch: master + +repos: + meta-qcom: + url: https://github.com/qualcomm-linux/meta-qcom + + oe-core: + url: https://github.com/openembedded/openembedded-core + layers: + meta: + + bitbake: + url: https://github.com/openembedded/bitbake + layers: + .: disabled + + meta-yocto: + url: https://git.yoctoproject.org/meta-yocto + layers: + meta-poky: + +local_conf_header: + base: | + CONF_VERSION = "2" + INHERIT += "buildstats-summary" + INHERIT += "buildhistory" + INHERIT += "rm_work" + diskmon: | + BB_DISKMON_DIRS ??= "\ + STOPTASKS,${TMPDIR},1G,100K \ + STOPTASKS,${DL_DIR},1G,100K \ + STOPTASKS,${SSTATE_DIR},1G,100K \ + STOPTASKS,/tmp,100M,100K \ + HALT,${TMPDIR},100M,1K \ + HALT,${DL_DIR},100M,1K \ + HALT,${SSTATE_DIR},100M,1K \ + HALT,/tmp,10M,1K" + clo-mirrors: | + MIRRORS:append = " \ + git://github.com git://git.codelinaro.org/clo/yocto-mirrors/github/ \ + git://.*/ git://git.codelinaro.org/clo/yocto-mirrors/ \ + https://.*/.*/ https://artifacts.codelinaro.org/codelinaro-le/ \ + " + cmdline: | + KERNEL_CMDLINE_EXTRA:append = " qcom_scm.download_mode=1" + qcomflash: | + IMAGE_CLASSES += "image_types_qcom" + IMAGE_FSTYPES += "qcomflash" + extra: | + DISTRO_FEATURES:append = " efi pni-names" + EXTRA_IMAGE_FEATURES = "allow-empty-password empty-root-password allow-root-login" + IMAGE_ROOTFS_EXTRA_SPACE = "307200" + WATCHDOG_RUNTIME_SEC:pn-systemd = "30" + uninative: | + INHERIT:remove = "uninative" + sstate: | + BB_SIGNATURE_HANDLER = "OEBasicHash" + +machine: unset + +target: + - core-image-base diff --git a/ci/debug.yml b/ci/debug.yml new file mode 100644 index 00000000..8458b756 --- /dev/null +++ b/ci/debug.yml @@ -0,0 +1,6 @@ +header: + version: 14 + +local_conf_header: + debug-build: | + DEBUG_BUILD = "1" diff --git a/ci/initramfs-test.yml b/ci/initramfs-test.yml new file mode 100644 index 00000000..eb2c4a35 --- /dev/null +++ b/ci/initramfs-test.yml @@ -0,0 +1,32 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + +local_conf_header: + fwcompress: | + FIRMWARE_COMPRESSION = "zst" + +target: + - initramfs-firmware-db8074-image + - initramfs-firmware-dragonboard410c-image + - initramfs-firmware-dragonboard820c-image + - initramfs-firmware-dragonboard845c-image + - initramfs-firmware-qar2130p-image + - initramfs-firmware-qcs615-ride-image + - initramfs-firmware-qcs8300-ride-image + - initramfs-firmware-rb1-image + - initramfs-firmware-rb2-image + - initramfs-firmware-rb3gen2-image + - initramfs-firmware-rb5-image + - initramfs-firmware-sa8775p-ride-image + - initramfs-firmware-sm8150-hdk-image + - initramfs-firmware-sm8350-hdk-image + - initramfs-firmware-sm8450-hdk-image + - initramfs-firmware-sm8550-hdk-image + - initramfs-firmware-sm8650-hdk-image + - initramfs-kerneltest-full-image + - initramfs-kerneltest-image + - initramfs-test-full-image + - initramfs-test-image + - initramfs-tiny-image diff --git a/ci/iq-615-evk.yml b/ci/iq-615-evk.yml new file mode 100644 index 00000000..f214942d --- /dev/null +++ b/ci/iq-615-evk.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: iq-615-evk diff --git a/ci/iq-8275-evk.yml b/ci/iq-8275-evk.yml new file mode 100644 index 00000000..b16dc6a5 --- /dev/null +++ b/ci/iq-8275-evk.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: iq-8275-evk diff --git a/ci/iq-9075-evk.yml b/ci/iq-9075-evk.yml new file mode 100644 index 00000000..75a09668 --- /dev/null +++ b/ci/iq-9075-evk.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: iq-9075-evk diff --git a/ci/iq-x7181-evk.yml b/ci/iq-x7181-evk.yml new file mode 100644 index 00000000..00ae0a43 --- /dev/null +++ b/ci/iq-x7181-evk.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: iq-x7181-evk diff --git a/ci/kaanapali-mtp.yml b/ci/kaanapali-mtp.yml new file mode 100644 index 00000000..b0c8fb5d --- /dev/null +++ b/ci/kaanapali-mtp.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: kaanapali-mtp diff --git a/ci/kas-container-shell-helper.sh b/ci/kas-container-shell-helper.sh new file mode 100755 index 00000000..f715f985 --- /dev/null +++ b/ci/kas-container-shell-helper.sh @@ -0,0 +1,20 @@ +#!/bin/sh -e +# Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +TOPDIR=$(realpath $(dirname $(readlink -f $0))/..) +SCRIPT=$(realpath $1) + +if ! [ -f $SCRIPT ]; then + echo "The script path argument is missing, please run it with:" + echo " $0 /path/to/script" + exit 1 +fi + +# make it relative to the TOPDIR +SCRIPT=${SCRIPT#$TOPDIR/} + +# on ci the kas-container is not on the default path +KAS_CONTAINER=${KAS_CONTAINER:-$(which kas-container)} + +exec $KAS_CONTAINER shell $TOPDIR/ci/base.yml:$TOPDIR/ci/qcom-distro.yml --command "/repo/$SCRIPT /repo /work" diff --git a/ci/kas-shell-helper.sh b/ci/kas-shell-helper.sh new file mode 100755 index 00000000..2479d033 --- /dev/null +++ b/ci/kas-shell-helper.sh @@ -0,0 +1,19 @@ +#!/bin/sh -e +# Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +TOPDIR=$(realpath $(dirname $(readlink -f $0))/..) +SCRIPT=$(realpath $1) + +if ! [ -f $SCRIPT ]; then + echo "The script path argument is missing, please run it with:" + echo " $0 /path/to/script" + exit 1 +fi + +# Ensure KAS workspace is outside of the checked out repo +# Allows the caller to specify KAS_WORK_DIR, otherwise make temp one +export KAS_WORK_DIR=$(realpath ${KAS_WORK_DIR:-$(mktemp -d)}) + +echo "Running kas in $KAS_WORK_DIR" +exec kas shell $TOPDIR/ci/base.yml --command "$SCRIPT $TOPDIR $KAS_WORK_DIR" diff --git a/ci/linux-qcom-6.18.yml b/ci/linux-qcom-6.18.yml new file mode 100644 index 00000000..075d9369 --- /dev/null +++ b/ci/linux-qcom-6.18.yml @@ -0,0 +1,7 @@ +header: + version: 14 + +local_conf_header: + kernelprovider: | + PREFERRED_PROVIDER_virtual/kernel = "linux-qcom" + PREFERRED_VERSION_virtual/kernel = "6.18%" diff --git a/ci/linux-qcom-next-rt.yml b/ci/linux-qcom-next-rt.yml new file mode 100644 index 00000000..eccae1ad --- /dev/null +++ b/ci/linux-qcom-next-rt.yml @@ -0,0 +1,6 @@ +header: + version: 14 + +local_conf_header: + kernelprovider: | + PREFERRED_PROVIDER_virtual/kernel = "linux-qcom-next-rt" diff --git a/ci/linux-qcom-next.yml b/ci/linux-qcom-next.yml new file mode 100644 index 00000000..dc4daf7f --- /dev/null +++ b/ci/linux-qcom-next.yml @@ -0,0 +1,6 @@ +header: + version: 14 + +local_conf_header: + kernelprovider: | + PREFERRED_PROVIDER_virtual/kernel = "linux-qcom-next" diff --git a/ci/linux-qcom-rt-6.18.yml b/ci/linux-qcom-rt-6.18.yml new file mode 100644 index 00000000..b10c55bb --- /dev/null +++ b/ci/linux-qcom-rt-6.18.yml @@ -0,0 +1,7 @@ +header: + version: 14 + +local_conf_header: + kernelprovider: | + PREFERRED_PROVIDER_virtual/kernel = "linux-qcom-rt" + PREFERRED_VERSION_virtual/kernel = "6.18%" diff --git a/ci/linux-yocto-dev.yml b/ci/linux-yocto-dev.yml new file mode 100644 index 00000000..2bf720f3 --- /dev/null +++ b/ci/linux-yocto-dev.yml @@ -0,0 +1,6 @@ +header: + version: 14 + +local_conf_header: + kernelprovider: | + PREFERRED_PROVIDER_virtual/kernel = "linux-yocto-dev" diff --git a/ci/mirror.yml b/ci/mirror.yml new file mode 100644 index 00000000..f2fdd3ba --- /dev/null +++ b/ci/mirror.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + +local_conf_header: + mirror: | + SSTATE_MIRRORS = "file://.* http://sstate.yoctoproject.org/all/PATH;downloadfilename=PATH" diff --git a/ci/performance.yml b/ci/performance.yml new file mode 100644 index 00000000..524f40a2 --- /dev/null +++ b/ci/performance.yml @@ -0,0 +1,6 @@ +header: + version: 14 + +local_conf_header: + cmdline: | + KERNEL_CMDLINE_EXTRA:append = " quiet" diff --git a/ci/qcm6490-idp.yml b/ci/qcm6490-idp.yml new file mode 100644 index 00000000..0331392b --- /dev/null +++ b/ci/qcm6490-idp.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: qcm6490-idp diff --git a/ci/qcom-armv7a.yml b/ci/qcom-armv7a.yml new file mode 100644 index 00000000..6cc84084 --- /dev/null +++ b/ci/qcom-armv7a.yml @@ -0,0 +1,11 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +local_conf_header: + qcomflash: | + +machine: qcom-armv7a diff --git a/ci/qcom-armv8a.yml b/ci/qcom-armv8a.yml new file mode 100644 index 00000000..6798ba13 --- /dev/null +++ b/ci/qcom-armv8a.yml @@ -0,0 +1,11 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +local_conf_header: + qcomflash: | + +machine: qcom-armv8a diff --git a/ci/qcom-distro-catchall.yml b/ci/qcom-distro-catchall.yml new file mode 100644 index 00000000..c63a2303 --- /dev/null +++ b/ci/qcom-distro-catchall.yml @@ -0,0 +1,13 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/qcom-distro.yml + +distro: qcom-distro-catchall + +target: + - qcom-multimedia-image + - qcom-multimedia-proprietary-image + - qcom-container-orchestration-image diff --git a/ci/qcom-distro-kvm.yml b/ci/qcom-distro-kvm.yml new file mode 100644 index 00000000..1a3ace09 --- /dev/null +++ b/ci/qcom-distro-kvm.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/qcom-distro.yml + +distro: qcom-distro-kvm diff --git a/ci/qcom-distro-prop-image.yml b/ci/qcom-distro-prop-image.yml new file mode 100644 index 00000000..cec2a629 --- /dev/null +++ b/ci/qcom-distro-prop-image.yml @@ -0,0 +1,11 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/qcom-distro.yml + +target: + - qcom-multimedia-image + - qcom-multimedia-proprietary-image + - qcom-container-orchestration-image diff --git a/ci/qcom-distro-selinux.yml b/ci/qcom-distro-selinux.yml new file mode 100644 index 00000000..bc9dd512 --- /dev/null +++ b/ci/qcom-distro-selinux.yml @@ -0,0 +1,12 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/qcom-distro.yml + +distro: qcom-distro-selinux + +target: + - qcom-multimedia-image + - qcom-multimedia-proprietary-image diff --git a/ci/qcom-distro-sota.yml b/ci/qcom-distro-sota.yml new file mode 100644 index 00000000..84d6ea4e --- /dev/null +++ b/ci/qcom-distro-sota.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/qcom-distro.yml + +distro: qcom-distro-sota diff --git a/ci/qcom-distro.yml b/ci/qcom-distro.yml new file mode 100644 index 00000000..29b76ab9 --- /dev/null +++ b/ci/qcom-distro.yml @@ -0,0 +1,50 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + +distro: qcom-distro + +repos: + meta-qcom-distro: + + meta-openembedded: + url: https://github.com/openembedded/meta-openembedded + layers: + meta-filesystems: + meta-gnome: + meta-multimedia: + meta-networking: + meta-oe: + meta-python: + meta-xfce: + + meta-virtualization: + url: https://git.yoctoproject.org/git/meta-virtualization + branch: master + + meta-audioreach: + url: https://github.com/AudioReach/meta-audioreach + branch: master + + meta-selinux: + branch: master + url: https://git.yoctoproject.org/meta-selinux + + meta-updater: + branch: master + url: https://github.com/uptane/meta-updater + + meta-security: + url: https://git.yoctoproject.org/meta-security + branch: master + layers: + .: + meta-tpm: + +local_conf_header: + virtualization: + SKIP_META_VIRT_SANITY_CHECK = "1" + +target: + - qcom-multimedia-image diff --git a/ci/qcs615-ride.yml b/ci/qcs615-ride.yml new file mode 100644 index 00000000..d09d46d3 --- /dev/null +++ b/ci/qcs615-ride.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: qcs615-ride diff --git a/ci/qcs8300-ride-sx.yml b/ci/qcs8300-ride-sx.yml new file mode 100644 index 00000000..213a2457 --- /dev/null +++ b/ci/qcs8300-ride-sx.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: qcs8300-ride-sx diff --git a/ci/qcs9100-ride-sx.yml b/ci/qcs9100-ride-sx.yml new file mode 100644 index 00000000..baa01b7b --- /dev/null +++ b/ci/qcs9100-ride-sx.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: qcs9100-ride-sx diff --git a/ci/rb1-core-kit.yml b/ci/rb1-core-kit.yml new file mode 100644 index 00000000..ac0bd029 --- /dev/null +++ b/ci/rb1-core-kit.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: rb1-core-kit diff --git a/ci/rb3gen2-core-kit.yml b/ci/rb3gen2-core-kit.yml new file mode 100644 index 00000000..0cab499d --- /dev/null +++ b/ci/rb3gen2-core-kit.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: rb3gen2-core-kit diff --git a/ci/schemacheck.py b/ci/schemacheck.py new file mode 100644 index 00000000..e8107802 --- /dev/null +++ b/ci/schemacheck.py @@ -0,0 +1,33 @@ +# Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +import os +import sys +import yaml +import voluptuous +from lava_common.schemas import validate + +exitcode = 0 + +for root, dirs, files in os.walk(sys.argv[1]): + for fname in files: + if fname.endswith(".yaml"): + filename = os.path.join(root, fname) + + try: + f = open(filename, "rb") + y = yaml.safe_load(f) + f.close() + validate(y) + print(f"{filename} is valid") + except voluptuous.Invalid as e1: + print(f"{filename} is invalid") + print(e1.msg) + print(e1.path) + exitcode += 1 + except yaml.error.MarkedYAMLError as e2: + print(f"{filename} is invalid") + print(e2.problem) + print(e2.problem_mark) + exitcode += 1 +sys.exit(exitcode) diff --git a/ci/sm8750-mtp.yml b/ci/sm8750-mtp.yml new file mode 100644 index 00000000..fe0c25d1 --- /dev/null +++ b/ci/sm8750-mtp.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: sm8750-mtp diff --git a/ci/world.yml b/ci/world.yml new file mode 100644 index 00000000..590fc47b --- /dev/null +++ b/ci/world.yml @@ -0,0 +1,13 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + +local_conf_header: + world_build: | + EXCLUDE_FROM_WORLD = "1" + EXCLUDE_FROM_WORLD:layer-qcom = "0" + #EXCLUDE_FROM_WORLD:layer-qcom-distro = "0" + +target: + - world diff --git a/ci/yocto-check-layer.sh b/ci/yocto-check-layer.sh new file mode 100755 index 00000000..add39021 --- /dev/null +++ b/ci/yocto-check-layer.sh @@ -0,0 +1,92 @@ +#!/bin/bash -e +# Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +if [ -z $1 ] || [ -z $2 ] ; then + echo "The REPO_DIR or WORK_DIR is empty and it needs to point to the corresponding directories." + echo "Please run it with:" + echo " $0 REPO_DIR WORK_DIR" + exit 1 +fi + +REPO_DIR="$1" +WORK_DIR="$2" + +_is_dir(){ + test -d "$1" && return + echo "The '$1' is not a directory." + exit 1 +} + +_is_dir "$REPO_DIR" +_is_dir "$WORK_DIR" + +# Creates a temporary build directory to run the yocto-check-layer +# script to avoid a contaminated environment. +BUILDDIR="$(mktemp -p $WORK_DIR -d -t build-yocto-check-layer-XXXX)" +source $WORK_DIR/oe-core/oe-init-build-env $BUILDDIR +git -c advice.detachedHead=false -c init.defaultBranch=master clone --quiet --shared $REPO_DIR meta-qcom-distro + +# Patch dependent layers otherwise breaking yocto-check-layer +bitbake-layers create-layer -a meta-patch +mkdir -p meta-patch/recipes-patch/patch +# Taint (by forced/invalidated task) changed from nostamp(uuid4):foo to nostamp(uuid4):foo +echo 'unset do_install[nostamp]' >> meta-patch/recipes-patch/patch/aide_%.bbappend +# Taint (by forced/invalidated task) changed from nostamp(uuid4):foo to nostamp(uuid4):foo +echo 'unset do_populate_registry[nostamp]' >> meta-patch/recipes-patch/patch/container-registry-populate.bbappend +# QA error because of network access +echo 'unset do_populate_registry[network]' >> meta-patch/recipes-patch/patch/container-registry-populate.bbappend +# Depends on the package outside of the layer set +echo 'EXCLUDE_FROM_WORLD = "1"' >> meta-patch/recipes-patch/patch/cockpit-machines_%.bbappend +# Missing or unbuildable dependency chain was: ['meta-world-pkgdata', 'packagegroup-yocto-builder', 'systemd'] +echo 'inherit features_check' >> meta-patch/recipes-patch/patch/packagegroup-yocto-builder.bbappend +echo 'REQUIRED_DISTRO_FEATURES = "systemd"' >> meta-patch/recipes-patch/patch/packagegroup-yocto-builder.bbappend + +# DISTRO features of qcom-distro +echo 'DISTRO_FEATURES:append:nodistro = " \ + bluetooth \ + efi \ + glvnd \ + opencl \ + opengl \ + overlayfs \ + pam \ + pni-names \ + ptest \ + security \ + tpm2 \ + virtualization \ + vulkan \ + wayland \ + wifi \ + x11 \ +"' >> conf/local.conf + +# Yocto Project layer checking tool +CMD="yocto-check-layer" +# Layer to check +CMD="$CMD meta-qcom-distro" +# Disable auto layer discovery +CMD="$CMD --no-auto" +# Layers to process for dependencies +CMD="$CMD --dependency" +CMD="$CMD $WORK_DIR/oe-core/meta" +CMD="$CMD $WORK_DIR/meta-qcom" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-oe" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-networking" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-multimedia" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-python" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-filesystems" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-gnome" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-xfce" +CMD="$CMD $WORK_DIR/meta-security" +CMD="$CMD $WORK_DIR/meta-security/meta-tpm" +CMD="$CMD $WORK_DIR/meta-selinux" +CMD="$CMD $WORK_DIR/meta-updater" +CMD="$CMD $WORK_DIR/meta-virtualization" +# Disable automatic testing of dependencies +CMD="$CMD --no-auto-dependency" +# Set machines to all machines defined in this BSP layer +CMD="$CMD --machines $(echo $(find ${WORK_DIR}/meta-qcom/conf/machine/ -maxdepth 1 -name *.conf -exec basename {} .conf \; ))" + +exec $CMD diff --git a/ci/yocto-patchreview.sh b/ci/yocto-patchreview.sh new file mode 100755 index 00000000..033c87e4 --- /dev/null +++ b/ci/yocto-patchreview.sh @@ -0,0 +1,29 @@ +#!/bin/sh -e +# Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +if [ -z $1 ] || [ -z $2 ] ; then + echo "The REPO_DIR or WORK_DIR is empty and it needs to point to the corresponding directories." + echo "Please run it with:" + echo " $0 REPO_DIR WORK_DIR" + exit 1 +fi + +REPO_DIR="$1" +WORK_DIR="$2" + +_is_dir(){ + test -d "$1" && return + echo "The '$1' is not a directory." + exit 1 +} + +_is_dir "$REPO_DIR" +_is_dir "$WORK_DIR" + + +$WORK_DIR/oe-core/scripts/contrib/patchreview.py -v -b -j status.json $REPO_DIR + +# return an error if any malformed patch is found +cat $WORK_DIR/build/status.json | + python3 -c "import json,sys;obj=json.load(sys.stdin); sys.exit(1) if 'malformed-sob' in obj[0] or 'malformed-upstream-status' in obj[0] else sys.exit(0)" diff --git a/ci/yocto-pybootchartgui.sh b/ci/yocto-pybootchartgui.sh new file mode 100755 index 00000000..80bf24d7 --- /dev/null +++ b/ci/yocto-pybootchartgui.sh @@ -0,0 +1,35 @@ +#!/bin/sh -e +# Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +if [ -z $1 ] || [ -z $2 ] ; then + echo "The REPO_DIR or WORK_DIR is empty and it needs to point to the corresponding directories." + echo "Please run it with:" + echo " $0 REPO_DIR WORK_DIR" + exit 1 +fi + +REPO_DIR="$1" +WORK_DIR="$2" + +_is_dir(){ + test -d "$1" && return + echo "The '$1' is not a directory." + exit 1 +} + +_is_dir "$REPO_DIR" +_is_dir "$WORK_DIR" + +# pybootchartgui tool +CMD="$CMD $WORK_DIR/oe-core/scripts/pybootchartgui/pybootchartgui.py" +# display time in minutes instead of seconds +CMD="$CMD --minutes" +# image format (png, svg, pdf); default format png +CMD="$CMD --format=svg" +# output path (file or directory) where charts are stored +CMD="$CMD --output=buildchart" +# /path/to/tmp/buildstats/// +CMD="$CMD $WORK_DIR/build/tmp/buildstats" + +exec $CMD diff --git a/recipes-products/packagegroups/packagegroup-qcom-utilities.bb b/recipes-products/packagegroups/packagegroup-qcom-utilities.bb index 5698dd4a..bc12cc55 100644 --- a/recipes-products/packagegroups/packagegroup-qcom-utilities.bb +++ b/recipes-products/packagegroups/packagegroup-qcom-utilities.bb @@ -69,7 +69,7 @@ RDEPENDS:${PN}-profile-utils = " \ perf \ powertop \ sysbench \ - systemd-analyze \ + ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd-analyze', '', d)} \ tiobench \ "