mkosi: Add hyperscale profile (#39329)

In the CentOS Hyperscale SIG, we maintain a backport of systemd with
its own rpm spec forked from rawhide.

Let's make it easy to build upstream rpms using the Hyperscale spec
by adding a mkosi hyperscale profile.
This commit is contained in:
Daan De Meyer
2025-11-25 13:50:45 +01:00
committed by GitHub
23 changed files with 101 additions and 43 deletions

View File

@@ -25,7 +25,7 @@ jobs:
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: systemd/mkosi@d45142e329550abc9c6fc63c1f1f86e5286d3d67
- uses: systemd/mkosi@10544812b35a668d4aac9834c78ee8166e99bc78
# Freeing up disk space with rm -rf can take multiple minutes. Since we don't need the extra free space
# immediately, we remove the files in the background. However, we first move them to a different location

View File

@@ -38,7 +38,7 @@ jobs:
LINTER_RULES_PATH: .github/linters
GITHUB_ACTIONS_CONFIG_FILE: actionlint.yml
- uses: systemd/mkosi@d45142e329550abc9c6fc63c1f1f86e5286d3d67
- uses: systemd/mkosi@10544812b35a668d4aac9834c78ee8166e99bc78
- name: Check that tabs are not used in Python code
run: sh -c '! git grep -P "\\t" -- src/core/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py'

View File

@@ -167,7 +167,7 @@ jobs:
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: systemd/mkosi@d45142e329550abc9c6fc63c1f1f86e5286d3d67
- uses: systemd/mkosi@10544812b35a668d4aac9834c78ee8166e99bc78
# Freeing up disk space with rm -rf can take multiple minutes. Since we don't need the extra free space
# immediately, we remove the files in the background. However, we first move them to a different location

View File

@@ -19,7 +19,7 @@ actions:
post-upstream-clone:
# Use the Fedora Rawhide specfile
- git clone https://src.fedoraproject.org/rpms/systemd .packit_rpm
- bash -c 'git -C .packit_rpm checkout "$(grep GIT_COMMIT= mkosi/mkosi.conf.d/centos-fedora/mkosi.conf.d/pkgenv.conf | cut -d= -f2)"'
- bash -c 'git -C .packit_rpm checkout "$(grep GIT_COMMIT= mkosi/mkosi.pkgenv/mkosi.conf.d/centos-fedora.conf | cut -d= -f2)"'
- bash -c 'echo "%bcond upstream 1" > .packit_rpm/systemd.spec.new'
- bash -c 'echo "%define meson_extra_configure_options --werror" >> .packit_rpm/systemd.spec.new'
- bash -c 'cat .packit_rpm/systemd.spec >> .packit_rpm/systemd.spec.new'

View File

@@ -1,7 +1,7 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Config]
MinimumVersion=commit:d45142e329550abc9c6fc63c1f1f86e5286d3d67
MinimumVersion=commit:10544812b35a668d4aac9834c78ee8166e99bc78
Dependencies=
exitrd
initrd
@@ -156,3 +156,4 @@ KVM=yes
[Include]
Include=%D/mkosi/mkosi.sanitizers
%D/mkosi/mkosi.coverage
%D/mkosi/mkosi.pkgenv

View File

@@ -1,5 +1,8 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Include]
Include=%D/mkosi/mkosi.pkgenv
[Content]
Packages=
clang

View File

@@ -3,9 +3,6 @@
[Match]
Distribution=arch
[Include]
Include=%D/mkosi/mkosi.conf.d/arch/mkosi.conf.d/pkgenv.conf
[Content]
Packages=
base

View File

@@ -4,9 +4,6 @@
Distribution=|centos
Distribution=|fedora
[Include]
Include=%D/mkosi/mkosi.conf.d/centos-fedora/mkosi.conf.d/pkgenv.conf
[Content]
Packages=
clang-devel

View File

