Skip to content

About

Reproducible RPM source preparation, qualification, and OBS repositories for Qore and its modules

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Qore RPM packaging

Copyright 2026 Qore Technologies, s.r.o.

This repository prepares pinned sources and coordinates RPM qualification for Qore and its external modules. The canonical specs belong to the individual source repositories; Qore uses qore.spec-multi. The Fedora and openSUSE spec names in Qore are compatibility symlinks to that file.

Current status

The rollout is in pilot qualification. No target is yet qualified for a stable release. evidence/ records the checks actually completed; local full logs, containers and RPMs are retained under ignored results/ and work/ directories. Do not interpret a successfully prepared SRPM as a successful binary build.

Thirty-four external modules have committed RPM packaging and pass builds and installed-runtime suites on Fedora 44, Leap 16.0 and EL10. PostgreSQL includes mandatory Fedora pgvector coverage. ZeroMQ includes draft sockets and CURVE. The original twenty-one modules now have x86_64 OBS builds enabled on all three distributions and Fedora aarch64 builds enabled, with publication disabled.

Core revision 16 passes all 400 local suites plus SDK, compiler, debugger and minimal-runtime ONNX qualification on all three distributions. Native OBS builds pass all 400 suites on all six x86_64/aarch64 targets. The earlier Fedora ARM HttpClientHttpsProxy timeout did not recur; its diagnostic evidence is retained. Native ARM installed-package checks remain required before publication. Evidence is recorded in evidence/core16-native-installed-20261002.json. Revision 17 passes all 400 local suites and installed checks on all three targets with the binary-module metadata ownership fix. A recurring native ARM proxy fixture shutdown hang was reproduced locally and root-caused: readiness can disappear before a blocking accept, while shutdown previously joined the thread before closing the listener. The fix closes the listener first and passes all four fixture consumers plus 40 optimized single-CPU stress runs. Revision 18 passes all three x86_64 OBS builds, but all native ARM targets exposed a second race: an accept submitted between cancellation and descriptor close never receives kernel readiness. Revision 19 explicitly wakes these late operations, releases context resources on I/O-thread resizing, and retains descriptor-owning HTTP notification objects until their completion actions finish. It also includes the independently committed resident-memory accounting fix. Debug and optimized builds pass 866 native assertions, twelve functional suites, 900 shutdown cycles at one/two/four I/O threads, and seven Valgrind suites with zero memory/descriptor errors or lost allocations. The user-approved GCC/Valgrind debug-symbol warning is reproduced by a standalone C++ control. The native CI pipeline passes all 21 jobs. Revision 19 now passes all 400 local suites and installed SDK, compiler, debugger and minimal-runtime ONNX checks on all three distributions. Revision 19 also passes all six native OBS builds and installed-package qualification on Fedora, Leap and AlmaLinux ARM runners. Those checks include minimal-runtime ONNX inference, SDK consumers, tools, remote debuggers and RPM file verification; see evidence/core19-local-installed-20261002.json, evidence/core19-native-arm-installed-20261002.json, evidence/core-close-rpm-qualification-20261002.json, evidence/proxy-shutdown-fix-20261002.json and evidence/core17-local-installed-20261002.json.

Core release 20 now passes all 400 local suites and installed runtime/SDK, ONNX, compiler, tools and debugger checks on all three x86_64 distributions. The canonical source is 2a7afda675225f639a698ec289bc218560800485; it is recorded separately from the earlier release-20 candidate in evidence/core20-local-installed-20261002.json. OBS revision 15 has matching source checksums and passes all 400 suites on all six native targets, with publication disabled. Native ARM installed qualification also passes on Fedora, Leap and AlmaLinux: minimal-runtime ONNX inference, SDK consumers, tools, remote debuggers and RPM verification. See evidence/core20-native-builds-20261003.json and evidence/core20-native-arm-installed-20261003.json.

Release 21's packaging change names openSUSE's versioned LLVM 19 SDK, so adding PDFium's LLVM 21 toolchain cannot switch Qore to a newer default SDK. All 24 target metadata/dependency tests pass and OBS resolves the required headers. Canonical builds pass all 400 suites on each distribution; installed runtime/SDK upgrades, ONNX, compiler, tools and debugger checks also pass. Source d58eec0b2 on rpm/llvm19-sdk retains the qualified release-20 runtime sources. OBS revision 16 has matching checksums and passes all 400 suites on all six native OBS targets. Native ARM installed-package checks pass on Fedora, Leap and AlmaLinux, covering minimal-runtime ONNX inference, SDK consumers, tools, remote debuggers and RPM verification. Publication remains disabled. Existing core build diagnostics are unchanged after normalizing source and temporary paths. See evidence/llvm-sdk-dependency-20261003.json, evidence/core21-local-installed-20261003.json, evidence/core21-native-builds-20261003.json and evidence/core21-native-arm-installed-20261003.json.

The process module fixes a Linux PID-inspection race exposed by Fedora ARM: a concurrent waiter can reap a child between its existence check and reading /proc/PID/stat. The fix recognizes dead tasks and revalidates disappeared PIDs while retaining conservative handling of permissions and unavailable proc filesystems. Canonical RPMs and installed runtime/SDK checks pass all 70 cases and 468 assertions on each distribution. Thirteen deterministic Valgrind cases are clean; three affected existing cases retain only approved external diagnostics. Normal native CI passes. OBS revision 2 has verified sources and publication disabled. All six native OBS targets pass the same 70 cases and 468 assertions. Native ARM installed runtime/SDK checks now pass on all three distributions, including compiler smoke tests and PID regressions. See evidence/process-state-qualification-20261003.json and its complete audit.

UUID release 3 uses committed source c910cec. Canonical builds, seven staged uninstall regressions, all 14 UUID cases, installed runtime/SDK tests and package lint pass on Fedora, Leap and AlmaLinux. OBS revision 3 sources and the public archive SHA-256 are verified; all six native builds pass 14 cases and 227 assertions plus seven uninstall regressions. Native ARM installed runtime/SDK and compiler checks also pass on all three distributions in pipeline 59373. See evidence/uuid-rpm-maintenance-20261005.json and evidence/modules1-native-arm-installed-final-20261005.json. Pipeline 59378 also verifies all RPM signatures before installation and installs complete LLVM documentation; all native ARM qualification logs are warning-free. See evidence/modules1-native-arm-signed-final-20261005.json. Published repository metadata remains a separate gate.

Fedora ARM XML passes 3,758 cases and 171,685 assertions. Fedora ARM Python passes 30 cases and 270 assertions, and JNI passes 632 cases and 8,662 assertions; these bridge installed-package checks remain pending. Leap and AlmaLinux ARM XML each pass 3,784 cases and 177,812 assertions; their Python builds are enabled. Leap XML retains three catalog/metadata lint diagnostics for review. Leap gRPC revision 3 passes both native architectures, including source/runtime RPM lint with zero errors or warnings. It combines the two approved resolver paths in one architecture-correlated expression. Publication remains disabled for every package.

JNI native fixes and the latest Excel/ODS changes are committed. Release/Debug reference, exception and cleanup suites pass; strict documentation and the new checked-JNI headless regression pass. The latter corrects a static Java method that was incorrectly called through the instance JNI API during spreadsheet compilation. Source and AOT spreadsheet suites pass 782 assertions. Valgrind has no unclassified contexts or native losses; only the previously approved JVM/glibc and CPython origins remain. Evidence is in evidence/jni-native-final-qualification-20261002.json and evidence/jni-headless-merge-20261002.json. JNI canonical builds and installed runtime/SDK/artifact checks pass on all three targets from 33367ce. Every build and SDK run passes 37 suites (632 cases, 8,662 assertions); the minimal runtime passes 23 suites (478 cases, 4,336 assertions). All 22 AOT providers, debug symbols and sources, 195 JAR copies and 176 provenance records are verified. The OpenJDK 21 font-layout exception was accepted on 2026-10-03, with standalone Java controls retained in evidence/jni-awt-diagnostic-20261003.json. Final results are recorded in evidence/jni-rpm-final-20261003.json. Installed tests use an isolated bridge without external routing, supplying the hardware address required by Netty; the earlier loopback-only fixture warning is fixed. JNI is included in the local qualified-module count; OBS and native ARM checks remain separate.

The testing project's build configuration explicitly chooses CPU onnxruntime for qore-stdlib's ELF dependencies. Fedora provides those capabilities from several runtime, development, ROCm and Python packages; OBS otherwise refuses to choose. Verified buildinfo selects the CPU runtime with the revision 15 SDK. The project also maps /usr/bin/qore and the GEOS documentation index /usr/share/qore/tags/geos.tag to their owning packages and selects the qualified libgit2 development provider for each target. OBS omits repository file lists from dependency solving; these mappings follow its documented FileProvides and Prefer configuration rules: https://openbuildservice.org/help/manuals/obs-user-guide/cha-obs-prjconfig.

PROJ release 4 uses the literal GEOS documentation-index path in its spec. OBS does not expand %{_datadir} in this file dependency. All three local canonical builds and installed runtime/SDK checks pass; OBS revision 6 has verified matching sources. Installed Python interoperation now passes in both import orders in runtime and SDK images on all three targets; the full PROJ and GEOS suites and compiler smoke test pass in the same combined installations.

SSH, MySQL and tree-sitter now pass canonical builds and installed runtime/SDK checks against revision 15 on all three targets. SSH includes runnable installed documentation examples. Its confinement regression now owns both its allowed directory and the outside-root file, so it also works in OBS build roots that lack /etc/hostname. MySQL runs all 34 cases against an isolated MariaDB, allowing only the two approved fixture diagnostics. Final tree-sitter testing exposed a borrowed-tree lifetime bug; its fix retains trees for nodes/cursors, corrects copied-node source and cursor reset behavior, and adds ownership and concurrency regressions. All 99 cases / 371 assertions pass normally and under Valgrind on all three targets, with zero errors, losses or suppressions.

SSH2 and OpenLDAP now pass canonical builds and installed-runtime checks on all three distributions and are included in the qualified count. OpenLDAP also passes SDK/compiler and seven installed-reference checks. Each target runs all 86 LDAP cases / 501 assertions, SASL, CLI and verified StartTLS checks. Its Leap fixture exposed a distribution DIGEST-MD5 initialization crash; the committed plugin backport uses a private OpenSSL context and complete cleanup. Both its candidate and canonical RPM checks pass Valgrind with zero errors or lost allocations. The ten unchanged DES/3DES deprecation call sites retain their explicitly approved build-diagnostic exception. Native OBS builds of that dependency are enabled for Leap with publication disabled.

XML now passes canonical RPM builds and all 304 installed suites on all three targets, including 106 Litmus cases against Qore and installed WebDAV CLI checks. Its separate native Valgrind and strict-documentation evidence is retained. XML and XML Security are included in the thirty-one qualified local modules. XML Security passes canonical builds, installed runtime/SDK tests, documentation, and 13 native cases / 65 assertions under Valgrind on all three targets. Its parser options and errors are now isolated per document, including worker threads.

Python native qualification now covers Python 3.12, 3.13 and 3.14 on the three targets, plus free-threaded Python 3.14. The bridge fixes interpreter ownership, finalization, wrapper references and retained callable metadata. Each default interpreter passes 30 cases / 270 assertions in Release and Debug/Valgrind; standalone shutdown regressions also pass. Explicitly approved exceptions cover CPython shutdown retention, GCC bug 125913 and an independently reproduced 40-byte glibc loader allocation. Raw Valgrind diagnostics remain recorded; no invalid access or additional native leak is accepted. Canonical RPM builds and installed minimal-runtime/SDK tests now pass on all three targets, including strict documentation, the versioned CPython extension alias and compiler use. Python is included in the qualified count and uploaded to OBS with publication disabled. JNI/Python and native ARM qualification remain separate gates. See evidence/python-rpm-final-20261002.json, evidence/python-native-qualification-20261002.json and evidence/python-external-diagnostics-20261002.json.

FreeTDS packaging now passes canonical builds and installed runtime/SDK checks on all three targets. Its offline suite covers driver capabilities, invalid protocol and missing-username errors, and unopened-connection cleanup (four cases, fourteen assertions). Strict documentation and compiler checks also pass. OBS has verified the canonical sources with publication disabled. Live SQL Server/ASE behavior and proprietary Sybase OCS remain separate integration gates. See evidence/freetds-rpm-final-20261002.json.

Markdown packaging passes canonical builds and installed runtime/SDK checks on all three targets. Each run covers eight cases and 55 assertions, including 800 concurrent conversions; RPM checks also verify safe staged uninstall. Strict documentation and a compiled SDK consumer pass. Native Debug/Release and Valgrind checks pass with zero errors or lost allocations. The source archive excludes historical tracked build files and an editor swap file, and retains the verified Sundown/Houdini source and license notices. OBS has the verified canonical sources with publication disabled. See evidence/markdown-rpm-final-20261002.json.

JNI qualification exposed JDBC transaction, cursor-reference and batch-reuse bugs, plus inaccurate Flyway action output types. The fixes are committed and pass the module's Alpine and Ubuntu CI jobs. Targeted PostgreSQL, failure-injection and source/AOT Flyway tests pass; canonical RPM and installed checks pass on all three targets. The approved JVM/glibc diagnostics retain their raw Valgrind logs and standalone controls in evidence/jni-external-diagnostics-20261002.json. The corresponding Qore PostgreSQL native-array versus JDBC-batch correction is recorded in evidence/core-pgsql-bulk-protocols-20261002.json and is included in the canonical release-20 core RPMs.

gRPC packaging is committed and passes canonical builds and installed runtime/SDK checks on Fedora 44 and EL10. Each installation runs 13 suites and 1,768 assertions, including required Python gRPC and PyArrow Flight interoperation. Compiled consumers run without the SDK; AOT trailers, separate symbols and Qore debug sources are verified. The distribution grpc_tools deprecation retains its approved exception. OBS sources are verified with publication disabled. Leap now also passes the canonical Qore module build and installed runtime/SDK/artifact checks against candidate 14b of its repaired grpcio dependency. Each phase runs the same 13 suites and 1,768 assertions. The remaining local diagnostic scopes were accepted on 2026-10-04. Dependency commit 0e466c5 is uploaded as OBS revision 1; all 29 source payloads match the qualified candidate. Both Leap architecture builds pass 13 packaging tests and 102 upstream results (one upstream skip). Artifact review found that OBS's inherited release prefix prevents a normal upgrade from Leap's package. The corrected Leap policy preserves the spec release and appends the OBS build counter; Fedora and AlmaLinux retain their existing policies. The tested project configuration is now applied remotely. The four OBS GCC 13 reports were reproduced with exact sources and accepted after 60,000 ownership checks and 100,000 deep clones passed Valgrind. Certificate-store and resolver-lint packaging checks remain before the next build and installed qualification. Publication remains disabled. See evidence/grpc-rpm-final-20261002.json and evidence/grpc-leap-installed-20261003.json.

