# GitHub workflow for registered users

Source: [https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html](https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html)

The following sections provide instructions to use GitHub to make a build utilizing
            prebuilt proprietary binaries/images.

## Host machine requirements

Source: [https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html](https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html)

| Configuration | Configuration | Configuration | Tools | Permissions |
| --- | --- | --- | --- | --- |
| **Linux** | **Windows** | **Mac** | Tools | Permissions |
| x86 machine | x86 machine | x86/Arm^®^ machine | Git 1.8.3.1 or later versions | A `sudo` permission is<br>                            required to execute a few commands. |
| Quad-core CPU, for example, Intel i7-2600 at 3.4 GHz<br>                            (equivalent or better) | 16-core CPU | 16-core CPU | Git 1.8.3.1 or later versions | A `sudo` permission is<br>                            required to execute a few commands. |
| 300 GB free disk space (swap partition &gt; 32 GB) | 300 GB free space for the VirtualBox VM | 300 GB free space for UTM | Python 3.10.2 or later versions | A `sudo` permission is<br>                            required to execute a few commands. |
| 16 GB RAM | 16 GB RAM | 16 GB RAM | GCC 7.5 or later versions | A `sudo` permission is<br>                            required to execute a few commands. |
| Ubuntu 22.04 | Microsoft Windows 11 OS | Apple^®^ Mac^®^ OS 14 | GNU Make 4.0 or later versions | A `sudo` permission is<br>                            required to execute a few commands. |
|  |  |  |  |  |
|  |  |  |  |  |
|  |  |  |  |  |
|  |  |  |  |  |

Note: To set up a virtual machine (VM)
            running Ubuntu 22.04 OS on Microsoft Windows or Apple Mac, see [Qualcomm Linux Virtual Machine Setup Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-41/).
            Code compilation on a VM is a slow process and may take a few hours. Qualcomm recommends
            using an Ubuntu host machine for compilation.

## Install QSC CLI

Source: [https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html](https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html)

Set up `qsc-cli`:
1. Install curl (if not already
                        installed):

        sudo apt install curlCopy to clipboard
2. Download the Debian package for
                        `qsc-cli`:

        cd <workspace_path>
        curl -L https://softwarecenter.qualcomm.com/api/download/software/qsc/linux/latest.deb -o qsc_installer.debCopy to clipboard
3. Install the `qsc-cli` Debian
                        package:

        sudo dpkg -i qsc_installer.debCopy to clipboard
4. Log in to
                        `qsc-cli`:

        qsc-cli login -u <username>Copy to clipboard

Note: A one-time login into [chipcode.qti.qualcomm.com](http://chipcode.qti.qualcomm.com/) is required to download Qualcomm
                    proprietary git repositories. Use your Qualcomm login credentials to complete
                    this step.
For more details, see `qsc-cli` related topics in
                            [How to](https://docs.qualcomm.com/doc/80-70014-254/topic/how_to.html).

## Workflow options

Source: [https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html](https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html)

There are two workflows for registered users to set up, sync, and build Qualcomm Linux
            with GitHub as described in the following table:

| ![](data:image/png;base64,UklGRp4DAABXRUJQVlA4TJEDAAAv8kAPEJDgtpEkSfz/szsdR3X3IPcEIqTUtiRIUkgICSEhJYSEgQUbJlwYsGHChQkHJhyYsCSEhJAQDp4Dt20cSdnrTc7MNtwPyL9ixfd1LwyFfWk/l4JpPCrjTvgFpO+2vIC/OyEBulaiCrgTgHzg5L0X3ltjeL3GdeGANm4L02e57dPGWa77Fl8At8UHgLztx86F3vdjkl73Y76+9NZHfT7eKP9vCkcp/2565TeR9MqnM/8DIwG6R90Kv4CXb8vftf4yMPCsOLlT+XnyZ5j2Ibcq6uO7LR9K/lUuKhzHsd6+5zeEMcEFez/sI4E/0J0dZjkekGFF34YFaz5gFm8fYRs18BdjwVrhAaTgpgOAEaLAfwxUnsBCnMD8pyHh5tyTNiEEPwgJePJrJGD8LCi6Fv0sRJeQKrg/7ApwupVLaNhCnFE3LNcRudnhgp0tq0UTZjmOGfR6DaFoELLzdS2jovq4yl4am2cL98RlyP2gOyWxzTtswDWLX92OESJSwD6qEnZsWfXLtjcaJCoeHSoW2frW0WbTNF4bu0yGi7l0GXI/6o4HUW730A0pi/dXJiCF6QAJtOCWhqakN2olGjjgvkxm38hrG4aIFqUfa9kYS+E5eWB7hALYzmXI/ag7GoIxU8l+WF0dT7B8up3uZkGzPKE3B6NOojAIs9G3TD5oWqAtC2N1rLLvhGoIsnIZcj/pDiujOubklgQ0Dfqxl4kVEi6s1miQSFphBTH7cuOUBg+mvcPGuHdxYZOVy5B73Z28UoLT3ZEQIIJ0IIGTiCrRGdm9hFMxoaqJPfrWSmhds0KC06WxUaagBYesXIbcT7pDeG57jM2i4FQ80Ik70hoNEskkPPpClGJFRrVbbjUYv411yrEhuQtSAFiBOnZBww7a7TjVI63RIJEMwp7ZdxpdA7ALHFMGz9sYcj/oTs2pIQom4LI40g69I0QZcaGM2InMdEaDRFmHWxO18JWnRUJ7SmBR5ji1ADkZv40h95PuUDdWXdVAbADKdTVg5YZYaUWYBqSroWY6o1nCAaSHMAUoCYBvfLVrS3SBBY6iAuBSQlrj9zHkftCdPHkRLjTtttESp5RJSA5IhHABaGHlUJkNndEswSSOH3NiR2uQpS+Up33RbQPPxhP2zmXI/ag7pmoCtVtqzlmVYEaOAuOcvpTCq/qRwWih1wi/Uk2+rdA28NaY0qKxcJlzP+2OcRL/4S4CAA==) | ![](data:image/png;base64,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) |
| :---: | :---: |
| Build public Qualcomm Yocto layers with standalone<br>                                commands. | Build public Qualcomm Yocto layers with Dockerfile. |
| [Build with standalone commands](https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html#build_from_source_github) | [Build with<br>                                    Dockerfile](https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html#build_private_distribution) |

## Build with standalone commands

Source: [https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html](https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html)

### Ubuntu host setup

The Ubuntu host machine needs a few setup operations to ensure that the required
                software tools are ready.

1. Install the following packages to prepare your host environment for Yocto
                    build:

        sudo apt update
        sudo apt install repo gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint xterm python3-subunit mesa-common-dev zstd liblz4-tool locales tar python-is-python3 file libxml-opml-simplegen-perl vim whiptailCopy to clipboard
2. Add your Qualcomm login ID with Personalized Access Token (PAT) to the
                        `.netrc` file in your home
                        directory:

        # Log in to qsc-cli to generate PAT
        qsc-cli login -u <username>
        # Run the following command to generate PAT
        qsc-cli pat --get
        # This command gives output as shown in the following note
        # The last line in this output is the token, which can be used to access
        # Qualcomm Proprietary repositories. This token expires in two weeks.Copy to clipboard

Note: 
                        
user@hostname:/local/mnt/workspace$ qsc-cli pat --get

[Info]: Starting qsc-cli version 0.0.0.9

**5LThNlklb55mMVLB5C2KqUGU2jCF**

        vim ~/.netrc # add the following entries
         
        machine chipmaster2.qti.qualcomm.com
        login <your Qualcomm login id>
        password <your PAT token>
         
        machine qpm-git.qualcomm.com
        login <your Qualcomm login id>
        password <your PAT token>Copy to clipboard
3. Set up the locales (if not set up
                    already):

        sudo locale-gen en_US.UTF-8
        sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
        export LC_ALL=en_US.UTF-8
        export LANG=en_US.UTF-8Copy to clipboard
4. Update git
                    configurations:

        # Check if your identity is configured in .gitconfig
        git config --get user.email
        git config --get user.name
         
        # Run the following commands if you do not have your account identity set in .gitconfig
        git config --global user.email <Your email ID>
        git config --global user.name <"Your Name">
         
        # Add the following UI color option for output of console (optional)
        git config --global color.ui auto
         
        # Add the following git configurations to fetch large size repositories and to avoid unreliable connections
        git config --global http.postBuffer 1048576000
        git config --global http.maxRequestBuffer 1048576000
        git config --global http.lowSpeedLimit 0
        git config --global http.lowSpeedTime 999999
        
        # Add the following git configurations to follow remote redirects from http-alternates files or alternates
        git config --global http.https://chipmaster2.qti.qualcomm.com.followRedirects true
        git config --global http.https://qpm-git.qualcomm.com.followRedirects trueCopy to clipboard

### Sync

This section uses the Repo tool installed in the previous section to download a list
                of git repositories and additional attributes from the [Qualcomm manifest](https://github.com/quic-yocto/qcom-manifest). As part of this process, it downloads
                the manifests used in the `repo init` command.

The following table shows an example mapping of Yocto layers to the manifest release
                tags that are used to download and build Qualcomm Linux:

| Yocto layers | Manifest release tag | Distribution (`DISTRO`) |
| --- | --- | --- |
| <ul class="ul" id="build_from_source_github__ul_b5j_xrl_qbc_vinayjk_06-06-24-1307-46-325"><br>                                    <li class="li"><code class="ph codeph">meta-qcom</code></li><br><br>                                    <li class="li"><code class="ph codeph">meta-qcom-hwe</code></li><br><br>                                </ul> | Base build: High-level OS and prebuilt firmware (GPS only)<br><br><br>                                <br>`qcom-6.6.28-QLI.1.1-Ver.1.1.xml` | `qcom-wayland` |
| <ul class="ul" id="build_from_source_github__ul_c5j_xrl_qbc_vinayjk_06-06-24-1307-46-325"><br>                                    <li class="li"><code class="ph codeph">meta-qcom</code></li><br><br>                                    <li class="li"><code class="ph codeph">meta-qcom-hwe</code></li><br><br>                                    <li class="li"><code class="ph codeph">meta-qcom-qim-product-sdk</code></li><br><br>                                </ul> | Base build + QIMP SDK build:<br><br><br>                                <br>`qcom-6.6.28-QLI.1.1-Ver.1.1_qim-product-sdk-1.1.3.xml` | `qcom-wayland` |
| <ul class="ul" id="build_from_source_github__ul_az4_njb_wbc_vinayjk_06-26-24-1355-19-162"><br>                                    <li class="li"><code class="ph codeph">meta-qcom</code></li><br><br>                                    <li class="li"><code class="ph codeph">meta-qcom-hwe</code></li><br><br>                                    <li class="li"><code class="ph codeph">meta-qcom-realtime</code></li><br><br>                                </ul> | Base build + Real-time kernel build:<br><br><br>                                <br>`qcom-6.6.28-QLI.1.1-Ver.1.1_realtime-linux-1.0.xml` | `qcom-wayland` |
| <ul class="ul" id="build_from_source_github__ul_rlp_q2t_qbc_vinayjk_06-07-24-1350-57-451"><br>                                    <li class="li"><code class="ph codeph">meta-qcom</code></li><br><br>                                    <li class="li"><code class="ph codeph">meta-qcom-hwe</code></li><br><br>                                    <li class="li"><code class="ph codeph">meta-ros</code></li><br><br>                                    <li class="li"><code class="ph codeph">meta-qcom-robotics</code></li><br><br>                                    <li class="li"><code class="ph codeph">meta-qcom-robotics-distro</code></li><br><br>                                    <li class="li"><code class="ph codeph">meta-qcom-robotics-sdk</code></li><br><br>                                    <li class="li"><code class="ph codeph">meta-qcom-qim-product-sdk</code></li><br><br>                                </ul> | Base build + QIRP SDK build:<br><br><br>                                <br>`qcom-6.6.28-QLI.1.1-Ver.1.1_robotics-product-sdk-1.1.xml` | `qcom-robotics-ros2-humble` |

For Yocto layer descriptions, see [Table :  1. Qualcomm Linux Yocto layers](https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_qsc_gui_intro.html#concept_n2t_tjn_w1c__Yocto_layer_descriptions).

Note: For information on building the
                    `meta-qcom-extras` add-on layer and select firmware sources, see
                    [GitHub workflow (firmware and extras)](https://docs.qualcomm.com/doc/80-70014-254/topic/build_addn_info.html).

### Build base image

1. Download Qualcomm Yocto and supporting
                        layers:

        # cd to directory where you have 300 GB of free storage space to create your workspaces
        mkdir <WORKSPACE_DIR>
        cd <WORKSPACE_DIR>
        repo init -u https://github.com/quic-yocto/qcom-manifest -b qcom-linux-kirkstone -m <manifest release tag>
        # Example, <manifest release tag> is qcom-6.6.28-QLI.1.1-Ver.1.1.xml
        repo syncCopy to clipboard

Note: For the latest
                            `<manifest release tag>`, see the <cite class="cite">Build-critical
                            release tags</cite> section in the [Release
                            Notes](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-240626095531/).
2. Set up the build
                    environment:

        MACHINE=qcm6490 DISTRO=qcom-wayland source setup-environment
        # source setup-environment: Sets the environment settings, creates the build directory build-qcom-wayland,
        # and enters into build-qcom-wayland directory.Copy to clipboard
3. Build the software image:
Note: For supported image
                        recipes, see [What are the image recipes supported as part of the GitHub workflow?](https://docs.qualcomm.com/doc/80-70014-254/topic/how_to.html#howto_build__section_x3c_n5l_zbc_vinayjk_07-08-24-1744-58-455).

        bitbake <image recipes>
        bitbake qcom-multimedia-imageCopy to clipboard

On successful build, you can
                        check if `system.img` is present in the
                            `<workspace_path>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-multimedia-image`
                        directory:

        cd <workspace_path>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-multimedia-image
        ls -al system.imgCopy to clipboard

### Build QIMP SDK image

1. Download Qualcomm Yocto and supporting layers:
Note: The `<manifest
                            release tag>` for QIMP SDK build is the same as the base build.
                        QIMP SDK layer must be cloned on top of the base
                        build.

        # cd to directory where you have 300 GB of free storage space to create your workspaces
        mkdir <WORKSPACE_DIR>
        cd <WORKSPACE_DIR>
        repo init -u https://github.com/quic-yocto/qcom-manifest -b qcom-linux-kirkstone -m <manifest release tag>
        # Example, <manifest release tag> is qcom-6.6.28-QLI.1.1-Ver.1.1.xml
        repo syncCopy to clipboard

Note: For the latest `<manifest release tag>`, see the
                            <cite class="cite">Build-critical release tags</cite> section in the [Release
                            Notes](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-240626095531/).
2. Clone QIMP SDK layer into the
                        workspace:

        git clone https://github.com/quic-yocto/meta-qcom-qim-product-sdk -b <qim-product-sdk release tag> layers/meta-qcom-qim-product-sdk
        # Example, <qim-product-sdk release tag> is qcom-6.6.28-QLI.1.1-Ver.1.1_qim-product-sdk-1.1.3Copy to clipboard

To
                        build a QIMP SDK layer, the following export is
                        required:

        export EXTRALAYERS="meta-qcom-qim-product-sdk"Copy to clipboard
3. Set up the build
                    environment:

        MACHINE=qcm6490 DISTRO=qcom-wayland source setup-environment
        # source setup-environment: Sets the environment settings, creates the build directory build-qcom-wayland,
        # and enters into build-qcom-wayland directory.Copy to clipboard
4. Build the software
                        image:

        bitbake qcom-multimedia-image
        # Build SDK image
        bitbake qim-product-sdkCopy to clipboard

On successful build, you can check if
                            `system.img` is present in the
                            `<workspace_path>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-multimedia-image`
                        directory:

        cd <workspace_path>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-multimedia-image
        ls -al system.imgCopy to clipboard

### Build QIRP SDK image

1. Download Qualcomm Yocto and supporting layers:
Note: The `<manifest
                            release tag>` for QIRP SDK build is the same as the base build.
                        QIRP SDK layers must be cloned on top of the base
                        build.

        # cd to directory where you have 300 GB of free storage space to create your workspaces
        mkdir <WORKSPACE_DIR>
        cd <WORKSPACE_DIR>
        repo init -u https://github.com/quic-yocto/qcom-manifest -b qcom-linux-kirkstone -m <manifest release tag>
        # Example, <manifest release tag> is qcom-6.6.28-QLI.1.1-Ver.1.1.xml
        repo syncCopy to clipboard

Note: For the latest
                            `<manifest release tag>`, see the <cite class="cite">Build-critical
                            release tags</cite> section in the [Release
                            Notes](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-240626095531/).
2. Download the QIRP SDK layers into the base build `<WORKSPACE
                        DIR>`
                    directory:

        git clone https://git.codelinaro.org/clo/le/meta-ros.git -b ros.qclinux.1.0.r1-rel layers/meta-ros
        git clone https://github.com/quic-yocto/meta-qcom-robotics.git layers/meta-qcom-robotics
        git clone https://github.com/quic-yocto/meta-qcom-robotics-distro.git layers/meta-qcom-robotics-distro
        git clone https://github.com/quic-yocto/meta-qcom-robotics-sdk.git layers/meta-qcom-robotics-sdk
        git clone https://github.com/quic-yocto/meta-qcom-qim-product-sdk layers/meta-qcom-qim-product-sdkCopy to clipboard
3. Set up the build
                    environment:

        ln -s layers/meta-qcom-robotics-distro/set_bb_env.sh ./setup-robotics-environment
        ln -s layers/meta-qcom-robotics-sdk/scripts/qirp-build ./qirp-build
        MACHINE=qcm6490 DISTRO=qcom-robotics-ros2-humble source setup-robotics-environment
        # source setup-robotics-environment: Sets the environment settings, creates the build directory build-qcom-robotics-ros2-humble,
        # and enters into build-qcom-robotics-ros2-humble directory.Copy to clipboard
4. Build the robotics image and QIRP SDK
                        artifacts:

        ../qirp-build qcom-robotics-full-imageCopy to clipboard

On
                        a successful build, you can see the QIRP SDK build artifacts at the
                        following
                        paths:

        QIRP SDK artifacts: <WORKSPACE DIR>/build-qcom-robotics-ros2-humble/tmp-glibc/deploy/qirpsdk_artifacts/qirp-sdk_<version>.tar.gz
        # system.img is present in the following path
        Robotics image: <WORKSPACE DIR>/build-qcom-robotics-ros2-humble/tmp-glibc/deploy/images/qcm6490/qcom-robotics-full-imageCopy to clipboard

### Build real-time Linux image

1. Download Qualcomm Yocto and supporting layers:
Note: The `<manifest
                            release tag>` for real-time Linux image is the same as the base
                        build. Real-time Linux must be cloned on top of the base
                        build.

        # cd to directory where you have 300 GB of free storage space to create your workspaces
        mkdir <WORKSPACE_DIR>
        cd <WORKSPACE_DIR>
        repo init -u https://github.com/quic-yocto/qcom-manifest -b qcom-linux-kirkstone -m <manifest release tag>
        # Example, <manifest release tag> is qcom-6.6.28-QLI.1.1-Ver.1.1.xml
        repo syncCopy to clipboard

Note: For the latest
                            `<manifest release tag>`, see the <cite class="cite">Build-critical
                            release tags</cite> section in the [Release
                            Notes](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-240626095531/).
2. Clone real-time Linux layer into the
                        workspace:

        git clone https://github.com/quic-yocto/meta-qcom-realtime -b <meta-qcom-realtime release tag> layers/meta-qcom-realtime
        # Example, <meta-qcom-realtime release tag> is qcom-6.6.28-QLI.1.1-Ver.1.1_realtime-linux-1.0Copy to clipboard

To
                        build a real-time layer, the following export is
                        required:

        export EXTRALAYERS="meta-qcom-realtime"Copy to clipboard
3. Set up the build
                    environment:

        MACHINE=qcm6490 DISTRO=qcom-wayland source setup-environment
        # source setup-environment: Sets the environment settings, creates the build directory build-qcom-wayland,
        # and enters into build-qcom-wayland directoryCopy to clipboard
4. Build the software
                        image:

        bitbake qcom-multimedia-imageCopy to clipboard

On
                        successful build, you can check if `system.img` is present in
                        the
                            `<workspace_path>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-multimedia-image`
                        directory:

        cd <workspace_path>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-multimedia-image
        ls -al system.imgCopy to clipboard

### Flash

Flash software images to the device using [Flash images for registered users](https://docs.qualcomm.com/doc/80-70014-254/topic/flash_images.html).

## Build with Dockerfile

Source: [https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html](https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html)

### Ubuntu host setup

- Install
                    git:

        # Install git if you have not already installed
        sudo apt install gitCopy to clipboard
- Clone the `qcom-download-utils` git repository, which provides
                    Dockerfile for Qualcomm public Yocto layers and a few helper
                    scripts:

        mkdir <workspace_path>
        cd <workspace_path>
        git clone https://git.codelinaro.org/clo/le/qcom-download-utils.git
        cd qcom-download-utilsCopy to clipboard
- Add user to the Docker
                    group:

        sudo usermod -aG docker $USER
        newgrp docker
        # To check if user is part of a Docker group, run the following command:
        sudo grep /etc/group -e "docker"Copy to clipboard

### Check the machine configuration

- Check if your host is configured
                        accurately:

        bash utils/check_config.sh
        # Resolve the errors and run this command until no errors show upCopy to clipboard
- Install
                    Docker:

        bash docker/docker_setup.shCopy to clipboard

Note: As part of the Docker setup, the
                    `qcom-download-utils` directory structure is shown in the
                following figure:
![](data:image/png;base64,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)

### Build base image

Create a Yocto Docker image and build:
1. Run `docker_build.sh` to create the Docker image with
                            Dockerfile (**Dockerfile\_22.04**) and Dockertag
                                (**qcom-6.6.28-qli.1.1-ver.1.1\_22.04**). This Docker image is
                            used to create the container environment to run the Yocto build.

**Dockertag**: Release folder in lower case letters appended by the
                            Dockerfile OS version to enable easy identification of the release build
                            with Dockerfile (Docker does not allow upper case letters in the
                                Dockertag).
Note: See [docker troubleshooting](https://docs.qualcomm.com/doc/80-70014-254/topic/troubleshoot_sync_build_and_flash.html#troubleshoot_sync_build_and_flash__section_hkm_2dc_p1c_vinayjk_02-29-24-1641-18-155) for troubleshooting Docker
                                issues.

        bash docker/docker_build.sh -f ./docker/dockerfiles/Dockerfile_22.04 -t qcom-6.6.28-qli.1.1-ver.1.1_22.04Copy to clipboard

If
                            you face any issues while running `docker_build.sh`, see
                            the following
                            solution:

        # Error 1: cache related issue.
           # If you are facing issue with the docker build command, try using --no-cache option. This option will force rebuilding of layers already available
           $ bash docker/docker_build.sh -n --no-cache -f ./docker/dockerfiles/Dockerfile_22.04 -t qcom-6.6.28-qli.1.1-ver.1.1_22.04
        
        # Error2: response from daemon: Get "https://registry-1.docker.io/v2/": http: server gave HTTP response to HTTPS client
           # Add internal Docker registry mirror. (Internal-only setting for the Qualcomm network)
           # Using a tab instead of space and other invisible white-space characters may break the proper work of json configuration files
           # and later may lead to Docker service failing to start.
        
           # Solution:
             sudo vim /etc/docker/daemon.json
             # Add an entry similar to the following in /etc/docker/daemon.json:
             {
                "registry-mirrors": ["https://docker-registry.qualcomm.com"]
             }
             # Restart the Docker service to take the new settings
             sudo systemctl restart dockerCopy to clipboard
2. Sync and build the Yocto image in a Docker container with the Docker tag and
                        release
                        parameters:

        bash docker/docker_run.sh -t qcom-6.6.28-qli.1.1-ver.1.1_22.04 -r qcom-6.6.28-QLI.1.1-Ver.1.1Copy to clipboard

Build
                        workspace is available in `<qcom-download-utils download
                            path>/<release>/build-qcom-wayland`. For example,
                            `qcom-download-utils/qcom-6.6.28-QLI.1.1-Ver.1.1/build-qcom-wayland`.

Note: **# ERROR: error.GitError: git                    config ('--replace-all', 'color.ui', 'auto'): error: could not write config file                    /home/$USER/.gitconfig: Device or resource busy**
This error is triggered
                    when your gitconfig does not set the UI color configuration as Git 1.8.4 is
                    enabled by default. To enable color display in your account, run the following
                    command: `git config --global color.ui auto`.

Note: If a build error is triggered
                and fixed, run the commands in [Rebuild](https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html#build_private_distribution__section_p1h_tv3_v1c_vinayjk_03-23-24-142-26-643).

### Build QIMP SDK image

1. [Build base
                        image](https://docs.qualcomm.com/doc/80-70014-254/topic/build_from_source_github_intro.html#build_private_distribution__section_opk_sh4_w1c) with Docker.
2. Build QIMP SDK on top of the base image with Docker:
    1. Run the `docker run`
                            command:

            # Run the following commands inside the base image build location
            cd <workspace_path>/qcom-download-utils/qcom-6.6.28-QLI.1.1-Ver.1.1
            bash
            docker run -it -v "${HOME}/.gitconfig":"/home/${USER}/.gitconfig" -v "${HOME}/.netrc":"/home/${USER}/.netrc" -v $(pwd):$(pwd) -w $(pwd) qcom-6.6.28-qli.1.1-ver.1.1_22.04 /bin/bashCopy to clipboard
    2. Clone QIMP SDK layer into the
                                workspace:

            git clone https://github.com/quic-yocto/meta-qcom-qim-product-sdk -b <qim-product-sdk release tag> layers/meta-qcom-qim-product-sdk
            # Example, <qim-product-sdk release tag> is qcom-6.6.28-QLI.1.1-Ver.1.1_qim-product-sdk-1.1.3Copy to clipboard

To
                                build a QIMP SDK layer, the following export is
                                required:

            export EXTRALAYERS="meta-qcom-qim-product-sdk"Copy to clipboard
    3. Set up the build
                            environment:

            MACHINE=qcm6490 DISTRO=qcom-wayland source setup-environment
            # source setup-environment: Sets the environment settings, creates the build directory build-qcom-wayland,
            # and enters into build-qcom-wayland directoryCopy to clipboard
    4. Build the software
                            image:

            bitbake qcom-multimedia-image
            # Build SDK image
            bitbake qim-product-sdkCopy to clipboard

### Rebuild

- List the Docker
                        images:

        docker imagesCopy to clipboard

This command generates the following
                        output:

        REPOSITORY                                               TAG                         IMAGE ID       CREATED        SIZE
        qcom-6.6.28-qli.1.1-ver.1.1_22.04                        latest                      8fcea388d8ca   2 days ago     1.47GBCopy to clipboard
- Attach the
                    container:

        # Run the following commands outside the Docker container
        cd <workspace_path>/qcom-download-utils/qcom-6.6.28-QLI.1.1-Ver.1.1
        
        # Run the following commands inside the base image build location
        bash
        docker run -it -v "${HOME}/.gitconfig":"/home/${USER}/.gitconfig" -v "${HOME}/.netrc":"/home/${USER}/.netrc" -v $(pwd):$(pwd) -w $(pwd) qcom-6.6.28-qli.1.1-ver.1.1_22.04 /bin/bash
        
        # Example
        WORKSPACE=<workspace_path>/qcom-download-utils/qcom-6.6.28-QLI.1.1-Ver.1.1Copy to clipboard
- Set up the build
                    environment:

        # cd <release directory>
        MACHINE=qcm6490 DISTRO=qcom-wayland source setup-environment
        # source setup-environment: Sets the environment settings, creates the build directory build-qcom-wayland,
        # and enters into build-qcom-wayland directoryCopy to clipboard
- Build the software
                    image:

        bitbake qcom-multimedia-imageCopy to clipboard

### Flash

Flash software images to the device using [Flash images for registered users](https://docs.qualcomm.com/doc/80-70014-254/topic/flash_images.html).

Last Published: Aug 07, 2024

[Previous Topic
GitHub workflow for unregistered users](https://docs.qualcomm.com/bundle/publicresource/80-70014-254/topics/github_workflow_unregistered_users.md) [Next Topic
GitHub workflow (firmware and extras)](https://docs.qualcomm.com/bundle/publicresource/80-70014-254/topics/build_addn_info.md)