44 KiB
UniversalisOS RPM Packaging Environment — Feature-Parity Specification
Document: docs/parity/RPM_PARITY_SPEC.md
Status: Analysis of mirrored PikeOS 5.0 packaging environment; design for the uos-pkg reimplementation.
Sources analyzed:
~/portugalfuturista/universalisos/pikeos-mirror/rpm/(mirror ofsrc/rpm/)~/portugalfuturista/universalisos/pikeos-mirror/config/rpm/- Live execution of binaries in
~/portugalfuturista/universalisos/src/rpm/bin/withLD_LIBRARY_PATH=src/rpm/lib64
Naming note: the original vendor tree uses a two-character product abbreviation that is banned in UniversalisOS documentation and code. This spec uses "PikeOS" (the product) and the
uos_prefix (the replica) exclusively. Where the original macro names contain the product name (e.g.%_pikeos_prefix), they are quoted verbatim because they are interface facts thatuos-pkgmust reproduce.
1. Tool Inventory (exact versions)
1.1 Binary tools — src/rpm/bin/
All ELF binaries are x86-64, dynamically linked, stripped, built for GNU/Linux 2.6.26, linking against the bundled lib64/ shared objects (librpm-4.2.so, librpmbuild-4.2.so, librpmdb-4.2.so, libpopt.so.0, libbeecrypt.so.2). Verified by execution (./rpm --version → RPM version 4.2).
| Tool | Type | Version / facts | Evidence |
|---|---|---|---|
rpm |
ELF 78 432 B | RPM 4.2 (Red Hat rpm-4.2 codebase, CVS macros.in,v 1.138 2003/03/05, rpmrc.in,v 2.54 2003/01/10). Modes: query (-q), verify (-V), install/upgrade/erase (-i/-U/-e), signature (-K/--addsign/--resign/--import), database (--initdb/--rebuilddb). 133 query tags (--querytags). Localized (pt, de, es, … locale catalogs in share/locale/). |
bin/rpm; --version; --help; --querytags |
rpmbuild |
symlink → lib/rpm/rpmb (ELF 80 904 B) |
RPM 4.2 build front-end. Stages -bp -bc -bi -bl -ba -bb -bs, tarball variants -t*, --rebuild/--recompile, --target=CPU-VENDOR-OS, --buildroot, --clean, --rmsource, --rmspec, --short-circuit, --nodirtokens. |
bin/rpmbuild; --help |
rpmquery |
symlink → lib/rpm/rpmq (71 168 B) |
Query-only mode binary (same 4.2 CLI). | bin/rpmquery |
rpmi / rpmu / rpme |
lib/rpm/rpmi (73 376 B); rpmu→rpmi, rpme→rpmi |
Install / upgrade / erase mode binaries. | lib/rpm/ |
rpmsign |
symlink → lib/rpm/rpmk (71 584 B) |
Signature mode binary. | bin/rpmsign |
rpmverify |
symlink → lib/rpm/rpmv → rpmq |
Verify mode. | bin/rpmverify |
rpmdb |
symlink → lib/rpm/rpmd (70 272 B) |
Database maintenance mode. | bin/rpmdb |
rpm2cpio |
ELF 87 872 B | RPM 4.2 payload extractor; supports gzip and bzip2 payloads (bzip2 decompressor statically embedded, jseward bzip2 strings present). Usage: rpm2cpio file.rpm > out.cpio. |
bin/rpm2cpio, strings |
rpmgraph |
ELF 70 496 B | RPM 4.2 dependency-graph tool; emits graphviz digraph of Requires/Provides from rpmdb or package files (digraph XXX { string, rpmgraph.c). Option --nolegacy. |
bin/rpmgraph, strings, --help |
gendiff |
POSIX sh script, 386 B | gendiff <directory> <diff-extension> — finds *<ext> / .*<ext> files and emits unified diffs against the original (-U0 for ChangeLog<ext>). Used to generate PatchN: files. |
bin/gendiff |
1.2 Bundled libraries — src/rpm/lib64/
| Library | Version | Role |
|---|---|---|
librpm-4.2.so |
rpm 4.2 core | header/payload/signature/transaction engine; embeds zlib 1.1.4 inflate/deflate (Adler/Gailly 1995–2002 copyright strings) and reports zlib 1.2.7 via zlibVersion linkage; compiled-in defaults: prefix /opt/pikeos-D5.0/rpm, rpmdb /opt/pikeos-D5.0/rpm/var/lib/rpm, magic file lib/rpm/magic |
librpmbuild-4.2.so |
rpm 4.2 | spec parsing, build scriptlets, packaging |
librpmdb-4.2.so |
rpm 4.2 | rpmdb access; Berkeley DB 4.1.24 (Sleepycat, 2002-09-13) embedded (db_version_rpmdb) |
libpopt.so.0.0.0 |
popt (rpm 4.2 era) | CLI parsing, alias/exec tables (rpmpopt-4.2) |
libbeecrypt.so.2.2.0 |
BeeCrypt 2.2.0 | DSA/RSA signature verification, entropy |
1.3 Auxiliary executables — src/rpm/lib/rpm/
| Tool | Kind | Purpose |
|---|---|---|
debugedit |
ELF 57 816 B | rewrites DWARF debug paths (-b builddir -d /usr/src/debug) for debuginfo packages |
rpmdeps |
ELF 66 816 B | internal dependency generator (--provides/--requires) |
rpmcache |
ELF 73 928 B | dependency-universe cache builder (rpmcache(8)) |
rpmfile |
ELF 73 200 B | file-classification helper (libmagic-based) |
rpmdb_dump, rpmdb_load, rpmdb_loadcvt, rpmdb_stat, rpmdb_svc, rpmdb_verify, rpmdb_deadlock |
ELF | Berkeley DB 4.1.24 utilities for the rpmdb |
rpmdiff, rpmdiff.cgi |
script + CGI | package-to-package diff reporting |
brp-compress, brp-strip, brp-strip-static-archive, brp-strip-comment-note, brp-strip-shared, brp-sparc64-linux, brp-redhat |
sh | Build-Root Policy scripts run at end of %install (compress man pages, strip ELF) |
check-files |
sh | fails build on unpackaged files in $RPM_BUILD_ROOT (see %__check_files) |
check-prereqs |
sh | verifies build prerequisites |
config.guess, config.sub, config.site |
autotools | platform detection / site defaults for %configure |
cpanflute, cpanflute2 |
perl | CPAN module → spec file generator |
find-provides, find-requires (+.perl stubs), find-prov.pl, find-req.pl, get_magic.pl, perl.prov, perl.req, perldeps.pl, sql.prov, sql.req, tcl.req |
sh/perl | automatic dependency extraction (ELF SONAMEs via file/ldd, shebang interpreters, perl modules, tcl, java) |
find-debuginfo.sh |
sh | creates /usr/lib/debug shadow tree + debugfiles.list (invokes debugedit, eu-strip) |
find-lang.sh |
sh | generates %lang() file lists from share/locale/**/<name>.mo |
getpo.sh |
sh | extracts translatable Summary/Group/Description into .po format via rpm -qp --qf |
rpm2cpio.sh |
sh | pure-sh rpm→cpio: parses lead (96 B) + signature header + header with od, then `dd … |
Specfile.pm |
perl module | RPM::Specfile v1.02 — programmatic spec generation (accessors for name/version/release/…, generate_specfile) |
convertrpmrc.sh |
sh | migrates legacy /etc/rpmrc key:value entries to %_macro form (translation table at lines 38–72) |
u_pkg.sh |
sh | "universal package manager" abstraction: maps list_all_packages, query_file, … to rpm -qa/-qf/… on Linux, pkginfo/pkgchk on SunOS |
vpkg-provides.sh, vpkg-provides2.sh |
sh | build "virtual packages" that Provides: host OS libraries/interpreters (SunOS/HP-UX/AIX/IRIX/OSF1 shlib dirs) |
trpm, tgpg, rpm.daily, rpm.log, rpm.xinetd, cross-build |
misc | test/ops helpers; cross-build shows the cross-compile make invocation pattern |
1.4 Configuration files shipped with the tools
| File | Lines | Role |
|---|---|---|
lib/rpm/macros |
1100 | master macro definitions (§3) |
lib/rpm/rpmrc |
358 | arch/os canon tables, optflags per arch, macrofiles: load list (line 355) |
lib/rpm/rpmpopt-4.2 |
472 | popt aliases: --scripts, --setperms, --setugids, --conflicts, --obsoletes, --provides, --requires/-R, --info, --changelog, --xml, … |
lib/rpm/x86_64-linux/macros |
66 | per-platform overrides (§3.5) |
lib/rpm/noarch-linux/macros |
~60 | same for noarch builds |
var/lib/rpm/* |
— | rpmdb skeleton: Berkeley DB files Packages, Name, Basenames, Group, Requirename, Providename, Conflictname?, Triggername, Dirnames, Requireversion, Provideversion, Installtid, Sigmd5, Sha1header, Filemd5s + __db.001–003 environment. Packages is 0 bytes (empty template); secondary indexes retain ~1906 historical package-name keys (used in §2.3) |
2. The PikeOS Package Model
2.1 What a .spec + macros produce
A PikeOS package is a standard RPM 4.2 binary package (name-version-release.arch.rpm, name template %_build_name_fmt = %{ARCH}/%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm, macros:575) whose build is driven by the PikeOS macro layer in config/rpm/. The flow:
rpmbuild -bb/--rebuildloads the macro stack (§3.6): mastermacros→ host file → target file →common→ platform macros → user files.%prepunpacksSourceN:into%_builddir(%{_topdir}/BUILD, topdir =%{_usrsrc}/sysgo=/opt/pikeos-D5.0/rpm/src/sysgo).%buildtypically invokes PikeOS-aware macros fromconfig/rpm/common:%pikeos_build_package(init devel project →make var-value && make all && make install) or%pikeos_build_recipe(pikeos-build-recipe <name>.recipe), withPIKEOS_BUILD_ID="%{_pikeos_build_id}"exported (common:119–129).%installpopulates$RPM_BUILD_ROOT; install-post hooks runbrp-compress/brp-strip/…(platform macros) plus the SYSGO hooks__sysgo_track_compile_postand__sysgo_check_files(common:194–197).- Packaging:
%fileslist → cpio payload (gzipw9.gzdiodefault, bzip2 optional) → header with Requires/Provides (internal generator,%_use_internal_dependency_generator 1,macros:326) → written to%_rpmdir=%{_topdir}/RPMS. - Install:
rpmi/rpm -iinto the rpmdb at%_dbpath=/opt/pikeos-D5.0/rpm/var/lib/rpm, files landing under/opt/pikeos-D5.0/…(prefix%_pikeos_prefix,common:1).
Vendor metadata stamped into every header (config/rpm/common:1–15): Vendor: SYSGO AG, Distribution: PikeOS D5.0, Packager: <support@pikeos.com>, URL http://www.pikeos.com/, product version D5.0, build id %{_pikeos_version}-%{_pikeos_mod_release} (mod_release injected by the build system, common:17–19).
2.2 Package naming scheme (from config/rpm/targets/* + common)
Name grammar (assembled by spec authors from these macros):
%{_pikeos_rpm_prefix} <component> [-<qualifier>…] [-%{_pikeos_target_arch}] (target packages)
%{_pikeos_rpm_prefix} <component> [-%{_pikeos_rpm_host}<host-ish>] (host packages)
%_pikeos_rpm_prefix=pikeos-(common:7). Every product package starts with it.- Target suffix
%_pikeos_target_arch=%{_pikeos_target_cpu}_%{_pikeos_target_proc}(e.g.arm_v7hf,ppc_e500mc-4g; the-diabtoolchain variants append-diab,targets/ppc_e500mc-diab-linux:3). - Tool prefix
%_pikeos_tool_prefix=<arch>-used for cross-tool binaries (targets/*:4). - Host infix
%_pikeos_rpm_host:%nil(empty) on Linux hosts,cygwin-/win32-on Windows hosts (hosts/*:3). - Derived component renames (
common:71–72):pikeos-psp-<board>-<arch>→ sources packagepikeos-sources-psp-<board>-<arch>and config packagepikeos-config-psp-<board>-<arch>(sed rewrites).
2.3 Observed package taxonomy (rpmdb Name index, 1906 unique names)
Recovered from src/rpm/var/lib/rpm/Name (secondary index keys). Representative families — the replica must accept/install all of these shapes:
| Family | Example | Meaning |
|---|---|---|
pikeos-kernel[-cert]-<arch> |
pikeos-kernel-cert-ppc_e5500 |
kernel binaries (cert = certification variant) |
pikeos-fusion-kernel-<board>-<arch> |
pikeos-fusion-kernel-<qoriq-board>-e6500-l2-ppc_e500mc |
board-fused kernel images |
pikeos-bin-fusion-pssw-{standard,cert}-<arch> |
— | prebuilt PSSW fusion binaries |
pikeos-psp-<board>-<arch> |
pikeos-psp-<qoriq-board>-e6500-ppc_e500mc |
Platform Support Package |
pikeos-sources-psp-<board>-<arch> / pikeos-config-psp-<board>-<arch> |
pikeos-config-psp-imx6-arm_v7hf |
PSP source/config split (renames per common:71–72) |
pikeos-bsp-… |
29 names | board support packages |
pikeos-ddk-<drv>[-headers][-kdev][-cmp]-<arch> |
pikeos-ddk-can-headers-ppc_e500mc, pikeos-pci_manager-kdev-x86_amd64 |
Driver Development Kit modules; -kdev = kernel-device framework variant, -cmp = companion |
pikeos-posix[-smp]-pse51[-debug-instr]-<arch> |
pikeos-posix-pse51-arm_v8hf |
POSIX PSE51 personality |
pikeos-personality-{native,integration}-<arch> |
— | personality runtimes |
pikeos-apex-… / pikeos-demo-… |
pikeos-demo-apex-hello-smp |
ARINC-653 + demo projects (129 demo names) |
pikeos-gcc-<arch>, pikeos-binutils-…, pikeos-gdb-client-<arch> |
pikeos-gcc-ppc_e500mc-4g |
cross toolchains (host packages, target in name) |
pikeos-lib{vp,spider,drv,imon,nfsrpc,util,gcc_cert,psp,ivm,gdbstub,fdt,debug,vm,acpica}-… |
pikeos-libgcc_cert-ppc_e500 |
libraries |
pikeos-{hlnet,hlser,hldio,hlclk,hlcan,hlblk}-<arch> |
— | high-level I/O stacks |
pikeos-{scov,coverage,profile,profileopt,mon,traceserver,sectick}-… |
202 scov names | coverage/profiling/monitoring |
pikeos-{cenv,cppenv,tfw,errno,errcnt,anisfp,kextfp,enteremul}-… |
— | C/C++ environments, test framework |
pikeos-{virtio,veth,qport,muxa,sport,pci,dpaa}-… |
— | virtual/para-virtual devices |
pikeos-{boot,bootimage,cdk,target,devel,doc,releasenotes,licensing}-… |
pikeos-boot-grub-noarch |
boot loaders, CDK, docs; -noarch suffix appears explicitly on some |
pikeos-{8250,e1000,pl011,lpuart,scif,xuartps,xemacps,tsec,cpsw,ravb,smc911x,smmu}-… |
— | device drivers |
pikeos-buildenv-babs, pikeos-babs-buildlogs, pikeos-rpmconfig, pikeos-scripts |
— | build-system integration (BaBS) |
host-provides, sbe-proxy-<pkg> |
— | proxy packages (§2.4) |
Target-suffix distribution in the index: arm_v7hf 276, arm_v8hf 243, ppc_e500mc-4g 232, ppc_e500mc 228, ppc_e5500 222, ppc_e500 216, x86_amd64 211, plus unsuffixed host/noarch packages.
2.4 Proxy packages (host-provides / buildenv-provides)
Two special package types let the rpmdb satisfy dependencies on material that is not rpm-managed:
host-provides(rpm/host-provides/host-provides.spec, 39 lines):Name: host-provides,Version: 0.0,Release: 1,BuildArchitectures: noarch,AutoReqProv: no, empty%files. The line# PROVIDES GO HERE -- DON'T CHANGE!(line 18) marks wherefind-host-provides.shoutput is injected. That script (find-host-provides.sh, 113 lines):- emits
Provides: /bin/sh,/usr/bin/env, and interpretersbash/perl/cshfound viawhich(lines 83–100); - scans
/lib /usr/lib(or/compat/linux/...on BSD) forlib*.so.[0-9]andld-linux*.so.[0-9], and for each library emitsProvides: <SONAME>,Provides: <libname>(<VERDEF>)for every version definition, suffixed(64bit)for ELF64 (lines 44–73, 103–112); - Cygwin hosts skip library scanning.
- emits
sbe-proxy-<PKGNAME>(rpm/buildenv-provides/buildenv-provides.spec.in, 39 lines): template with##PKGNAME##placeholder (lines 1, 21); one proxy package per SYSGO Build Environment (/opt/sbe-D3.1,%_sysgo_buildenv_prefix,common:9) component, same noarch/AutoReqProv-no shape.
uos-pkg must generate and install both proxy types so that Requires: libc.so.6(GLIBC_2.17)(64bit)-style dependencies resolve against the host.
3. Macro Reference — lib/rpm/macros and config/rpm/*
241 distinct macro names in the master file (265 definition lines). Grouped below with file:line citations (macros = src/rpm/lib/rpm/macros, common = pikeos-mirror/config/rpm/common).
3.1 Path macros
| Macro | Value | Cite |
|---|---|---|
%nil |
empty (%{!?nil}) |
macros:24 |
%_usr |
/opt/pikeos-D5.0/rpm |
macros:29 |
%_usrsrc |
%{_usr}/src |
macros:30 |
%_var |
/opt/pikeos-D5.0/rpm/var |
macros:31 |
%_topdir |
%{_usrsrc}/sysgo |
macros:170 |
%_builddir / %_sourcedir / %_specdir / %_rpmdir / %_srcrpmdir |
%{_topdir}/{BUILD,SOURCES,SPECS,RPMS,SRPMS} |
macros:95,157,161,146,164 |
%_tmppath |
/tmp |
macros:167 |
%_dbpath / %_dbpath_rebuild |
%{_var}/lib/rpm |
macros:104,107 |
%_defaultdocdir |
%{_usr}/doc |
macros:133 |
%_rpmfilename / %_build_name_fmt |
%{ARCH}/%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm |
macros:150,575 |
%_repackage_dir / %_repackage_name_fmt / %_repackage_root / %_repackage_all_erasures |
/var/spool/repackage, %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm, empty, 0 |
macros:604–614 |
%_prefix %_exec_prefix %_bindir %_sbindir %_libexecdir %_datadir %_sysconfdir %_sharedstatedir %_localstatedir %_lib %_libdir %_includedir %_oldincludedir %_infodir %_mandir |
autoconf-style tree under /opt/pikeos-D5.0/rpm (_lib=lib) |
macros:902–916 |
%_javadir / %_javadocdir |
%{_datadir}/java, %{_datadir}/javadoc |
macros:245–246 |
%_install_script_path |
/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin |
macros:231 |
%_cache_dbpath, %_bhpath, %_bhcoll, %_bhN, %_bhVR (=SYSGO), %_bhA |
rpmcache universe config | macros:703–710 |
Tool paths %__awk … %__xz (30 entries) |
gawk bzip2 cat chgrp chmod chown cp cpio file gpg grep gzip id install ln-s make mkdir mkdir-p mv patch perl pgp python rm rsh sed ssh tar unzip xz |
macros:36–65 |
Build tools %__ar %__as %__cxx %__ld %__nm %__objcopy %__objdump %__ranlib %__remsh %__strip + autotools set |
ar as g++ /usr/bin/ld /usr/bin/nm /usr/bin/objcopy /usr/bin/objdump ranlib %{__rsh} /usr/bin/strip, libtoolize aclocal autoheader automake autoconf |
macros:70–86 |
3.2 Build macros
| Macro | Meaning | Cite |
|---|---|---|
%_buildshell |
/bin/bash — scriptlet interpreter |
macros:98 |
%___build_shell/_args/_cmd/_pre/_post/_template |
scriptlet template machinery; _pre exports RPM_SOURCE_DIR RPM_BUILD_DIR RPM_OPT_FLAGS RPM_ARCH RPM_OS RPM_DOC_DIR RPM_PACKAGE_NAME/VERSION/RELEASE RPM_BUILD_ROOT, umask 022, cd %{u2p:%{_builddir}} |
macros:738–773 |
%__spec_{prep,build,install,check,clean,rmbuild}_{shell,args,cmd,pre,body,post,template} |
per-stage instantiations of the template | macros:780–880 |
%optflags |
-O2 (generic); per-arch table in rpmrc:14–62 (e.g. x86_64 -O2 -g); platform file sets -O2 -g |
macros:726; rpmrc:20; x86_64-linux/macros:11 |
%configure |
PLD-style: exports CFLAGS/CXXFLAGS/FFLAGS, runs ./configure --host=%{_host} --build=%{_build} --target=%{_target_platform} --program-prefix=… --prefix=… + 12 dir flags |
macros:958–977 |
%GNUconfigure(MCs:) |
regenerates autotools (libtoolize/gettextize/aclocal/autoheader/automake/autoconf) then configures; opts -C dir, -M mkdir, -s LDFLAGS |
macros:1008–1052 |
%makeinstall |
make prefix=%{buildroot}%{_prefix} … install with all 13 dir overrides |
macros:981–996 |
%_smp_mflags |
-j$(getconf _NPROCESSORS_ONLN) when >1 CPU |
x86_64-linux/macros:35–37 |
%_package_version |
30005 — rpm-3.0.5-compatible headers |
macros:303 |
%__check_files / %_unpackaged_files_terminate_build / %_missing_doc_files_terminate_build |
check-files %{buildroot}; both terminate flags = 1 (strict) |
macros:310,316,322 |
%_use_internal_dependency_generator |
1 (internal); external fallbacks %__find_provides/%__find_requires = find-provides/find-requires; perl helpers perl.prov/perl.req |
macros:326,334–335,346–347 |
%debug_package / %__debug_install_post |
auto -debug subpackage template + find-debuginfo.sh invocation |
macros:112–131 |
%find_lang |
find-lang.sh %{buildroot} |
macros:1097 |
%requires_eq(), %perl_sitearch, %perl_archlib |
perl helper macros | macros:1076–1078 |
%ix86 |
i386 i486 i586 i686 athlon arch alias list |
macros:1086 |
%debian_patch |
applies debian/patches via quilt/00list/glob (SYSGO addition) |
common:21–36 |
%sysgo_modulepatch(cvs-path) / %sysgo_install_modulepatch(cvs-path file) |
applies/installs per-module patches from %{_sysgo_modulepatch_dir} = %{_pikeos_prefix}/build/module-patches, with cpu/proc-specific subdirs |
common:75–94 |
%pikeos_clone_project(demo dst) / %_pikeos_init_devel_project / %pikeos_prepare_package / %pikeos_prepare_demo / %pikeos_build_package / %pikeos_build_recipe / %pikeos_install_demo(dir) / %pikeos_bsp_prepare_basic_fusion(board) / %pikeos_bsp_prepare_cert_fusion(name) |
PikeOS project build orchestration (projectconfigurator/cloneproject/build-recipe/make wrappers) | common:96–144 |
%pikeos_psp_src_name() / %pikeos_psp_config_name() |
PSP package rename functions | common:71–72 |
%__sysgo_track_compile_pre/post, %_fixowner hook, %__sysgo_check_files, %__spec_install_post (override) |
compile-time file tracking (BaBS BABS_TRACK_COMPILE), post-install checker hook |
common:146–197 |
3.3 Install / transaction / database macros
| Macro | Meaning | Cite |
|---|---|---|
%_signature |
none (default signing off) |
macros:153 |
%__gpg_check_password_cmd, %__pgp_check_password_cmd, %__pgp5_check_password_cmd, %__gpg_sign_cmd, %__pgp_sign_cmd, %__pgp5_sign_cmd |
external signer command templates (verify done internally via beecrypt) | macros:526–541 |
%_transaction_color |
3 (Elf32+Elf64 permitted) |
macros:582 |
%_vsflags_{build,erase,install,query,rebuilddb,up2date,verify} |
all 0 — digest/signature verify flags per mode |
macros:626–633 |
%_query_all_fmt |
%{name}-%{version}-%{release} for rpm -qa |
macros:693 |
%_install_langs |
all |
macros:236 |
%_query_selector_match |
default (glob-like) |
macros:267 |
%_dependency_whiteout[_7_0,_7_1,_7_2] |
legacy dependency-loop breakers (p>q pairs) |
macros:650–687 |
%_dbapi / %_dbapi_rebuild |
3 / 3 — Berkeley DB backend |
macros:516–517 |
%__dbi_cdb |
create cdb mpool mp_mmapsize=16Mb mp_size=1Mb |
macros:454 |
%__dbi_other / %__dbi_rebuild / %__dbi_transient / %__dbi_perms |
tmpdir+cdb; nofsync !log !txn !cdb; +temporary private; perms=0644 |
macros:456–461 |
%__dbi_htconfig / %_dbi_htconfig[_current/_rebuild] |
hash-db config composition | macros:465–477 |
%__dbi_btconfig / %_dbi_btconfig[_current/_rebuild] |
btree-db config composition | macros:481–493 |
%_dbi_tags |
Packages:Name:Basenames:Group:Requirename:Providename:Conflictname:Triggername:Dirnames:Requireversion:Provideversion:Installtid:Sigmd5:Sha1header:Filemd5s:Depends:Pubkeys |
macros:496 |
%_dbi_config_Packages |
%{_dbi_htconfig} lockdbfd nofsync |
macros:499 |
%_dbi_config_Depends |
%{_dbi_htconfig} temporary private nofsync |
macros:502 |
%_dbi_config_{Dirnames,Requireversion,Provideversion,Installtid,Removetid} |
%{_dbi_btconfig} nofsync |
macros:504–508 |
%_dbi_config |
%{_dbi_htconfig} nofsync (default) |
macros:519 |
3.4 Target-configuration macros (config/rpm/)
common (product identity, cited §2.1): %_pikeos_prefix /opt/pikeos-D5.0, %vendor SYSGO AG, %_pikeos_version D5.0, %distribution PikeOS D5.0, %packager <support@pikeos.com>, %_pikeos_url, %_pikeos_rpm_prefix pikeos-, %_sysgo_buildenv_dirname lin64, %_sysgo_buildenv_prefix /opt/sbe-D3.1, %_sysgo_* aliases of the pikeos values, %_pikeos_build_id %{_pikeos_version}-%{_pikeos_mod_release}.
Per-target files (config/rpm/targets/<arch>-linux, 16 files) define: %_pikeos_target_cpu, %_pikeos_target_proc, %_pikeos_target_arch (=cpu_proc, + -diab on DIAB variants), %_pikeos_tool_prefix (arch + -), %_pikeos_target_name (human label), %_pikeos_cdk_dir = %{_pikeos_prefix}/cdk/<cpu>/<proc>, %_pikeos_arch_pool = %{_pikeos_prefix}/target/<cpu>/<proc>, %_pikeos_target_config (gcc triplet), optional %_pikeos_cpu_id, %_pikeos_cpu_arch, %_pikeos_cpu_endian, %_pikeos_has_fpu, %_pikeos_fpu_id, %_pikeos_cache_size, %_pikeos_has_altivec, %_pikeos_multilib_gcc, %_pikeos_wrdsz (32/64), %_pikeos_align (0x1000).
Per-host files (config/rpm/hosts/*, 6 files) define: %_pikeos_host_name, %_pikeos_host_arch, %_pikeos_rpm_host (<name>- or %nil on Linux), %_pikeos_host_config (host triplet), %_pikeos_host_prefix, %_pikeos_host_dirname, %_pikeos_host_dir = %{_pikeos_prefix}/<dirname>; win32/win64 add %_pikeos_cygwin_{config,prefix,dirname,dir}; every host file mirrors all values into %_sysgo_host_* aliases.
3.5 Platform macros (lib/rpm/<arch>-linux/macros)
x86_64-linux/macros (66 lines): %_arch x86_64, %_vendor unknown, %_os linux, %_gnu -gnu, %_target_platform %{_target_cpu}-%{_vendor}-%{_target_os}, %optflags -O2 -g, configure tree with %_sysconfdir /opt/pikeos-D5.0/config, %_localstatedir /opt/pikeos-D5.0/rpm/var, %_lib lib64, %_initrddir, %_smp_mflags, multilib (%_multilibno 2, %_multilibpatt …), and build-root policy: %__os_install_post = brp-compress brp-strip brp-strip-static-archive brp-strip-comment-note, wired into %__spec_install_post (lines 51–64). noarch-linux/macros is identical except %_arch noarch.
3.6 Macro load order (the effective stack)
From rpmrc:355 (macrofiles:), confirmed by --showrc:
1. /opt/pikeos-D5.0/rpm/lib/rpm/macros (master, §3.1–3.3)
2. /opt/pikeos-D5.0/config/rpm/hosts/lin32 (host — NOTE: compiled-in default is lin32 even on x86_64; see §6)
3. /opt/pikeos-D5.0/config/rpm/targets/%{_target} (target, e.g. x86_64-linux)
4. /opt/pikeos-D5.0/config/rpm/common (product identity + PikeOS build macros)
5. /opt/pikeos-D5.0/rpm/lib/rpm/%{_target}/macros (platform, §3.5)
6. config/rpm/macros.specspo : macros.prelink : macros.solve : macros.up2date : macros (optional, absent)
7. /opt/pikeos-D5.0/config/rpm/%{_target}/macros (optional)
8. ~/.rpmmacros
Later definitions win. The compiled-in fallback in librpm-4.2.so is …/macros:…/hosts/lin32:…/targets/%{_target}:…/common:./.rpmmacros:~/.rpmmacros (note ./.rpmmacros instead of the platform file — a vendor customization).
3.7 Built-in macro functions observed
%(...) shell eval, %[...]? (not used), %{?cond:…}/%{!?cond:…} conditionals, %{-opt:…} option-argument forms (%GNUconfigure(MCs:)), and %{u2p:PATH} — a vendor-added "unix-to-path" builtin used throughout ___build_pre (macros:742–761) and common:41–69; verified live: %{u2p:/opt/foo/bar} → /opt/foo/bar (identity on Linux; on cygwin/mingw hosts it converts to the host path form). uos-pkg must implement u2p as a host-dependent path-conversion builtin.
3.8 rpmlib feature set (from --showrc)
rpmlib(pikeos-D5.0) (vendor virtual feature, "PikeOS virtual package"), VersionedDependencies 3.0.3-1, CompressedFileNames 3.0.4-1, PayloadIsBzip2 3.0.5-1, PayloadFilesHavePrefix 4.0-1, ExplicitPackageProvide 4.0-1, HeaderLoadSortsTags 4.0.1-1, ScriptletInterpreterArgs 4.0.3-1, PartialHardlinkSets 4.0.4-1, ConcurrentAccess 4.1-1.
4. Host/Target Matrix (config/rpm/)
4.1 Targets — 16 definition files covering 8 architecture families
| File | cpu_proc (arch) | gcc target_config | endian | word | FPU / notes |
|---|---|---|---|---|---|
arm_v7hf-linux |
arm_v7hf |
arm-unknown-eabihf |
little | 32 | fpu yes, vfpv3-d16, cpu_arch armv7-a |
arm_v8hf-linux |
arm_v8hf |
aarch64-unknown-elf |
little | 64 | fpu yes, cpu_arch armv8-a |
riscv_rv64-linux |
riscv_rv64 |
riscv64-unknown-elf |
little | 64 | fpu yes, cpu_arch rv64g |
x86_amd64-linux |
x86_amd64 |
x86_64-unknown-elf |
little | 64 | fpu yes |
x86_i686-linux |
x86_i686 |
i686-unknown-elf |
little | 32 | fpu yes, cpu_id i686 |
ppc_oea-linux |
ppc_oea |
powerpc-unknown-elf |
big | 32 | cpu_id 603, cache 8, multilib |
ppc_e500-linux |
ppc_e500 |
powerpc-unknown-elfspe |
big | 32 | cpu_id 8540, cache 32 |
ppc_e500mc-linux |
ppc_e500mc |
powerpc-unknown-elf |
big | 32 | cpu_id e500mc, multilib |
ppc_e500mc-4g-linux |
ppc_e500mc-4g |
powerpc-unknown-elf |
big | 32 | 4G:4G memory split, multilib |
ppc_e500mc-diab-linux |
ppc_e500mc-diab |
powerpc-unknown-elf |
big | 32 | DIAB toolchain variant |
ppc_e500mc-4g-diab-linux |
ppc_e500mc-4g-diab |
powerpc-unknown-elf |
big | 32 | 4G:4G + DIAB |
ppc_e5500-linux |
ppc_e5500 |
powerpc64-unknown-elf |
big | 64 | cpu_id e5500, multilib |
ppc_e6500-linux |
ppc_e6500 |
powerpc64-unknown-elf |
big | 64 | cpu_id e6500, multilib |
mips_isa32be-linux |
mips_isa32be |
mipsisa32r2-unkown-elf (sic) |
big | 32 | fpu yes |
mips_isa32le-linux |
mips_isa32le |
mipsisa32r2el-unkown-elf (sic) |
little | 32 | fpu yes |
sparc_v8-linux |
sparc_v8 |
sparc-unknown-elf |
big | 32 | fpu yes |
All targets: %_pikeos_align 0x1000; cdk dir <prefix>/cdk/<cpu>/<proc>; arch pool <prefix>/target/<cpu>/<proc>; tool prefix <arch>-.
UniversalisOS relevance: the replica kernel targets armv7 (→ arm_v7hf), aarch64 (→ arm_v8hf), riscv (→ riscv_rv64) — all present in the matrix, so uos-pkg inherits target definitions 1:1.
4.2 Hosts — 6 definition files
| File | host_name | arch | host_config (triplet) | rpm_host infix | dirname | extra |
|---|---|---|---|---|---|---|
lin32 |
linux | i386 | i686-pc-linux-gnu |
%nil (empty) |
lin64 (sic — 32-bit tools run from lin64 tree) |
— |
lin64 |
linux | x86_64 | x86_64-pc-linux-gnu |
%nil |
lin64 |
— |
cygwin |
cygwin | i386 | i686-pc-cygwin |
cygwin- |
cygwin |
— |
cygwin64 |
cygwin | x86_64 | x86_64-pc-cygwin |
cygwin- |
cygwin64 |
— |
win32 |
win32 | i386 | i686-w64-mingw32 |
win32- |
mingw |
cygwin companion: i686-pc-cygwin, dir cygwin |
win64 |
win32 | x86_64 | x86_64-w64-mingw32 |
win32- |
mingw64 |
cygwin companion: x86_64-pc-cygwin, dir cygwin64 |
Host dir = %{_pikeos_prefix}/<dirname>; every value mirrored into %_sysgo_host_*.
5. uos-pkg — From-Scratch Reimplementation Design
Goal: a clean-room packaging toolchain for the UniversalisOS build environment that is functionally identical to the PikeOS RPM 4.2 stack: same CLI surface, same on-disk package format (so existing .rpm artifacts install), same macro semantics (so existing .spec files and config/rpm/* files work unmodified), same rpmdb behavior. Written in C++ (freestanding-friendly core library libuospkg + CLI), no GPL/LGPL code reuse — format-level compatibility only (RPM format is documented; cpio/gzip are open formats).
5.1 Component map (1:1 to the PikeOS stack)
| PikeOS component | uos-pkg component | Notes |
|---|---|---|
rpm (mode-dispatched CLI) |
uos-pkg single binary, mode by argv[0] symlink or subcommand |
symlinks uos-pkg-{build,query,install,verify,sign,db} mirror rpmb/rpmq/rpmi/rpmk/rpmv/rpmd |
rpmbuild |
uos-pkg build (-bp -bc -bi -bl -ba -bb -bs -t* --rebuild --recompile --target --buildroot --clean --rmsource --rmspec --short-circuit --nodirtokens) |
identical stage semantics |
rpm -q/-V/-i/-U/-e/-K/--initdb/--rebuilddb |
`uos-pkg query | verify |
rpm2cpio |
uos-pkg extract (+ uos-rpm2cpio compat wrapper) |
gzip+bzip2 payloads |
rpmgraph |
uos-pkg graph |
graphviz digraph output |
gendiff |
uos-pkg gendiff (or keep the 20-line sh script) |
trivial |
librpm/librpmbuild/librpmdb |
libuospkg (format), libuosbuild (spec/build engine), libuosdb (database) |
C++17, freestanding-capable core |
| Berkeley DB 4.1.24 rpmdb | uosdb: append-only log-structured store with the same logical indexes (§5.4) | BDB format is legacy; we keep logical parity (same indexes, same query results), not byte parity |
lib/rpm/macros + rpmrc + rpmpopt-4.2 |
share/uos-pkg/macros, uosrc, uospopt — byte-identical copies with path prefix retargeted (/opt/pikeos-D5.0 → %{uos_prefix}) |
macro engine must parse the original files unmodified as a conformance test |
config/rpm/{common,hosts/*,targets/*} |
config/uos-rpm/{common,hosts/*,targets/*} — same files, pikeos→uos token rename |
16 targets + 6 hosts preserved exactly |
helper scripts (find-provides, brp-*, check-files, find-lang.sh, …) |
reimplemented as uos-pkg builtins (--internal-find-provides etc.) with sh wrappers for compat |
eliminates perl/sh host deps |
host-provides / buildenv-provides machinery |
uos-pkg proxy host / uos-pkg proxy buildenv <pkg> |
generates identical spec + builds + installs (§5.6) |
5.2 Package file format (byte-level parity target)
Implement the RPM 4.2 container exactly (so PikeOS-built .rpm files install under uos-pkg and vice versa):
+-------------+ lead: 96 bytes, magic 0xEDABEEDB, major 3, minor 0,
| lead | type (0=bin,1=src), archnum, osnum, name[66], sigtype 5
+-------------+ signature header: header structure, magic 0x8EADE801,
| signature | RSA/DSA/SHA1/MD5 entries, 8-byte aligned
+-------------+ header: magic 0x8EADE801, sorted tags, i18n table;
| header | 133 query tags (verified list from --querytags)
+-------------+ payload: cpio (newc, "070701") compressed
| payload | gzip (w9.gzdio, default) or bzip2 (w9.bzdio)
+-------------+
- Header store: region + immutable section, tag sorting (
HeaderLoadSortsTags), compressed filenames as (dirname,basename,dirindex) tuples (CompressedFileNames),./-prefixed payload paths (PayloadFilesHavePrefix). - Digests: MD5 per file (
Filemd5s), SHA1 over header (Sha1header), MD5 over header+payload (Sigmd5). Signatures: DSA/RSA via an internal minimal implementation (BeeCrypt replacement) — verification only is mandatory; signing optional. - rpmlib dependencies: emit/require the same feature strings as §3.8, including
rpmlib(uos-5.0)as the renamed virtual feature (the originalrpmlib(pikeos-D5.0)string must also be accepted when installing legacy packages — aliasing table in the dependency resolver). rpm2cpioequivalence:uos-pkg extract pkg.rpm | cpio -idmmust reproduce the payload; the pure-sh fallback algorithm (rpm2cpio.sh: skip 96-byte lead, parse signature/header sizes viaod,dd | gunzip) documents the exact offsets and is the conformance reference.
5.3 CLI surface (parity with rpm 4.2)
uos-pkg query (-q) [-c -d -l -s --dump --qf FMT -a -f FILE -g GROUP -p PKG --specfile --whatrequires CAP --whatprovides CAP --scripts --provides --requires/-R --obsoletes --conflicts --info --changelog --xml --setperms --setugids]
uos-pkg verify (-V) [--nomd5 --nofiles --nodeps --noscript -a -f -g -p ...]
uos-pkg install (-i) / upgrade (-U) / freshen (-F) / erase (-e)
[--aid --allfiles --allmatches --badreloc --excludepath --force --hash/-h --ignorearch --ignoreos --ignoresize --includedocs --justdb --nodeps --nodigest --noorder --nopre --nopost --nopreun --nopostun --noscripts --notriggers --oldpackage --percent --prefix PATH --relocate OLD=NEW --repackage --replacefiles --replacepkgs --test]
uos-pkg sign (--addsign/--resign -K/--checksig --import --nodigest --nosignature)
uos-pkg db (--initdb --rebuilddb)
uos-pkg build (rpmbuild stage flags, §5.1)
uos-pkg extract | graph | gendiff | proxy | eval (-E) | define (-D) | showrc | querytags | macros=LIST | rcfile=LIST | root=DIR | version
All 133 query tags from --querytags must be supported by the query formatter (headerSprintf-compatible: %{TAG}, %|TAG?{t}:{f}| conditionals, [...] array iteration, :shescape/:octal/:depflags/:json? (4.2 set: shescape, octal, hex, date, depflags, perms, fflags, vflags) modifiers). The popt alias file rpmpopt-4.2 (472 lines) is ported to uospopt verbatim.
5.4 Database (uosdb) — logical parity with the BDB rpmdb
- Location:
%{_dbpath}=<prefix>/var/lib/rpm(same macro). - Logical schema mirrors
%_dbi_tags(macros:496): primaryPackagesstore + indexesName Basenames Group Requirename Providename Conflictname Triggername Dirnames Requireversion Provideversion Installtid Sigmd5 Sha1header Filemd5s Depends Pubkeys. - Implementation: single-file log-structured store (
Packages.uosdb) + per-index sorted-string tables; fcntl exclusive/shared locking replicatinglockdbfd;nofsyncdefault per%_dbi_config*;--rebuilddbregenerates all indexes from headers (equivalent of%__dbi_rebuild nofsync !log !txn !cdb). - Import path:
uos-pkg db --import-bdb <dir>reads legacy Berkeley DB 4.1.24 files (documented hash/btree formats) to migrate an existing PikeOS rpmdb. ConcurrentAccesssemantics: scriptlets may query the db mid-transaction (in-process snapshot).
5.5 Macro engine (the heart of spec compatibility)
A faithful rpm-4.2 macro processor:
- Syntax:
%name,%{name},%{name:args}builtins,%name(args)parameterized,%(...)shell,%{?c:t}/%{!?c:f}/%{?c}conditionals,%{-o:…}/%{-o*}option forms,%%escape, line continuation\,#comments,%define/%global/%undefinein spec files, BUFSIZ-8192 expansion buffer semantics (macros:778). - Builtins: at minimum
u2p(host path conversion — identity on linux hosts, cygwin/mingw conversion on windows hosts; §3.7),basename,dirname,suffix,expand,unexpand,verbose,nil,echo,warn,error,trace,dump,getenv,getconfdir,S P Fspec-section refs, plus lua-free 4.2 set. - Load order exactly as §3.6 with
%{_target}interpolation in the file list;--macros=replaces the list;-Ddefines land in the highest-priority context. - Conformance test:
uos-pkg evalon every macro inconfig/rpm/*andlib/rpm/macrosmust produce byte-identical expansions to the originalrpm -E(differential test harness against the mirrored binaries, which run fine underLD_LIBRARY_PATH=src/rpm/lib64).
5.6 Build engine (rpmbuild parity)
- Spec parser: preamble tags (
Name Version Release Epoch Summary Group License Copyright Vendor Packager Distribution URL BuildRoot BuildRequires BuildArchitectures AutoReqProv Provides Requires Obsoletes Conflicts SourceN PatchN …), sections%description %prep %build %install %check %clean %files %changelog %pre %post %preun %postun %verifyscript %trigger*, subpackages%package/-n,%filesattributes%defattr %attr %config %doc %dir %lang %ghost %exclude. - Scriptlet execution via
%___build_cmdtemplate with the SYSGO-overridden%___build_pre(PATH/LD_LIBRARY_PATH injection fromcommon:40–69, includingBABS_BUILDENV_PREFIXhandling) — the replica keeps this logic, retargeted touos_macros. - Stage pipeline
-bp→-bc→-bi→-bl→-bb/-ba,%setup/%patchbuiltins, build-root policies (brp-*equivalents),check-filesstrictness (%_unpackaged_files_terminate_build 1), internal dependency generator producing SONAME/interpreter/perl deps identical tofind-provides/find-requiresoutput. - PikeOS-specific macros from
common(%pikeos_build_packageetc.) are provided underuos_names (%uos_build_package,%uos_clone_project, …) with a compatibility alias table so legacy specs build unmodified; the alias table is the only place the old product token appears, isolated inshare/uos-pkg/legacy-aliases.macros.
5.7 Proxy-package generation (host/buildenv parity)
uos-pkg proxy host:
- emit
Provides: /bin/sh,/usr/bin/env, interpreters (bash perl cshon Linux/BSD;bash perlon cygwin) — mirrorsfind-host-provides.sh:83–100; - scan
/lib /usr/lib(/compat/linuxprefix on BSD) forlib*.so.[0-9],ld-linux*.so.[0-9]; parse ELF dynamic section: emit SONAME and eachVERDEFaslibname(VER); append(64bit)marker for ELF64 — mirrorscheck_lib()lines 44–73; - render the
host-providesspec template (Version 0.0, Release 1, noarch, AutoReqProv no, empty %files), build, and install into the uosdb.
uos-pkg proxy buildenv <name>: instantiate the sbe-proxy-##PKGNAME## template (buildenv-provides.spec.in) per build-environment component.
5.8 Macro-set mapping (1:1)
Every macro in §3 keeps its name and semantics; only the values carrying the product prefix change, via a single retargeting layer:
| PikeOS macro | uos-pkg value | Mechanism |
|---|---|---|
%_pikeos_prefix /opt/pikeos-D5.0 |
%_uos_prefix /opt/uos-5.0 (+ legacy alias) |
config/uos-rpm/common |
%_pikeos_rpm_prefix pikeos- |
%_uos_rpm_prefix uos- |
same |
%_pikeos_version D5.0 |
%_uos_version 5.0 |
same |
%vendor SYSGO AG, %packager, %_pikeos_url |
UniversalisOS identity | same |
all %_pikeos_target_*, %_pikeos_host_* |
%_uos_target_*, %_uos_host_* |
renamed copies of the 22 files |
%_sysgo_* aliases |
%_uos_sys_* (or drop; internal only) |
same |
%{u2p:…} |
identical builtin | macro engine |
master macros paths /opt/pikeos-D5.0/rpm/… |
/opt/uos-5.0/pkg/… |
retargeted copy |
The legacy-alias file maps %_pikeos_* → %_uos_* so that unmodified PikeOS specs/config evaluate identically. New UniversalisOS content uses only uos_ names.
5.9 Verification & conformance plan
- Differential macro tests: for each of the 241 macros + all
config/rpmentries, compareuos-pkg evalvs mirroredrpm -Eoutput (harness:LD_LIBRARY_PATH=src/rpm/lib64 src/rpm/bin/rpm --rcfile … --macros … -E). - Format round-trip: build a package with mirrored
rpmbuild, install withuos-pkg; build withuos-pkg build, install with mirroredrpm -i(in a sandbox root) — both directions must succeed;rpm2cpiovsuos-pkg extractbyte-compare payloads. - DB parity: after identical install sequences,
query -qa --qfdumps must match;rpmgraphvsuos-pkg graphdigraphs must be isomorphic. - Proxy parity:
find-host-provides.shoutput vsuos-pkg proxy host --emit-providesdiffed on the same machine. - Real-world corpus: the 1906 package names recovered from the mirrored rpmdb
Nameindex serve as the naming-conformance corpus; synthetic specs generating each family must produce identical NEVRA strings.
5.10 Non-goals / deliberate deviations
- No byte-level Berkeley DB compatibility (logical parity only; import tool provided).
- No PGP2/PGP5 external signers (
%__pgp*_sign_cmd) — GPG-compatible signing only; verification of legacy signatures still supported. - No
rpmcache/up2date universe solver (%_bh*,%_solve_*macros parsed but inert). - Internationalization: English-only CLI (the original ships 20+ locale catalogs; messages are out of parity scope).
- The
lin32-as-default-host quirk in the compiled-in macrofiles list (§3.6) is reproduced for fidelity but documented;uos-pkgselects the host file matching the actual host arch unless--legacy-host-defaultis given.
6. Notable findings / quirks (relevant to the replica)
- Compiled-in default host is
lin32even though the tools are x86_64 binaries (rpmrc:355and thelibrpm-4.2.soembedded string). On a 64-bit host the effective host config comes fromhosts/lin32unless overridden —lin32itself sets%_pikeos_host_dirname lin64(sic), so paths still resolve to the 64-bit tree. ./.rpmmacros(cwd-local macro file) appears in the embedded macrofiles list but not in the on-diskrpmrc— a vendor patch to the library.rpmlib(pikeos-D5.0)is a custom virtual rpmlib capability injected by the vendor build; packages mayRequire:it.uos-pkgmust alias it.%{u2p:…}is a vendor-added macro builtin (not in stock rpm 4.2) for Windows-host path conversion; used in every build scriptlet prelude.- The shipped rpmdb is an empty template (
Packages= 0 bytes) but secondary indexes retain ~1906 historical package-name keys — a goldmine for the naming taxonomy (§2.3). - zlib inside
librpmreports 1.1.4 inflate/deflate (2002-era) while linking a 1.2.7zlibVersionsymbol — payload compression is plain gzip either way. mips_isa32*target files contain the misspelled tripletmipsisa32r2-unkown-elf— reproduce verbatim for parity (gcc configure consumes it).- Strict-build defaults: unpackaged files and missing
%docfiles terminate the build (macros:316,322) — harsher than stock rpm 4.2 defaults. %_fixowneris deliberately abused as the earliest post-%setuphook for compile tracking (common:184–190) — the replica must preserve hook ordering.- The banned two-character product token appears in original comments (e.g.
common:78,92example CVS paths) and as an infix in ~14 recovered legacy package names (a doc package, an API family, a CFS family, a bus family, and a base family, all of the formpikeos-<token>…); the replica's alias table handles these as opaque legacy strings, never generating them.
End of specification. All citations refer to files under ~/portugalfuturista/universalisos/ (src/rpm/… for binaries and shipped config, pikeos-mirror/… for the config/rpm tree).