oerv入门课一
OERV入门课 https://space.bilibili.com/382946288/lists
P2
基础包:应该在OS仓里面
扩展包:EPOL仓
长尾包:剩下的
这一步,只是在仓库里面有,也会参与构建,但还不会发布给用户使用
#如何引入软件包
https://gitee.com/openeuler/community/
fork,提交pr,交流,申请引入软件包,可以参考已有的pr
pr讲解:
https://www.bilibili.com/video/BV1gVtoezEq2?t=401.4
这里的pr通过后,可以向源码仓库 https://gitee.com/src-openEuler提交pr
源码仓pr讲解:
https://www.bilibili.com/video/BV1gVtoezEq2?t=668.1
想让包发布的话,还需要发布仓的工作
https://gitee.com/openeuler/release-management
引入包官网指南:https://www.openeuler.openatom.cn/zh/community/contribution/detail.html
修包的话,一般是从源码仓fork一个包,修改后提交pr到master分支,然后在pr评论/sync branchname,就会在pr合并以后,由openeuler-sync-bot自动开启针对其他分支的pr
P3
#介绍rpm的spec文件
https://www.bilibili.com/video/BV1MwbFeCE1B?t=181.0
名称
版本号
发布号
简短描述功能
许可证信息
源代码下载链接或者源代码文件名
构建此包需要的依赖包
prep
准备阶段的指令,解压源代码,运用补丁
build
编译源代码,生成二进制
install
定义编译好的软件安装到临时目录的步骤,用于打包的准备
files
列出rpm中包含的文件和路径,用于指定哪些文件包含在最终的包中
changelog
记录修改内容和时间
spec规范,也可以查看官网指南:https://gitee.com/openeuler/community/blob/master/zh/contributors/packaging.md#打包基础知识
https://rpm-packaging-guide.github.io/
这个也和上面的类似,添加对riscv的支持即可
修包案例分享:oerv-team/cases/README.md at main · openeuler-riscv/oerv-team
P4
helloworld.c
//vim helloworld.c
#include<stdio.h>
int main() {
printf("hello world\n");
编译:
[root@special course]# gcc -g -o helloworld helloworld.c
[root@special course]# ./helloworld
hello world
普通编译和清理的Makefile
helloworld:
gcc -g -o helloworld helloworld.c
clean:
rm helloworld
安装并设置文件的权限
sudo install -m 0755 helloworld /usr/bin/helloworld
ls -alh /usr/bin/helloworld
-rwxr-xr-x 1 root root 9.9K Jun 1 11:30 /usr/bin/helloworld
带安装的Makefile
helloworld:
gcc -g -o helloworld helloworld.c
clean:
rm helloworld
install:
mkdir -p $(DESTDIR)/usr/bin
install -m 0755 helloworld $(DESTDIR)/usr/bin/helloworld
重新安装
[root@special course]# make clean
rm helloworld
[root@special course]# make install
mkdir -p /usr/bin
install -m 0755 helloworld /usr/bin/helloworld
install: cannot stat 'helloworld': No such file or directory
make: *** [Makefile:9: install] Error 1
#应该添加一个文件状态检测的,没有就先编译
[root@special course]# make
gcc -g -o helloworld helloworld.c
[root@special course]# make install
mkdir -p /usr/bin
install -m 0755 helloworld /usr/bin/helloworld
#安装成功
[root@special course]# ls -alh /usr/bin/helloworld
-rwxr-xr-x 1 root root 9.9K Jun 1 11:35 /usr/bin/helloworld
使用diff生成patch,不修改源代码的压缩包,更安全的修改分享
#备份源代码
cp helloworld.c helloworld.c.orig
#修改helloworld.c,生成差异
vim helloworld.c
diff -Naur helloworld.c.orig helloworld.c
--- helloworld.c.orig 2025-06-01 11:39:12.870933726 +0000
+++ helloworld.c 2025-06-01 11:39:31.142935176 +0000
@@ -1,6 +1,6 @@
#include<stdio.h>
int main() {
- printf("hello world\n");
+ printf("hello world from patched code.\n");
return 0;
}
#参数解释
N:如果参与比较的某个文件不存在,就视为空
示例如下:
[root@special course]# ls
helloworld helloworld.c helloworld.c.orig Makefile
[root@special course]# diff -Naur helloworld.c.orig helloworld.a
--- helloworld.c.orig 2025-06-01 11:39:12.870933726 +0000
+++ helloworld.a 1970-01-01 00:00:00.000000000 +0000
@@ -1,6 +0,0 @@
-#include<stdio.h>
-
-int main() {
- printf("hello world\n");
- return 0;
-}
a: 将比较的文件视为文本文件,即使实际是二进制文件
u:以统一的格式展示差异,会展示上下文,帮助理解差异
r:递归的比较目录中的所有文件和子目录
使用patch文件
#将差异保存至文件
diff -Naur helloworld.c.orig helloworld.c >change-line.patch
#恢复原来的c文件
[root@special course]# cp helloworld.c.orig helloworld.c
cp: overwrite 'helloworld.c'? y
[root@special course]# cat helloworld.c
#include<stdio.h>
int main() {
printf("hello world\n");
return 0;
}
#使用patch文件
[root@special course]# patch < change-line.patch
patching file helloworld.c
[root@special course]# cat helloworld.c
#include<stdio.h>
int main() {
printf("hello world from patched code.\n");
return 0;
}
编写rpm spec文件来进行打包
GPLV3的LICENSE,github上找一个
https://github.com/Unvanquished/Unvanquished/blob/master/GPL.txt
#恢复helloworld.c
cp helloworld.c.orig helloworld.c
cp: overwrite 'helloworld.c'? y
#安装rpmdevtools,我是用的openeuler25.03
dnf install -y rpmdevtools
#生成工作树,在~/目录下,也就是用户目录下
rpmdev-setuptree
[root@special course]# cd ../rpmbuild/
[root@special rpmbuild]# ls
BUILD RPMS SOURCES SPECS SRPMS
#目录解释:https://www.bilibili.com/video/BV1YXtfeSE8H?t=795.0
BUILD:构建过程中使用的临时目录,源码会解压缩到此目录,然后打补丁,编译为二进制文件
RPMS:生成的rpm包在此目录
SOURCES:源码文件和其他需要包含在rpm中的文件
SPECS:RPM规范文件 spec文件会放在这里
SRPMS:生成的源码rpm包放在这个目录
打包实操:
mkdir /tmp/helloworld-1.0
#把文件复制过去
[root@special course]# cp helloworld.c /tmp/helloworld-1.0/
[root@special course]# cp Makefile /tmp/helloworld-1.0/
[root@special course]# cp LICENSE /tmp/helloworld-1.0/
[root@special course]# cd /tmp
#进行压缩打包
[root@special tmp]# tar -cvzf helloworld-1.0.tar.gz helloworld-1.0/
helloworld-1.0/
helloworld-1.0/helloworld.c
helloworld-1.0/Makefile
helloworld-1.0/LICENSE
#patch要单独放进去
[root@special tmp]# cd ~/course/
[root@special course]# mv change-line.patch ~/rpmbuild/SOURCES/
[root@special course]# cd ~/rpmbuild/SOURCES/
[root@special SOURCES]# ls
change-line.patch helloworld-1.0.tar.gz
#生成默认模板,后面是包名
[root@special SOURCES]# rpmdev-newspec helloworld
helloworld.spec created; type minimal, rpm version >= 4.18.
[root@special SOURCES]# ls
change-line.patch helloworld-1.0.tar.gz helloworld.spec
#对spec文件的说明,建议看视频原文
https://www.bilibili.com/video/BV1YXtfeSE8H?t=1047.9
#提到的网址
https://compliance.openeuler.org/
License文件需要参考此网址中的内容
#yaml文件规范查看地址
https://gitee.com/openeuler/openEuler-Advisor
helloworld.spec
Name: helloworld
Version: 1.0
Release: 1
Summary: Hello World for openEuler
License: GPL-3.0-or-later
URL: https://github.com/example/helloworld
Source0: https://example.com/helloworld/release/%{name}-%{version}.tar.gz
BuildRequires: gcc
BuildRequires: make
#Requires:
BuildArch: noarch
Patch0: change-line.patch
%description
This is a test program for openEuler.
It's a Hello World program.
%prep
%setup -q
%patch 0
%build
make %{?_smp_mflags}
%install
make install
%files
%license LICENSE
%{_bindir}/helloworld
%changelog
* Sun Jun 01 2025 name <test@mail.com> - 1.0-1
- Init package
P5
#查看项目配置
osc meta prj
<project name="home:yyjeqhc">
<title/>
<description/>
<person userid="yyjeqhc" role="maintainer"/>
<repository name="standard_riscv64">
<path project="openEuler:25.03" repository="standard_riscv64"/>
<arch>riscv64</arch>
</repository>
</project>
#编辑项目配置,proj_name可选
osc meta prj -e proj_name
File unchanged. Not saving.
project config:https://build.tarsier-infra.isrc.ac.cn/project/prjconf/openEuler:25.03
project meta:https://build.tarsier-infra.isrc.ac.cn/projects/openEuler:25.03/meta
package meta:https://build.tarsier-infra.isrc.ac.cn/package/meta/openEuler:25.03/eclipse
这些属性,都可以在构建网站,选择一个项目进行查看