修包笔记

修包笔记

编写任何文件时,希望各位在文件末尾 add a new line,方便自己和他人,更方便强迫症患者。

openEuler 软件包 Patch 补丁编号顺序

请参考 oEEP-0012,不过这个 openEuler 演进提案 Evolution Proposal 目前还在初始化中,不作为必须要求。

  • 所有来自同一版本 upstream 的补丁声明范围为 0001-0999
  • 所有架构相关的补丁声明范围为 1000 - 1999
  • 预留补丁编号范围 2000 - 2999
  • 所有CVE漏洞修复及上游其他版本backport 补丁,声明范围为 3000 - 4999
  • 所有 openEuler 特性补丁声明范围为 5000 -

其它规定:

  • 原则上不按架构分别打补丁,rpm spec 文件中出现 ifarch 宏的,必须在之前一行通过注释的方式明确说明原因和当前技术限制。
  • 补丁名称显式说明是否已经被 upstream 接纳,或来自某个特定版本的backport,便于版本升级时处理。
  • 原则上新增架构相关代码文件,和修改架构相关代码的补丁应明确分开,不在同一个补丁中既修改代码,又新增文件。
  • 对于修改架构相关代码的补丁,一个补丁尽量不要包含太多文件修改,尽量拆分,可使用 split-patch 工具,一个补丁最多包括5个文件修改(暂定)。
  • 对于同一个文件的不同架构补丁,原则上按架构相对稳定程度排序,优先应用架构稳定的补丁。不同软件包维护者可根据实际情况选择,但在不同文件的补丁应用中应保持一致。

yaml

建仓的时候除了 spec 文件和源码,一定要包含一个 yaml 文件。如果 version_controlgit,那么 src_repo 就要填写完整的地址。

kweathercore.yaml
version_control: github
src_repo: KDE/kweathercore
tag_prefix: "^v"
separator: "."

upstream 源码包名字跟仓内不一样

以 aom 包为例:

Source0:    https://aomedia.googlesource.com/%{name}/+archive/%{commit}.tar.gz#/%{name}-%{shortcommit}.tar.gz

KDE 系列包

Update(2024-11-11): 目前已经有 %cmake_build%cmake_install 了,不用这么麻烦了。

目前有宏了,之前没有宏的话需要这样:

example.spec
%build
mkdir %{_target_platform}
pushd %{_target_platform}
%{cmake_kf5} ..
popd
%make_build -C %{_target_platform}
 
%install
make install/fast DESTDIR=%{buildroot} -C %{_target_platform}

单 part 执行

su - abuild

For prep:
rpmbuild -bp --define "_srcdefattr (-.root,root)" --nosignature --short-circuit /home/abuild/rpmbuild/SOURCES/texlive-base.spec

For compile:
rpmbuild -bc --define "_srcdefattr (-.root,root)" --nosignature --short-circuit /home/abuild/rpmbuild/SOURCES/texlive-base.spec

For install:
rpmbuild -bi --define "_srcdefattr (-.root,root)" --nosignature --short-circuit /home/abuild/rpmbuild/SOURCES/texlive-base.spec

For wrote rpm:
rpmbuild -bb --define "_srcdefattr (-.root,root)" --nosignature --short-circuit /home/abuild/rpmbuild/SOURCES/texlive-base.spec

For files(but check):
rpmbuild -bl --define "_srcdefattr (-.root,root)" --nosignature --short-circuit /home/abuild/rpmbuild/SOURCES/texlive-base.spec

For all:
rpmbuild -ba --define "_srcdefattr (-.root,root)" --nosignature --short-circuit /home/abuild/rpmbuild/SOURCES/texlive-base.spec

安装单 part 执行

参考https://bugzilla.redhat.com/show_bug.cgi?id=671210,可以使用 –nodeps 指令,想要寻找这类包也可以直接使用 rpm -Va –nofiles 命令:

# rpm -ivh chromedriver-119.0.6045.159-1.oe2309.riscv64.rpm chromium-119.0.6045.159-1.oe2309.riscv64.rpm chromium-common-119.0.6045.159-1.oe2309.riscv64.rpm 
error: Failed dependencies:
        rpmlib(ShortCircuited) <= 4.9.0-1 is needed by chromedriver-119.0.6045.159-1.oe2309.riscv64
        rpmlib(ShortCircuited) <= 4.9.0-1 is needed by chromium-119.0.6045.159-1.oe2309.riscv64
        rpmlib(ShortCircuited) <= 4.9.0-1 is needed by chromium-common-119.0.6045.159-1.oe2309.riscv64
# rpm -ivh chromedriver-119.0.6045.159-1.oe2309.riscv64.rpm chromium-119.0.6045.159-1.oe2309.riscv64.rpm chromium-common-119.0.6045.159-1.oe2309.riscv64.rpm --nodeps
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:chromium-common-119.0.6045.159-1.################################# [ 33%]
   2:chromedriver-119.0.6045.159-1.oe2################################# [ 67%]
   3:chromium-119.0.6045.159-1.oe2309 ################################# [100%]

QT5 cmake -> 包名

一些速查

cmake 包名
cmake(Qt5Core) qt5-qtbase-devel
cmake(Qt5Gui)
cmake(Qt5Widgets)
cmake(Qt5DBus)
cmake(Qt5Xml)
cmake(Qt5Test)
cmake(Qt5Network)
cmake(Qt5Qml) qt5-qtdeclarative-devel
cmake(Qt5QuickControls2) qt5-qtquickcontrols2-devel
cmake(Qt5Multimedia) qt5-qtmultimedia-devel
cmake(Qt5Svg) qt5-qtsvg-devel

bcond with & without

openEuler 内没有 “%bcond_with” 这个宏。只有 “%bcond_without”。

在 RPM spec 文件中,“%bcond_without” 是一个条件宏,用于定义一个默认为打开(on)的构建选项。这个宏的工作方式是,如果在构建包时没有明确指定 “–without <option>“,那么这个选项就会被视为打开。这个宏与 ”%bcond_with” 相反,“%bcond_with” 定义的是一个默认为关闭(off)的构建选项。

以下有一个例子:

example.spec
# 默认没有 cuda
%bcond_without cuda
%global have_cuda 0
 
# 如果有 cuda 且为以下架构再设置
%if %{without cuda}
%ifarch x86_64 aarch64
%global have_cuda 1
%endif
%endif
 
# 检查是否为 1
%if %{have_cuda}
BuildRequires:  cuda-nvcc
%endif

expand macro

example.spec
%global common_description %{expand:
This package provides a set of C++ libraries for multimedia streaming, using
using open standard protocols (RTP/RTCP, RTSP, SIP). These libraries can be
used  to build streaming applications.
 
The libraries can also be used to stream, receive, and process MPEG, H.263+ or
JPEG video, and several audio codecs. They can easily be extended to support
additional (audio and/or video) codecs, and can also be used to build basic
RTSP or SIP clients and servers, and have been used to add streaming support to
existing media player applications.}
 
%description    %{common_description}

碰到 noarch 怎么办

如果遇到 “%ifarch” 宏不起作用的情况下,可以先看一下 spec 文件内是否有 “BuildArch: noarch” 这一行。

在包为 noarch 的情况下,“%ifarch” 是不起作用的。你可能需要这样的 dirty hack 才行:

example.spec
BuildArch: noarch
%if "%{_arch}" == "riscv64"
echo "Do Something"
%endif

碰到的一些乱七八糟的

指定 BuildRoot?

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

在 mousepad 的 spec 文件里看到了这行。其中,最后的 root-%(%{__id_u} -n) 这部分是为了确保构建根目录的唯一性,通过调用 id -u 获取当前用户的 UID,确保不同用户构建的软件包不会互相干扰。

如何 patch golang 某个 package?

在用到 Golang 运行时的相关包看到了龙芯相关的更改:

%ifarch loongarch64
sed 's/go 1.10/go 1.21/g' -i go.mod
export GOSUMDB="sum.golang.org"
export GOPROXY="https://goproxy.cn"
go get -d golang.org/x/sys@v0.19.0
go mod tidy
go mod download
go mod vendor
%endif