Leap's Python gRPC compiler fixture now passes a canonical RPM build and all nine upstream/generated-stub tests without warnings. Installed checks pass; the canonical compiler ELF is identical to the native Valgrind-qualified build. OBS revision 1 has verified sources with publication disabled. PyArrow Flight and its Compute/Acero/Dataset dependencies pass candidate qualification: 95 Arrow test groups, 17,527 Cython tests, and 6,616 PyArrow tests plus three API regressions. The upstream/compiler diagnostic exceptions were explicitly accepted on 2026-10-03. Canonical Arrow/PyArrow rebuilds and installed Qore interoperation now pass. The grpcio dependency has completed local compiler and installed-package review. Candidate 12 also fixes failed poll-worker initialization: the exact native fault-injection binary passes 100 failures and recovery cycles without memory or descriptor errors, and all nine installed native controls retain only approved external allocation sites. Both installed Qore runtime/SDK suites pass with this RPM. See evidence/grpcio-poll-init-20261003.json. Candidate 14b also passes all 13 packaging tests, 101 upstream tests (one skip) and both installed Qore bridge suites. Its stripped native extension is byte-identical to Valgrind-qualified candidate 13. SPDX metadata now includes all bundled-component notices and removes the license-classifier deprecation; source-manifest negative tests still reject stale binary files. Ten native compiler diagnostics, two Cython diagnostics and two manifest-message forms were explicitly accepted on 2026-10-04. The scope excludes new sites, growing allocations and native errors. See dependencies/grpcio.rst, evidence/grpcio-rpm-candidate14b-20261004.json and evidence/grpcio-remaining-diagnostics-20261004.json. Submission identity is in evidence/grpcio-obs-submission-20261004.json. See dependencies/arrow-flight.rst and evidence/grpcio-tools-rpm-final-20261003.json.

The Cython update supplies OBS's missing Python dependency generator and corrects the imported Cythonize module's executable mode. Its complete local suite passes (17,533 reported tests across eight workers, 49 skips), as do installed compiler positive/negative cases and ABI checks. Only the exact approved compiler-template classification rules are applied; unrelated lint errors remain visible. See evidence/cython-package-classification-20261003.json.

V8 canonical RPMs from 664eaf58 pass Fedora and AlmaLinux builds and installed runtime/SDK qualification. Each target completes 14 suites (138 executed cases, 10 explicit skips, 1,153 assertions), compiler and CLI consumers, AOT metadata, separate debug symbols/sources, and directory ownership. Eight source-only fault-injection cases are covered by the separate source-proxy run; two cases require the separately built HubSpot app catalogue. Seven native Valgrind regressions retain only the approved distribution Node/V8 diagnostics. The TypeScript experimental-API notice is explicitly accepted. See evidence/v8-rpm-final-20261003.json and evidence/v8-integration-20261003.json. Leap needs the libnode dependency; OBS revision 1 has verified source checksums and publication disabled. Fedora and AlmaLinux x86_64 OBS builds succeeded. Leap now also passes the canonical build and installed runtime/SDK checks, including five native Valgrind runs with only the approved conservative-GC diagnostic family and no unsuppressed lost allocations. The custom Node RPM passes 192 native cases and 5,249 reported JavaScript results (including upstream skips). Node compiler diagnostics and native ARM qualification remain open. See evidence/v8-leap-installed-20261003.json. The inspector frame-vector and uvwasi timestamp compiler diagnostics are explicitly accepted after standalone functional and Valgrind checks; the scope is recorded in evidence/node-compiler-controls-20261003.json. Other compiler diagnostic families remain separate release gates. The final local Node candidate also includes the tested Ada Unicode-conversion and SQLite length-overflow fixes. Its complete RPM check again passes all 192 native cases and 5,249 reported JavaScript results; four exact optimizer diagnostics remain pending approval. See evidence/node-rpm-candidate6-20261004.json. Installing this final Node RPM also passes the Leap SDK consumer, all 14 V8 suites (148 reported cases, 1,153 assertions), and five Valgrind controls. All 25 reported GC contexts match previously qualified sites; no unsuppressed lost allocations or additional file descriptors occur. See evidence/v8-node6-installed-20261004.json.

The NATS broker candidate now fixes lost shutdown events caused by closing cluster sockets with unread TCP input. All three distributions pass twenty race-detector repetitions of the affected cluster test and eleven socket regressions, plus three runs of nineteen existing shutdown/TLS/buffer tests. The consumer-election fixture also passes both storage modes on all targets. Candidate 17 exposed further asynchronous fixture assumptions. The next candidate observes consumer-signal, acknowledgement and account-route completion, and checks intentional slow-leaf closure using actual TCP sockets. Four affected/new top-level tests and six subtests pass 100 repetitions on each distribution with Go's race detector; three batch/NAK tests and eighteen subtests also pass twenty repetitions on each. All original state assertions remain. Candidate 18 exposed two further route-interest assumptions and the large-page transport limit. Route fixes pass all 480 top-level/subtest executions across the three targets, including exact success/conflict checks for concurrent publications. The paging failure is reproduced without the race detector: its soft default page budget can exceed the hard transport limit once headers are added. The fixture with explicit, separate limits passes 39 runs. The unchanged upstream default-budget behavior and this test exception were explicitly accepted on 2026-10-04; production defaults remain unchanged. See evidence/nats-routes-paging-20261004.json. Candidate 18 completed all test groups on all three targets, with roughly 9,500 top-level/subtest results per target, but each RPM check failed. The complete failure inventory is in evidence/nats-candidate18-review-20261004.json. The responder, legacy gateway and route-disconnect fixture corrections now pass 900 repeated cases across all targets under the race detector. Memory stream setup retains the original concurrency/timeouts and passes nine runs. Duplicate-route count review and another complete RPM qualification remain. See evidence/nats-account-gateway-20261004.json and evidence/nats-consumer-completion-20261004.json, evidence/nats-shutdown-drain-20261003.json and evidence/nats-no-interest-fixture-20261003.json.

ODBC 2.0.0 passes all six OBS native builds and local x86_64 installed runtime/SDK checks, including nullable arrays, empty buffers and binding-failure recovery. All 37 Qore cases (156 assertions), 12 native size-boundary cases and six fixture tests pass. Signed native ARM installation also passes on all three distributions in pipeline 59422, including minimal runtime, SDK, native failure recovery and all 28 compiled-array cases. Qualification logs and Leap package lint have no warnings or errors. Valgrind retains only the separately approved PCRE2 and unixODBC/libltdl diagnostics; distribution libraries are retained. Publication remains disabled. See evidence/odbc-array-qualification-20261005.json and evidence/odbc-native-arm-signed-final-20261005.json.

Combined installation exposes the designed ProviderIndexUtil source-selection diagnostic when msgpack is added. Its qualification diagnostic exception is explicitly approved and documented. The remaining modules, target matrix and release gates still need qualification.

The EL10 OBS path uses Fedora:EPEL:10.2 alongside AlmaLinux 10.2. The unversioned EPEL 10 path follows the leading CentOS Stream minor release; its newer OpenLDAP server requires a library version absent from AlmaLinux. When advancing the Enterprise Linux baseline, update this explicit minor-version path and requalify dependency resolution together.

The target matrix is Fedora 44, AlmaLinux 10 as the Enterprise Linux baseline, and openSUSE Leap 16.0, initially x86_64. aarch64 requires native qualification before publication. targets/ pins the base image digests. Build dependency images additionally need an exact installed-package inventory and immutable image ID, both captured by the local builder.

ONNX-enabled ML is required. The Qore spec enables both QORE_WITH_ONNXRUNTIME and QORE_REQUIRE_ONNXRUNTIME and checks the built ML capabilities before its tests. Fedora's ONNX Runtime 1.22.2 is a candidate for qualification; its availability alone does not qualify inference. EL and Leap dependency qualification remains separate. Both backports have passed seven CTest groups and installed SDK inference. Leap reports zero lost bytes; EL reproduces only the documented cpuinfo startup allocation described below. OBS has also built the Leap backport on x86_64 and aarch64. Qore integration remains a separate gate. No target may silently omit ONNX to produce an apparently successful package.

PDF packaging requires the pinned PDFium renderer and retains the private PoDoFo library with complete notices. PDFium revision 3 passes all 1,819 upstream tests on Fedora 44, AlmaLinux 10 and Leap 16.0, on both x86_64 and native aarch64. PDF module revision 2 passes all seven suites, 79 cases and 616 assertions on each of those six targets. Exact source revisions and build histories are recorded in evidence/pdfium-native-rev3-20261008.json and evidence/pdf-native-rev2-20261008.json.

Signed native ARM runtime and SDK installation checks pass on all three distributions, including mandatory rendering, both SDK consumers and PDFium Valgrind checks. Each installation phase passes the same 79 cases and 616 assertions. The jobs verify 15 Fedora, 22 Leap and 18 AlmaLinux package signatures against the pinned OBS project key. The first AlmaLinux attempt stopped before installation during a temporary OBS API outage; after the exact signing key was available again, the unchanged job passed on retry. Both attempts are retained. See evidence/pdf-native-installed-fedora-20261008.json, evidence/pdf-native-installed-leap-20261008.json, evidence/pdf-native-installed-el10-20261008.json and evidence/pdf-alma-installed-service-interruption-20261008.json.

OBS maintainers attributed the earlier Fedora dependency-fetch failure to a certificate change that stopped remote repository synchronization and reported it fixed. Both subsequent Fedora PDFium builds succeeded; the maintainer explanation and corroborating builds are recorded in evidence/obs-fedora-fetch-resolution-20261008.json. The later, brief API outage was a separate observed service interruption. Publication remains disabled. These module installation checks use the qualified core revision 21 baseline; the updated core, its exact AOT runtime dependencies, coinstallation and repository upgrade/removal qualification remain required.

Oracle now has canonical local RPM builds and offline runtime/SDK checks on all three distributions, including source/AOT extensions, compiler metadata, debug-source lookup, removal and reinstallation. All build diagnostics and source/runtime/doc lint are clean. Oracle's signed Instant Client 23 RPMs remain an external dependency. Only the open-source module sources are staged in OBS; builds and publication are disabled. An existing home-project client package does not confirm a hosting exception: OBS explicitly lists oracle-instantclient as not approved for normal hosting. A confirmed exception or separate permitted client route is required. Live Oracle server and native ARM qualification remain outstanding. See evidence/oracle-rpm-qualification-20261003.json and evidence/oracle-debugger-configuration-20261003.json.

Preparing and building

The orchestration tools and RPM helpers require Python 3.11 or newer.

Run the inexpensive orchestration tests before changing a source pin:

python3 -B -W error -m unittest discover -s tests -v
python3 tools/packaging.py order

Check package directory ownership in the matching target SDK before uploading to OBS. Supply the runtime, development, tools and documentation RPMs from one build together; their dependencies must be installed in that SDK:

python3 -B -W error tools/check-rpm-directories.py /rpms/runtime.rpm /rpms/tools.rpm

The command reports unowned parent directories per RPM and fails if any remain. It queries the target RPM database without installing or changing packages. Leave automatic debuginfo/debugsource RPMs to the separate debug-artifact gate, matching openSUSE's 50-check-filelist application-package scope. This check catches missing %dir entries such as a license directory's parent; dependency resolution, file verification and installed functionality have separate checks.

Prepare a source bundle from a committed revision:

python3 tools/packaging.py prepare --repo ../qore --ref COMMIT \
  --name qore --version 3.0.0~gitYYYYMMDD.SERIAL \
  --spec qore.spec-multi --output work/qore-source

The source archive, rendered spec and manifest are reproducible. The manifest contains the commit, timestamp and SHA-256 of each input. Working-tree changes and ignored build outputs are not read. --packaging-overlay can include spec files and rpm/ from a separate directory for pre-commit testing. Such bundles are explicitly marked candidate and must not be published. Archive permissions use a fixed Git tar.umask=0022 so a developer's local Git configuration cannot change the source bundle or make committed package files group-writable. Executable bits and safe symlink targets are retained.

Recipe identity and source declarations are checked in the RPM preamble. Metadata in descriptions or generated files, such as a pkg-config Version field in %install, is preserved without treating it as package metadata.

Prepare dependencies in a disposable target container, then save that container as a build image. Builds use only its installed dependencies:

python3 tools/build-local.py --source work/qore-source \
  --image BUILD_DEPENDENCY_IMAGE --output results/qore-build --jobs 2

The builder resolves the image to its immutable ID, verifies all source hashes, runs unprivileged with loopback-only networking by default, and records the command, installed RPMs, log, exit status and artifact hashes. Use a new output directory for each build. --source-only checks SRPM preparation without requiring the target SDK. Build images used for runtime tests must define the invoking UID/GID as a normal account, since Qore also tests system user lookup. Use --background for durable local builds that can outlive the launching terminal. It returns the driver PID, immutable image and output paths; the completed build.json records the exit status and artifact hashes. Use --keep-build when post-build diagnostics need native test binaries or compiler intermediates. This passes RPM's --noclean option and records the choice in build.json; normal compilation, tests and packaging still run. The retained tree can be large. The default lets RPM clean up normally. The real foreground/background retention and cleanup regression runs with:

python3 -B -W error tests/check_build_retention.py \
  --image BUILD_DEPENDENCY_IMAGE --output results/retention-probe

The container runs with --init so orphaned child processes are reaped. Running rpmbuild itself as PID 1 leaves zombies after interrupted process groups and makes the system/backquote cleanup tests fail.

Tests that measure free disk space can use --tmpfs-mib 4096 to give each build a private 4 GiB /tmp. Concurrent host builds then cannot change that test volume's capacity. The bound is recorded in build.json and applies in foreground and background modes. Files consume memory as they are written; choose a limit appropriate for the test workload. Execution is enabled for Go's temporary test binaries, with nosuid and nodev retained. The mount disappears with the container. Unit tests cover invalid sizes and both launch modes; the real mount and RPM check can be run with:

python3 -B -W error tests/check_tmpfs.py --image BUILD_DEPENDENCY_IMAGE \
  --output results/tmpfs-probe --background

For tests that enumerate non-loopback interfaces, Docker builds can use --internal-interface. Each build creates a private internal bridge with IPv4/IPv6 gateway mode isolated, verifies the effective configuration, and records its immutable ID and metadata. No ports are published and no default route or host bridge address is provided. The network is removed after success or failure. Unsupported engines or gateway modes fail rather than enabling external access. See Docker's gateway-mode documentation: https://docs.docker.com/engine/network/port-publishing/#gateway-modes.

Run the real container/RPM regression separately from the unit suite:

python3 -B -W error tests/check_internal_network.py \
  --image BUILD_DEPENDENCY_IMAGE --output results/internal-network-probe

The image needs Python 3 and the normal RPM build tools. The check exercises non-loopback bind/connect, rejects an external destination with ENETUNREACH, verifies the resulting RPM and confirms network cleanup. NATS's wildcard gateway and monitor-bind tests require this interface; their assertions remain unchanged.

Dependency sources and vendoring

A module's vendor manifest may describe a locally assembled component with generated_from instead of url. This maps repository paths to SHA-256 pins for its generator and input manifests. Preparation verifies those files against the selected commit (or explicit candidate overlay), requires the generated archive in the checksum-addressed cache, and verifies its hash and retained license files. It never downloads a missing generated component. This supports JNI's aggregate of pinned Java/Kotlin archives while preserving the original per-dependency URLs, sources and notices inside the component.

Leap's PDFium toolchain needs debugedit 5.1 for indexed DWARF in Clang runtime objects. The openSUSE backport preserves the distribution helper layout and passes 35 upstream tests, installed lint, hardlink/debug-index controls and Valgrind with no errors or lost allocations. Both executables use PIE. See evidence/debugedit-leap-20261003.json. The canonical local build passes; OBS revision 1 source files are verified with publication disabled.

dependencies/sources.json pins upstream dependency downloads. The nghttp2 backport preserves the client/server applications and their matching library; ngtcp2 preserves matching OpenSSL and GnuTLS providers. c-ares carries both Qore query lifecycle fixes. Its explicit RPM capability prevents an unpatched same-version system library from satisfying Qore's requirement accidentally.

Prepare a dependency from a committed packaging revision and a verified cache:

python3 tools/prepare-dependency.py --ref COMMIT --name ngtcp2 \
  --cache cache --output work/ngtcp2-source

Use --candidate instead of --ref to test uncommitted dependency packaging locally. Candidate manifests cannot be uploaded by the OBS tool. The source bundle includes all declared patches and auxiliary test sources; the same offline builder handles Qore, modules and dependency backports.

The c-ares timeout selection test uses its existing local mock fixture. Public-DNS Live tests are excluded from offline RPM builds and belong to connected qualification; mock DNS, parser and fuzz tests run during the build. The changed timeout test also runs under Valgrind.

Leap additionally needs MongoDB C 2.5.5 and Arrow/Parquet 25.0.1 SDKs. MongoDB builds its static libraries for upstream tests but installs only shared SDKs. Its test patch answers the driver's current reconnect-and-close behavior, checks the returned TLS error, classifies a default-server test as live, and registers static import checks only when those SDKs install. Local unit and mock tests remain enabled. Arrow uses system dependencies plus its pinned xsimd 14.2.0 archive and the exact upstream test-data submodules. Its upstream GH-50542 patch preserves a portable baseline with runtime CPU dispatch.

EL and Leap use ONNX Runtime 1.22.2 with pinned, hash-verified offline component archives. CPU inference and the upstream unit suite stay enabled. The test conversion patch backports upstream 15c255499f65 for GCC's packet-bounds diagnostic on small buffers; it changes test utilities only. The separate Softsign patch carries reviewed upstream PR 32222 (not yet merged), correcting reciprocal underflow on EL10's x86-64-v3 baseline. Its existing extreme-value regression stays enabled. Upstream f7619dc9 supplies the explicit integer-type include needed by GCC 15. Backport build and memory-check results are recorded separately from Qore ML qualification.

The user approved a documented exception on 2026-10-01 for bundled cpuinfo's 512-byte process-startup allocation in the EL LTO build. A zero-test baseline has the same allocation; all 32 affected tests pass with no additional memory errors. Upstream reverted its cleanup because it broke thread safety (pytorch/cpuinfo#411). This exception does not waive Qore's ONNX inference checks or suppress other memory errors.

Recipes clamp file timestamps and RPM build headers to SOURCE_DATE_EPOCH. RPM 4.20 and newer use build_mtime_policy; older RPM uses the corresponding legacy clamp macro. The real RPM integration test checks both header and file timestamps on each target.

Vendor components must retain their license texts and use verified source archives. The ZIP pilot uses the pin and exclusions recorded in its Debian vendor manifest; it never populates minizip-ng from a developer checkout. Each RPM vendor manifest lists the exact archive root, SHA-256, output name, retained license files, and optional exclusions. Read it from the same committed revision as the module and use a checksum-addressed download cache:

python3 tools/packaging.py prepare --repo ../module-zip --ref COMMIT \
  --name qore-zip-module --version 1.0.0 --spec qore-zip-module.spec \
  --vendor-manifest rpm/vendor-sources.json --cache cache \
  --output work/zip-source

All vendor inputs are checked before the completed source bundle is exposed. Missing licenses, corrupt downloads, unsafe paths, and filename collisions fail preparation. The manifest records both original and repacked hashes. Every declared Source and Patch must be present; preparation, local builds and OBS uploads all enforce completeness before exposing output or making changes. See design/source-bundles.rst for the supported recipe syntax.

Oracle client redistribution and the PDFium, JNI, XML, tree-sitter and ZMQ source components each require their own reviewed source manifest.

Qualification and publication

Qore and its modules are being qualified with source preparation, binary builds, installed runtime and SDK use, module dependencies, AOT metadata after RPM stripping, separate debug symbols, and module feature/CLI interoperability. Qore's installed runtime test performs actual ONNX inference and session-pool inference; its SDK test compiles both C++ embedding and standalone/module AOT programs outside the source checkout.

