Update build to run qemu on MacOS
This commit is contained in:
+39
-2
@@ -35,8 +35,26 @@ ARCHES = {
|
||||
"x86_64": {
|
||||
"zig_flags": [], # build.zig currently pins the kernel to x86_64
|
||||
"qemu": "qemu-system-x86_64",
|
||||
"ovmf_code": "/usr/share/edk2/x64/OVMF_CODE.4m.fd",
|
||||
"ovmf_vars": "/usr/share/edk2/x64/OVMF_VARS.4m.fd",
|
||||
# Firmware lives in different places per OS/distro; resolve_firmware()
|
||||
# picks the first that exists so the harness runs unconfigured on Arch,
|
||||
# Debian/Ubuntu, Fedora, and macOS (Homebrew). Override by reordering or
|
||||
# dropping an absolute path at the front.
|
||||
"ovmf_code": [
|
||||
"/usr/share/edk2/x64/OVMF_CODE.4m.fd", # Arch
|
||||
"/usr/share/OVMF/OVMF_CODE_4M.fd", # Debian/Ubuntu
|
||||
"/usr/share/OVMF/OVMF_CODE.fd", # older Debian/Ubuntu
|
||||
"/usr/share/edk2-ovmf/x64/OVMF_CODE.fd", # Fedora
|
||||
"/opt/homebrew/share/qemu/edk2-x86_64-code.fd", # macOS Homebrew (Apple Silicon)
|
||||
"/usr/local/share/qemu/edk2-x86_64-code.fd", # macOS Homebrew (Intel)
|
||||
],
|
||||
"ovmf_vars": [
|
||||
"/usr/share/edk2/x64/OVMF_VARS.4m.fd", # Arch
|
||||
"/usr/share/OVMF/OVMF_VARS_4M.fd", # Debian/Ubuntu
|
||||
"/usr/share/OVMF/OVMF_VARS.fd", # older Debian/Ubuntu
|
||||
"/usr/share/edk2-ovmf/x64/OVMF_VARS.fd", # Fedora
|
||||
"/opt/homebrew/share/qemu/edk2-i386-vars.fd", # macOS Homebrew (Apple Silicon)
|
||||
"/usr/local/share/qemu/edk2-i386-vars.fd", # macOS Homebrew (Intel)
|
||||
],
|
||||
"efi_app": ("EFI/BOOT/BOOTX64.efi", "BOOTX64.efi"), # (dest in ESP, name in zig-out/bin)
|
||||
"kernel": ("danos", "danos"),
|
||||
# Built as a function so we can splice in per-run paths.
|
||||
@@ -123,6 +141,24 @@ def make_esp(arch):
|
||||
return esp
|
||||
|
||||
|
||||
def resolve_firmware(arch):
|
||||
"""Collapse the ovmf_code/ovmf_vars candidate lists to the first path that
|
||||
exists on this machine. Mutates `arch` in place; idempotent (a resolved
|
||||
string is left untouched). Exits with a clear message if none is found."""
|
||||
for key, label in (("ovmf_code", "OVMF_CODE"), ("ovmf_vars", "OVMF_VARS")):
|
||||
val = arch[key]
|
||||
if isinstance(val, str):
|
||||
continue # already resolved on a previous call
|
||||
for cand in val:
|
||||
if os.path.exists(cand):
|
||||
arch[key] = cand
|
||||
break
|
||||
else:
|
||||
sys.exit(f"error: no {label} firmware image found; looked in:\n "
|
||||
+ "\n ".join(val)
|
||||
+ "\nInstall OVMF (edk2-ovmf / ovmf) or add its path above.")
|
||||
|
||||
|
||||
def run_case(arch, case):
|
||||
err = build(arch, case["name"])
|
||||
if err:
|
||||
@@ -176,6 +212,7 @@ def main():
|
||||
if not shutil.which(arch["qemu"]):
|
||||
print(f"error: {arch['qemu']} not found on PATH", file=sys.stderr)
|
||||
return 2
|
||||
resolve_firmware(arch)
|
||||
|
||||
selected = [c for c in CASES if not args.cases or c["name"] in args.cases]
|
||||
os.makedirs(WORK, exist_ok=True)
|
||||
|
||||
Reference in New Issue
Block a user