@@ -14,10 +14,13 @@ without = [
1414
1515[components .kernel .build .defines ]
1616# RPM release number for the Azure Linux kernel package
17- azl_pkgrelease = " 1 "
17+ azl_pkgrelease = " 2 "
1818# 4th version component from the AZL kernel source (6.18.29.1). Included in specrelease so it appears
19- # in the RPM Release tag, uname -r, and /lib/modules/ path (e.g. 6.18.29-1.1 .azl4.aarch64).
19+ # in the RPM Release tag, uname -r, and /lib/modules/ path (e.g. 6.18.29-1.2 .azl4.aarch64).
2020kextraversion = " 1"
21+ # NVIDIA open GPU kernel module version (built as a subpackage of the kernel)
22+ nvidia_open_version = " 595.58.03"
23+ nvidia_open_branch = " 595"
2124
2225# Download the source tarball from the AzureLinux kernel repo
2326[[components .kernel .source-files ]]
@@ -26,6 +29,13 @@ hash = "9c71dec3ea3897107c176c89014134ab31aba0c3a669af549993e1134cf2896c7d6f6b75
2629hash-type = " SHA512"
2730origin = { type = " download" , uri = " https://github.com/microsoft/CBL-Mariner-Linux-Kernel/archive/rolling-lts/azl4/6.18.29.1.tar.gz" }
2831
32+ # Download the NVIDIA open GPU kernel module source tarball
33+ [[components .kernel .source-files ]]
34+ filename = " open-gpu-kernel-modules-595.58.03.tar.gz"
35+ hash = " e0c4659ddf15e4f4e19cee05b49f88c9ba08ef3add0dfe08249798f58d0fe75e"
36+ hash-type = " SHA256"
37+ origin = { type = " download" , uri = " https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/595.58.03.tar.gz" }
38+
2939# Insert version and release information from the component defines into the spec file, and update the source URL to match the AzureLinux kernel source structure
3040[[components .kernel .overlays ]]
3141description = " Set specrpmversion to 6.18.29"
@@ -164,3 +174,169 @@ lines = [
164174 " cd ../.." ,
165175 " %endif" ,
166176]
177+
178+ # ============================================================================
179+ # kmod subpackage framework — modular kmod builds alongside the kernel
180+ #
181+ # This framework allows building out-of-tree kernel modules as subpackages of
182+ # the kernel RPM. Each kmod is defined in its own .inc file (e.g.
183+ # kmod-nvidia-open.inc) with phase-gated sections that run at each RPM build
184+ # phase (%description, %prep, %build, %install, %files).
185+ #
186+ # To add a new kmod:
187+ # 1. Create kmod-<name>.inc with phase-gated sections
188+ # 2. Add file-add overlays for .inc and any extra source files
189+ # 3. Add spec-insert-tag overlays to register sources (Source6xxx range)
190+ # 4. Add spec-search-replace overlays targeting the AZL-KMOD-*-ANCHOR
191+ # sentinels for each phase (the anchor survives replacement so the
192+ # next kmod can chain onto it)
193+ # ============================================================================
194+
195+ # --- kmod-nvidia-open: source file registration ---
196+ # Registers the NVIDIA open GPU kernel module sources and configuration files.
197+ # Source numbers 6000-6099 are reserved for nvidia-open.
198+
199+ [[components .kernel .overlays ]]
200+ description = " Add kmod-nvidia-open.inc subpackage definition to sources"
201+ type = " file-add"
202+ file = " kmod-nvidia-open.inc"
203+ source = " kmod-nvidia-open.inc"
204+
205+ [[components .kernel .overlays ]]
206+ description = " Add NVIDIA modprobe config file for kmod-nvidia-open subpackage"
207+ type = " file-add"
208+ file = " kmod-nvidia-open-modprobe.conf"
209+ source = " kmod-nvidia-open-modprobe.conf"
210+
211+ [[components .kernel .overlays ]]
212+ description = " Register NVIDIA open-gpu-kernel-modules tarball as Source6000"
213+ type = " spec-insert-tag"
214+ tag = " Source6000"
215+ value = " open-gpu-kernel-modules-%{nvidia_open_version}.tar.gz"
216+
217+ [[components .kernel .overlays ]]
218+ description = " Register NVIDIA modprobe config as Source6001"
219+ type = " spec-insert-tag"
220+ tag = " Source6001"
221+ value = " kmod-nvidia-open-modprobe.conf"
222+
223+ [[components .kernel .overlays ]]
224+ description = " Register kmod-nvidia-open.inc as Source6002"
225+ type = " spec-insert-tag"
226+ tag = " Source6002"
227+ value = " kmod-nvidia-open.inc"
228+
229+ # --- kmod framework: phase anchor insertion ---
230+ # These overlays insert unique sentinel comments at unconditional locations in
231+ # the upstream spec. Per-kmod overlays below target these sentinels with
232+ # spec-search-replace, replacing SENTINEL with <kmod include> + SENTINEL so
233+ # each sentinel survives for the next kmod to chain onto.
234+
235+ [[components .kernel .overlays ]]
236+ description = " Insert kmod package anchor after main %description — unconditional location for kmod subpackage declarations"
237+ type = " spec-append-lines"
238+ section = " %description"
239+ lines = [
240+ " " ,
241+ " # AZL-KMOD-PACKAGE-ANCHOR — do not remove (kmod overlays chain here)" ,
242+ ]
243+
244+ [[components .kernel .overlays ]]
245+ description = " Insert kmod prep anchor at end of %prep — unconditional location for kmod source extraction"
246+ type = " spec-append-lines"
247+ section = " %prep"
248+ lines = [
249+ " " ,
250+ " # AZL-KMOD-PREP-ANCHOR — do not remove (kmod overlays chain here)" ,
251+ ]
252+
253+ [[components .kernel .overlays ]]
254+ description = " Insert kmod build anchor before modsign macros — unconditional location at the end of the active %build body"
255+ type = " spec-search-replace"
256+ regex = ' # Module signing \(modsign\)'
257+ replacement = """ # AZL-KMOD-BUILD-ANCHOR — do not remove (kmod overlays chain here)
258+
259+ # Module signing (modsign)"""
260+
261+ [[components .kernel .overlays ]]
262+ description = " Insert kmod install anchor before ### clean — unconditional location at the end of the active %install body"
263+ type = " spec-search-replace"
264+ regex = ' ### clean'
265+ replacement = """ # AZL-KMOD-INSTALL-ANCHOR — do not remove (kmod overlays chain here)
266+
267+ ###
268+ ### clean"""
269+
270+ [[components .kernel .overlays ]]
271+ description = " Insert kmod files anchor after %files modules-extra-matched — unconditional location for kmod file lists"
272+ type = " spec-append-lines"
273+ section = " %files"
274+ package = " modules-extra-matched"
275+ lines = [
276+ " " ,
277+ " # AZL-KMOD-FILES-ANCHOR — do not remove (kmod overlays chain here)" ,
278+ ]
279+
280+ # --- kmod-nvidia-open: phase injection ---
281+ # RPM %include is a preprocessor directive — it must appear directly in the spec
282+ # text (not inside a %define macro). Each phase sets _kmod_phase and _kmod_name
283+ # globals, then includes the kmod .inc file. The .inc file's %if guards select
284+ # the correct section for that phase.
285+ #
286+ # To add a new kmod: duplicate the phase blocks below, changing _kmod_name and
287+ # the %include path. Each block targets the framework anchor for its phase.
288+
289+ [[components .kernel .overlays ]]
290+ description = " Run kmod 'package' phase at package anchor — declares kmod subpackages"
291+ type = " spec-search-replace"
292+ regex = ' # AZL-KMOD-PACKAGE-ANCHOR'
293+ replacement = """ # AZL: kmod subpackage declarations (nvidia-open)
294+ %global _kmod_phase package
295+ %global _kmod_name nvidia-open
296+ %include %{_sourcedir}/kmod-nvidia-open.inc
297+
298+ # AZL-KMOD-PACKAGE-ANCHOR"""
299+
300+ [[components .kernel .overlays ]]
301+ description = " Run kmod 'prep' phase at prep anchor — extracts kmod source tarballs"
302+ type = " spec-search-replace"
303+ regex = ' # AZL-KMOD-PREP-ANCHOR'
304+ replacement = """ # AZL: Prepare kmod subpackage sources (nvidia-open)
305+ %global _kmod_phase prep
306+ %global _kmod_name nvidia-open
307+ %include %{_sourcedir}/kmod-nvidia-open.inc
308+
309+ # AZL-KMOD-PREP-ANCHOR"""
310+
311+ [[components .kernel .overlays ]]
312+ description = " Run kmod 'build' phase at build anchor — compiles NVIDIA modules against the just-built kernel"
313+ type = " spec-search-replace"
314+ regex = ' # AZL-KMOD-BUILD-ANCHOR'
315+ replacement = """ # AZL: Build kmod subpackage modules (nvidia-open)
316+ %global _kmod_phase build
317+ %global _kmod_name nvidia-open
318+ %include %{_sourcedir}/kmod-nvidia-open.inc
319+
320+ # AZL-KMOD-BUILD-ANCHOR"""
321+
322+ [[components .kernel .overlays ]]
323+ description = " Run kmod 'install' phase at install anchor — installs NVIDIA modules, configs, and licenses"
324+ type = " spec-search-replace"
325+ regex = ' # AZL-KMOD-INSTALL-ANCHOR'
326+ replacement = """ # AZL: Install kmod subpackage files (nvidia-open)
327+ %global _kmod_phase install
328+ %global _kmod_name nvidia-open
329+ %include %{_sourcedir}/kmod-nvidia-open.inc
330+
331+ # AZL-KMOD-INSTALL-ANCHOR"""
332+
333+ [[components .kernel .overlays ]]
334+ description = " Run kmod 'files' phase at files anchor — adds %post/%postun/%files for NVIDIA kmod subpackage"
335+ type = " spec-search-replace"
336+ regex = ' # AZL-KMOD-FILES-ANCHOR'
337+ replacement = """ # AZL: kmod subpackage file lists and scriptlets (nvidia-open)
338+ %global _kmod_phase files
339+ %global _kmod_name nvidia-open
340+ %include %{_sourcedir}/kmod-nvidia-open.inc
341+
342+ # AZL-KMOD-FILES-ANCHOR"""
0 commit comments