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 website 或 RPM Packaging Guide。
工作原理¶
了解 autospec 工具的设置和流程。
创建 RPM¶
autospec 的基本流程如以下步骤所述:
make autospec 命令根据对代码和现有控制文件的分析生成
.spec
文件。所有控制文件均应与所生成
.spec
文件位于同一目录。查看 autospec README,了解有关 control files 的更多信息。
autospec 通过模拟配置来创建内部版本根目录。
autospec 会尝试通过所生成的
.spec
来构建 RPM。autospec 会检测
.spec
中的所有缺失声明。如果出现构建错误,autospec 则会扫描构建日志,尝试发现根源所在。
如果 autospec 检测到根源,且知如何继续,则会在步骤 1 中利用更新后的构建指令自动重新启动构建。
否则,autospec 会停止构建,以供用户检查,纠正错误。修复源代码问题和/或编辑控制文件,响应构建过程输出,从而解决问题。这些问题可能包括依存关系或排除项。查看 autospec README,了解有关控制文件的更多信息。
纠正错误后,用户在步骤 1 中恢复此流程。
如果 Clear Linux OS 中不存在二进制依存关系,则须先构建这种关系,然后才能再次运行 autospec。
执行完这些步骤后,autospec 根据从构建失败中发现的新信息继续重新构建软件包,直到它具有有效的 .spec
。如果未出现构建错误,则会成功构建 RPM 包。
示例¶
在使用这些示例之前,请先完成 设置环境以构建源代码。
例 1:使用现有规格文件构建 RPM¶
本例介绍如何使用现有规格文件通过预封装的上游软件包来构建 RPM。本例采用 dmidecode
软件包。
导航到 autospec 工作区并克隆
dmidecode
软件包:cd ~/clearlinux make clone_dmidecode
注解
您可使用以下命令一次性克隆所有软件包存储库:
make [-j NUM] clone-packages
可选 NUM 参数表示待用线程数量。
有关可用软件包的列表,请查看
~/clearlinux/projects/common/packages
文件。导航到
dmidecode
软件包的本地副本进行构建:cd ~/clearlinux/packages/dmidecode/ make build
生成的 RPM 位于
./rpms
。构建日志和其他 RPM 则位于./results
。
例 2:构建新的 RPM¶
本例介绍如何构建新的 RPM,而不使用规格文件。本例会创建简易的 helloclear RPM。
导航到 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
软件包进行简单的更改并重新构建软件包。
导航到 autospec 工作区并克隆
dmidecode
软件包:cd ~/clearlinux make clone_dmidecode
导航到 dmidecode 目录:
cd packages/dmidecode
用编辑器打开
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 不需要这些文件,因此可放心将其删除。
在
dmidecode
目录中,构建修改后的dmidecode
软件包:make autospec
生成的 RPM 位于
./rpms
。日志则位于./results
。
例 4:为 autospec 提供控制文件¶
本例介绍如何修改控制文件,纠正 autospec 无法进行解析的构建问题。在本例中,您会添加缺少的许可证和依存关系,以便 autospec 成功完成构建。
导航到 autospec 工作区:
cd ~/clearlinux
如果尚未克隆所有上游数据包存储库,则进行克隆:
make [-j NUM] clone-packages
可选 NUM 参数表示待用线程数量。
注解
在本例的后续步骤中,我们搜索克隆的软件包存储库中是否存在缺少的依存关系。
构建 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!
导航到包含构建问题的软件包:
cd packages/opae-sdk
添加一个或多个来自 SPDX License List 的有效许可证标识符。在下例中,根据 opae-sdk 项目许可,有两个不同的许可证适用:
echo "BSD-3-Clause MIT" > opae-sdk.license
再次运行 autospec:
make autospec
此操作会导致一般错误:
[FATAL] Build failed, aborting
打开构建日志,查看错误详细信息:
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
搜索上游 Clear Linux OS 软件包的规格文件,查看 json-c 库是否可用。在本例中,此库不存在,我们需要将 json-c ‘dev’ 软件包添加到 buildreq_add:
grep 'json-c\.so$' ~/clearlinux/packages/*/*.spec echo "json-c-dev" >> buildreq_add
注解
仅当用户已克隆所有上游软件包存储库后,此搜索步骤才有效。在本例中,已在上一步骤中克隆上游软件包存储库。
搜索上游 Clear Linux OS 软件包的规格文件,查看 libuuid 库是否可用。在本例中,此库存在于 util-linux 软件包中,因此需要将 util-linux-dev 软件包添加到 buildreq_add:
grep 'libuuid\.so$' ~/clearlinux/packages/*/*.spec echo "util-linux-dev" >> buildreq_add
再次运行 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 创建的软件包:
将 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)
解压缩已下载的 Clear Linux OS KVM 映像:
unxz -v clear.img.xz
将 KVM 所需的 QEMU 启动脚本和虚拟固件复制到
~/clearlinux
目录:cp ~/clearlinux/projects/common/start_qemu.sh . cp /usr/share/qemu/OVMF.fd .
在此软件包的 autospec 目录中运行 make install。make install 命令可挂载已下载的 Clear Linux OS KVM 映像并将 autospec 创建的 RPM 安装到其中:
cd ~/clearlinux/packages/<package-name> make install
在 GitHub 上的 Makefile.common 文件中搜索 install: 目标,可以查看实现此操作的代码。
返回到
~/clearlinux
目录并启动 Clear Linux OS 虚拟机:cd ~/clearlinux/ sudo ./start_qemu.sh clear.img
新的 Clear Linux OS 虚拟机随即在控制台上启动。以 root 用户身份登录到虚拟机,为此虚拟机设置新密码。
确保该软件已正常安装到 Clear Linux OS 虚拟机上,然后完成所有相关测试。
测试完成后,可关闭并删除 Clear Linux OS 虚拟机:
poweroff rm clear.img
直接在开发计算机上进行测试¶
Clear Linux OS 开发工具还包括将 autospec 创建的 RPM 从本地解压缩到 Clear Linux OS 开发系统进行测试的方法。将 RPM 直接解压缩到系统中,可以加速测试过程,但可能发生冲突。同时,测试后删除软件的责任也取决于开发人员。
要直接在 Clear Linux OS 开发系统上测试 autospec 创建的软件包,必须执行以下步骤:
在此软件包的 autospec 目录中运行 make install-local。make install-local 命令会将 RPM 直接解压缩到正在运行的 Clear Linux OS 系统的文件系统中:
cd ~/clearlinux/packages/<package-name> make install-local
在 GitHub 上的 Makefile.common 文件中搜索 install-local: 目标,可以查看实现此操作的代码。
确保该软件已正常安装,然后完成所有相关测试。
测试完成后,必须发现并删除该软件和所有相关文件。swupd repair --picky 命令有助于还原
/usr
目录的状态(请参阅 swupd),但所有其他文件均须手动清理。
参考¶
请参阅 autospec README,了解有关 autospec 命令和选项的详细信息。
设置环境以构建源代码¶
在 Clear Linux OS 中构建源代码所需的工作空间和工具设置操作大多数可通过设置脚本自动执行。该设置脚本使用来自 os-clr-on-clr 捆绑包的工具。
该设置脚本会在 clearlinux
文件夹(其中包含 Makefile
、packages
和 projects
子文件夹)中创建一个工作空间。projects
文件夹包含在 Clear Linux OS 中制作软件包的主要工具,即 autospec
和 common
。
按照以下步骤设置构建代码所需的工作空间和工具:
安装 os-clr-on-clr 捆绑包:
sudo swupd bundle-add os-clr-on-clr
下载
user-setup.sh
脚本:curl -O https://raw.githubusercontent.com/clearlinux/common/master/user-setup.sh
制作
user-setup.sh
可执行文件:chmod +x user-setup.sh
以非特权用户的身份运行脚本:
./user-setup.sh
脚本完成后,注销并再次登录以完成设置过程。
在系统上设置存储库的 Git 用户电子邮件和用户名:
git config --global user.email "you@example.com" git config --global user.name "Your Name"
此全局设置由使用 Git 的 Clear Linux OS 工具使用。