From 94a2450f32f809dde28454560046912ec69dc047 Mon Sep 17 00:00:00 2001 From: Brian Ignacio Date: Mon, 20 Jan 2025 15:34:20 +0800 Subject: [PATCH] get supported qemu targets from tools json --- src/IPackage.ts | 2 ++ src/qemu/qemuManager.ts | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/IPackage.ts b/src/IPackage.ts index 57a2ab825..c8b9a0d68 100644 --- a/src/IPackage.ts +++ b/src/IPackage.ts @@ -64,4 +64,6 @@ export interface IPackage { versions: IVersion[]; strip_container_dirs: number; + + supported_targets: string[]; } diff --git a/src/qemu/qemuManager.ts b/src/qemu/qemuManager.ts index e83dcc09d..bd1b72645 100644 --- a/src/qemu/qemuManager.ts +++ b/src/qemu/qemuManager.ts @@ -33,6 +33,7 @@ import { Logger } from "../logger/logger"; import { statusBarItems } from "../statusBar"; import { CommandKeys, createCommandDictionary } from "../cmdTreeView/cmdStore"; import { appendIdfAndToolsToPath, isBinInPath } from "../utils"; +import { IdfToolsManager } from "../idfToolsManager"; export enum QemuLaunchMode { Debug, @@ -142,20 +143,44 @@ export class QemuManager extends EventEmitter { return !!this.qemuTerminal; } + public async getQemuExecutable(idfPath: string) { + const idfToolsManagerInstance = await IdfToolsManager.createIdfToolsManager( + idfPath + ); + const packages = await idfToolsManagerInstance.getPackageList(["qemu-xtensa", "qemu-riscv32"]); + const xtensaPackage = packages.find((pkg) => { + return pkg.name === "qemu-xtensa"; + }); + const risvPackage = packages.find((pkg) => { + return pkg.name === "qemu-riscv32"; + }); + const qemuDictionary: { [key: string]: string } = {}; + for (const supportedTarget of xtensaPackage.supported_targets) { + qemuDictionary[supportedTarget] = xtensaPackage.version_cmd[0]; + } + for (const supportedTarget of risvPackage.supported_targets) { + qemuDictionary[supportedTarget] = risvPackage.version_cmd[0]; + } + // fallback for older versions + if (Object.keys(qemuDictionary).length === 0) { + qemuDictionary["esp32"] = "qemu-system-xtensa"; + qemuDictionary["esp32c3"] = "qemu-system-riscv32"; + } + return qemuDictionary; + } + public async start(mode: QemuLaunchMode, workspaceFolder: Uri) { if (this.isRunning()) { return; } const modifiedEnv = await appendIdfAndToolsToPath(workspaceFolder); - const qemuExecutable = - modifiedEnv.IDF_TARGET === "esp32" - ? "qemu-system-xtensa" - : modifiedEnv.IDF_TARGET === "esp32c3" - ? "qemu-system-riscv32" - : ""; + const qemuExecutableDict = await this.getQemuExecutable( + modifiedEnv.IDF_PATH + ); + const qemuExecutable = qemuExecutableDict[modifiedEnv.IDF_TARGET] || ""; if (!qemuExecutable) { throw new Error( - `${modifiedEnv.IDF_TARGET} is not supported by Espressif QEMU. Only esp32 or esp32c3 targets are supported.` + `${modifiedEnv.IDF_TARGET} is not supported by Espressif QEMU. Check ESP-IDF and QEMU version installed.` ); } const isQemuBinInPath = await isBinInPath(