diff --git a/.github/workflows/build-os.yml b/.github/workflows/build-os.yml index d83f397..3d4b267 100644 --- a/.github/workflows/build-os.yml +++ b/.github/workflows/build-os.yml @@ -5,6 +5,15 @@ on: pull_request: workflow_dispatch: inputs: + menuconfig_preset: + description: "menuconfig preset (full/minimal/dev)" + type: choice + options: + - full + - minimal + - dev + required: false + default: "full" menuconfig_overrides: description: "Optional extra menuconfig args, e.g. --set CLEONOS_CLKS_ENABLE_AUDIO=OFF" required: false @@ -17,6 +26,7 @@ jobs: build-os: runs-on: ubuntu-latest env: + MENUCONFIG_PRESET: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.menuconfig_preset || 'full' }} MENUCONFIG_OVERRIDES: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.menuconfig_overrides || '' }} steps: @@ -47,7 +57,7 @@ jobs: - name: Setup Rust uses: dtolnay/rust-toolchain@stable - - name: Generate menuconfig (default all enabled) + - name: Generate menuconfig (shared preset) shell: bash run: | set -euo pipefail @@ -56,8 +66,8 @@ jobs: # shellcheck disable=SC2206 extra_args=(${MENUCONFIG_OVERRIDES}) fi - python3 scripts/menuconfig.py --defaults --non-interactive "${extra_args[@]}" - echo "menuconfig generated with defaults=all-enabled" + python3 scripts/menuconfig.py --defaults --non-interactive --preset "${MENUCONFIG_PRESET}" "${extra_args[@]}" + echo "menuconfig generated with preset=${MENUCONFIG_PRESET}" - name: Configure run: | diff --git a/Makefile b/Makefile index d27064c..af9c773 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,7 @@ OBJDUMP_FOR_TARGET ?= READELF_FOR_TARGET ?= PYTHON ?= python3 MENUCONFIG_ARGS ?= +MENUCONFIG_PRESET ?= ifeq ($(strip $(CMAKE_GENERATOR)),) GEN_ARG := @@ -25,6 +26,7 @@ GEN_ARG := -G "$(CMAKE_GENERATOR)" endif CMAKE_PASSTHROUGH_ARGS := +MENUCONFIG_PRESET_ARG := $(if $(strip $(MENUCONFIG_PRESET)),--preset $(MENUCONFIG_PRESET),) ifneq ($(strip $(LIMINE_SKIP_CONFIGURE)),) CMAKE_PASSTHROUGH_ARGS += -DLIMINE_SKIP_CONFIGURE=$(LIMINE_SKIP_CONFIGURE) @@ -64,9 +66,9 @@ reconfigure: menuconfig: > @if command -v $(PYTHON) >/dev/null 2>&1; then \ -> $(PYTHON) scripts/menuconfig.py $(MENUCONFIG_ARGS); \ +> $(PYTHON) scripts/menuconfig.py $(MENUCONFIG_PRESET_ARG) $(MENUCONFIG_ARGS); \ > elif command -v python >/dev/null 2>&1; then \ -> python scripts/menuconfig.py $(MENUCONFIG_ARGS); \ +> python scripts/menuconfig.py $(MENUCONFIG_PRESET_ARG) $(MENUCONFIG_ARGS); \ > else \ > echo "python3/python not found"; \ > exit 1; \ @@ -75,9 +77,9 @@ menuconfig: menuconfig-gui: > @if command -v $(PYTHON) >/dev/null 2>&1; then \ -> $(PYTHON) scripts/menuconfig.py --gui $(MENUCONFIG_ARGS); \ +> $(PYTHON) scripts/menuconfig.py --gui $(MENUCONFIG_PRESET_ARG) $(MENUCONFIG_ARGS); \ > elif command -v python >/dev/null 2>&1; then \ -> python scripts/menuconfig.py --gui $(MENUCONFIG_ARGS); \ +> python scripts/menuconfig.py --gui $(MENUCONFIG_PRESET_ARG) $(MENUCONFIG_ARGS); \ > else \ > echo "python3/python not found"; \ > exit 1; \ @@ -145,3 +147,7 @@ help: > @echo " make configure CMAKE_EXTRA_ARGS='-DLIMINE_SKIP_CONFIGURE=1 -DOBJCOPY_FOR_TARGET=objcopy'" > @echo "Direct passthrough is also supported:" > @echo " make run LIMINE_SKIP_CONFIGURE=1" +> @echo "Preset examples:" +> @echo " make menuconfig MENUCONFIG_PRESET=full" +> @echo " make menuconfig MENUCONFIG_PRESET=minimal" +> @echo " make menuconfig-gui MENUCONFIG_PRESET=dev" diff --git a/scripts/menuconfig.py b/scripts/menuconfig.py index 06a77b1..6d18ad3 100644 --- a/scripts/menuconfig.py +++ b/scripts/menuconfig.py @@ -169,6 +169,108 @@ def init_values(options: Iterable[OptionItem], previous: Dict[str, bool], use_de return values +def _set_option_if_exists(values: Dict[str, bool], key: str, enabled: bool) -> None: + if key in values: + values[key] = enabled + + +def _set_all_options(values: Dict[str, bool], options: List[OptionItem], enabled: bool) -> None: + for item in options: + values[item.key] = enabled + + +def apply_preset(preset: str, clks_options: List[OptionItem], user_options: List[OptionItem], values: Dict[str, bool]) -> None: + preset_name = preset.strip().lower() + + if preset_name == "full": + _set_all_options(values, clks_options, True) + _set_all_options(values, user_options, True) + return + + if preset_name == "dev": + _set_all_options(values, clks_options, True) + _set_all_options(values, user_options, True) + _set_option_if_exists(values, "CLEONOS_CLKS_ENABLE_USERLAND_AUTO_EXEC", False) + _set_option_if_exists(values, "CLEONOS_CLKS_ENABLE_EXEC_SERIAL_LOG", True) + _set_option_if_exists(values, "CLEONOS_CLKS_ENABLE_PROCFS", True) + _set_option_if_exists(values, "CLEONOS_CLKS_ENABLE_IDLE_DEBUG_LOG", True) + return + + if preset_name == "minimal": + _set_all_options(values, clks_options, True) + _set_all_options(values, user_options, False) + + clks_disable = [ + "CLEONOS_CLKS_ENABLE_AUDIO", + "CLEONOS_CLKS_ENABLE_MOUSE", + "CLEONOS_CLKS_ENABLE_DESKTOP", + "CLEONOS_CLKS_ENABLE_DRIVER_MANAGER", + "CLEONOS_CLKS_ENABLE_KELF", + "CLEONOS_CLKS_ENABLE_EXTERNAL_PSF", + "CLEONOS_CLKS_ENABLE_ELFRUNNER_PROBE", + "CLEONOS_CLKS_ENABLE_KLOGD_TASK", + "CLEONOS_CLKS_ENABLE_KWORKER_TASK", + "CLEONOS_CLKS_ENABLE_BOOT_VIDEO_LOG", + "CLEONOS_CLKS_ENABLE_PMM_STATS_LOG", + "CLEONOS_CLKS_ENABLE_HEAP_STATS_LOG", + "CLEONOS_CLKS_ENABLE_FS_ROOT_LOG", + "CLEONOS_CLKS_ENABLE_ELFRUNNER_INIT", + "CLEONOS_CLKS_ENABLE_SYSCALL_TICK_QUERY", + "CLEONOS_CLKS_ENABLE_TTY_READY_LOG", + "CLEONOS_CLKS_ENABLE_IDLE_DEBUG_LOG", + "CLEONOS_CLKS_ENABLE_USER_SYSTEM_APP_PROBE", + "CLEONOS_CLKS_ENABLE_SCHED_TASK_COUNT_LOG", + ] + for key in clks_disable: + _set_option_if_exists(values, key, False) + + clks_enable = [ + "CLEONOS_CLKS_ENABLE_KEYBOARD", + "CLEONOS_CLKS_ENABLE_USRD_TASK", + "CLEONOS_CLKS_ENABLE_USERLAND_AUTO_EXEC", + "CLEONOS_CLKS_ENABLE_HEAP_SELFTEST", + "CLEONOS_CLKS_ENABLE_SYSTEM_DIR_CHECK", + "CLEONOS_CLKS_ENABLE_PROCFS", + "CLEONOS_CLKS_ENABLE_EXEC_SERIAL_LOG", + "CLEONOS_CLKS_ENABLE_KBD_TTY_SWITCH_HOTKEY", + "CLEONOS_CLKS_ENABLE_KBD_CTRL_SHORTCUTS", + "CLEONOS_CLKS_ENABLE_KBD_FORCE_STOP_HOTKEY", + "CLEONOS_CLKS_ENABLE_USER_INIT_SCRIPT_PROBE", + "CLEONOS_CLKS_ENABLE_INTERRUPT_READY_LOG", + "CLEONOS_CLKS_ENABLE_SHELL_MODE_LOG", + ] + for key in clks_enable: + _set_option_if_exists(values, key, True) + + user_enable_tokens = [ + "SHELL", + "HELP", + "LS", + "CD", + "PWD", + "CAT", + "CLEAR", + "EXIT", + "EXEC", + "DMESG", + "TTY", + "PID", + "PS", + "KILL", + "JOBS", + "FG", + "BG", + "RESTART", + "SHUTDOWN", + "TTYDRV", + ] + for token in user_enable_tokens: + _set_option_if_exists(values, f"CLEONOS_USER_APP_{token}", True) + return + + raise RuntimeError(f"unknown preset: {preset}") + + def print_section(title: str, options: List[OptionItem], values: Dict[str, bool]) -> None: print() print(f"== {title} ==") @@ -1048,6 +1150,11 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--non-interactive", action="store_true", help="save config without opening interactive menu") parser.add_argument("--plain", action="store_true", help="use legacy plain-text menu instead of ncurses") parser.add_argument("--gui", action="store_true", help="use GUI window mode (PySide)") + parser.add_argument( + "--preset", + choices=["full", "minimal", "dev"], + help="apply a built-in preset before interactive edit or save", + ) parser.add_argument( "--set", action="append", @@ -1070,6 +1177,10 @@ def main() -> int: previous = load_previous_values() values = init_values(all_options, previous, use_defaults=args.defaults) + + if args.preset: + apply_preset(args.preset, clks_options, user_options, values) + parse_set_overrides(values, args.set) should_save = args.non_interactive