forked from Mirror/pmbootstrap
pmb.kconfig: refactor to remove args (MR 2346)
Co-authored-by: Stefan Hansson <newbyte@postmarketos.org> Closes https://gitlab.postmarketos.org/postmarketOS/pmbootstrap/-/issues/2402
This commit is contained in:
parent
4f3ede3329
commit
afb036da0d
7 changed files with 155 additions and 106 deletions
|
@ -2,7 +2,6 @@
|
|||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
from pmb.build.init import init, init_abuild_minimal, init_compiler
|
||||
from pmb.build.envkernel import package_kernel
|
||||
from pmb.build.kconfig import menuconfig
|
||||
from pmb.build.newapkbuild import newapkbuild
|
||||
from pmb.build.other import copy_to_buildpath, get_status, index_repo
|
||||
from .backend import mount_pmaports
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
# Copyright 2023 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
import enum
|
||||
import os
|
||||
from pathlib import Path
|
||||
from pmb.core.arch import Arch
|
||||
from pmb.core.context import get_context
|
||||
from pmb.helpers import logging
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
import pmb.build
|
||||
|
@ -13,14 +14,38 @@ import pmb.build.checksum
|
|||
import pmb.chroot
|
||||
import pmb.chroot.apk
|
||||
import pmb.chroot.other
|
||||
from pmb.types import PmbArgs
|
||||
import pmb.helpers.pmaports
|
||||
import pmb.helpers.run
|
||||
import pmb.parse
|
||||
from pmb.core import Chroot
|
||||
|
||||
|
||||
def get_arch(apkbuild) -> Arch:
|
||||
class KConfigUI(enum.Enum):
|
||||
MENUCONFIG = "menuconfig"
|
||||
XCONFIG = "xconfig"
|
||||
NCONFIG = "nconfig"
|
||||
|
||||
def is_graphical(self) -> bool:
|
||||
match self:
|
||||
case KConfigUI.MENUCONFIG | KConfigUI.NCONFIG:
|
||||
return False
|
||||
case KConfigUI.XCONFIG:
|
||||
return True
|
||||
|
||||
def depends(self) -> list[str]:
|
||||
match self:
|
||||
case KConfigUI.MENUCONFIG:
|
||||
return ["ncurses-dev"]
|
||||
case KConfigUI.NCONFIG:
|
||||
return ["ncurses-dev"]
|
||||
case KConfigUI.XCONFIG:
|
||||
return ["qt5-qtbase-dev", "font-noto"]
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.value
|
||||
|
||||
|
||||
def get_arch(apkbuild: dict[str, Any]) -> Arch:
|
||||
"""Take the architecture from the APKBUILD or complain if it's ambiguous.
|
||||
|
||||
This function only gets called if --arch is not set.
|
||||
|
@ -109,66 +134,13 @@ def extract_and_patch_sources(pkgname: str, arch) -> None:
|
|||
)
|
||||
|
||||
|
||||
def menuconfig(args: PmbArgs, pkgname: str, use_oldconfig) -> None:
|
||||
# Pkgname: allow omitting "linux-" prefix
|
||||
if not pkgname.startswith("linux-"):
|
||||
pkgname = "linux-" + pkgname
|
||||
|
||||
# Read apkbuild
|
||||
def _make(chroot: pmb.core.Chroot, make_command: str, env, pkgname, arch, apkbuild) -> None:
|
||||
aport = pmb.helpers.pmaports.find(pkgname)
|
||||
apkbuild = pmb.parse.apkbuild(aport / "APKBUILD")
|
||||
arch = args.arch or get_arch(apkbuild)
|
||||
chroot = pmb.build.autodetect.chroot(apkbuild, arch)
|
||||
cross = pmb.build.autodetect.crosscompile(apkbuild, arch)
|
||||
hostspec = arch.alpine_triple()
|
||||
|
||||
# Set up build tools and makedepends
|
||||
pmb.build.init(chroot)
|
||||
if cross:
|
||||
pmb.build.init_compiler(get_context(), [], cross, arch)
|
||||
|
||||
depends = apkbuild["makedepends"] + ["gcc", "make"]
|
||||
copy_xauth = False
|
||||
|
||||
if use_oldconfig:
|
||||
kopt = "oldconfig"
|
||||
else:
|
||||
kopt = "menuconfig"
|
||||
if args.xconfig:
|
||||
depends += ["qt5-qtbase-dev", "font-noto"]
|
||||
kopt = "xconfig"
|
||||
copy_xauth = True
|
||||
elif args.nconfig:
|
||||
kopt = "nconfig"
|
||||
depends += ["ncurses-dev"]
|
||||
else:
|
||||
depends += ["ncurses-dev"]
|
||||
|
||||
pmb.chroot.apk.install(depends, Chroot.native())
|
||||
|
||||
# Copy host's .xauthority into native
|
||||
if copy_xauth:
|
||||
pmb.chroot.other.copy_xauthority(args)
|
||||
|
||||
extract_and_patch_sources(pkgname, arch)
|
||||
|
||||
# Check for background color variable
|
||||
color = os.environ.get("MENUCONFIG_COLOR")
|
||||
|
||||
# Run make menuconfig
|
||||
outputdir = get_outputdir(pkgname, apkbuild)
|
||||
logging.info("(native) make " + kopt)
|
||||
env = {
|
||||
"ARCH": arch.kernel(),
|
||||
"DISPLAY": os.environ.get("DISPLAY"),
|
||||
"XAUTHORITY": "/home/pmos/.Xauthority",
|
||||
}
|
||||
if cross:
|
||||
env["CROSS_COMPILE"] = f"{hostspec}-"
|
||||
env["CC"] = f"{hostspec}-gcc"
|
||||
if color:
|
||||
env["MENUCONFIG_COLOR"] = color
|
||||
pmb.chroot.user(["make", kopt], Chroot.native(), outputdir, output="tui", env=env)
|
||||
|
||||
logging.info("(native) make " + make_command)
|
||||
|
||||
pmb.chroot.user(["make", str(make_command)], chroot, outputdir, output="tui", env=env)
|
||||
|
||||
# Find the updated config
|
||||
source = Chroot.native() / outputdir / ".config"
|
||||
|
@ -181,3 +153,71 @@ def menuconfig(args: PmbArgs, pkgname: str, use_oldconfig) -> None:
|
|||
target = aport / config
|
||||
pmb.helpers.run.user(["cp", source, target])
|
||||
pmb.build.checksum.update(pkgname)
|
||||
|
||||
|
||||
def _init(pkgname: str, arch: Arch | None) -> tuple[str, Arch, Any, Chroot, dict[str, str]]:
|
||||
"""
|
||||
:returns: pkgname, arch, apkbuild, chroot, env
|
||||
"""
|
||||
# Pkgname: allow omitting "linux-" prefix
|
||||
if not pkgname.startswith("linux-"):
|
||||
pkgname = "linux-" + pkgname
|
||||
|
||||
aport = pmb.helpers.pmaports.find(pkgname)
|
||||
apkbuild = pmb.parse.apkbuild(aport / "APKBUILD")
|
||||
|
||||
if arch is None:
|
||||
arch = get_arch(apkbuild)
|
||||
|
||||
chroot = pmb.build.autodetect.chroot(apkbuild, arch)
|
||||
cross = pmb.build.autodetect.crosscompile(apkbuild, arch)
|
||||
hostspec = arch.alpine_triple()
|
||||
|
||||
# Set up build tools and makedepends
|
||||
pmb.build.init(chroot)
|
||||
if cross:
|
||||
pmb.build.init_compiler(get_context(), [], cross, arch)
|
||||
|
||||
depends = apkbuild["makedepends"] + ["gcc", "make"]
|
||||
|
||||
pmb.chroot.apk.install(depends, chroot)
|
||||
|
||||
extract_and_patch_sources(pkgname, arch)
|
||||
|
||||
env = {
|
||||
"ARCH": arch.kernel(),
|
||||
}
|
||||
|
||||
if cross:
|
||||
env["CROSS_COMPILE"] = f"{hostspec}-"
|
||||
env["CC"] = f"{hostspec}-gcc"
|
||||
|
||||
return pkgname, arch, apkbuild, chroot, env
|
||||
|
||||
|
||||
def migrate_config(pkgname: str, arch: Arch | None) -> None:
|
||||
pkgname, arch, apkbuild, chroot, env = _init(pkgname, arch)
|
||||
_make(chroot, "oldconfig", env, pkgname, arch, apkbuild)
|
||||
pass
|
||||
|
||||
|
||||
def edit_config(pkgname: str, arch: Arch | None, config_ui: KConfigUI) -> None:
|
||||
pkgname, arch, apkbuild, chroot, env = _init(pkgname, arch)
|
||||
|
||||
pmb.chroot.apk.install(config_ui.depends(), chroot)
|
||||
|
||||
# Copy host's .xauthority into native
|
||||
if config_ui.is_graphical():
|
||||
pmb.chroot.other.copy_xauthority(chroot)
|
||||
env["DISPLAY"] = os.environ.get("DISPLAY") or ":0"
|
||||
env["XAUTHORITY"] = "/home/pmos/.Xauthority"
|
||||
|
||||
# Check for background color variable
|
||||
color = os.environ.get("MENUCONFIG_COLOR")
|
||||
if color:
|
||||
env["MENUCONFIG_COLOR"] = color
|
||||
mode = os.environ.get("MENUCONFIG_MODE")
|
||||
if mode:
|
||||
env["MENUCONFIG_MODE"] = mode
|
||||
|
||||
_make(chroot, str(config_ui), env, pkgname, arch, apkbuild)
|
||||
|
|
|
@ -4,7 +4,6 @@ import os
|
|||
from pmb.core.context import get_context
|
||||
from pmb.helpers import logging
|
||||
import pmb.chroot.apk
|
||||
from pmb.types import PmbArgs
|
||||
import pmb.install
|
||||
from pmb.core import Chroot
|
||||
|
||||
|
@ -34,7 +33,7 @@ def kernel_flavor_installed(chroot: Chroot, autoinstall=True) -> str | None:
|
|||
return glob_result[0].name if glob_result else None
|
||||
|
||||
|
||||
def copy_xauthority(args: PmbArgs) -> None:
|
||||
def copy_xauthority(chroot: Chroot) -> None:
|
||||
"""
|
||||
Copy the host system's Xauthority file to the pmos user inside the chroot,
|
||||
so we can start X11 applications from there.
|
||||
|
@ -60,7 +59,7 @@ def copy_xauthority(args: PmbArgs) -> None:
|
|||
)
|
||||
|
||||
# Copy to chroot and chown
|
||||
copy = Chroot.native() / "home/pmos/.Xauthority"
|
||||
copy = chroot / "home/pmos/.Xauthority"
|
||||
if os.path.exists(copy):
|
||||
pmb.helpers.run.root(["rm", copy])
|
||||
pmb.helpers.run.root(["cp", original, copy])
|
||||
|
|
|
@ -19,8 +19,7 @@ from .test import Test
|
|||
from .pkgrel_bump import PkgrelBump
|
||||
from .pkgver_bump import PkgverBump
|
||||
from .pull import Pull
|
||||
from .kconfig_check import KConfigCheck
|
||||
from .kconfig_edit import KConfigEdit
|
||||
from .kconfig import KConfigCheck, KConfigEdit, KConfigMigrate
|
||||
|
||||
"""New way to model pmbootstrap subcommands that can be invoked without PmbArgs."""
|
||||
|
||||
|
@ -89,8 +88,10 @@ def run_command(args: PmbArgs):
|
|||
command = KConfigCheck(
|
||||
args.kconfig_check_details, args.file, args.package, args.keep_going
|
||||
)
|
||||
case "edit" | "migrate":
|
||||
command = KConfigEdit(args.package[0], args.action_kconfig == "migrate")
|
||||
case "edit":
|
||||
command = KConfigEdit(args.package[0], args.arch, args.xconfig, args.nconfig)
|
||||
case "migrate":
|
||||
command = KConfigMigrate(args.package, args.arch)
|
||||
case _:
|
||||
raise NotImplementedError(f"Command '{args.action}' is not implemented.")
|
||||
|
||||
|
|
|
@ -2,25 +2,25 @@
|
|||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from __future__ import annotations
|
||||
from pmb import commands
|
||||
from pmb.core.context import get_context
|
||||
from pmb.helpers.exceptions import NonBugError
|
||||
import pmb.parse.kconfig
|
||||
|
||||
import pmb.helpers.git
|
||||
import pmb.config
|
||||
import pmb.parse.kconfig
|
||||
import logging
|
||||
from pmb import commands
|
||||
from pmb.build.kconfig import KConfigUI
|
||||
from pmb.core.arch import Arch
|
||||
from pmb.core.context import get_context
|
||||
from pmb.helpers.exceptions import NonBugError
|
||||
|
||||
|
||||
class KConfigCheck(commands.Command):
|
||||
details: bool
|
||||
file: str
|
||||
packages: list[str]
|
||||
keep_going: bool
|
||||
|
||||
def __init__(self, details, file, packages, keep_going) -> None:
|
||||
def __init__(
|
||||
self, details: bool, file: str, pkgname: str | list[str], keep_going: bool
|
||||
) -> None:
|
||||
self.details = details
|
||||
self.file = file
|
||||
self.packages = packages
|
||||
self.pkgname_list = [pkgname] if isinstance(pkgname, str) else pkgname
|
||||
self.keep_going = keep_going
|
||||
|
||||
def run(self) -> None:
|
||||
|
@ -36,16 +36,16 @@ class KConfigCheck(commands.Command):
|
|||
raise NonBugError(error_msg)
|
||||
|
||||
# Default to all kernel packages
|
||||
if not self.packages:
|
||||
if not self.pkgname_list:
|
||||
for pkg in pmb.helpers.pmaports.get_list():
|
||||
if pkg.startswith("linux-"):
|
||||
self.packages.append(pkg.split("linux-")[1])
|
||||
self.pkgname_list.append(pkg.split("linux-")[1])
|
||||
|
||||
# Iterate over all kernels
|
||||
error = False
|
||||
skipped = 0
|
||||
self.packages.sort()
|
||||
for package in self.packages:
|
||||
self.pkgname_list.sort()
|
||||
for package in self.pkgname_list:
|
||||
if not get_context().force:
|
||||
pkgname = package if package.startswith("linux-") else f"linux-{package}"
|
||||
aport = pmb.helpers.pmaports.find(pkgname)
|
||||
|
@ -68,3 +68,34 @@ class KConfigCheck(commands.Command):
|
|||
" (consider 'pmbootstrap kconfig check -f')"
|
||||
)
|
||||
logging.info("kconfig check succeeded!")
|
||||
|
||||
|
||||
class KConfigEdit(commands.Command):
|
||||
def __init__(
|
||||
self, pkgname: str, arch: Arch | None, use_xconfig: bool, use_nconfig: bool
|
||||
) -> None:
|
||||
self.pkgname = pkgname
|
||||
self.arch = arch
|
||||
|
||||
if use_xconfig and use_nconfig:
|
||||
raise AssertionError
|
||||
|
||||
if use_xconfig:
|
||||
self.chosen_ui = KConfigUI.XCONFIG
|
||||
elif use_nconfig:
|
||||
self.chosen_ui = KConfigUI.NCONFIG
|
||||
else:
|
||||
self.chosen_ui = KConfigUI.MENUCONFIG
|
||||
|
||||
def run(self) -> None:
|
||||
pmb.build.kconfig.edit_config(self.pkgname, self.arch, self.chosen_ui)
|
||||
|
||||
|
||||
class KConfigMigrate(commands.Command):
|
||||
def __init__(self, pkgname: str | list[str], arch: Arch | None) -> None:
|
||||
self.pkgname_list = [pkgname] if isinstance(pkgname, str) else pkgname
|
||||
self.arch = arch
|
||||
|
||||
def run(self):
|
||||
for pkgname in self.pkgname_list:
|
||||
pmb.build.kconfig.migrate_config(pkgname, self.arch)
|
|
@ -1,21 +0,0 @@
|
|||
# Copyright 2024 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from __future__ import annotations
|
||||
from pmb import commands
|
||||
import pmb.build
|
||||
import pmb.helpers.args
|
||||
|
||||
|
||||
class KConfigEdit(commands.Command):
|
||||
pkgname: str
|
||||
use_oldconfig: bool
|
||||
|
||||
def __init__(self, pkgname, use_oldconfig):
|
||||
self.pkgname = pkgname
|
||||
self.use_oldconfig = use_oldconfig
|
||||
pass
|
||||
|
||||
def run(self):
|
||||
args = pmb.helpers.args.please_i_really_need_args()
|
||||
pmb.build.menuconfig(args, self.pkgname, self.use_oldconfig)
|
|
@ -191,7 +191,7 @@ def chroot(args: PmbArgs) -> None:
|
|||
# Xauthority
|
||||
env = {}
|
||||
if args.xauth:
|
||||
pmb.chroot.other.copy_xauthority(args)
|
||||
pmb.chroot.other.copy_xauthority(chroot)
|
||||
env["DISPLAY"] = os.environ.get("DISPLAY")
|
||||
env["XAUTHORITY"] = "/home/pmos/.Xauthority"
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue