# 注册用户的 GitHub 工作流程

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

以下章节提供了使用 GitHub 基于预编译的专有二进制文件/镜像进行编译的说明。

## 主机要求

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

| 配置 | 配置 | 配置 | 工具 | 权限 |
| --- | --- | --- | --- | --- |
| **Linux** | **Windows** | **MAC** | 工具 | 权限 |
| x86 机器 | x86 机器 | x86/Arm^®^ 机器 | Git 1.8.3.1 或更高版本 | 有些命令在执行时需要 `sudo` 权限。 |
| 至少四核 CPU，例如 Intel i7-2600 @ 3.4 GHz（同等或更高配置） | 16 核 CPU | 16 核 CPU | Git 1.8.3.1 或更高版本 | 有些命令在执行时需要 `sudo` 权限。 |
| 300 GB 可用磁盘空间（交换分区 &gt; 32 GB） | 300 GB 可用磁盘空间，供 VirtualBox VM 使用 | 300 GB 可用磁盘空间，供 UTM 使用 | Python 3.10.2 或更高版本 | 有些命令在执行时需要 `sudo` 权限。 |
| 16 GB RAM | 16 GB RAM | 16 GB RAM | GCC 7.5 或更高版本 | 有些命令在执行时需要 `sudo` 权限。 |
| Ubuntu 22.04 | Microsoft Windows 11 操作系统 | Apple^®^ Mac^®^ OS 14 | GNU Make 4.0 或更高版本 | 有些命令在执行时需要 `sudo` 权限。 |
|  |  |  |  |  |
|  |  |  |  |  |
|  |  |  |  |  |
|  |  |  |  |  |

Note: 若要在 Microsoft Windows 或 Apple Mac 上搭建运行 Ubuntu 22.04 操作系统的虚拟机 (VM)，参见 [Qualcomm Linux 虚拟机搭建指南](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-41/)。VM 上的代码编译是一个较慢的过程，可能需要几个小时。Qualcomm 建议使用 Ubuntu 主机进行编译。

## 安装 QSC CLI

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

安装 `qsc-cli`：
1. 安装 curl（如果尚未安装）：

        sudo apt install curlCopy to clipboard
2. 下载 `qsc-cli` 的 Debian 软件包：

        cd <workspace_path>
        curl -L https://softwarecenter.qualcomm.com/api/download/software/qsc/linux/latest.deb -o qsc_installer.debCopy to clipboard
3. 安装 `qsc-cli` Debian 软件包：

        sudo dpkg -i qsc_installer.debCopy to clipboard
4. 登录到 `qsc-cli`：

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

Note: 需要登录一次 [chipcode.qti.qualcomm.com](http://chipcode.qti.qualcomm.com/) 才能下载 Qualcomm 专有的 git 代码仓库。使用您的 Qualcomm 帐号密码完成此步骤。
有关更多详细信息，参见[方法](https://docs.qualcomm.com/doc/80-70014-254Y/topic/how_to.html)章节中与 `qsc-cli` 相关的主题。

## 工作流选项

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

注册用户可以通过两种工作流程使用 GitHub 设置、同步和编译 Qualcomm Linux，如下表中所述：

| ![](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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) |
| :---: | :---: |
| 使用独立命令编译公共 Qualcomm Yocto 层。 | 使用 Dockerfile 编译公共 Qualcomm Yocto 层。 |
| [使用独立命令编译](https://docs.qualcomm.com/doc/80-70014-254Y/topic/build_from_source_github_intro.html#build_from_source_github) | [使用 Dockerfile 编译](https://docs.qualcomm.com/doc/80-70014-254Y/topic/build_from_source_github_intro.html#build_private_distribution) |

## 使用独立命令编译

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

### Ubuntu 主机配置

Ubuntu 主机需要进行一些配置操作，确保所需的软件工具已准备就绪。

1. 安装以下软件包，准备好运行 Yocto 版本所需的主机环境：

        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. 将 Qualcomm 登录 ID 及个人访问令牌 (PAT) 添加到主目录下的 `.netrc` 文件中：

        # 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]: 启动 qsc-cli 版本 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. 设置语言环境（如果尚未设置）：

        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. 更新 git 配置：

        # 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

### 同步

本节使用上一节中安装的 Repo 工具从 [Qualcomm manifest](https://github.com/quic-yocto/qcom-manifest) 中下载 git 代码仓库列表和其他配置文件。作为此过程的一部分，它会下载 `repo init` 命令中使用的 manifest。

下表显示了 Yocto 层到用于下载和编译 Qualcomm Linux 的 manifest release tag 的示例映射：

| Yocto 层 | Manifest release tag | 发行版 (`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> | 基础版本：High-level OS 和预编译固件（仅限 GPS）<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> | 基础版本 + QIMP SDK 版本：<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> | 基础版本 + 实时内核版本：<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> | 基础版本 + QIRP SDK 版本：<br><br><br>                                <br>`qcom-6.6.28-QLI.1.1-Ver.1.1_robotics-product-sdk-1.1.xml` | `qcom-robotics-ros2-humble` |

有关 Yocto 层的说明，参见[Table :  1. Qualcomm Linux Yocto 层](https://docs.qualcomm.com/doc/80-70014-254Y/topic/build_from_source_qsc_gui_intro.html#concept_n2t_tjn_w1c__Yocto_layer_descriptions)。

Note: 有关编译 `meta-qcom-extras` 附加层和选择固件源代码的信息，参见 [GitHub 工作流程（固件和附加组件）](https://docs.qualcomm.com/doc/80-70014-254Y/topic/build_addn_info.html)。

### 编译基础镜像

1. 下载 Qualcomm Yocto 和支持层：

        # 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: 有关最新的 `<manifest release tag>`，参见[发行说明](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-240626095531/)中的<cite class="cite">编译关键发布标签</cite>部分。
2. 搭建编译环境：

        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. 编译软件镜像：
Note: 有关支持的镜像配方，参见 [GitHub 工作流程支持哪些镜像配方？](https://docs.qualcomm.com/doc/80-70014-254Y/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

编译成功后，可以检查 `system.img` 是否位于 `<workspace_path>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-multimedia-image` 目录中：

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

### 编译 QIMP SDK 镜像

1. 下载 Qualcomm Yocto 和支持层：
Note: QIMP SDK 版本的 `<manifest release tag>` 与基础版本相同。必须在基础编译版本之上克隆 QIMP SDK 层。

        # 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: 有关最新的 `<manifest release tag>`，参见[发行说明](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-240626095531/)中的<cite class="cite">编译关键发布标签</cite>部分。
2. 将 QIMP SDK 层克隆到工作区：

        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

要编译 QIMP SDK 层，需要进行以下导出操作：

        export EXTRALAYERS="meta-qcom-qim-product-sdk"Copy to clipboard
3. 搭建编译环境：

        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. 编译软件镜像：

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

编译成功后，可以检查 `system.img` 是否位于 `<workspace_path>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-multimedia-image` 目录中：

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

### 编译 QIRP SDK 镜像

1. 下载 Qualcomm Yocto 和支持层：
Note: QIRP SDK 版本的 `<manifest release tag>` 与基础版本相同。必须在基础版本之上克隆 QIRP SDK 层。

        # 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: 有关最新的 `<manifest release tag>`，参见[发行说明](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-240626095531/)中的<cite class="cite">编译关键发布标签</cite>部分。
2. 将 QIRP SDK 层下载到基础版本 `<WORKSPACE DIR>` 目录中：

        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. 搭建编译环境：

        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. 编译 robotics 镜像和 QIRP SDK 文件：

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

编译成功后，可以在以下路径看到 QIRP SDK 编译文件：

        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

### 编译实时 Linux 镜像

1. 下载 Qualcomm Yocto 和支持层：
Note: 实时 Linux 镜像的 `<manifest release tag>` 与基础版本相同。必须在基础版本之上克隆实时 Linux。

        # 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: 有关最新的 `<manifest release tag>`，参见[发行说明](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-240626095531/)中的<cite class="cite">编译关键发布标签</cite>部分。
2. 将实时 Linux 层克隆到工作区中：

        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

要编译实时层，需要进行以下导出操作：

        export EXTRALAYERS="meta-qcom-realtime"Copy to clipboard
3. 搭建编译环境：

        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. 编译软件镜像：

        bitbake qcom-multimedia-imageCopy to clipboard

编译成功后，可以检查 `system.img` 是否位于 `<workspace_path>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-multimedia-image` 目录中：

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

### 刷写

按[注册用户刷写镜像](https://docs.qualcomm.com/doc/80-70014-254Y/topic/flash_images.html)章节所述，将软件镜像刷入设备。

## 使用 Dockerfile 编译

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

### Ubuntu 主机配置

- 安装 git：

        # Install git if you have not already installed
        sudo apt install gitCopy to clipboard
- 克隆 `qcom-download-utils` git 代码仓库，该代码仓库提供了 Qualcomm 公共 Yocto 层的 Dockerfile 和一些帮助脚本：

        mkdir <workspace_path>
        cd <workspace_path>
        git clone https://git.codelinaro.org/clo/le/qcom-download-utils.git
        cd qcom-download-utilsCopy to clipboard
- 将用户添加到 Docker 组：

        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

### 检查机器配置

- 检查主机配置是否正确：

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

        bash docker/docker_setup.shCopy to clipboard

Note: 在 Docker 安装过程中，`qcom-download-utils` 目录结构如下图所示：
![](data:image/png;base64,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)

### 编译基础镜像

创建 Yocto Docker 镜像并编译：
1. 运行 `docker_build.sh` 创建带有 Dockerfile (**Dockerfile\_22.04**) 和 Dockertag (**qcom-6.6.28-qli.1.1-ver.1.1\_22.04**) 的 Docker 镜像。此 Docker 镜像用于创建容器环境来运行 Yocto 编译版本。

**Dockertag**：小写字母的发行版本文件夹后面附加 Dockerfile 操作系统版本，可轻松识别带有 Dockerfile 的发行版本（Docker 不支持在 Dockertag 中使用大写字母）。
Note: 参见 [docker 故障排除](https://docs.qualcomm.com/doc/80-70014-254Y/topic/troubleshoot_sync_build_and_flash.html#troubleshoot_sync_build_and_flash__section_hkm_2dc_p1c_vinayjk_02-29-24-1641-18-155)部分来解决 Docker 问题。

        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

如果在运行 `docker_build.sh` 时遇到问题，参见以下解决方案：

        # 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. 使用 Docker 标签和发布参数在 Docker 容器中同步并编译 Yocto 镜像：

        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

编译工作区位于 `<qcom-download-utils download path>/<release>/build-qcom-wayland`。例如，`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**
当您的 gitconfig 没有设置 UI 颜色配置时，就会触发此错误，因为 Git 1.8.4 默认已启用。如需在您的帐户中启用彩色显示，可运行以下命令：`git config --global color.ui auto`。

Note: 如果出现编译错误并已修复，可运行[重新编译](https://docs.qualcomm.com/doc/80-70014-254Y/topic/build_from_source_github_intro.html#build_private_distribution__section_p1h_tv3_v1c_vinayjk_03-23-24-142-26-643)部分的命令。

### 编译 QIMP SDK 镜像

1. 使用 Docker [编译基础镜像](https://docs.qualcomm.com/doc/80-70014-254Y/topic/build_from_source_github_intro.html#build_private_distribution__section_opk_sh4_w1c)。
2. 使用 Docker 在基础镜像上编译 QIMP SDK：
    1. 运行 `docker run` 命令：

            # 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. 将 QIMP SDK 层克隆到工作区：

            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

要编译 QIMP SDK 层，需要进行以下导出操作：

            export EXTRALAYERS="meta-qcom-qim-product-sdk"Copy to clipboard
    3. 搭建编译环境：

            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. 编译软件镜像：

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

### 重新编译

- 列出 Docker 镜像：

        docker imagesCopy to clipboard

此命令生成以下输出：

        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
- 附加容器：

        # 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
- 搭建编译环境：

        # 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
- 编译软件镜像：

        bitbake qcom-multimedia-imageCopy to clipboard

### 刷写

按[注册用户刷写镜像](https://docs.qualcomm.com/doc/80-70014-254Y/topic/flash_images.html)章节所述，将软件镜像刷入设备。

Last Published: Oct 09, 2024

[Previous Topic
非注册用户的 GitHub 工作流程](https://docs.qualcomm.com/bundle/publicresource/80-70014-254Y/topics/github_workflow_unregistered_users.md) [Next Topic
GitHub 工作流程（固件和附加组件）](https://docs.qualcomm.com/bundle/publicresource/80-70014-254Y/topics/build_addn_info.md)