Before promoting a target, also check clean installation and removal, upgrades from previous packages, dependency closure, reproducibility, RPM policy/lint, and signed repository metadata. Qore's existing ABI release qualification is a separate prerequisite for stable promotion. Preserve normal debug package generation; the Qore helper wraps the distro post-install pipeline and restores the QAMD/QPCM/QAOM trailers that strip/objcopy discard.

obs/project-testing.xml and obs/project-stable.xml target subprojects under home:davidnichols. They start with builds and publication disabled; enable only prepared package/target combinations after their prerequisites are available. This leaves the existing home project's older repositories intact. Both subprojects were created on 2026-10-01. OBS returned HTTP 500 after each creation, but authenticated metadata reads and backend result queries confirmed all six repository/architecture combinations and the disabled flags. The write errors are recorded in the qualification evidence; do not blindly repeat a failed remote mutation without checking the resulting state first. OBS manages separate RSA-4096 signing keys for these projects. Both public keys are stored under obs/keys and import successfully on all three target distributions. Verify the relevant fingerprint before enabling a repository:

  • testing: 3C3E 3E9E 0EAD DE7C 47E4 9C54 9960 899F 10DF 018C
  • stable: C173 403E E2D8 FB52 D61A 6D77 243F A61D 0D37 0E2E

Committed dependency sources are uploaded with verified remote checksums. Their package metadata enables only the target repositories requiring each backport, including native aarch64 builds; publication remains disabled. evidence/obs-dependency-sources-20261001.json records each upload and enable operation. Module builds remain disabled until their SDK is available.

The parent home project's existing key is unchanged.

Credentials stay in the user's osc configuration/keyring. Never put passwords, API tokens, private signing keys, or webhook trigger tokens in this repository. Packaging-only source commits use [skip ci]. Runtime or build-system fixes that affect existing CI are separate commits and run normal CI. Do not force push when synchronizing GitHub and GitLab.

This repository's GitLab job runs only the lightweight Python tooling tests when tooling, tests or CI configuration changes. Spec-only and documentation changes do not launch that job. Distribution package builds and installation checks are separate qualification steps; a tooling pipeline does not replace them.

Native installed RPM qualification

The GitLab jobs rpm-fedora-arm64, rpm-leap-arm64 and rpm-el10-arm64 run only when a pipeline is explicitly started with RPM_NATIVE_QUALIFICATION=core21. Set RPM_NATIVE_TARGET to fedora, leap or el10 to select one target. They use native ARM runners and pinned distribution images. Their manifests pin each OBS binary and core test fixture by SHA-256; no OBS credentials or published repository are needed. Package installation in these disposable containers verifies the pinned, unpublished testing RPMs with the SHA-256 pinned OBS public signing key. Every RPM must have a valid signature; intact digests alone are insufficient. Package-manager signature checks stay enabled. Signed repository metadata and public release qualification remain separate gates.

tools/qualify-installed.py verifies every artifact before installation, checks the runner architecture, installs the minimal runtime without weak optional dependencies, verifies RPM payloads, and runs ONNX and module tests as an unprivileged user. It then adds the SDK and exercises CMake, pkg-config, qcc, metadata extraction, utilities and debugger startup. Logs and package inventories are retained as CI artifacts. On Leap, a temporary zypp configuration installs complete documentation payloads so LLVM alternatives can register their manual pages; the base image's system configuration stays unchanged. Never run this installation tool on a workstation; use a fresh disposable distribution container.

For the first external-module wave, start a pipeline with RPM_NATIVE_QUALIFICATION=modules1 (and optionally RPM_NATIVE_TARGET). The rpm-modules-*-arm64 jobs use the same qualified core and add SHA-256 pinned UUID and process RPMs. Fixture inventories are complete and bound to each module's immutable Git revision. Both runtime and SDK phases run the UUID and process functional suites with debugging enabled; the SDK also runs each module's qcc smoke test and all 13 process PID-state fault-injection cases. Those injected cases compile a C fixture and therefore run only after the SDK is installed. Download verification completes before any package installation. The runner rejects unknown suites, duplicate or missing fixtures, crossed repository revisions, unsafe paths and missing runtime packages. The existing core ONNX inference and SDK tests still run in these combined installations.

Start RPM_NATIVE_QUALIFICATION=odbc for the signed ODBC ARM installation jobs (optionally selecting RPM_NATIVE_TARGET). The runtime runs all 36 ODBC cases against a private Unix-socket PostgreSQL cluster without development headers or compilers. After SDK installation, the runner also verifies native binding-failure recovery and 12 buffer-size boundaries, then compiles and runs all 28 nullable-array cases. Eleven fixture files are pinned to the same module commit; no workstation build directory enters the fixture. The core ONNX and SDK checks remain enabled. See evidence/odbc-native-runner-20261005.json.

Release 21 native ARM evidence is recorded in evidence/core21-native-arm-installed-20261003.json. Fedora 44, Leap 16 and AlmaLinux 10 all passed the 400 OBS suites and installed runtime/SDK qualification, including ONNX inference. Combined-module and repository release gates remain pending; OBS testing publication remains disabled.

About

Reproducible RPM source preparation, qualification, and OBS repositories for Qore and its modules

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages