From: Zbigniew Jędrzejewski-Szmek Date: Tue, 28 Nov 2023 15:52:21 +0000 (+0100) Subject: kernel-install/60-ukify: use exec() instead of runpy X-Git-Tag: v256-rc1~1500^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2060509d1245de797f89292b9513364c3e4cbbb5;p=thirdparty%2Fsystemd.git kernel-install/60-ukify: use exec() instead of runpy As suggested by Daniele Nicolodi. Also drop left-over debug line. --- diff --git a/src/kernel-install/60-ukify.install.in b/src/kernel-install/60-ukify.install.in index be1e21b4e7d..e09880fc0e2 100755 --- a/src/kernel-install/60-ukify.install.in +++ b/src/kernel-install/60-ukify.install.in @@ -21,8 +21,8 @@ import argparse import os -import runpy import shlex +import types from shutil import which from pathlib import Path from typing import Optional @@ -210,22 +210,20 @@ def initrd_list(opts) -> list[Path]: return [*microcode, *opts.initrd, *initrd] -def call_ukify(opts): - # Punish me harder. - # We want this: - # ukify = importlib.machinery.SourceFileLoader('ukify', UKIFY).load_module() - # but it throws a DeprecationWarning. - # https://stackoverflow.com/questions/67631/how-can-i-import-a-module-dynamically-given-the-full-path - # https://github.com/python/cpython/issues/65635 - # offer "explanations", but to actually load a python file without a .py extension, - # the "solution" is 4+ incomprehensible lines. - # The solution with runpy gives a dictionary, which isn't great, but will do. - ukify = runpy.run_path(UKIFY, run_name='ukify') +def load_module(name: str, path: str) -> types.ModuleType: + module = types.ModuleType(name) + text = open(path).read() + exec(compile(text, path, 'exec'), module.__dict__) + return module + + +def call_ukify(opts) -> None: + ukify = load_module('ukify', UKIFY) # Create "empty" namespace. We want to override just a few settings, so it # doesn't make sense to configure everything. We pretend to parse an empty # argument set to prepopulate the namespace with the defaults. - opts2 = ukify['create_parser']().parse_args(['build']) + opts2 = ukify.create_parser().parse_args(['build']) opts2.config = uki_conf_location() opts2.uname = opts.kernel_version @@ -241,12 +239,10 @@ def call_ukify(opts): if BOOT_STUB: opts2.stub = BOOT_STUB - # opts2.summary = True - - ukify['apply_config'](opts2) - ukify['finalize_options'](opts2) - ukify['check_inputs'](opts2) - ukify['make_uki'](opts2) + ukify.apply_config(opts2) + ukify.finalize_options(opts2) + ukify.check_inputs(opts2) + ukify.make_uki(opts2) log(f'{opts2.output} has been created')