From 69f4bbc7a60f5f76f264fa19557651c922dd7d72 Mon Sep 17 00:00:00 2001 From: Mykola Grymalyuk Date: Tue, 1 Aug 2023 13:24:02 -0600 Subject: [PATCH] Build: Add handling for ARM64 Python --- Build-Binary.command | 50 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/Build-Binary.command b/Build-Binary.command index df8ab6fe7..2df61ff3e 100755 --- a/Build-Binary.command +++ b/Build-Binary.command @@ -3,14 +3,15 @@ # Generate stand alone application for OpenCore-Patcher # Copyright (C) 2022-2023 - Mykola Grymalyuk -from pathlib import Path +import os +import sys import time import argparse -import os -import subprocess import plistlib -import time -import sys +import platform +import subprocess + +from pathlib import Path from resources import constants @@ -30,11 +31,13 @@ class CreateBinary: def __init__(self): start = time.time() - print("Starting build script") + self._set_cwd() + self._is_x86_64() + print("Starting build script") self.args = self._parse_arguments() - self._set_cwd() + print(f"Current Working Directory:\n- {os.getcwd()}") self._preflight_processes() self._build_binary() @@ -42,13 +45,44 @@ class CreateBinary: print(f"Build script completed in {str(round(time.time() - start, 2))} seconds") + def _is_x86_64(self): + """ + Check if invoked as x86_64 + Some of our dependancies are not universal, so we'll create a new virtual environment and invoke as Rosetta + """ + + if platform.machine() != "arm64": + return + + print("Detected ARM64, creating x86_64 environment") + + args = sys.argv[:] + if "python" in args[0].lower(): + args.pop(0) + + if not Path(".x86_64_venv").exists(): + print("Creating new venv") + subprocess.run(["arch", "-x86_64", sys.executable, "-m", "venv", ".x86_64_venv"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + print("Installing requirements") + subprocess.run(["arch", "-x86_64", ".x86_64_venv/bin/pip3", "install", "-r", "requirements.txt"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + print("Relaunching as x86_64") + result = subprocess.run(["arch", "-x86_64", ".x86_64_venv/bin/python3"] + args) + + if result.returncode != 0: + if result.stdout: + print("STDOUT: " + result.stdout.decode("utf-8")) + if result.stderr: + print("STDERR: " + result.stderr.decode("utf-8")) + sys.exit(result.returncode) + + def _set_cwd(self): """ Initialize current working directory to parent of this script """ os.chdir(Path(__file__).resolve().parent) - print(f"Current Working Directory:\n- {os.getcwd()}") def _parse_arguments(self):