oerv入门课一

OERV入门课 https://space.bilibili.com/382946288/lists

P2

image-20250601210602194

image-20250601210704449

image-20250601210726053

基础包:应该在OS仓里面

扩展包:EPOL仓

长尾包:剩下的

image-20250601211945322

这一步,只是在仓库里面有,也会参与构建,但还不会发布给用户使用

#如何引入软件包
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

image-20250601215418824

引入包官网指南:https://www.openeuler.openatom.cn/zh/community/contribution/detail.html

​ 修包的话,一般是从源码仓fork一个包,修改后提交pr到master分支,然后在pr评论/sync branchname,就会在pr合并以后,由openeuler-sync-bot自动开启针对其他分支的pr

P3

image-20250601215619139

image-20250601215713273

image-20250601215739675

#介绍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/

image-20250601220503666

image-20250601220631115

image-20250601220717855

image-20250601220809779

image-20250601220906005

这个也和上面的类似,添加对riscv的支持即可

image-20250601221001779

image-20250601221022933

修包案例分享: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

image-20250601222551863

image-20250601222711249

#查看项目配置
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.

image-20250601223533530

image-20250601223631588

project config:https://build.tarsier-infra.isrc.ac.cn/project/prjconf/openEuler:25.03

image-20250601223717219

project meta:https://build.tarsier-infra.isrc.ac.cn/projects/openEuler:25.03/meta

image-20250601223756461

package meta:https://build.tarsier-infra.isrc.ac.cn/package/meta/openEuler:25.03/eclipse

image-20250601223839548

这些属性,都可以在构建网站,选择一个项目进行查看

image-20250601224041861

P6

image-20250601224401172

image-20250601224528222

image-20250601224644938

posted @ 2025-06-02 15:04  念秋  阅读(7)  评论(0)    收藏  举报