From 20885afe04380825b7b47573542c811e1826dcc3 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 9 Nov 2026 21:53:50 +0100 Subject: [PATCH] fix: keep the cores knulli's retroarch installs KNULLI's RetroArch is Batocera's build with its core downloader on. Its armv7 hard-float boards (atm7039, r16, rk3128) fetch from buildbot linux/armhf: atm7039's shipped retroarch.cfg hides the menu entry but leaves the URL, and Settings offers the entry back. Its aarch64 boards get no buildbot URL. ecwolf, squirreljme, stella2014 and vemulator come back as installable cores, and openmsx, which no buildbot list carries, stays out. --- install/targets/knulli.json | 164 ++++++++++++++++++++++++++++++ platforms/knulli.yml | 51 ++++++++++ platforms/targets/knulli.yml | 5 +- scripts/scraper/knulli_scraper.py | 7 +- tests/test_target_scrapers.py | 3 +- 5 files changed, 227 insertions(+), 3 deletions(-) diff --git a/install/targets/knulli.json b/install/targets/knulli.json index 533167e6b..89a0b6bda 100644 --- a/install/targets/knulli.json +++ b/install/targets/knulli.json @@ -321,26 +321,43 @@ }, "atm7039": { "cores": [ + "2048", "81", "a5200", "abuse", "arduous", "atari800", "bennugd", + "bk", "bluemsx", + "bsnes_cplusplus98", + "bsnes_mercury_accuracy", + "bsnes_mercury_balanced", + "bsnes_mercury_performance", "bstone", "cannonball", "cap32", "cdogs", "cgenius", + "chailove", + "crocods", "devilutionx", + "dinothawr", + "dosbox_core", "dosbox_pure", "dosbox_staging", + "dosbox_svn", + "dosbox_svn_ce", "easyrpg", + "ecwolf", "emuscv", "fake08", "fallout1-ce", "fallout2-ce", + "fbalpha2012", + "fbalpha2012_cps1", + "fbalpha2012_cps2", + "fbalpha2012_neogeo", "fbneo", "fceumm", "flycast", @@ -349,37 +366,56 @@ "freeintv", "fuse", "gambatte", + "gearboy", "gearsystem", + "genesis_plus_gx", "genesisplusgx", "geolith", + "gme", + "gpsp", "gsplus", "gw", "handy", "hatari", "hcl", + "higan_sfc", + "higan_sfc_balanced", "holani", "hurrican", "ioquake3", "lowresnx", "lutro", + "mame", "mame0139", "mame078plus", + "mame2000", + "mame2003", + "mame2003_plus", + "mednafen_gba", "mednafen_lynx", "mednafen_ngp", + "mednafen_pce", + "mednafen_pce_fast", "mednafen_psx", + "mednafen_snes", "mednafen_supergrafx", + "mednafen_vb", "mednafen_wswan", + "mesen", "mgba", "minivmac", "moonlight", "mrboom", + "mu", "mupen64plus", "mupen64plus-next", + "nekop2", "neocd", "nestopia", "np2kai", "nxengine", "o2em", + "oberon", "openbor", "openbor4432", "openbor6412", @@ -392,6 +428,7 @@ "pcfx", "pcsx_rearmed", "picodrive", + "pocketcdg", "pokemini", "potator", "ppsspp", @@ -402,22 +439,34 @@ "px68k", "pygame", "quasi88", + "quicknes", + "reminiscence", + "remotejoy", "samcoupe", + "sameboy", "sameduck", "scummvm", "sdlpop", "smsplus", "snes9x", + "snes9x2002", + "snes9x2005", + "snes9x2005_plus", + "snes9x2010", "snes9x_next", "solarus", "sonic2013", "soniccd", + "squirreljme", "stella", + "stella2014", "superbroswar", "swanstation", "taradino", + "test", "tgbdual", "theodore", + "thepowdertoy", "tic80", "tyrian", "tyrquake", @@ -425,15 +474,21 @@ "uzem", "vb", "vba-m", + "vba_next", + "vbam", "vecx", + "vemulator", "vice", "vice_x128", "vice_x64", "vice_x64sc", + "vice_xcbm2", + "vice_xcbm5x0", "vice_xpet", "vice_xplus4", "vice_xscpu64", "vice_xvic", + "virtualjaguar", "x1", "x128", "x16emu", @@ -620,6 +675,7 @@ }, "r16": { "cores": [ + "2048", "81", "a5200", "abuse", @@ -627,20 +683,36 @@ "arduous", "atari800", "bennugd", + "bk", "bluemsx", + "bsnes_cplusplus98", + "bsnes_mercury_accuracy", + "bsnes_mercury_balanced", + "bsnes_mercury_performance", "bstone", "cannonball", "cap32", "cdogs", "cgenius", + "chailove", + "crocods", "devilutionx", + "dinothawr", + "dosbox_core", "dosbox_pure", "dosbox_staging", + "dosbox_svn", + "dosbox_svn_ce", "easyrpg", + "ecwolf", "emuscv", "fake08", "fallout1-ce", "fallout2-ce", + "fbalpha2012", + "fbalpha2012_cps1", + "fbalpha2012_cps2", + "fbalpha2012_neogeo", "fbneo", "fceumm", "flycast", @@ -649,37 +721,56 @@ "freeintv", "fuse", "gambatte", + "gearboy", "gearsystem", + "genesis_plus_gx", "genesisplusgx", "geolith", + "gme", + "gpsp", "gsplus", "gw", "handy", "hatari", "hcl", + "higan_sfc", + "higan_sfc_balanced", "holani", "hurrican", "ioquake3", "lowresnx", "lutro", + "mame", "mame0139", "mame078plus", + "mame2000", + "mame2003", + "mame2003_plus", + "mednafen_gba", "mednafen_lynx", "mednafen_ngp", + "mednafen_pce", + "mednafen_pce_fast", "mednafen_psx", + "mednafen_snes", "mednafen_supergrafx", + "mednafen_vb", "mednafen_wswan", + "mesen", "mgba", "minivmac", "moonlight", "mrboom", + "mu", "mupen64plus", "mupen64plus-next", + "nekop2", "neocd", "nestopia", "np2kai", "nxengine", "o2em", + "oberon", "openbor", "openbor4432", "openbor6412", @@ -692,6 +783,7 @@ "pcfx", "pcsx_rearmed", "picodrive", + "pocketcdg", "pokemini", "potator", "ppsspp", @@ -702,22 +794,34 @@ "px68k", "pygame", "quasi88", + "quicknes", + "reminiscence", + "remotejoy", "samcoupe", + "sameboy", "sameduck", "scummvm", "sdlpop", "smsplus", "snes9x", + "snes9x2002", + "snes9x2005", + "snes9x2005_plus", + "snes9x2010", "snes9x_next", "solarus", "sonic2013", "soniccd", + "squirreljme", "stella", + "stella2014", "superbroswar", "swanstation", "taradino", + "test", "tgbdual", "theodore", + "thepowdertoy", "tic80", "tyrian", "tyrquake", @@ -725,15 +829,21 @@ "uzem", "vb", "vba-m", + "vba_next", + "vbam", "vecx", + "vemulator", "vice", "vice_x128", "vice_x64", "vice_x64sc", + "vice_xcbm2", + "vice_xcbm5x0", "vice_xpet", "vice_xplus4", "vice_xscpu64", "vice_xvic", + "virtualjaguar", "x1", "x128", "x16emu", @@ -752,6 +862,7 @@ }, "rk3128": { "cores": [ + "2048", "81", "a5200", "abuse", @@ -759,21 +870,37 @@ "arduous", "atari800", "bennugd", + "bk", "bluemsx", + "bsnes_cplusplus98", + "bsnes_mercury_accuracy", + "bsnes_mercury_balanced", + "bsnes_mercury_performance", "bstone", "cannonball", "cap32", "cdogs", "cgenius", + "chailove", + "crocods", "devilutionx", + "dinothawr", + "dosbox_core", "dosbox_pure", "dosbox_staging", + "dosbox_svn", + "dosbox_svn_ce", "easyrpg", + "ecwolf", "emuscv", "fake08", "fallout1-ce", "fallout2-ce", "fbalpha", + "fbalpha2012", + "fbalpha2012_cps1", + "fbalpha2012_cps2", + "fbalpha2012_neogeo", "fbneo", "fceumm", "flycast", @@ -782,37 +909,55 @@ "freeintv", "fuse", "gambatte", + "gearboy", "gearsystem", + "genesis_plus_gx", "genesisplusgx", "geolith", + "gme", "gpsp", "gsplus", "gw", "handy", "hatari", "hcl", + "higan_sfc", + "higan_sfc_balanced", "holani", "hurrican", "lightspark", "lowresnx", "lutro", + "mame", "mame0139", "mame078plus", + "mame2000", + "mame2003", + "mame2003_plus", + "mednafen_gba", "mednafen_lynx", "mednafen_ngp", + "mednafen_pce", + "mednafen_pce_fast", "mednafen_psx", + "mednafen_snes", "mednafen_supergrafx", + "mednafen_vb", "mednafen_wswan", + "mesen", "mgba", "minivmac", "mrboom", + "mu", "mupen64plus", "mupen64plus-next", + "nekop2", "neocd", "nestopia", "np2kai", "nxengine", "o2em", + "oberon", "openbor", "openbor4432", "openbor6412", @@ -825,6 +970,7 @@ "pcfx", "pcsx_rearmed", "picodrive", + "pocketcdg", "pokemini", "potator", "ppsspp", @@ -835,22 +981,34 @@ "px68k", "pygame", "quasi88", + "quicknes", + "reminiscence", + "remotejoy", "samcoupe", + "sameboy", "sameduck", "scummvm", "sdlpop", "smsplus", "snes9x", + "snes9x2002", + "snes9x2005", + "snes9x2005_plus", + "snes9x2010", "snes9x_next", "solarus", "sonic2013", "soniccd", + "squirreljme", "stella", + "stella2014", "superbroswar", "swanstation", "taradino", + "test", "tgbdual", "theodore", + "thepowdertoy", "tic80", "tyrian", "tyrquake", @@ -858,15 +1016,21 @@ "uzem", "vb", "vba-m", + "vba_next", + "vbam", "vecx", + "vemulator", "vice", "vice_x128", "vice_x64", "vice_x64sc", + "vice_xcbm2", + "vice_xcbm5x0", "vice_xpet", "vice_xplus4", "vice_xscpu64", "vice_xvic", + "virtualjaguar", "x1", "x128", "x16emu", diff --git a/platforms/knulli.yml b/platforms/knulli.yml index c6923e911..dd5b3eff2 100644 --- a/platforms/knulli.yml +++ b/platforms/knulli.yml @@ -4907,6 +4907,57 @@ dual_mode_cores: - scummvm - stella - yabasanshiro +installable_cores: +- "2048" +- bk +- bsnes_cplusplus98 +- bsnes_mercury_accuracy +- bsnes_mercury_balanced +- bsnes_mercury_performance +- chailove +- crocods +- dinothawr +- dosbox_core +- dosbox_svn +- dosbox_svn_ce +- ecwolf +- fbalpha2012 +- fbalpha2012_cps1 +- fbalpha2012_cps2 +- fbalpha2012_neogeo +- gearboy +- genesis_plus_gx +- gme +- higan_sfc +- higan_sfc_balanced +- mame2000 +- mame2003 +- mame2003_plus +- mednafen_gba +- mednafen_pce +- mednafen_pce_fast +- mednafen_snes +- mednafen_vb +- mu +- nekop2 +- oberon +- pocketcdg +- quicknes +- remotejoy +- sameboy +- snes9x2002 +- snes9x2005 +- snes9x2005_plus +- snes9x2010 +- squirreljme +- stella2014 +- test +- thepowdertoy +- vba_next +- vbam +- vemulator +- vice_xcbm2 +- vice_xcbm5x0 libretro_systems: "81": - zx81 diff --git a/platforms/targets/knulli.yml b/platforms/targets/knulli.yml index c98caaf92..d18ca9335 100644 --- a/platforms/targets/knulli.yml +++ b/platforms/targets/knulli.yml @@ -1,6 +1,6 @@ platform: knulli source: https://github.com/knulli-cfw/knulli-linux/tree/20260511 -scraped_at: '2026-11-06T02:19:00Z' +scraped_at: '2026-11-09T20:38:23Z' targets: a133: architecture: aarch64 @@ -472,6 +472,7 @@ targets: - zc210 images: - rg35xx + downloads: linux-armhf h700: architecture: aarch64 cores: @@ -787,6 +788,7 @@ targets: - zc210 images: - miyoo-a30 + downloads: linux-armhf rk3128: architecture: arm cores: @@ -930,6 +932,7 @@ targets: - powkiddy_a13 - ps5000 - ps7000 + downloads: linux-armhf rk3326: architecture: aarch64 cores: diff --git a/scripts/scraper/knulli_scraper.py b/scripts/scraper/knulli_scraper.py index f94f56704..0522ae53a 100644 --- a/scripts/scraper/knulli_scraper.py +++ b/scripts/scraper/knulli_scraper.py @@ -42,6 +42,7 @@ from .batocera_scraper import ( es_systems_by_system, es_systems_libretro_systems, extract_systems_dict, + installable_cores, platform_systems, records_run, requirements_from_systems, @@ -136,9 +137,11 @@ class Scraper(BaseScraper): # What runs is what at least one board builds, read by the targets # scraper from the Kconfig of KNULLI's tree and its batocera and # buildroot submodules (boards_build). - built = boards_build(BoardTargets().build_selection(self.tag), launchers) + selection = BoardTargets().build_selection(self.tag) + built = boards_build(selection, launchers) launchers = records_run(launchers, built) cores, standalone, dual = configgen_cores(defaults, es_systems, dropped, built) + installable = installable_cores(selection, cores) # Each system's own list (psx, es_systems.yml:640-653: libretro # pcsx_rearmed, swanstation, mednafen_psx, then duckstation and # duckstation-legacy). @@ -160,6 +163,8 @@ class Scraper(BaseScraper): result["standalone_cores"] = standalone if dual: result["dual_mode_cores"] = dual + if installable: + result["installable_cores"] = installable # configgen hands a libretro core /userdata/saves/, as # Batocera's does: the systems each core runs for are its save folders. result["libretro_systems"] = es_systems_libretro_systems(es_systems, dropped) diff --git a/tests/test_target_scrapers.py b/tests/test_target_scrapers.py index 23571eb7c..8c17df288 100644 --- a/tests/test_target_scrapers.py +++ b/tests/test_target_scrapers.py @@ -280,6 +280,7 @@ class CoreDownloaderReach(unittest.TestCase): self.assertLessEqual(x86, set(load_target_config("batocera", "x86_64", root) or ())) self.assertLessEqual(armhf, set(load_target_config("batocera", "rk3288", root) or ())) self.assertFalse(x86 <= set(load_target_config("batocera", "bcm2711", root) or ())) + self.assertLessEqual(armhf, set(load_target_config("knulli", "r16", root) or ())) def test_the_platform_names_what_its_boards_install(self): import yaml # noqa: PLC0415 @@ -287,7 +288,7 @@ class CoreDownloaderReach(unittest.TestCase): from common import load_target_config # noqa: PLC0415 root = str(REPO_ROOT / "platforms") - for platform in ("batocera",): + for platform in ("batocera", "knulli"): config = yaml.safe_load((REPO_ROOT / "platforms" / f"{platform}.yml").read_text()) targets = yaml.safe_load( (REPO_ROOT / "platforms" / "targets" / f"{platform}.yml").read_text())["targets"]