99#
1010# Strategy:
1111# 1. After do_kernel_resin_injectconfig runs (balena defconfig + BALENA_CONFIGS
12- # are already merged into .config), apply kernel-extension.cfg via
13- # scripts/kconfig/merge_config.sh.
14- # 2. Run olddefconfig to resolve dependencies.
12+ # are already merged into .config), discover every *.cfg fragment reachable
13+ # via FILESEXTRAPATHS and merge them all via scripts/kconfig/merge_config.sh
14+ # in sorted order.
15+ # 2. Run olddefconfig once to resolve dependencies.
1516# 3. Let the normal do_compile / do_install flow proceed.
1617#
1718# Usage:
1819# inherit kernel-extension
19- # # Place kernel-extension .cfg in a FILESEXTRAPATHS-reachable directory .
20+ # # Place one or more * .cfg fragments in a FILESEXTRAPATHS-reachable dir .
2021
2122python do_kernel_extend_config () {
23+ import glob
2224 import os
2325 import subprocess
2426
@@ -32,31 +34,40 @@ python do_kernel_extend_config() {
3234 if not arch :
3335 bb . fatal ("kernel-extension: ARCH variable not set" )
3436
35- # 1. Locate kernel-extension.cfg via FILESEXTRAPATHS.
36- extension_cfg = None
37+ # 1. Discover every *.cfg fragment reachable via FILESEXTRAPATHS, in
38+ # sorted order. Deduplicate paths reachable via multiple entries.
39+ fragments = []
40+ seen = set ()
3741 filesextrapaths = d . getVar ("FILESEXTRAPATHS" ) or ""
3842 for path in filesextrapaths . split (":" ):
39- candidate = os . path . join (path , "kernel-extension.cfg" )
40- if os . path . exists (candidate ):
41- extension_cfg = candidate
42- break
43+ if not path :
44+ continue
45+ for cfg in sorted (glob . glob (os . path . join (path , "*.cfg" ))):
46+ if cfg not in seen :
47+ seen . add (cfg )
48+ fragments . append (cfg )
4349
44- if not extension_cfg :
50+ if not fragments :
4551 bb . fatal (
46- "kernel-extension: kernel-extension .cfg not found.\n"
47- "Place it in a directory reachable via FILESEXTRAPATHS.\n"
52+ "kernel-extension: no * .cfg fragments found via FILESEXTRAPATHS .\n"
53+ "Place at least one fragment in a FILESEXTRAPATHS-reachable dir .\n"
4854 f "Searched paths: {filesextrapaths}"
4955 )
5056
51- bb . note (f "Using kernel extension fragment: {extension_cfg}" )
57+ bb . note (f "Merging {len(fragments)} kernel extension fragment(s):" )
58+ for f in fragments :
59+ bb . note (f " {f}" )
5260
53- # 2. Merge the fragment into .config.
61+ # 2. Merge every fragment in a single merge_config.sh invocation.
62+ # merge_config.sh accepts multiple input fragments; later inputs
63+ # override earlier ones for conflicting symbols and warn on stderr.
5464 merge_script = os . path . join (S , "scripts" , "kconfig" , "merge_config.sh" )
55- cmd = f '{merge_script} -m -O {B} {base_config} {extension_cfg}'
56- bb . note ("Merging kernel-extension.cfg" )
65+ cmd = " " . join ([merge_script , "-m" , "-O" , B , base_config , *fragments ])
5766 ret = subprocess . run (cmd , shell = True , capture_output = True , text = True )
5867 if ret . returncode != 0 :
5968 bb . fatal (f "merge_config.sh failed:\n{ret.stderr}" )
69+ if ret . stderr :
70+ bb . note (ret . stderr )
6071
6172 # 3. Resolve dependencies.
6273 cmd = f '{make_cmd} {make_opts} -C {S} O={B} ARCH={arch} olddefconfig'
0 commit comments