1
0
Fork 1
mirror of https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git synced 2025-07-13 03:19:47 +03:00

pmb.aportgen: Ask whether a new device port is upstream or downstream

Essentially we want to place the generated APKBUILD files into the
correct device/testing/ or device/downstream/ category, depending
whether it's a port using upstream or downstream kernel.

Fixes #2556
This commit is contained in:
Luca Weiss 2025-05-23 12:25:29 +02:00
parent 606eb669fc
commit 129fb3f44d
4 changed files with 68 additions and 12 deletions

View file

@ -62,7 +62,10 @@ def properties(pkgname: str) -> tuple[str, str, AportGenEntry]:
def generate( def generate(
pkgname: str, fork_alpine: bool = False, fork_alpine_retain_branch: bool = False pkgname: str,
fork_alpine: bool = False,
fork_alpine_retain_branch: bool = False,
device_category: pmb.helpers.devices.DeviceCategory | None = None,
) -> None: ) -> None:
options: AportGenEntry options: AportGenEntry
@ -71,7 +74,10 @@ def generate(
else: else:
prefix, folder, options = properties(pkgname) prefix, folder, options = properties(pkgname)
config = get_context().config config = get_context().config
path_target = pkgrepo_default_path() / folder / pkgname if device_category:
path_target = pkgrepo_default_path() / folder / str(device_category) / pkgname
else:
path_target = pkgrepo_default_path() / folder / pkgname
# Confirm overwrite # Confirm overwrite
if options["confirm_overwrite"] and os.path.exists(path_target): if options["confirm_overwrite"] and os.path.exists(path_target):
@ -80,9 +86,9 @@ def generate(
raise RuntimeError("Aborted.") raise RuntimeError("Aborted.")
aportgen = config.work / "aportgen" aportgen = config.work / "aportgen"
if os.path.exists(aportgen): if os.path.exists(aportgen):
pmb.helpers.run.user(["rm", "-r", aportgen]) pmb.helpers.run.user(["rm", "-r", aportgen])
if fork_alpine: if fork_alpine:
upstream = pmb.aportgen.core.get_upstream_aport( upstream = pmb.aportgen.core.get_upstream_aport(
pkgname, retain_branch=fork_alpine_retain_branch pkgname, retain_branch=fork_alpine_retain_branch
@ -96,7 +102,7 @@ def generate(
case "busybox-static": case "busybox-static":
pmb.aportgen.busybox_static.generate(pkgname) pmb.aportgen.busybox_static.generate(pkgname)
case "device": case "device":
pmb.aportgen.device.generate(pkgname) pmb.aportgen.device.generate(pkgname, device_category)
case "gcc": case "gcc":
pmb.aportgen.gcc.generate(pkgname) pmb.aportgen.gcc.generate(pkgname)
case "grub-efi": case "grub-efi":

View file

@ -7,6 +7,7 @@ from pmb.types import Bootimg
from pathlib import Path from pathlib import Path
import os import os
import pmb.helpers.cli import pmb.helpers.cli
import pmb.helpers.devices
import pmb.helpers.run import pmb.helpers.run
import pmb.aportgen.core import pmb.aportgen.core
import pmb.parse.apkindex import pmb.parse.apkindex
@ -267,9 +268,20 @@ def generate_modules_initfs() -> None:
handle.write(line.lstrip() + "\n") handle.write(line.lstrip() + "\n")
def generate_apkbuild(pkgname: str, name: str, arch: Arch, flash_method: str) -> None: def generate_apkbuild(
pkgname: str,
name: str,
arch: Arch,
flash_method: str,
device_category: pmb.helpers.devices.DeviceCategory,
) -> None:
# Dependencies # Dependencies
depends = ["postmarketos-base", "linux-" + "-".join(pkgname.split("-")[1:])] depends = ["postmarketos-base"]
if device_category == pmb.helpers.devices.DeviceCategory.DOWNSTREAM:
depends += ["linux-" + "-".join(pkgname.split("-")[1:])]
else:
depends += ["linux-CHANGEME"]
if flash_method in ["fastboot", "heimdall-bootimg"]: if flash_method in ["fastboot", "heimdall-bootimg"]:
depends.append("mkbootimg") depends.append("mkbootimg")
if flash_method == "0xffff": if flash_method == "0xffff":
@ -317,7 +329,10 @@ def generate_apkbuild(pkgname: str, name: str, arch: Arch, flash_method: str) ->
handle.write(line[8:].replace(" " * 4, "\t") + "\n") handle.write(line[8:].replace(" " * 4, "\t") + "\n")
def generate(pkgname: str) -> None: def generate(
pkgname: str,
device_category: pmb.helpers.devices.DeviceCategory | None,
) -> None:
arch = ask_for_architecture() arch = ask_for_architecture()
manufacturer = ask_for_manufacturer() manufacturer = ask_for_manufacturer()
name = ask_for_name(manufacturer) name = ask_for_name(manufacturer)
@ -328,6 +343,8 @@ def generate(pkgname: str) -> None:
bootimg = None bootimg = None
if flash_method in ["fastboot", "heimdall-bootimg"]: if flash_method in ["fastboot", "heimdall-bootimg"]:
bootimg = ask_for_bootimg() bootimg = ask_for_bootimg()
if device_category is None:
device_category = pmb.config.ask_for_mainline_downstream()
generate_deviceinfo( generate_deviceinfo(
pkgname, pkgname,
@ -341,4 +358,4 @@ def generate(pkgname: str) -> None:
bootimg, bootimg,
) )
generate_modules_initfs() generate_modules_initfs()
generate_apkbuild(pkgname, name, arch, flash_method) generate_apkbuild(pkgname, name, arch, flash_method, device_category)

View file

@ -14,7 +14,10 @@ from collections.abc import Sequence
from pmb.config.file import load as load, save as save, serialize as serialize from pmb.config.file import load as load, save as save, serialize as serialize
from pmb.config.sudo import which_sudo from pmb.config.sudo import which_sudo
from pmb.config.other import is_systemd_selected as is_systemd_selected from pmb.config.other import is_systemd_selected as is_systemd_selected
from .init import require_programs as require_programs from .init import (
require_programs as require_programs,
ask_for_mainline_downstream as ask_for_mainline_downstream,
)
from . import workdir as workdir from . import workdir as workdir
@ -594,7 +597,7 @@ aportgen: dict[str, AportGenEntry] = {
"prefixes": ["busybox-static", "gcc", "musl", "grub-efi"], "prefixes": ["busybox-static", "gcc", "musl", "grub-efi"],
"confirm_overwrite": False, "confirm_overwrite": False,
}, },
"device/testing": { "device": {
"prefixes": ["device", "linux"], "prefixes": ["device", "linux"],
"confirm_overwrite": True, "confirm_overwrite": True,
}, },

View file

@ -463,6 +463,33 @@ def ask_for_device_kernel(config: Config, device: str) -> str:
return ret return ret
def ask_for_mainline_downstream() -> pmb.helpers.devices.DeviceCategory:
logging.info("What type of port are you creating?")
logging.info(
"* mainline: Port using upstream/mainline kernel, compatible with upstream user space."
)
logging.info(
"* downstream: Port using downstream kernel, using the original (e.g. Android) kernel "
"sources, at least partially incompatible with upstream user space."
)
port_type = pmb.helpers.cli.ask(
question="Type?",
choices=["mainline", "downstream"],
default=None,
validation_regex="mainline|downstream",
complete=["mainline", "downstream"],
)
match port_type:
# Mainline ports start out in the testing category
case "mainline":
return pmb.helpers.devices.DeviceCategory.TESTING
case "downstream":
return pmb.helpers.devices.DeviceCategory.DOWNSTREAM
case _:
raise ValueError(f"Unexpected port_type {port_type}")
def ask_for_device(context: Context) -> tuple[str, bool, str]: def ask_for_device(context: Context) -> tuple[str, bool, str]:
""" """
Prompt for the device vendor, model, and kernel. Prompt for the device vendor, model, and kernel.
@ -537,10 +564,13 @@ def ask_for_device(context: Context) -> tuple[str, bool, str]:
current_vendor = vendor current_vendor = vendor
continue continue
device_category = ask_for_mainline_downstream()
# New port creation confirmed # New port creation confirmed
logging.info(f"Generating new aports for: {device}...") logging.info(f"Generating new aports for: {device}...")
pmb.aportgen.generate(f"device-{device}") pmb.aportgen.generate(f"device-{device}", device_category=device_category)
pmb.aportgen.generate(f"linux-{device}") if device_category == pmb.helpers.devices.DeviceCategory.DOWNSTREAM:
pmb.aportgen.generate(f"linux-{device}", device_category=device_category)
elif device_category == pmb.helpers.devices.DeviceCategory.ARCHIVED: elif device_category == pmb.helpers.devices.DeviceCategory.ARCHIVED:
apkbuild = device_path.parent / "APKBUILD" apkbuild = device_path.parent / "APKBUILD"
archived = pmb.parse._apkbuild.archived(apkbuild) or "No reason given (this is a bug)" archived = pmb.parse._apkbuild.archived(apkbuild) or "No reason given (this is a bug)"