@@ -4,9 +4,6 @@
Distribution=|debian
Distribution=|ubuntu
[Include]
Include=%D/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.conf.d/pkgenv.conf
[Content]
Packages=
apt

View File

@@ -3,9 +3,6 @@
[Match]
Distribution=opensuse
[Include]
Include=%D/mkosi/mkosi.conf.d/opensuse/mkosi.conf.d/pkgenv.conf
[Content]
Packages=
clang

View File

@@ -1,5 +1,8 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Match]
Distribution=arch
[Build]
Environment=
GIT_URL=https://gitlab.archlinux.org/archlinux/packaging/packages/systemd.git

View File

@@ -1,5 +1,10 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Match]
Distribution=|fedora
Distribution=|centos
Profiles=!hyperscale
[Build]
Environment=
GIT_URL=https://src.fedoraproject.org/rpms/systemd.git

View File

@@ -1,5 +1,9 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Match]
Distribution=|debian
Distribution=|ubuntu
[Build]
Environment=
GIT_URL=https://salsa.debian.org/systemd-team/systemd.git

View File

@@ -0,0 +1,14 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Match]
Profiles=hyperscale
[Assert]
Distribution=centos
[Build]
Environment=
GIT_URL=https://gitlab.com/CentOS/Hyperscale/rpms/systemd.git
GIT_BRANCH=c10s-sig-hyperscale
GIT_COMMIT=417b671b173ea6271c00a3c605215b5f68795a3a
PKG_SUBDIR=hyperscale

View File

@@ -1,5 +1,8 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Match]
Distribution=opensuse
[Build]
Environment=
GIT_URL=https://github.com/bmwiedemann/openSUSE

View File

@@ -0,0 +1,7 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Match]
Distribution=centos
[Distribution]
Repositories=hyperscale-packages-main

View File

@@ -1,5 +1,8 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Include]
Include=%D/mkosi/mkosi.pkgenv
[Content]
SyncScripts=%D/mkosi/mkosi.sync
Packages=

View File

@@ -3,9 +3,6 @@
[Match]
Distribution=arch
[Include]
Include=%D/mkosi/mkosi.conf.d/arch/mkosi.conf.d/pkgenv.conf
[Content]
PrepareScripts=%D/mkosi/mkosi.images/build/mkosi.conf.d/arch/mkosi.prepare
Packages=

View File

@@ -4,9 +4,6 @@
Distribution=|fedora
Distribution=|centos
[Include]
Include=%D/mkosi/mkosi.conf.d/centos-fedora/mkosi.conf.d/pkgenv.conf
[Content]
PrepareScripts=%D/mkosi/mkosi.images/build/mkosi.conf.d/centos-fedora/mkosi.prepare
Packages=

View File

@@ -4,9 +4,6 @@
Distribution=|debian
Distribution=|ubuntu
[Include]
Include=%D/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.conf.d/pkgenv.conf
[Content]
PrepareScripts=%D/mkosi/mkosi.images/build/mkosi.conf.d/debian-ubuntu/mkosi.prepare
Packages=

View File

@@ -3,9 +3,6 @@
[Match]
Distribution=opensuse
[Include]
Include=%D/mkosi/mkosi.conf.d/opensuse/mkosi.conf.d/pkgenv.conf
[Content]
PrepareScripts=%D/mkosi/mkosi.images/build/mkosi.conf.d/opensuse/mkosi.prepare
Packages=

View File

@@ -0,0 +1,34 @@
Types: deb
URIs: https://ppa.launchpadcontent.net/enr0n/qemu/ubuntu/
Suites: noble
Components: main
Signed-By:
-----BEGIN PGP PUBLIC KEY BLOCK-----
.
mQINBGH5cH0BEADThqBQWZiPv6UdXe5FkAH6ju24sO6eYzUlVWkpJZcMjr3WBgIN
I69C2OHhwZDB3NkScPZejl1cSiMNkXN64B0lAxsahL1DxlSNkKP3mdbiuyslG89b
2fyhnIq8wLb7b7taZs8bE++CHjaua16qdlgUrbq37waOoA/UO8DiudP8L//qRWwj
j8RuELkDiUU+dwuJnJp3v3hsaDCl9PeUYnmFyfNtfh6xFQgCkZyQQaSnnfl1Ba89
V0uQ0D4LuW2e0uMSXhkG774X9kJX2vg5gMR5RWwaftMQh2Fxt6mqe00dPl+SMp95
9hpNc2ZL/VTwq/TPL+P4FU1/n/6R7fnkyh7zDw++VCn5s2Lqq/uV/mheiFbDNdsp
YYPoF4S+2iMYHMlqpmPQF4obSSr066Hq74WsuJM+fntYcgnK/Sjwt6CYcdmq+AvC
x3ZFJgsxYJPBLtPyqPmqBfBVH5F5vBiJibJq+5Ny9HVYWIcQuMwa02RcJbMdFG2/
If9TVQYysvdR3TKjk4gVmfS76dBrR1lZjbWx3Ynz5lMqfYnesbocZbrd5LFvXdRl
1uUmbLkUdyII11ZfgXveycFKnRXYUgmnj3NRI5IlYKqH5iPBd/iHneeI2l2e/NVN
6YPcC17dQVhWUKM3D5XdkjZBUFnTyf7QlqUiRnu3eomzcPypDsilMTqJXQARAQAB
tB9MYXVuY2hwYWQgUFBBIGZvciBOaWNrIFJvc2Jyb29riQJOBBMBCgA4FiEEwH5l
MEnRbPBOQRqIJhaTwJngVOUFAmH5cH0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
F4AACgkQJhaTwJngVOXjtxAAxhrizeyhu3hPDqgmk4qtenEEYcLtJGdMq8DXTQZu
vKAZ7OvQiyZw456oRUHSe5gyT2tFWDz/DxJ7VU9657WupO9a2YmUlbYpoYK/npA0
6+307KssyK7g6DU63mugqjKvTKhJK3hSganYEyovhJsZUlXwPcJ4szUH5BiR0nQh
f1mKIWD9ktSd2Eywp8PtDyraX1I7h6H8OrMwPSXxKlk5BtrhLg5xh7FJOVLFw9vT
xqCziywxi3mJgGEOLZPUs13l24wiHmQpP1eG/LadPsE0Lkqurzj/eyKHjziqynz+
MTpOr7IhvUhXqnMmxNzJF76e16e5MoxEekAelagF2KzXtnmHRLWqkjU/k2cbeU5n
/T+g+eVKH5ALCRMgYS5ZFsDYD5KivGeEE6BypyTqpqge3BN8rZJs3uRji/IPRhA8
N6t030lB5z2WldBADRZB0w61Uz7v6aTr4zjafjygIvVWcgRj0plsndwYwEIddw1v
ut6ZO9XudWiNExawuyAMSTbQh3xhfltWFRIuOp6taQRqP0hPzjbyeaDBz3JXM2gj
rKS2lh3HVnEBtRKurk8+/fUXjY9zTu1xzA0AslMX3WecAexECd9QRI3U+M6ak8GJ
O8vcL5svM8nqDb7z6DWeBU6+Ejtn3fJ13oit9+fN+NQUUkHCaWMUuI6yVkgLWymb
I/U=
=JGzV
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -31,10 +31,13 @@ def parse_args():
action='store_true',
default=False,
)
p.add_argument('--profile')
return p.parse_args()
def read_config(distro: str):
cmd = ['mkosi', '--json', '-d', distro, 'summary']
if args.profile:
cmd += ['--profile', args.profile]
print(f"+ {shlex.join(cmd)}")
text = subprocess.check_output(cmd, text=True)
@@ -53,14 +56,15 @@ def commit_file(distro: str, files: list[Path], commit: str, changes: str):
subprocess.check_call(cmd)
def checkout_distro(args, distro: str, config: dict):
dest = Path(f'pkg/{distro}')
if dest.exists():
print(f'{dest} already exists.')
return
url = config['Environment']['GIT_URL']
branch = config['Environment']['GIT_BRANCH']
subdir = config['Environment'].get('GIT_SUBDIR')
pkg_subdir = config['Environment']['PKG_SUBDIR']
dest = Path(f'pkg/{pkg_subdir}')
if dest.exists():
print(f'{dest} already exists.')
return
# Do not checkout the full sources if the package is in a subdirectory,
# a sparse checkout will be done after
@@ -81,12 +85,12 @@ def checkout_distro(args, distro: str, config: dict):
# Sparse checkout if the package is in a subdirectory
if subdir is not None:
cmd = ['git', '-C', f'pkg/{distro}', 'sparse-checkout', 'set',
cmd = ['git', '-C', f'pkg/{pkg_subdir}', 'sparse-checkout', 'set',
'--no-cone', f'{subdir}']
print(f"+ {shlex.join(cmd)}")
subprocess.check_call(cmd)
cmd = ['git', '-C', f'pkg/{distro}', 'checkout', 'HEAD']
cmd = ['git', '-C', f'pkg/{pkg_subdir}', 'checkout', 'HEAD']
print(f"+ {shlex.join(cmd)}")
subprocess.check_call(cmd)
@@ -96,18 +100,19 @@ def update_distro(args, distro: str, config: dict):
branch = config['Environment']['GIT_BRANCH']
subdir = config['Environment'].get('GIT_SUBDIR')
old_commit = config['Environment']['GIT_COMMIT']
pkg_subdir = config['Environment']['PKG_SUBDIR']
if args.fetch:
cmd = ['git', '-C', f'pkg/{distro}', 'fetch', 'origin', '-v',
cmd = ['git', '-C', f'pkg/{pkg_subdir}', 'fetch', 'origin', '-v',
f'{branch}:remotes/origin/{branch}']
print(f"+ {shlex.join(cmd)}")
subprocess.check_call(cmd)
cmd = ['git', '-C', f'pkg/{distro}', 'switch', branch]
cmd = ['git', '-C', f'pkg/{pkg_subdir}', 'switch', branch]
print(f"+ {shlex.join(cmd)}")
subprocess.check_call(cmd)
cmd = ['git', '-C', f'pkg/{distro}', 'log', '-n1', '--format=%H',
cmd = ['git', '-C', f'pkg/{pkg_subdir}', 'log', '-n1', '--format=%H',
f'refs/remotes/origin/{branch}']
if subdir is not None:
cmd += [f'{subdir}']
@@ -115,10 +120,10 @@ def update_distro(args, distro: str, config: dict):
new_commit = subprocess.check_output(cmd, text=True).strip()
if old_commit == new_commit:
print(f'{distro}: commit {new_commit!s} is still fresh')
print(f'{pkg_subdir}: commit {new_commit!s} is still fresh')
return
cmd = ['git', '-C', f'pkg/{distro}', 'log', '--graph', '--first-parent',
cmd = ['git', '-C', f'pkg/{pkg_subdir}', 'log', '--graph', '--first-parent',
'--pretty=oneline', '--no-decorate', '--abbrev-commit', '--abbrev=10',
f'{old_commit}..{new_commit}']
if subdir is not None:
@@ -126,8 +131,8 @@ def update_distro(args, distro: str, config: dict):
print(f"+ {shlex.join(cmd)}")
changes = subprocess.check_output(cmd, text=True).strip()
conf_dir = Path('mkosi/mkosi.conf.d')
files = conf_dir.glob('**/pkgenv.conf')
conf_dir = Path('mkosi/mkosi.pkgenv/mkosi.conf.d')
files = conf_dir.glob('*.conf')
for file in files:
s = file.read_text()
if old_commit in s: