7
7
import hashlib
8
8
import itertools
9
9
import json
10
+ import glob
10
11
import logging
11
12
import os
12
13
import re
90
91
from mkosi .installer import clean_package_manager_metadata
91
92
from mkosi .installer .pacman import Pacman
92
93
from mkosi .installer .zypper import Zypper
93
- from mkosi .kmod import gen_required_kernel_modules , is_valid_kdir , loaded_modules , process_kernel_modules
94
+ from mkosi .kmod import gen_required_kernel_modules , is_valid_kdir , loaded_modules , process_kernel_modules , globs_match_filename
94
95
from mkosi .log import ARG_DEBUG , complete_step , die , log_notice , log_step
95
96
from mkosi .manifest import Manifest
96
97
from mkosi .mounts import (
@@ -1598,6 +1599,7 @@ def build_kernel_modules_initrd(context: Context, kver: str) -> Path:
1598
1599
1599
1600
def find_devicetree (context : Context , kver : str ) -> Path :
1600
1601
assert context .config .devicetree
1602
+ assert not glob .has_magic (os .fspath (context .config .devicetree ))
1601
1603
1602
1604
for d in (
1603
1605
context .root / f"usr/lib/firmware/{ kver } /device-tree" ,
@@ -1611,6 +1613,38 @@ def find_devicetree(context: Context, kver: str) -> Path:
1611
1613
die (f"Requested devicetree { context .config .devicetree } not found" )
1612
1614
1613
1615
1616
+
1617
+ def find_devicetrees (context : Context , kver : str ) -> list [Path ]:
1618
+ assert context .config .devicetree
1619
+
1620
+ if not glob .has_magic (os .fspath (context .config .devicetree )):
1621
+ # Single devicetree
1622
+ return [find_devicetree (context , kver )]
1623
+
1624
+ # Glob pattern - search all directories
1625
+ dtb_dirs = [
1626
+ context .root / f"usr/lib/firmware/{ kver } /device-tree" ,
1627
+ context .root / f"usr/lib/linux-image-{ kver } " ,
1628
+ context .root / f"usr/lib/modules/{ kver } /dtb" ,
1629
+ ]
1630
+
1631
+ matched_dtbs = []
1632
+ for dtb_dir in dtb_dirs :
1633
+ if not dtb_dir .exists ():
1634
+ continue
1635
+
1636
+ all_dtbs = [p for p in dtb_dir .rglob ("*.dtb" ) if p .is_file ()]
1637
+ for dtb in all_dtbs :
1638
+ rel_path = os .fspath (dtb .relative_to (dtb_dir ))
1639
+ if globs_match_filename (rel_path , [os .fspath (context .config .devicetree )], match_default = False ):
1640
+ matched_dtbs .append (dtb )
1641
+
1642
+ if not matched_dtbs :
1643
+ logging .warning (f"Devicetree glob '{ context .config .devicetree } ' matched 0 files" )
1644
+
1645
+ return matched_dtbs
1646
+
1647
+
1614
1648
def want_signed_pcrs (config : Config ) -> bool :
1615
1649
return config .sign_expected_pcr == ConfigFeature .enabled or (
1616
1650
config .sign_expected_pcr == ConfigFeature .auto
@@ -1769,9 +1803,14 @@ def build_uki(
1769
1803
] # fmt: skip
1770
1804
1771
1805
if context .config .devicetree :
1772
- dtb = find_devicetree (context , kver )
1773
- arguments += ["--devicetree" , workdir (dtb )]
1774
- options += ["--ro-bind" , dtb , workdir (dtb )]
1806
+ if glob .has_magic (os .fspath (context .config .devicetree )):
1807
+ for dtb in find_devicetrees (context , kver ):
1808
+ arguments += ["--devicetree-auto" , workdir (dtb )]
1809
+ options += ["--ro-bind" , dtb , workdir (dtb )]
1810
+ else :
1811
+ dtb = find_devicetree (context , kver )
1812
+ arguments += ["--devicetree" , workdir (dtb )]
1813
+ options += ["--ro-bind" , dtb , workdir (dtb )]
1775
1814
1776
1815
if context .config .splash :
1777
1816
splash = context .root / os .fspath (context .config .splash ).lstrip ("/" )
@@ -2016,6 +2055,8 @@ def install_type1(
2016
2055
2017
2056
dtb = None
2018
2057
if context .config .devicetree :
2058
+ if glob .has_magic (os .fspath (context .config .devicetree )):
2059
+ die ("Devicetree globs are not supported with Type 1 boot entries, use UKI builds instead" )
2019
2060
dtb = dst / context .config .devicetree
2020
2061
with umask (~ 0o700 ):
2021
2062
dtb .parent .mkdir (parents = True , exist_ok = True )
0 commit comments