autospec

autospec 是在 Clear Linux* OS 中协助自动创建和维护 RPM 封装的工具。其中,使用 rpmbuild 的标准 RPM 构建流程需要 tarball 和 .spec 文件才能启动,而 autospec 只需 tarball 和软件包名称便可启动。

描述

autospec 工具通过分析源代码和 Makefile 信息来尝试推断 .spec 文件的要求。它会根据从构建失败中发现的新信息不断运行更新后的内部版本,直到它具有完整有效的 .spec 文件。如有必要,可以在 autospec 工具中增加可选的 control files,影响 autospec 的行为,定制内部版本。

autospec 使用模拟作为沙箱运行内部版本。访问 mock wiki,了解有关使用模拟的其他信息。

要大致了解 RPM 工作原理,请访问 rpm websiteRPM Packaging Guide

工作原理

了解 autospec 工具的设置和流程。

必备条件

使用 autospec 工具之前,必须先在 Clear Linux OS 中完成构建源代码的设置操作。

请参阅 设置环境以构建源代码,了解有关完成此设置的说明。

创建 RPM

autospec 的基本流程如以下步骤所述:

  1. make autospec 命令根据对代码和现有控制文件的分析生成 .spec 文件。

    所有控制文件均应与所生成 .spec 文件位于同一目录。

    查看 autospec README,了解有关 control files 的更多信息。

  2. autospec 通过模拟配置来创建内部版本根目录。

  3. autospec 会尝试通过所生成的 .spec 来构建 RPM。

  4. autospec 会检测 .spec 中的所有缺失声明。

  5. 如果出现构建错误,autospec 则会扫描构建日志,尝试发现根源所在。

  6. 如果 autospec 检测到根源,且知如何继续,则会在步骤 1 中利用更新后的构建指令自动重新启动构建。

  7. 否则,autospec 会停止构建,以供用户检查,纠正错误。修复源代码问题和/或编辑控制文件,响应构建过程输出,从而解决问题。这些问题可能包括依存关系或排除项。查看 autospec README,了解有关控制文件的更多信息。

    纠正错误后,用户在步骤 1 中恢复此流程。

    如果 Clear Linux OS 中不存在二进制依存关系,则须先构建这种关系,然后才能再次运行 autospec。

执行完这些步骤后,autospec 根据从构建失败中发现的新信息继续重新构建软件包,直到它具有有效的 .spec。如果未出现构建错误,则会成功构建 RPM 包。

示例

在使用这些示例之前,请先完成 设置环境以构建源代码

例 1:使用现有规格文件构建 RPM

本例介绍如何使用现有规格文件通过预封装的上游软件包来构建 RPM。本例采用 dmidecode 软件包。

  1. 导航到 autospec 工作区并克隆 dmidecode 软件包:

    cd ~/clearlinux
    make clone_dmidecode
    

    注解

    您可使用以下命令一次性克隆所有软件包存储库:

    make [-j NUM] clone-packages
    

    可选 NUM 参数表示待用线程数量。

    有关可用软件包的列表,请查看 ~/clearlinux/projects/common/packages 文件。

  2. 导航到 dmidecode 软件包的本地副本进行构建:

    cd ~/clearlinux/packages/dmidecode/
    make build
    
  3. 生成的 RPM 位于 ./rpms。构建日志和其他 RPM 则位于 ./results

例 2:构建新的 RPM

本例介绍如何构建新的 RPM,而不使用规格文件。本例会创建简易的 helloclear RPM。

  1. 导航到 autospec 工作区并构建 helloclear RPM。Makefile 提供 make autospecnew,可以使用 autospec 工具自动生成 RPM 包。必须将 URL 传递给源 tarball 以及待创建 RPM 的 NAME:

    cd ~/clearlinux
    make autospecnew URL="https://github.com/clearlinux/helloclear/archive/helloclear-v1.0.tar.gz" NAME="helloclear"
    

    生成的 RPM 位于 ./packages/helloclear/rpms。构建日志和其他 RPM 则位于 ./packages/helloclear/results

例 3:使用预定义软件包生成新的规格文件

本例介绍如何修改现有软件包来创建定制 RPM。本例会对 dmidecode 软件包进行简单的更改并重新构建软件包。

  1. 导航到 autospec 工作区并克隆 dmidecode 软件包:

    cd ~/clearlinux
    make clone_dmidecode
    
  2. 导航到 dmidecode 目录:

    cd packages/dmidecode
    
  3. 用编辑器打开 excludes 文件,添加以下行:

    /usr/bin/biosdecode
    /usr/bin/ownership
    /usr/bin/vpddecode
    /usr/share/man/man8/biosdecode.8
    /usr/share/man/man8/ownership.8
    /usr/share/man/man8/vpddecode.8
    

    注解

    dmidecode 不需要这些文件,因此可放心将其删除。

  4. dmidecode 目录中,构建修改后的 dmidecode 软件包:

    make autospec
    
  5. 生成的 RPM 位于 ./rpms。日志则位于 ./results

例 4:为 autospec 提供控制文件

本例介绍如何修改控制文件,纠正 autospec 无法进行解析的构建问题。在本例中,您会添加缺少的许可证和依存关系,以便 autospec 成功完成构建。

  1. 导航到 autospec 工作区:

    cd ~/clearlinux
    
  2. 如果尚未克隆所有上游数据包存储库,则进行克隆:

    make [-j NUM] clone-packages
    

    可选 NUM 参数表示待用线程数量。

    注解

    在本例的后续步骤中,我们搜索克隆的软件包存储库中是否存在缺少的依存关系。

  3. 构建 opae-sdk RPM:

    make autospecnew URL="https://github.com/OPAE/opae-sdk/archive/0.13.0.tar.gz" NAME="opae-sdk"
    

    此操作会因缺少许可证文件而出错:

    [FATAL]    Cannot find any license or opae-sdk.license file!
    
  4. 导航到包含构建问题的软件包:

    cd packages/opae-sdk
    
  5. 添加一个或多个来自 SPDX License List 的有效许可证标识符。在下例中,根据 opae-sdk 项目许可,有两个不同的许可证适用:

    echo "BSD-3-Clause MIT" > opae-sdk.license
    
  6. 再次运行 autospec:

    make autospec
    

    此操作会导致一般错误:

    [FATAL]    Build failed, aborting
    
  7. 打开构建日志,查看错误详细信息:

    cat ./results/build.log
    

    构建日志包含特定故障的详细信息。在本例中,存在缺少的依存关系:

    CMake Error: The following variables are used in this project, but they are set to NOTFOUND.  Please set them or make sure they are set and tested correctly in the CMake files:
    CJSON_LIBRARY
       linked by target "opae-c++-utils" in directory /builddir/build/BUILD/opae-sdk-0.13.0/tools/c++utilslib
    json-c_LIBRARIES
       linked by target "opae-c" in directory /builddir/build/BUILD/opae-sdk-0.13.0/libopae
    libuuid_LIBRARIES
       linked by target "opae-c" in directory /builddir/build/BUILD/opae-sdk-0.13.0/libopae
    
  8. 搜索上游 Clear Linux OS 软件包的规格文件,查看 json-c 库是否可用。在本例中,此库不存在,我们需要将 json-c ‘dev’ 软件包添加到 buildreq_add:

    grep 'json-c\.so$' ~/clearlinux/packages/*/*.spec
    echo "json-c-dev" >> buildreq_add
    

    注解

    仅当用户已克隆所有上游软件包存储库后,此搜索步骤才有效。在本例中,已在上一步骤中克隆上游软件包存储库。

  9. 搜索上游 Clear Linux OS 软件包的规格文件,查看 libuuid 库是否可用。在本例中,此库存在于 util-linux 软件包中,因此需要将 util-linux-dev 软件包添加到 buildreq_add:

    grep 'libuuid\.so$' ~/clearlinux/packages/*/*.spec
    echo "util-linux-dev" >> buildreq_add
    
  10. 再次运行 autospec 并在 rpms 目录中查找成功生成的 RPM:

    make autospec
    

注解

如需 Clear Linux OS 存储库中不存在的某一依存关系,则须首先对其进行手动构建(请参阅 Example 2: Build a new RPM),然后添加此存储库,以便 autospec 了解存在此软件包。例如:

cd ~/clearlinux/packages/<package-name>
make repoadd
make repostatus

如果 autospec 无法单独自动查找正确的依存关系,则需将此依存关系添加到 buildreq_add 控制文件。

测试封装后的软件

使用 autospec 封装软件后,可对生成的 RPM 进行功能测试,然后再用 Mixer tool 将其集成和部署到 Clear Linux OS 映像。

Clear Linux OS 开发工具提供两种快速测试 autospec 所生成 RPM 的方法。

注解

下列方法只应用于开发系统的临时测试。

在 Clear Linux OS 虚拟机上测试

Clear Linux OS 开发工具包括将 RPM 安装到 Clear Linux OS 虚拟机(在 KVM 管理程序上运行)的方法。使用 虚拟机,可在完全隔离的环境下进行测试。

要测试在虚拟机内 autospec 创建的软件包:

  1. 将 Clear Linux OS KVM 映像下载到 ~/clearlinux 目录,即 clear.img。其位置和名称 clear.img.xz 对于工具运行都十分重要:

    cd ~/clearlinux
    curl -o clear.img.xz https://download.clearlinux.org/image/$(curl https://download.clearlinux.org/image/latest-images | grep '[0-9]'-kvm)
    
  2. 解压缩已下载的 Clear Linux OS KVM 映像:

    unxz -v clear.img.xz
    
  3. 将 KVM 所需的 QEMU 启动脚本和虚拟固件复制到 ~/clearlinux 目录:

    cp ~/clearlinux/projects/common/start_qemu.sh .
    cp /usr/share/qemu/OVMF.fd .
    
  4. 在此软件包的 autospec 目录中运行 make installmake install 命令可挂载已下载的 Clear Linux OS KVM 映像并将 autospec 创建的 RPM 安装到其中:

    cd ~/clearlinux/packages/<package-name>
    make install
    

    在 GitHub 上的 Makefile.common 文件中搜索 install: 目标,可以查看实现此操作的代码。

  5. 返回到 ~/clearlinux 目录并启动 Clear Linux OS 虚拟机:

    cd ~/clearlinux/
    sudo ./start_qemu.sh clear.img
    
  6. 新的 Clear Linux OS 虚拟机随即在控制台上启动。以 root 用户身份登录到虚拟机,为此虚拟机设置新密码。

  7. 确保该软件已正常安装到 Clear Linux OS 虚拟机上,然后完成所有相关测试。

  8. 测试完成后,可关闭并删除 Clear Linux OS 虚拟机:

    poweroff
    rm clear.img
    

直接在开发计算机上进行测试

Clear Linux OS 开发工具还包括将 autospec 创建的 RPM 从本地解压缩到 Clear Linux OS 开发系统进行测试的方法。将 RPM 直接解压缩到系统中,可以加速测试过程,但可能发生冲突。同时,测试后删除软件的责任也取决于开发人员。

要直接在 Clear Linux OS 开发系统上测试 autospec 创建的软件包,必须执行以下步骤:

  1. 在此软件包的 autospec 目录中运行 make install-localmake install-local 命令会将 RPM 直接解压缩到正在运行的 Clear Linux OS 系统的文件系统中:

    cd ~/clearlinux/packages/<package-name>
    make install-local
    

    在 GitHub 上的 Makefile.common 文件中搜索 install-local: 目标,可以查看实现此操作的代码。

  2. 确保该软件已正常安装,然后完成所有相关测试。

  3. 测试完成后,必须发现并删除该软件和所有相关文件。swupd repair --picky 命令有助于还原 /usr 目录的状态(请参阅 swupd),但所有其他文件均须手动清理。

参考

请参阅 autospec README,了解有关 autospec 命令和选项的详细信息。

设置环境以构建源代码

在 Clear Linux OS 中构建源代码所需的工作空间和工具设置操作大多数可通过设置脚本自动执行。该设置脚本使用来自 os-clr-on-clr 捆绑包的工具。

该设置脚本会在 clearlinux 文件夹(其中包含 Makefilepackagesprojects 子文件夹)中创建一个工作空间。projects 文件夹包含在 Clear Linux OS 中制作软件包的主要工具,即 autospeccommon

按照以下步骤设置构建代码所需的工作空间和工具:

  1. 安装 os-clr-on-clr 捆绑包:

    sudo swupd bundle-add os-clr-on-clr
    
  2. 下载 user-setup.sh 脚本:

    curl -O https://raw.githubusercontent.com/clearlinux/common/master/user-setup.sh
    
  3. 制作 user-setup.sh 可执行文件:

    chmod +x user-setup.sh
    
  4. 以非特权用户的身份运行脚本:

    ./user-setup.sh
    
  5. 脚本完成后,注销并再次登录以完成设置过程。

  6. 在系统上设置存储库的 Git 用户电子邮件和用户名:

    git config --global user.email "you@example.com"
    git config --global user.name "Your Name"
    

    此全局设置由使用 Git 的 Clear Linux OS 工具使用。