+++ /dev/null
-= 关于我们的发行版必须知道的
-
-== 我们的目标
-* Fedora的兼容性
-* openSUSE的易于管理
-* Deepin的对垃圾国产软件的兼容性
-* CentOS/Debian的稳定性
-* 可以加入kali/blackarch/ros2等包含的包
-
-== 原则性问题
-
-. 包管理为rpm-zypper。选择rpm的原因主要有:便于解决依赖(pacman的解决依赖能力一直为人吐槽),降低开发难度(可以对比下dpkg的打包脚本,同样是glibc,dpkg打包脚本突破1万行了),便于拆包,提高兼容性(deb和rpm依然是商业软件的首选)。选择zypper的原因主要是zypper是用{cpp}与boost库写的,效率相对较高(dnf是用python写的,他的前辈yum他自己都看不下去了。_1),以及zypper对于包求解的能力。
-. init system为openrc。主要原因是openrc相对简洁。
-. 法律问题。发行版不反对闭源许可证,但任何闭源软件必须允许二次分发,否则均不能加入官方仓库(例如微软的VSCode是不允许二次分发的(VSCode是MIT许可证,但VSCode的二进制文件是EULA _2))。同样,发行版对于解码器的专利并不在乎,不需要像openSUSE一样分拆Packman仓库。
-. 反对所谓的KISS。ArchLinux自称的KISS实际上是对于开发者,而不是用户,带来的问题就是用户无权选择是否安装头文件,文档等,使得ArchLinux对硬盘的占用远高于dpkg/rpm发行版。我们应该选择的方向是精简与实用间找到平衡点。
-. 发行版是开源项目,社区项目,没法过多考虑赚钱的问题。向RHEL靠拢,需要每年人民币5000元的营业执照,需要24x7的服务人员,需要起步资金人民币500万元的电信增值业务许可证,显然不太可能。
-
-== 代码,数据的仓库
-
-考虑到伟大的GFW与中国电信垄断+QoS,再加上国内服务器对于带宽实在太抠门,我们的代码选择托管在OSDN(前身为SourceForge日本分站),清华/北外两大国内镜像站同步了OSDN的仓库,也就意味着我们可以利用OSDN解决国内用户的需求。OSDN在世界各地也有分镜像。
-
-网站暂时还没有决定,需要考虑包括框架,地理位置,传输等。
-
-== 人员基本素质要求
-
-. 英语能力与熟悉许可证。有用的文档基本都是英文的。(国外写的叫干货,国人写的叫日志。国外对于GPL要不然不碰,要不然开源,国内:许可证是啥?)
-. 自学能力。打包使用的语言是RPM-spec,基本上为shell+lua+spec的宏,与shell和lua本身有一定区别,而且并没有特定的书与视频。(我非常反感学计算机需要看视频的!)。
-. 自备宽带与梯子。(不知道梯子的重要性的来尝试下打开 https://www.chromium.org/Home[chromium的官网])
-. 反对Mac OS用户。Linux用户用Windows大多数是因为行业软件或者打游戏(不反对打游戏),但Linux用户用了Mac OS大部分都会变成喷子,说Linux各种不好。
-. 反对抄袭代码。我们不是华为鸿蒙,我不希望我们的发行版像鸿蒙一样“抄”出国门。 _3华为可以拿着CentOS的源代码申请UNIX认证 _4,我们不能这样。
-. 反对向“钱”看。
-. 别当强迫症。我们承认,很多闭源软件做的很好或者没有替代品,但是凡事都有解决方案。
-
-_1 https://lwn.net/Articles/580223/
-
-_2 https://github.com/tuna/issues/issues/335
-
-_3 https://arstechnica.com/gadgets/2021/02/harmonyos-hands-on-huaweis-android-killer-is-just-android/
-
-_4 https://www.zhihu.com/question/60993359
\ No newline at end of file
+++ /dev/null
-= 文章链接与标题\r
-\r
-* 良好的开发文档与用户文档应成为我发行版的优良传统。同时全文翻译优秀外文文档与撰写编纂新文档将有助于开发人员水平的提升。\r
+++ /dev/null
-= RPM
-
-== RPM 常识
-* RPM (RedHat Package Manager) 以 GPL (General Public License) 发布
-* RPM 所安装软件的信息位于 `/var/lib/rpm` 的数据库
-
-== 常用命令
-[source,sh]
-----
-rpm --checksig ${NVR}.rpm ## 检查数字签名
-rpm -ivh ${NVR}.rpm ## 安装软件包
-rpm -Uvh ${NVR}.rpm ## 升级软件包
-rpm -qpR ${NVR}.rpm ## 依赖检查
-rpm -ivh --nodeps ${NVR}.rpm ## 忽略依赖安装
-rpm -q ${name} ## 检查软件包是否安装
-rpm -ql ${name} ## 列出已安装软件包的所有文件
-rpm -qa --last ## 列出最近安装的软件包
-rpm -evv ${name} ## 卸载软件包
-rpm -evv --nodeps ${name} ## 忽略依赖卸载软件包
-rpm -qf ${file} ## 查询一个文件或目录属于哪个软件包
-rpm -qi ${name} ## 查询已安装软件包信息
-rpm -qip ${NVR}.rpm ## 查询未安装软件包信息
-rpm -qdf /usr/bin/top ## 查询已安装文件文档位置
-rpm -Vq ${name} ## 验证已安装软件包文件是否已改变
-rpm -Vp ${NVR}.rpm ## 验证已安装软件包文件是否已改变
-rpm -Va ## 验证所有已安装软件包
-rpm --import ${URL} ## 导入 RPM 公钥
-rpm -qa gpg-pubkey* ## 列出已导入的所有公钥
-----
-
-.重建损坏的 RPM 数据库
-[source,bash]
-----
-windows下面没问题
-----
-
-
-== 参考文献
-. RPM Manpages +
-. https://www.tecmint.com/20-practical-examples-of-rpm-commands-in-linux/ +
-
-
+++ /dev/null
-= rpmbuild 用法\r
-\r
-`rpmbuild` 命令由 `rpmdevtools` 提供, 详见 `man rpmbuild` 与 `rpmbuild --help`\r
-\r
-== 常用构建命令\r
-\r
-=== 构建源码包\r
-\r
-[source,bash]\r
-----\r
- pushd ~/rpmbuild/SPECS\r
- rpmbuild -bs ~/rpmbuild/SPECS/${name}.spec\r
-----\r
-\r
-=== 构建二进制包\r
-\r
-* 使用 `rpmbuild --rebuild` 命令从 `SRPM` 构建, 生成的二进制包位于 `~/rpmbuild/RPMS/`;\r
-构建的流程如下:\r
- .. 安装对应 SRPM 至 ~/rpmbuild/, 包括 SPEC 以及源码和补丁;\r
- .. 使用安装好的文件构建 RPM 包;\r
- .. 移除安装的 SPEC 与 源码和补丁;\r
-+\r
-[source,bash]\r
-----\r
-rpmbuild --rebuild ~/rpmbuild/SRPMS/${name}-${version}-${release}.src.rpm\r
-----\r
-* 若想要在构建后保留 SPEC 和源码可以:\r
- ** 构建时使用 `+rpmbuild --recompile ~/rpmbuild/SRPMS/${SRPM}+` 在构建二进制包后不删除 SPEC 和源码;\r
- ** 使用 `+rpm -Uvh ~/rpmbuild/SRPMS/${SRPM}+` 安装源码包至 `~/rpmbuild/`;\r
- ** 卸载源码包: `rpm -qa` 并不会显示你所安装的源码包, 这是由于源码包并非真正安装, 而仅仅是解压于你的系统中,\r
-所以 `rpm -e` 并不能将它卸载, 你所需要做的仅仅是手动删除源码包解压的目录; 不同用户的 RPM Macros 不同,\r
-如果你使用 root 权限安装源码包, 默认位置在 `/usr/src/packages` 或类似的路径 (内含 `BUILDROOT`, `SPECS` 等目录)\r
-使用用户权限安装默认位置在 `~/rpmbuild`, 确认数据安全后, 手动删除它们;\r
-* 使用 `rpmbuild -bb` 从 SPEC 构建二进制包\r
-+\r
-[source,bash]\r
-----\r
-rpmbuild -bb ~/rpmbuild/SPECS/${name}.spec\r
-----\r
-\r
-=== 构建所有\r
-\r
-[source,bash]\r
-----\r
- rpmbuild -ba ~/rpmbuild/SPECS/${name}.spec\r
-----\r
-\r
-== 使用 zypper 安装源码包\r
-\r
-[source,bash]\r
-----\r
-## 首先确保你的 zypper 添加了源码源\r
-----\r
-\r
-== 参考文献\r
-\r
-. https://forums.opensuse.org/showthread.php/525837-Remove-a-source-package-src-rpm-(opposite-of-zypper-source-install-rpmbuild)\r
+++ /dev/null
-:doctype: book\r
-\r
-[TOC]\r
-\r
-= 常用 RPM 工具\r
-\r
-== `rpm2cpio`\r
-\r
-* *简介* `rpmspec` 是 SPEC 文件查询工具,\r
-\r
-== `rpmspec`\r
-\r
-== `deltarpm`\r
-\r
-== RPM 签署\r
-\r
-== 参考文献\r
-\r
-. `rpmspec manpages`\r
+++ /dev/null
-:doctype: book\r
-\r
-[TOC]\r
-\r
-= RPM SPEC 备忘单\r
-\r
-== 安装所需软件\r
-\r
-[source,sh]\r
-----\r
-dnf install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils patch rpmdevtools\r
-----\r
-\r
-== 初始化工作区\r
-\r
-* 早期 RPM 的工作路径位于 `/usr/src/redhat` 普通用户权限不能打包, 从 RPM 4.5.x 开始, 默认工作路径改为 `~/rpmbuild/`,\r
-并推荐在打包时尽量不要以 root 用户操作;\r
-* `rpmdevtools` 包对流行的编程语言提供一系列模板, 位于 `/etc/rpmdevtools/`\r
-```bash\r
-rpmdev-setuptree ## 初始化工作区, 命令由 rpmdevtools 提供,\r
- ## 等效于 mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}\r
-\r
-rpmdev-newspec ## 生成新的 SPEC 模板, 但不一定合乎发行版打包规范;\r
-\r
-----\r
-\r
-| Directory | RPM Macros | Purpose |\r
-| :-------- | :---------- | :---------------------- |\r
-| SOURCES | %_sourcedir | 放置源码 tarball 与补丁 |\r
-| SPECS | %_specdir | 放置 SPEC 源文件 |\r
-| BUILD | %_builddir | 源码编译构建 |\r
-| RPMS | %_rpmdir | 写输出 RPM 包 |\r
-| SRPMS | %_srcrpmdir | 写输出 SRPM 包 |\r
-\r
-\#\# 打包的逻辑\r
-* `N-V-R` 命名规范 `NAME-VERSION-RELEASE` 即 `%{name}-%{version}-%{release}-%{BuildArch}`\r
- 最终的 `-%{BuildArch}` 为 `x86_64` 或 `noarch` 由 `rpmbuild` 添加;\r
-* 按照 `%prep` 段指令解包 `%_sourcedir` 中的源码 tarball\r
-* 在 `%_builddir` 中按照 `%build` 段指令编译构建\r
-* `%install` 段中指令的本质是在编译构建后 `%_builddir` 杂乱的文件中寻找有用的文件复制到 `%_buildrootdir`\r
- 组成供安装的文件系统, 可用的手段主要有:\r
- (1) make (2) 预定义的 RPM 宏指令 (3) install 命令 (4) 脚本手动增删\r
-* 指令的具体用法参见 Maximum RPM 书\r
-\r
-\#\# 导言区\r
-* SPEC 中的 RPM 宏的本质是文本替换\r
-* 导言区中 `Name` `Version` 这些字段的值定义后可通过 `%{name}` `%{version}` 引用, 名称无大小写敏感;\r
- ```txt\r
- Name: %{name} 包的基本名, 应与 SPEC 文件同一;\r
- Version: %{version} 上游版本号;\r
- Release: 1%{?dist} %{release} 初始为 1, 对上游版本的任何补丁或打包方面的修订增加版本号;\r
- Summary: 一言以蔽包;\r
- License: GPLv3+ 许可证, 要注意兼容性;\r
- - Copyright: 软件包所采用的版权规则, 一般被 License Tag 取代;\r
- - Packager: 因发行版而异, 通常移除;\r
- URL: https://example.com/%{name}\r
- 上游项目网站, 例如 https://example.com/%{name};\r
- 使用 wget --spider --force-html -i bookmarks.html 验证链接可达性\r
- - Vendor: 供应商, 按需添加, 通常移除;\r
- - Group: 包组, 已弃用;\r
- Source0: https://example.com/%{name}/release/%{name}-%{version}.tar.gz\r
- 无补丁的 tarball 及打包涉及文件名, 后面使用 %{source0} 引用;\r
- Patch0: *.patch diff 补丁名;\r
- BuildArch: noarch | x86_64 打包架构, 缺省则默认继承打包机架构;\r
- BuildRequires: 构建时依赖, 逗号或空白分隔表;\r
- 也可以在多行写多个 BuildRequires 方便逻辑判断;\r
- Requires: 运行时依赖, 逗号或空白分隔表; 可多行写多个 Requires;\r
- ExcludeArch: 排除架构\r
-----\r
-\r
-== 主体区\r
-\r
-* SPEC 主体区指令头\r
-+\r
-[source,txt]\r
-----\r
- %description 软件包完整长文描述, 可多行, 可分段;\r
- %prep 指令或系列指令准备构建环境, 多为解压源码包, 应用补丁;\r
-%setup -q\r
- %build 指令或系列指令编译构建\r
-%configure 用于自动交互 GNU autoconf 构建工具的宏\r
-make %{?_smp_mflags} CFLAGS=""\r
- %check 指令或系列指令软件测试, 常包含单元测试\r
- %install 指令或系列指令复制所需 %builddir (~/rpmbuild/BUILD) -> %buildroot (~/rpmbuild/BUILDROOT)\r
-%make_install\r
- %files 将被终端用户系统安装的文件列表\r
-%license\r
-%doc\r
- %changelog 修订日志\r
-----\r
-\r
-== `%prep`\r
-\r
-=== `%setup` 指令\r
-\r
-=== `%patch` 指令\r
-\r
-=== `%autosetup` 指令\r
-\r
-== `%build`\r
-\r
-=== `%configure` 指令\r
-\r
-=== `%check`\r
-\r
-== `%install`\r
-\r
-* 如果为 CentOS 7 或 Fedora 18 前的发行版打包, 构建前使用 `rm $RPM_BUILD_ROOT`,\r
-更新的发行版会自动为你完成此事, 所以不必手动完成;\r
-* `BUILDROOT` 目录是空的 `chroot` 目录, 在这里形成的文件系统最终会被安装到目标用户系统;\r
-* 为保证一致性, 我们鼓励使用 `+%{buildroot}+` 记号而非 `$RPM_BUILD_ROOT`;\r
-* 某些需要手动复制文件的场合, 如配置文件或服务文件, 需在 `+%{buildroot}+` 中预先手动建好,\r
-否则导致报错, 因此推荐使用 `install` 命令;\r
-\r
-== `%files`\r
-\r
-* `%files` 段指定打出的 rpm 包中的文件在终端系统中所安装到的绝对路径, 由于 `BUILDROOT` 目录是 `chroot` 目录,\r
- 故此处的路径并非相对于 `+%{buildroot}+` 的路径, 而是终端系统安装后文件存在的路径;\r
-\r
-[source,spec]\r
-----\r
-%files\r
-%license LICENSE \#\# 使用 LICENSE 宏放置许可证\r
-%doc docs/*.txt README COPYING\r
-%dir %{_libdir}/%{name}/ \#\# %dir 宏声明此包拥有此目录\r
-%{_bindir}/%{name}\r
-%{_libdir}/%{name}/%{name}.py*\r
-----\r
-\r
-=== 文件权限\r
-\r
-* *默认权限* +\r
-`/usr` 内,默认权限归于 `root:root`,除非安全需要特定用户与组。文件必须是全局可读按需可执行的。 +\r
-`/usr` 外,非配置文件或非状态文件归于 `root:root`,非特殊情况须全局可读按需可执行。\r
-默认文件权限为 0644 或 0755,默认目录权限是 0755,多数写法良好的构建脚本和 RPM 都遵守这些设定。\r
-若目录要求组可写 (group writable),即写入该目录的文件归该组所有,则还应该设置 `setgid` 位,\r
-这些目录应设置权限为 2775。\r
-在 `%files` 头部使用 `%defattr` 指令的说法源自 _Maximum RPM_\r
-* `+%{buildroot}+` 中所有文件都要明确归宿,若有文件或目录不想被打入 RPM,要显式使用 `%exclude` 命令,否则报错。\r
-若声明了 `+%{buildroot}+` 中不存在的文件或目录也将报错。\r
-* *`%config` 指令*\r
-* *`%doc` 指令*\r
-* *`%defattr` 指令* +\r
-`%defattr` 指令在 `%files` 段使用, **仅可被用于**设置非默认权限,及在设置非默认权限后重置默认权限。\r
-+\r
-[source,spec]\r
-----\r
-%files\r
-\#\# %defattr(file mode, user, group, dir mode)\r
-\#\# 重置默认权限\r
-%defattr(-,root,root,-)\r
-----\r
-\r
-* *`%attr` 指令*\r
-+\r
-[source,spec]\r
-----\r
-%files\r
-\#%attr(<mode>, <user>, <group>) file\r
-%defattr(644,apache,apache,755)\r
-%attr(-,apache,apache) /var/www/coolapp\r
-%attr(-,apache,apache) /var/www/coolapp/js\r
-%attr(-,apache,apache) /var/www/coolapp/static\r
-/var/www/coolapp/index.html\r
-/var/www/coolapp/__init__.py\r
-/var/www/coolapp/settings.py\r
-/var/www/coolapp/urls.py\r
-/var/www/coolapp/wsgi.py\r
-----\r
-\r
-* *`%exclude` 指令*\r
-\r
-== `%changelog`\r
-\r
-* 以 Version-Release 时间戳列表的格式, 记录打包的变更 (改变打包指令或打新补丁), 而非上游软件的变更;\r
-时间戳条目以 `*` 开头, 每个时间戳条目可含多条变更, 每个改变一条且以 `-` 开头并新起一行;\r
-```spec\r
-%changelog\r
- ** Tue May 31 2016 Adam Miller link:mailto:maxamillion@fedoraproject.org[maxamillion@fedoraproject.org] - 0.1-1\r
- ** First bello package\r
- ** Example second item in the changelog for version-release 0.1-1\r
- ** Day-of-Week Month Day Year Name Surname +++<email>+++- Version-Release ```+++</email>+++\r
-\r
-== 参考文献\r
-\r
-. https://wiki.mageia.org/en/RPM_Spec_file_policy\r
-. https://docs.fedoraproject.org/en-US/packaging-guidelines/\r
-. https://stackoverflow.com/questions/6952384/what-does-defattr-mean-in-rpm-spec-files\r
-. http://ftp.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html#S3-RPM-INSIDE-FLIST-DEFATTR-DIRECTIVE\r
+++ /dev/null
-:doctype: book\r
-\r
-[TOC]\r
-\r
-= RPM 宏\r
-\r
-`rpm` 宏使我们避免硬编码, 从而增强打包的可维护性和可迁移性;\r
-\r
-== 宏语法\r
-\r
-* 当遇到不知道的宏:\r
-+\r
-[source,bash]\r
-----\r
-rpm --eval %{_MACRO}\r
-## 例如\r
-rpm --eval %{?dist} ## 奇怪的是在 openSUSE Tumbleweed 并没有回显\r
-----\r
-+\r
-查询 `/usr/lib/rpm/macros` 与 `/usr/lib/rpm/macros.d/macros.*` 与 `/etc/rpm/*`\r
-\r
-=== 条件求值\r
-\r
-* *?* +\r
-默认情况下, 如 `+%{dist}+`, 如果此宏没有值, RPM 将不做替换, TagName 将被原样保留;\r
-如 `%{?dist}` 中 `?` 告诉 RPM 若此宏有值则进行替换, 无值则移除宏的 TagName; 比较如下输出:\r
-+\r
-[source,bash]\r
-----\r
-$ rpm --eval %{dist}\r
-%{dist}\r
-$ rpm --eval %{?dist}\r
-\r
-$ rpm -E 'foo:%{foo}'$'\n''bar:%{?bar}'\r
-foo:%{foo}\r
-bar:\r
-$ rpm -D'foo foov' -E 'foo:%{foo}'$'\n''bar:%{?bar}'\r
-foo:foov\r
-bar:\r
-$ rpm -D'foo foov' -D'bar barv' -E 'foo:%{foo}'$'\n''bar:%{?bar}'\r
-foo:foov\r
-bar:barv\r
-----\r
-+\r
-再如常见的 `make %{?_smp_mflags}`\r
-\r
-== 常用路径宏\r
-\r
-[source,spec]\r
-----\r
-%{_topdir} ~/rpmbuild/\r
-%{buildroot} ~/rpmbuild/BUILDROOT/\r
-----\r
-\r
-== 用宏模拟 Autoconf 变量\r
-\r
-[source,spec]\r
-----\r
-%_prefix /usr\r
-%_exec_prefix %{_prefix}\r
-%_bindir %{_exec_prefix}/bin\r
-%_sbindir %{_exec_prefix}/sbin\r
-%_libexecdir %{_exec_prefix}/libexec\r
-%_datadir %{_prefix}/share\r
-%_sysconfdir %{_prefix}/etc\r
-%_sharedstatedir %{_prefix}/com\r
-%_localstatedir %{_prefix}/var\r
-%_libdir %{_exec_prefix}/lib\r
-%_includedir %{_prefix}/include\r
-%_oldincludedir /usr/include\r
-%_infodir %{_prefix}/info\r
-%_mandir %{_prefix}/man\r
-----\r
-\r
-执行以下查看实机定义:\r
-\r
-[source,bash]\r
-----\r
-for i in %{_{{,exec_}prefix,{{,s}bin,lib{,exec},sysconf,{shared,local}state,{,old}include,data,info,man}dir}}; do printf "%-20s%s\n" $i $(rpm -E $i); done\r
-----\r
-\r
-== 用户定义 rpm 宏\r
-\r
-[source,bash]\r
-----\r
-cat > ~/.rpmmacros << 'EOF'\r
-%_topdir $HOME/myrpmbuildenv ## 更改默认工作路径\r
-EOF\r
-----\r
-\r
-== 参考文献\r
-\r
-. https://rpm-packaging-guide.github.io[rpm packaging guide]\r
+++ /dev/null
-= Boolean Dependencies\r
-\r
-根本看不懂的一篇文章\r
-\r
-https://rpm.org/user_doc/boolean_dependencies.html[翻译自 RPM 文档: Boolean Dependencies]\r
-\r
-自 rpm-4.13 开始 RPM 能够处理所有依赖的布尔表达式 (Requires, Recommends, Suggests, Supplements, Enhances, Conflicts).\r
-布尔表达式始终用括号括起来, 它们是在"普通"依赖项的基础上构建的: 要么是仅名称, 要么是名称, 比较和版本描述;\r
-\r
-== 布尔运算符\r
-\r
-以下操作符自 RPM 4.13 引入:\r
-\r
-* `and` 逻辑且\r
- Conflicts: (pkgA and pkgB)\r
-* `or` 逻辑或\r
- Requires: (pkgA >= 3.2 or pkgB)\r
-* `if`\r
- Recommends: (myPkg-langCZ if langsupportCZ)\r
-* `if else`\r
- Requires: (myPkg-backend-mariaDB if mariaDB else sqlite)\r
-\r
-以下操作符自 RPM 4.14 引入:\r
-\r
-* `with` - requires all operands to be fulfilled by the same package for the term to be True.\r
- Requires: (pkgA-foo with pkgA-bar)\r
-* `without` - requires a single package that satisfies the first operand but not the second (set subtraction)\r
- Requires: (pkgA-foo without pkgA-bar)\r
-* `unless` - requires the first operand to be fulfilled if the second is not (reverse negative implication)\r
- Conflicts: (myPkg-driverA unless driverB)\r
-* `unless else` - same as above but requires the third operand to be fulfilled if the second is\r
- Conflicts: (myPkg-backend-SDL1 unless myPkg-backend-SDL2 else SDL2)\r
-\r
-if 运算符不能与 or 在同一上下文中使用, unless 运算符不能与 and 在同一上下文中使用;\r
-\r
-== 嵌套\r
-\r
-Requires: (pkgA or pkgB or pkgC)\r
-Requires: (pkgA or (pkgB and pkgC))\r
-Supplements: (foo and (lang-support-cz or lang-support-all))\r
-Requires: ((pkgA with capB) or (pkgB without capA))\r
-Supplements: ((driverA and driverA-tools) unless driverB)\r
-Recommends: ((myPkg-langCZ and (font1-langCZ or font2-langCZ)) if langsupportCZ)\r
+++ /dev/null
-:doctype: book\r
-\r
-[TOC]\r
-\r
-= RPM Conditional Builds\r
-\r
-== 条件构建\r
-\r
-rpmbuild 通过开关 `--with` 和 `--without` 支持条件构建; 例如:\r
-\r
-[source,bash]\r
-----\r
-## 启用 gnutls 支持, 禁用 openssl 支持\r
-rpmbuild -ba newpackage.spec --with gnutls --without openssl\r
-----\r
-\r
-== 使能 `--with` 和 `--without` 参数\r
-\r
-[source,spec]\r
-----\r
-# add --with gnutls option, i.e. disable gnutls by default\r
-%bcond_with gnutls\r
-# add --without openssl option, i.e. enable openssl by default\r
-%bcond_without openssl\r
-----\r
-\r
-如果想改变默认状态, 仅需将 `%bcond_with` 改为 `%bcond_without` 或反之, 余下的 SPEC 无需改动;\r
-\r
-== 检查选项的开关状态\r
-\r
-使用 `%{with foo}` 宏, 通过开关定义 `BuildRequires`\r
-\r
-[source,spec]\r
-----\r
-%if %{with gnutls}\r
-BuildRequires: gnutls-devel\r
-%endif\r
-%if %{with openssl}\r
-BuildRequires: openssl-devel\r
-%endif\r
-----\r
-\r
-通过 `%with_foo` 宏测试存在性\r
-\r
-[source,spec]\r
-----\r
-%configure \\r
- %{?with_static:--enable-static} \\r
- %{!?with_static:--disable-static}\r
-----\r
-\r
-*Always test for the with-condition, not the without-counterpart!*\r
-\r
-== 向 `%configure` 传参\r
-\r
-向如 `configure` 之类理解 `--with-foo` 和 `--without-foo` 参数的脚本传参, 可使用 `%{?_with_foo}` 宏.\r
-\r
-[source,spec]\r
-----\r
-%configure \\r
- %{?_with_gnutls} \\r
- %{?_with_openssl}\r
-----\r
-\r
-'''\r
-\r
-== `%bcond_with` conditional builds\r
-\r
-首先在 spec 文件的有效代码头部添加条件定义行:\r
-\r
-[source,spec]\r
-----\r
-%bcond_with video 1 ## 条件依赖, video 默认开启, 0 表示默认关闭\r
-%bcond_with video ## 什么都没有默认是 0, 默认关闭 video\r
-----\r
-\r
-在报头的编译依赖部分添加:\r
-\r
-[source,spec]\r
-----\r
-%if %{with video}\r
-BuildRequires: v4l2-devel\r
-%endif\r
-----\r
-\r
-按需切分出子包\r
-\r
-[source,spec]\r
-----\r
-%if %{with video}\r
-%package video ## 或者 %package -n libfoo-video\r
-Summary: video plugin for package foo\r
-Group: System/GUI/KDE\r
-Provides: foo-visual = %{version}\r
-Obsoletes: foo-visual < %{version}\r
-%description video\r
-blabla\r
-%endif\r
-----\r
-\r
-在 %build 段\r
-\r
-[source,spec]\r
-----\r
-%configure \\r
- %{?_with_video} \\r
- --with-gui ## 仅在刚性依赖时才用硬编码写死\r
-----\r
-\r
-或有\r
-\r
-[source,spec]\r
-----\r
-cmake -DCMAKE_INSTALL_PREFIX=%{_prefix} \\r
-%if 0%{with video}\r
- -DENABLE_VIDEO \\r
-%endif\r
-----\r
-\r
-在 %file 段\r
-\r
-[source,spec]\r
-----\r
-%files -n %{name}.lang\r
-%defattr(-,root,root)\r
-...\r
-%if 0%{with video}\r
-%{_libdir}/%{name}/libfoo-video.so.1.2.3\r
-\r
-%dir %{_datadir}/%{name}/foo-video/\r
-%{_datadir}/%{name}/foo-video/example\r
-## 也可用 %{_datadir}/%{name}/foo-video/ 替换以上两行\r
-\r
-%dir %{_sysconfdir}/%{name}/\r
-%config %{_sysconfdir}/%{name}/%{name}-video.conf\r
-## 这里注意子包和主包必须同时声明拥有 %{_sysconfdir}/%{name} 文件夹\r
-%endif\r
-----\r
-\r
-或有\r
-\r
-[source,spec]\r
-----\r
-%if 0%{with video}\r
-%files -n libfoo-video\r
-%defattr(-,root,root)\r
-...\r
-%endif\r
-----\r
-\r
-== 其他形式的条件依赖\r
-\r
-通过 RPM 宏定义方法实现条件依赖\r
-\r
-[source,spec]\r
-----\r
-%define with_mono 1\r
-%if %with_mono\r
-%endif\r
-----\r
-\r
-使用 %with_something 0 定义\r
-\r
-[source,spec]\r
-----\r
-%with_something 0\r
-%if %{with_something} do something eg: --with-video %endif\r
-----\r
-\r
-== 参考文献\r
-\r
-https://zh.opensuse.org/openSUSE:RPM_conditional_builds[openSUSE:RPM conditional builds]\r
+++ /dev/null
-= RPM 打包调试的一般步骤\r
-\r
-== 问题\r
-\r
-寻找通用的一般调试步骤,给出几个例子,\r
-如何通过写 SPEC,之后 rpmbuild -bb 之后 rpm -qp --qf 进行调试\r
-以及总结 rpm -E 与 rpm -D 的高级惯例用法\r
-\r
-== 参考文献\r
-\r
-. https://bugzilla.redhat.com/show_bug.cgi?id=515685\r
+++ /dev/null
-Essential OS AsciiDoc Template
-==============================
-Optional Author Name <optional@author.email>
-Optional version, optional date: Optional comments.
-:Author: AlternativeWayToSetOptional Author Name
-:Email: <AlternativeWayToSetOptional@author.email>
-:Date: AlternativeWayToSetOptional date
-:Revision: AlternativeWayToSetOptional version
-:toc:
-
-[可选] 导言区
-
-== 附录
-=== 推荐阅读
-// 主题相关的文档与资源
-
-=== 参考文献
-// 文章主体参考的文档
-
-=== 待补资源
-// 来不及补充到文档的资料
-
-// vim: set syntax=asciidoc:
+++ /dev/null
-Essential OS 文案写作
-=================
-// nacyro <nacyro@163.com>
-// v0.1, 2021-02-12: Essential OS 开发文档协作写作
-:Author: nacyro
-:Email: <nacyro@163.com>
-:Date: 2021-02-12
-:Revision: 0.1
-:toc:
-:source-highlighter: pygments
-
-NOTE: Essential OS ^(R)^ 协作开发文档语法备忘单与推荐文法。
-
-== AsciiDoc Template
-[source,asciidoc]
-----
-= The First Asciidoc example: Subtitle #<.>
-Lars Vogel(c) 2016 vogella GmbH #<.>
-Version 0.2, 17.12.2015
-:sectnums:
-:toc:
-:toclevels: 4
-:toc-title: My Content
-:description: Example AsciiDoc document
-:keywords: AsciiDoc
-:imagesdir: ./img
-
-This is the optional preamble (an untitled section body). Useful for
-writing simple sectionless documents consisting only of a preamble.
-
-== First section
-== Second section
-----
-
-== 文风排版
-
-== AsciiDoc How-Tos
-AsciiDoc::
- `AsciiDoc` 是一种文本文档格式,用于笔记、文档、文章、书籍、电子书、幻灯片、
- 网页、博客以及 man 手册。AsciiDoc 文件可转为多种格式,包括 HTML、PDF、
- EPUB、man 手册。AsciiDoc 配置灵活:AsciiDoc 的源文件语法与后端输出的标记语言
- (可为绝大多数 SGML/XML 标记语言)均可由用户配置和扩展。
-
-=== 文本格式化
-.圈引符格式化
-* `_斜体_` => +_斜体_+ {nbsp}{nbsp} `'斜体'` => +'斜体'+
-* `*粗体*` => +*粗体*+
-* `+等{amp}宽+` => +等{amp}宽+ {nbsp}{nbsp} +\`等\{amp}宽`+ => `等{amp}宽` +
- {nbsp}{nbsp}{nbsp}{nbsp}(区别在反引号等宽无文本替换,加号等宽仅显示上等宽)
-* +\`单引号'+ => +`单引号'+ {nbsp}{nbsp} +\`{zwsp}`双引号''+ => +``双引号''+
-* `^上标^` => ^上标^ {nbsp}{nbsp} `~下标~` => ~下标~ {nbsp}{nbsp}
- e^πi^+1 = 0 {nbsp}{nbsp} H~2~O {nbsp}{nbsp} x^10^
-
-.圈引格式化规则
-. 圈引符号不可重叠
-. 非同类圈引可嵌套
-. 欲禁止圈引符格式化文本,在圈引符前紧跟一反引号 +\\*粗体*+,`H\~2~O` => H\~2~O,
- 根据情况可能需要同时转义前导与尾随圈引符,多字符圈引可能需要单独转义每个字符。
-
-.界定格式 (Unquoted text)
-将 `#` 放在文本周围 `#` 不会执行任何操作,
-这是一种允许将内联属性应用于原本未格式化的文本的机制。
-AsciiDoc [underline]#元素列表# 支持以 CSS 元素修饰文本格式,CSS 类名为:
-
-- `<color>` 文本前景色,支持 HTML 基本 16 种颜色 +
- [black white-background]#white#
- [black silver-background]#silver#
- [black gray-background]#gray#
- [white black-background]#black#
- [black red-background]#red#
- [white maroon-background]#maroon#
- [black yellow-background]#yellow#
- [aqua olive-background]#olive# +
- [navy lime-background]#lime#
- [yellow green-background]#green#
- [black aqua-background]#aqua#
- [yellow teal-background]#teal#
- [white blue-background]#blue#
- [white navy-background]#navy#
- [black fuchsia-background]#fuchsia#
- [white purple-background]#purple#
-- `<color>-background` 文本背景色
-- [big]#big# {nbsp}与{nbsp} [small]#small#
-- [underline]#underline#,[overline]#overline# 与 [line-through]#line-through#
-
-[source,asciidoc]
-----
-[red]#red text# [small yellow-background]#on yellow# #<.>
-[big]'large' [red yellow-background big]*all bold* #<.>
-Un[line-through big red]##_constrain_##ed #<.>
-----
-<.> [red]#red text# [small yellow-background]#on yellow#
-<.> [big]'large' [red yellow-background big]*all bold*
-<.> Un[line-through big red]##_constrain_##ed
-
-.约束与非约束圈引
-*约束圈引 (Constrained quotes)* 须以空格或标点为界,
-*非约束圈引 (Unconstrained quotes)* 无须边界,可置于文本任意位置,
-形式为二重的 `__`, `**`, `++`, `##`
-
-[source,asciidoc]
-----
-*B*old #<.>
-**B**old #<.>
-<.> Un[line-through red]#constrain#ed #<.>
-<.> Un[line-through red big]##_constrain_##ed #<.>
-----
-<.> *B*old
-<.> **B**old
-<.> Un[line-through red]#constrain#ed
-<.> Un[line-through red big]##_constrain_##ed
-
-.强制断行
-至少一个空格跟加号作为行尾
-[source,asciidoc]
-----
-妾心藕中丝,
-虽断犹牵连。 +
-当断不断,反受其乱。
-----
-妾心藕中丝,
-虽断犹牵连。 +
-当断不断,反受其乱。
-
-.分页
-至少三个小于 `<<<` 构成硬换页
-
-.分割线
-至少三个单引号 `'''` 构成分割线
-
-.缩进
-默认情况下,输入文件中 `\t` 将转为 8 空格。
-可于配置文件 [miscellaneous] 节中设置 `tabsize`,
-且可以通过在包含文件宏的属性列表中设置 `tabsize` 属性来覆盖设置:
-[source,asciidoc]
-----
-\include::addendum.txt[tabsize=2]
-----
-也可通过命令参数设置 `--attribute tabsize=4`
-
-.自动替换
-* AsciiDoc 配置文件中默认作如下自动替换
-[source,asciidoc]
-----
-(C) copyright,(TM) trademark,(R) registered trademark,
--- 破折号,... 省略号,-> 右箭头,<- 左键头,=> 右双箭头,<= 左双箭头
-----
-(C) copyright,(TM) trademark,(R) registered trademark, +
-{zwsp}-- 破折号,... 省略号,-> 右箭头,<- 左键头,=> 右双箭头,<= 左双箭头
-
-* 也支持 HTML 特殊字符({zwsp}https://unicode-table.com/cn/html-entities[HTML 字符实体]),
-可查 https://unicode-table.com[unicode-table.com] 或百度 +
-`§` => § {nbsp}{nbsp} `¶` => ¶ {nbsp}{nbsp}
-`💩` => [big olive]#💩# {nbsp}{nbsp}
-`«` => « {nbsp}{nbsp} `»` => » {nbsp}{nbsp} +
-( ° ͜ʖ͡°)╭∩╮{nbsp}{nbsp}{nbsp}{nbsp}
-┌( ͡° ͜ʖ ͡°)=ε︻╦̵̵͇̿̿̿̿╤──
-
-//=== 表格
-//=== faq
-== 附录
-=== 推荐阅读
-// 主题相关的文档与资源
-.AsciiDoc How-Tos
-. https://powerman.name/doc/asciidoc
-
-.文风排版
-. https://open.leancloud.cn/improve-chinese/
-. https://open.leancloud.cn/copywriting-style-guide/
-
-=== 参考文献
-// 文章主体参考的文档
-.AsciiDoc How-Tos
-. https://asciidoc.org/userguide.html
-. https://www.vogella.com/tutorials/AsciiDoc/article.html
-
-.文风排版
-. https://lctt.github.io/wiki/tutorials/copywriting.html
-
-=== 待补资源
-// 来不及补充到文档的资料
-
-// vim: set syntax=asciidoc:
+++ /dev/null
-* 看历代 RPM Release Notes 能发现不少弃用或增强的信息。\r
-* 合作写文档需要制定统一的文档规范,建议参照 LCTT 文档。\r
查看已经安装的包的内容 `rpm -ql bash`
-完全解压 `rpm rpm2cpio ./a.rpm | cpio -idmv` 。注意需要rpm2cpio与cpio
+完全解压 `rpm2cpio ./a.rpm | cpio -idmv` 。注意需要rpm2cpio与cpio
cpio的参数: