利用本地仓库实现有依赖关系的软件包的顺序构建

Loong Arch Linux下要求同步升级的软件包的构建方法

Posted by wszqkzqk on September 19, 2024
本文字数:3011

前言

在软件包的构建过程中,有时候会遇到一些软件包之间有依赖关系的情况,对构建顺序存在要求,并且要求在后一个软件包构建时,能够获取前一个软件包并安装。这一过程固然可以通过手动向makechrootpkg传递-I参数来实现,但当重构大量包时较为麻烦。

本文介绍了一种利用本地仓库实现有依赖关系的软件包的顺序构建的方法。这样的方法尤其适用于需要先在本地一并打包/重构完并要求一次性上传的软件包。

建立本地仓库

首先,建立本地仓库目录并初始化(具体路径可以自行指定):

sudo mkdir -p /srv/local-repo
sudo chown -R $USER:alpm /srv/local-repo
repo-add /srv/local-repo/local-repo.db.tar.gz

如果成功,会看到类似这样的输出:

==> Creating updated database file '/srv/local-repo/local-repo.db.tar.gz'
==> WARNING: No packages remain, creating empty database.
==> WARNING: No packages remain, creating empty database.

添加软件包

如果要添加软件包到本地仓库,可以先将软件包复制到本地仓库目录,然后使用repo-add命令添加:

cp /path/to/package.pkg.tar.zst /srv/local-repo
cd /srv/local-repo
repo-add local-repo.db.tar.gz package.pkg.tar.zst

当然,为了简化这一过程,可以封装一些脚本来实现:

#!/bin/bash

if [ -z "$1" ]; then
  echo "Usage: $0 <db-file> <package1> [package2] ..."
  exit 0
fi

CURRENT_DIR=$(pwd)
DB_FILE="$1"
DB_DIR=$(dirname "$DB_FILE")

shift

for pkg in "$@"; do
  pkg_basename=$(basename "$pkg")
  if [[ "$pkg_basename" == *-debug-* ]]; then
    echo "Ignoring debug package: $pkg_basename"
    continue
  fi

  cp -f "$pkg" "$DB_DIR"
  cd "$DB_DIR"
  repo-add "$DB_FILE" "$pkg_basename"
  cd "$CURRENT_DIR"
done

将以上内容保存为add-to-local,并赋予执行权限:

chmod +x add-to-local

这样,只需要执行add-to-local /srv/local-repo/local-repo.db.tar.gz /path/to/package1.pkg.tar.zst /path/to/package2.pkg.tar.zst ...即可。

在构建中启用本地仓库

如果想要在devtools的构建过程中使用本地仓库,需要在/usr/share/devtools/pacman.conf.d/下添加一个配置文件,比如local-testing-loong64.conf。建议按照一定的规则来命名,比如这里的示例local表示本地仓库,testing表示基于testing仓库,loong64表示龙芯64位架构。这一conf文件可以从/usr/share/devtools/pacman.conf.d/extra-testing-loong64.conf复制并编辑。(针对staging或者稳定仓库的本地仓库构建同理)

复制并编辑local-repo所基于的conf文件,在所有软件源的指定之前插入本地仓库的指定:

  • 务必保证本地仓库的指定在所有软件源的指定之前
  • 只有这样pacman才会优先使用本地仓库
[local-repo]
SigLevel = Never
Server = file:///srv/local-repo

其中,SigLevel = Never表示不验证本地仓库的签名,我们在编译机上构建时对我们自己的本地仓库不便签名,也没有必要验证签名;Server = file:///srv/local-repo表示本地仓库的路径。

完成后,我们还需要增加archbuild的软链接,以便在构建时使用本地仓库:

sudo ln -s /usr/bin/archbuild /usr/bin/local-testing-loong64-build

确保软链接的名称与conf文件的名称保持对应。以后,我们就可以使用local-testing-loong64-build命令基于local-repo构建软件包了。

使用本地仓库构建的流程示例

  • 本示例较为简单,实际上在脚本中应该加入更多检查逻辑

假设我们有一整个包组需要构建并同时上传,首先应当获得构建顺序,使用肥猫的genrebuild脚本

./genrebuild package1 package2 package3 ...

然后,按顺序进行打包并添加到本地仓库的流程,假设我们的构建目录在~/loongpack下且存在get-loong64-pkgadd-to-local脚本,本地仓库数据库的路径为/srv/local-repo/local-repo.db.tar.gz

  • Bash
for pkg in package1 package2 package3 ...; do
    cd ~/loongpack
    ~/loongpack/get-loong64-pkg "$pkg"
    cd ~/loongpack/"$pkg"

    local-testing-loong64-build -- -- -A 2>&1 | tee build-log-all.log
    if [ $? -ne 0 ]; then
        break
    fi

    ~/loongpack/add-to-local /srv/local-repo/local-repo.db.tar.gz *.pkg.tar.zst

    cd ~/loongpack
done
  • Fish
for pkg in package1 package2 package3 ...                                                                      
    cd ~/loongpack
    ~/loongpack/get-loong64-pkg $pkg
    cd ~/loongpack/$pkg
    local-testing-loong64-build -- -- -A 2>&1 | tee build-log-all.log && ~/loongpack/add-to-local /srv/local-repo/local-repo.db.tar.gz *.pkg.tar.zst
    if test $status -ne 0
        break
    end
    cd ~/loongpack                                                                             
end

如果全部构建都顺利完成,再将所有的软件包一次性上传。(用脚本处理的注意不要把debug包直接上传了)

建议在一轮构建与上传完成后,清空本地仓库,以免下一轮构建时出现问题:

rm -rf /srv/local-repo/*
repo-add /srv/local-repo/local-repo.db.tar.gz

此外,当devtools-loong64conf更新后,需要重新编辑local-testing-loong64.conf文件,同步上游的变化