配置环境变量

编写rpm_build_tools.conf文件,定义需要用到的环境变量,然后运行source rpm_build_tools.conf以生效,文件内容示例如下:

MOCK_CONFIG=fedora-38-riscv64
WORK_DIR=~/development/RISC-V/rpm_packaging/${MOCK_CONFIG}
LOCAL_REPO=~/development/RISC-V/rpm_packaging/${MOCK_CONFIG}-localrepo/
GIT_REPO_BASE=https://src.fedoraproject.org/rpms
#GIT_REPO_BASE_SSH=git+ssh://git@gitee.com/src-oepkgs-fedora-rv
DEVEL_REMOTE=origin
DEVEL_BRANCH_ORG=rawhide
DEVEL_BRANCH=f38_riscv64
CMT_MESSAGE='Add source code tarball to repo.'
#for koji build
BUILD_TARGET=f38dev
BUILD_TAG=f38dev

同时需要定义包名:

PKG_NAME=[package name]

修改 mock 配置

由于mock编译时需要配置文件,因此确认使用的配置文件配置正确,例如使用~/.config/mock/fedora-38-riscv64.cfg,文件内容如下:

config_opts['target_arch'] = 'riscv64'
config_opts['legal_host_arches'] = ('riscv64',)
config_opts['qemu_user_static_mapping'] = {
    'riscv64': 'riscv64',
}

config_opts['root'] = 'zjs-fedora-{{ releasever }}-{{ target_arch }}'
config_opts['mirrored'] = config_opts['target_arch'] != 'i686'
config_opts['chroot_setup_cmd'] = 'install @{% if mirrored %}buildsys-{% endif %}build'
config_opts['dist'] = 'fc{{ releasever }}'  # only useful for --resultdir variable subst
config_opts['extra_chroot_dirs'] = [ '/run/lock', ]
config_opts['releasever'] = '38'
config_opts['package_manager'] = 'dnf'
config_opts['dnf.conf'] = """

[main]
keepcache=1
debuglevel=2
reposdir=/dev/null
logfile=/var/log/yum.log
retries=20
obsoletes=1
gpgcheck=0
assumeyes=1
syslog_ident=mock
syslog_device=
install_weak_deps=0
metadata_expire=0
best=1
module_platform_id=platform:f{{ releasever }}
protected_packages=
user_agent={{ user_agent }}

{%- macro rawhide_gpg_keys() -%}
file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-$releasever-primary
{%- for version in [releasever|int, releasever|int - 1]
%} file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-{{ version }}-primary
{%- endfor %}
{%- endmacro %}

# repos

[fedora-36-riscv]
name=Fedora 36 RISC-V on OpenKoji
baseurl=https://openkoji.iscas.ac.cn/repos/fc36/$basearch/
cost=2000
enabled=0
skip_if_unavailable=True

[fedora-38-mock-update-repo]
name=Fedora 38 RISC-V temporary mock updates on OpenKoji
baseurl=https://openkoji.iscas.ac.cn/pub/temp-f38-repo/$basearch/
cost=900
enabled=0
skip_if_unavailable=True

[fedora-38-dist-riscv]
name=Fedora 38 RISC-V dist on OpenKoji
baseurl=https://openkoji.iscas.ac.cn/repos/fc38dist/$basearch/
cost=1000
enabled=0
skip_if_unavailable=True

[fedora-37-openkoji-riscv-koji-devel-repo]
name=Fedora 37 RISC-V koji build devel repo on OpenKoji
#baseurl=http://openkoji.iscas.ac.cn/kojifiles/repos/f37-build-side-28-python-devel/latest/$basearch/
#baseurl=http://openkoji.iscas.ac.cn/kojifiles/repos/f37-build-side-31-rust-devel/latest/$basearch/
baseurl=http://openkoji.iscas.ac.cn/kojifiles/repos/f37-build-side-32-misc-devel/latest/$basearch/
cost=2000
enabled=0
skip_if_unavailable=True

[fedora-38-openkoji-riscv-koji-devel-repo]
name=Fedora 38 RISC-V koji build devel repo on OpenKoji
baseurl=http://openkoji.iscas.ac.cn/kojifiles/repos/f38-build-side-42-init-devel/latest/$basearch/
cost=2000
enabled=1
skip_if_unavailable=True


[fedora-36-dev-riscv]
name=Fedora 36 RISC-V dev on OpenKoji
baseurl=https://openkoji.iscas.ac.cn/repos/fc36dev/$basearch/
cost=2000
enabled=0
skip_if_unavailable=True

[fedora-riscv-rocks-source]
name=Fedora 36 RISC-V dev on OpenKoji - Source
baseurl=https://openkoji.iscas.ac.cn/repos/fc36dev/src/
cost=2000
enabled=0
skip_if_unavailable=True

[fedora-riscv-rocks]
name=Fedora RISC-V rocks dist-repo
baseurl=http://fedora.riscv.rocks/repos-dist/rawhide/latest/$basearch/
cost=2000
enabled=0
skip_if_unavailable=True

[fedora-riscv-rocks-source]
name=Fedora RISC-V rocks dist-repo - Source
baseurl=http://fedora.riscv.rocks/repos-dist/rawhide/latest/src/
cost=2000
enabled=0
skip_if_unavailable=True

[fedora-riscv-rocks-koji]
name=Fedora RISC-V rocks koji repo
baseurl=http://fedora.riscv.rocks/repos/rawhide/latest/$basearch/
cost=2000
enabled=0
skip_if_unavailable=True

"""

其中config_opts['root']选项为目录名,需要按需修改。

编译过程

建立并进入工作目录:

mkdir -p $LOCAL_REPO $WORK_DIR
pushd $WORK_DIR
PKG_NAME=zlib
mkdir -p ${PKG_NAME}_WS

下载源码防止编译因为clone问题出错:

git clone ${GIT_REPO_BASE}/${PKG_NAME}.git ${PKG_NAME}_WS/${PKG_NAME}
pushd ${PKG_NAME}_WS/${PKG_NAME}
git checkout ${DEVEL_REMOTE}/${DEVEL_BRANCH_ORG}
git checkout -b ${DEVEL_BRANCH}
fedpkg sources
#若下载失败可尝试以下命令
#spectool -g ${PKG_NAME}.spec
#获取所有源码压缩文件的列表
SRC_FILE=`cat sources | awk '{printf $2}' | sed -e 's/(//g' -e 's/)/ /g'`
#强行加入git的commit中
#并删除名为source的文件,确保编译系统不在编译阶段下载源码压缩包
git add -f $SRC_FILE && git rm sources
#本地提交带源码压缩包的commit
git commit -am "$CMT_MESSAGE"
#推到远程仓库,确保之后可使用这个带源码的提交点
git push $DEVEL_REMOTE $DEVEL_BRANCH

注意路径,进入clone下来的源码目录进行mock编译:

env G_SLICE=always-malloc mock -r ${MOCK_CONFIG} --buildsrpm --spec $(basename $PWD).spec --sources . --resultdir ..
env G_SLICE=always-malloc mock -r ${MOCK_CONFIG} --localrepo ${LOCAL_REPO} --recurse --chain ../${PKG_NAME}*src.rpm

测试验证

安装dnf

env G_SLICE=always-malloc mock -r ${MOCK_CONFIG} --install dnf

进入shell

env G_SLICE=always-malloc mock -r ${MOCK_CONFIG} --enable-network --shell

测试能否正常install

dnf install xxx.rpm

安装时可能出现依赖问题,如果缺失包yyy,在x86的机器上用dnf info yyy查询包名,编译解决依赖问题。

提交到 Koji

koji build --nowait --quiet f38-build-side-42-init-devel git+https://github.com/fedora-riscv/xxx.git#

xxx替换为真正的包名,#后写commit ID

如果是 mock 编译的包导入到 koji,则遵循先导入 srpm,再导入 rpm的原则,使用koji import命令导入,完成后添加 tag:

koji tag-build f38-build-side-43-rust-devel rust-axum-0.6.20-1.fc38_nc

当 Koji 上没有这个软件包时

需要先加入tag

koji add-pkg --owner=kojiadmin <tag> <package name>