1
0
Fork 1
mirror of https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git synced 2025-07-12 19:09:56 +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(
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:
options: AportGenEntry
@ -71,7 +74,10 @@ def generate(
else:
prefix, folder, options = properties(pkgname)
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
if options["confirm_overwrite"] and os.path.exists(path_target):
@ -80,9 +86,9 @@ def generate(
raise RuntimeError("Aborted.")
aportgen = config.work / "aportgen"
if os.path.exists(aportgen):
pmb.helpers.run.user(["rm", "-r", aportgen])
if fork_alpine:
upstream = pmb.aportgen.core.get_upstream_aport(
pkgname, retain_branch=fork_alpine_retain_branch
@ -96,7 +102,7 @@ def generate(
case "busybox-static":
pmb.aportgen.busybox_static.generate(pkgname)
case "device":
pmb.aportgen.device.generate(pkgname)
pmb.aportgen.device.generate(pkgname, device_category)
case "gcc":
pmb.aportgen.gcc.generate(pkgname)
case "grub-efi":

View file

@ -7,6 +7,7 @@ from pmb.types import Bootimg
from pathlib import Path
import os
import pmb.helpers.cli
import pmb.helpers.devices
import pmb.helpers.run
import pmb.aportgen.core
import pmb.parse.apkindex
@ -267,9 +268,20 @@ def generate_modules_initfs() -> None:
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
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"]:
depends.append("mkbootimg")
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")
def generate(pkgname: str) -> None:
def generate(
pkgname: str,
device_category: pmb.helpers.devices.DeviceCategory | None,
) -> None:
arch = ask_for_architecture()
manufacturer = ask_for_manufacturer()
name = ask_for_name(manufacturer)
@ -328,6 +343,8 @@ def generate(pkgname: str) -> None:
bootimg = None
if flash_method in ["fastboot", "heimdall-bootimg"]:
bootimg = ask_for_bootimg()
if device_category is None:
device_category = pmb.config.ask_for_mainline_downstream()
generate_deviceinfo(
pkgname,
@ -341,4 +358,4 @@ def generate(pkgname: str) -> None:
bootimg,
)
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.sudo import which_sudo
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
@ -594,7 +597,7 @@ aportgen: dict[str, AportGenEntry] = {
"prefixes": ["busybox-static", "gcc", "musl", "grub-efi"],
"confirm_overwrite": False,
},
"device/testing": {
"device": {
"prefixes": ["device", "linux"],
"confirm_overwrite": True,
},

View file

@ -463,6 +463,33 @@ def ask_for_device_kernel(config: Config, device: str) -> str:
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]:
"""
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
continue
device_category = ask_for_mainline_downstream()
# New port creation confirmed
logging.info(f"Generating new aports for: {device}...")
pmb.aportgen.generate(f"device-{device}")
pmb.aportgen.generate(f"linux-{device}")
pmb.aportgen.generate(f"device-{device}", device_category=device_category)
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:
apkbuild = device_path.parent / "APKBUILD"
archived = pmb.parse._apkbuild.archived(apkbuild) or "No reason given (this is a bug)"