# build_configs Per-package build overrides for [AlmaLinux Build System (ALBS)](https://build.almalinux.org). This repository contains a single file `build_configs.json` that defines per-package build parameters. ## Format ```json { "package_name": { "branch_pattern": { "secure_boot": true, "platform_flavors": ["flavor-name"], "linked_builds": [123], "mock_options": { "definitions": {"key": "value"}, "module_enable": ["module:stream"], "yum_exclude": ["package-name"], "with": ["option"], "without": ["option"], "target_arch": "noarch" } } } } ``` The top-level key is the **source package name** (as in the SRPM filename, e.g. `kernel`, `dotnet8.0`, `gcc-toolset-14-gcc`). Each package maps one or more **branch patterns** to an overrides object. Patterns use [fnmatch](https://docs.python.org/3/library/fnmatch.html) syntax and are matched against the `build_configs_branch` field in the product's `albs_config` (e.g. `almalinux-epel-10`, `kitten-epel-10`) or the `git_branch` for git-based builds. When multiple patterns match, the most specific one wins (more literal characters = higher priority). ## Field Reference ### Per-build parameters These affect the entire ALBS build. If packages in the same batch have different values for these, they are automatically split into separate ALBS builds. | Field | Type | Default | Description | |-------|------|---------|-------------| | `secure_boot` | `bool` | `false` | Enable SecureBoot signing for the build | | `platform_flavors` | `list[str]` | `[]` | Additional platform flavors (appended to the product's base flavors) | | `linked_builds` | `list[int]` | `[]` | ALBS build IDs to link (appended to product-level linked_builds) | ### Per-task parameters (mock_options) These are applied per-package within a single ALBS build. Different mock_options do **not** require separate builds. | Field | Type | Default | Description | |-------|------|---------|-------------| | `mock_options.definitions` | `dict[str, str]` | `{}` | RPM macro definitions (merged with product-level definitions; package values win on conflict) | | `mock_options.module_enable` | `list[str]` | `[]` | DNF module streams to enable in the chroot (format: `module:stream`) | | `mock_options.yum_exclude` | `list[str]` | `[]` | Packages to exclude from the mock chroot | | `mock_options.with` | `list[str]` | `[]` | `--with` conditional build options | | `mock_options.without` | `list[str]` | `[]` | `--without` conditional build options | | `mock_options.target_arch` | `str` | `""` | Override the RPM build target arch for this package (mock `--target=`). Useful for packages whose SRPM must always produce a fixed arch — e.g. `"noarch"` for Java packages like `maven`. Empty string = no override. Applied per-task; does not split the build. | ## Branch Patterns Patterns use fnmatch syntax. Common conventions: | Pattern | Matches | Use case | |---------|---------|----------| | `a*` | `a8`, `a9`, `a10`, `almalinux-epel-10` | AlmaLinux branches | | `c*` | `c8`, `c8s`, `c9s`, `c10s` | CentOS Stream branches | | `c8` | `c8` only | Exact CentOS 8 branch | | `*` | Everything | Catch-all for all branches | | `*portable*` | `a10-portable`, `c10s-portable` | Portable builds | | `almalinux-epel-10` | `almalinux-epel-10` only | Exact EPEL for AlmaLinux 10 | | `kitten-epel-10` | `kitten-epel-10` only | Exact EPEL for AlmaLinux Kitten 10 | When multiple patterns match, specificity is determined by the number of literal (non-wildcard) characters. For example, `*portable*` beats `*` because it has more literal content. ## Examples ### SecureBoot signing ```json { "kernel": { "a*": { "secure_boot": true } }, "grub2": { "a*": { "secure_boot": true } } } ``` Kernel and grub2 will have `is_secure_boot: true` in ALBS builds for all AlmaLinux branches. ### Platform flavors (dotnet) ```json { "dotnet8.0": { "c*": { "platform_flavors": ["dotnet-build"] } } } ``` dotnet8.0 builds for CentOS Stream branches will include the `dotnet-build` flavor (appended to the product's base flavors). ### RPM macro definitions (gcc-toolset) ```json { "gcc-toolset-14-gcc": { "c*": { "mock_options": { "definitions": { "scl": "gcc-toolset-14" } } } } } ``` The `%scl` macro will be set to `gcc-toolset-14` in the mock chroot. This is merged with any product-level definitions (e.g. `epel: 10`). ### Module dependencies ```json { "sssd": { "c8": { "mock_options": { "module_enable": ["idm:DL1"] } }, "a8": { "mock_options": { "module_enable": ["idm:DL1"] } } } } ``` sssd on EL8 branches requires the `idm:DL1` module stream enabled in the build chroot. ### SecureBoot + custom definitions ```json { "nvidia-open-kmod": { "a*": { "secure_boot": true, "mock_options": { "definitions": { "modsign_os": "almalinux-nvidia-signing" } } } } } ``` nvidia-open-kmod gets both SecureBoot signing and a custom signing identity macro. ### Per-package build target (mock `--target`) ```json { "maven": { "*": { "mock_options": { "target_arch": "noarch" } } } } ``` ### Portable builds (disable %check) ```json { "java-21-openjdk": { "*": { "platform_flavors": ["java-portable"] }, "*portable*": { "mock_options": { "definitions": { "__spec_check_template": "exit 0;" } } } } } ``` All java-21-openjdk builds get the `java-portable` flavor. Portable branch builds additionally skip `%check` via a mock definition override. The `*portable*` pattern is more specific than `*` and takes priority for portable branches. ## How It Works 1. `releng-monitoring` fetches this file periodically (every 30 minutes) 2. When creating ALBS builds, it looks up each package name and matches against branch patterns 3. Per-build overrides (`secure_boot`, `platform_flavors`) determine build grouping — packages with different per-build params go into separate ALBS builds 4. Per-task overrides (`mock_options`) are applied individually to each package's task within a build 5. Product-level `albs_config` (from `repositories.yaml`) is always the base layer; this file acts as an overlay ## Adding a New Package 1. Add a new top-level key with the source package name 2. Add one or more branch patterns with the desired overrides 3. Commit and push — changes take effect within 30 minutes (next refresh cycle) ```json { "my-package": { "a*": { "mock_options": { "definitions": { "my_macro": "value" } } } } } ```