场景

有许些时候,服务源没有平台的软件,需下载一个SRC的源码包,重新制作,但有时在制作的过程中涉及修改src的源码,怎么办?直接修改BUILD下的源码显然是不可以的,因为每次执行  rpmbuild  -ba xxx.spec的时候,会自动解压源码将你修改的文价覆盖,始终是达不到效果,此时,只能打补丁patch

例子

本帖以  编译mips平台  docker.spec 其中一个错误为例
1.下载src包

$wget https://mirrors.ustc.edu.cn/fedora/updates/25/SRPMS/d/docker-1.12.6-6.gitae7d637.fc25.src.rpm

2. 安装软件包

$rpm -ivh docker-1.12.6-6.gitae7d637.fc25.src.rpm

3.进入rpmbuild目录

$cd ~/rpmbuild/SPECS

$rpmbuild -ba docker.spec

4.此时会报一些依赖错误,缺什么就安装什么。解决依赖后再执行编译命令,报错
+ pushd /home/xzy/rpmbuild/BUILD/docker-ae7d637fcad9be396e75af430405446f9e6ab099/_build/src
~/rpmbuild/BUILD/docker-ae7d637fcad9be396e75af430405446f9e6ab099/_build/src ~/rpmbuild/BUILD/docker-ae7d637fcad9be396e75af4304
05446f9e6ab099
++ head -c20 /dev/urandom
++ od -An -tx1
++ tr -d ' \n'
+ go build -ldflags '-B 0xb05016bd8f940b62e889d083ae0027cc4c98c546' github.com/projectatomic/docker-novolume-plugin
# github.com/docker/docker/pkg/system
../../docker-novolume-plugin-c5212546ab01b4b7b62caba888d298ab63f53984/Godeps/_workspace/src/github.com/docker/docker/pkg/system/ stat_linux.go:13: cannot use s.Rdev (type uint32) as type uint64 in field value
错误:/var/tmp/rpm-tmp.C2EuCl (%build) 退出状态不好
          RPM 构建错误:
    /var/tmp/rpm-tmp.C2EuCl (%build) 退出状态不好
5.为了省事,我将BUILD下的 docker-ae7d637fcad9be396e75af430405446f9e6ab099拷贝一份在用户工作目录~,然后创建git
$cp docker-ae7d637fcad9be396e75af430405446f9e6ab099 ~
$cd docker-ae7d637fcad9be396e75af430405446f9e6ab099
$git init
$git add .
$git commit
6.修改第四步中的指定文件,修改代码,打出一个patch,补丁名字随意,但最好是与当前编译的包的名字相关,以便识别,将其放在~/rpmbuild/SOURCES目录下
$vim docker-novolume-plugin-c5212546ab01b4b7b62caba888d298ab63f53984/Godeps/_workspace/src/github.com/docker/docker/pkg/system/stat_linux.go
$git diff>~/rpmbuild/SOURCES//0001-docker-1.12.6-6.gitae7d637-add-mips64le-support.patch
$cd ~/rpmbuild/SPECS
$vim  docker.spec
7.修改docker.spec文件(很重要的两步
在Sourcexx结束和Buildrequires之前加入patch,一般未使用补丁号按递增命名
Source15: v1.10-migrator-helper
Source16: %{repo}-common.sh
Source17: README-%{repo}-common
# for mips64el
Patch0: 0001-docker-1.12.6-6.gitae7d637-add-mips64le-support.patch
BuildRequires: git
在setup后build之前加入使用patch
%setup -q -n %{repo}-%{commit0}
%ifarch mips64el
%patch0 -p1
%endif

%build

8.再次编译就可以通过这个错误了

+ cp /home/xzy/rpmbuild/SOURCES/README-docker-common .

+ echo 'Patch #1 (0001-docker-1.12.6-6.gitae7d637-add-mips64le-support.patch):'

Patch #1 (0001-docker-1.12.6-6.gitae7d637-add-mips64le-support.patch):

+ /usr/bin/patch --no-backup-if-mismatch -p1 --fuzz=0
patching file docker-novolume-plugin-c5212546ab01b4b7b62caba888d298ab63f53984/Godeps/_workspace/src/github.com/
docker/docker/pkg/system/stat_linux.go
+ exit 0
执行(%build): /bin/sh -e /var/tmp/rpm-tmp.yXkHTK
+ umask 022
+ cd /home/xzy/rpmbuild/BUILD
+ cd docker-ae7d637fcad9be396e75af430405446f9e6ab099
+ mkdir _build

疑惑:

docke.spec安装之后,在~/SOURCES/docker-xxxxx目录下会有个  _build目录,这个目录的子目录src/github.com/docker下面的两个文件

是链接文件,链接到docker-xxxxx目录,这样做是为啥呢,干嘛还要这么折腾呢?实在费解。这个问题也是在我git管理这个文件夹,想最终导出patch时才遇到

修改docker-xxxxx/src/github.com/docker/pkg/signal/signal_linux.go 后在git status的时候没有显示更改,git add docker-xxxxx/src/github.com/docker 会报一个

fatal: 路径规格 '_build/src/github.com/docker/containerd/' 位于符号链接中 错误



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