diff --git a/OpCore-Simplify.py b/OpCore-Simplify.py index dc59985..a62c97c 100644 --- a/OpCore-Simplify.py +++ b/OpCore-Simplify.py @@ -1,7 +1,7 @@ from Scripts.datasets import os_data from Scripts import acpi_guru from Scripts import compatibility_checker -from Scripts import efi_builder +from Scripts import config_prodigy from Scripts import gathering_files from Scripts import kext_maestro from Scripts import smbios @@ -10,7 +10,9 @@ import updater import os import sys import re +import shutil import traceback +import time class OCPE: def __init__(self): @@ -18,7 +20,7 @@ class OCPE: self.o = gathering_files.gatheringFiles() self.ac = acpi_guru.ACPIGuru() self.c = compatibility_checker.CompatibilityChecker() - self.b = efi_builder.builder() + self.co = config_prodigy.ConfigProdigy() self.k = kext_maestro.KextMaestro() self.s = smbios.SMBIOS() self.u = utils.Utils() @@ -79,6 +81,113 @@ class OCPE: if self.u.parse_darwin_version(supported_macos_version[0]) <= self.u.parse_darwin_version(target_version) <= self.u.parse_darwin_version(supported_macos_version[-1]): return target_version + + def build_opencore_efi(self, hardware_report, unsupported_devices, smbios_model, macos_version): + self.u.head("Building OpenCore EFI") + print("") + print("1. Copy EFI base to results folder...", end=" ") + self.u.create_folder(self.result_dir, remove_content=True) + + if not os.path.exists(self.k.ock_files_dir): + raise Exception("Directory '{}' does not exist.".format(self.k.ock_files_dir)) + + source_efi_dir = os.path.join(self.k.ock_files_dir, "OpenCore") + shutil.copytree(source_efi_dir, self.result_dir, dirs_exist_ok=True) + print("Done") + print("2. Generate config.plist...", end=" ") + config_file = os.path.join(self.result_dir, "EFI", "OC", "config.plist") + config_data = self.u.read_file(config_file) + + if not config_data: + raise Exception("Error: The file {} does not exist.".format(config_file)) + + self.co.genarate(hardware_report, unsupported_devices, smbios_model, macos_version, self.k.kexts, config_data) + print("Done") + print("3. Apply ACPI patches...", end=" ") + self.ac.hardware_report = hardware_report + self.ac.unsupported_devices = unsupported_devices + self.ac.acpi_directory = os.path.join(self.result_dir, "EFI", "OC", "ACPI") + self.ac.smbios_model = smbios_model + self.ac.get_low_pin_count_bus_device() + + for patch in self.ac.patches: + if patch.checked: + if patch.name == "BATP": + patch.checked = getattr(self.ac, patch.function_name)() + continue + + acpi_load = getattr(self.ac, patch.function_name)() + + if not isinstance(acpi_load, dict): + continue + + config_data["ACPI"]["Add"].extend(acpi_load.get("Add", [])) + config_data["ACPI"]["Delete"].extend(acpi_load.get("Delete", [])) + config_data["ACPI"]["Patch"].extend(acpi_load.get("Patch", [])) + + config_data["ACPI"]["Patch"] = self.ac.apply_acpi_patches(config_data["ACPI"]["Patch"]) + print("Done") + print("4. Copy kexts and snapshot to config.plist...", end=" ") + kexts_directory = os.path.join(self.result_dir, "EFI", "OC", "Kexts") + self.k.install_kexts_to_efi(macos_version, kexts_directory) + config_data["Kernel"]["Add"] = self.k.load_kexts(macos_version, kexts_directory) + + self.u.write_file(config_file, config_data) + print("Done") + print("5. Clean up unused drivers, resources, and tools...", end=" ") + files_to_remove = [] + + drivers_directory = os.path.join(self.result_dir, "EFI", "OC", "Drivers") + driver_list = self.u.find_matching_paths(drivers_directory, extension_filter=".efi") + driver_loaded = [kext.get("Path") for kext in config_data.get("UEFI").get("Drivers")] + for driver_path, type in driver_list: + if not driver_path in driver_loaded: + files_to_remove.append(os.path.join(drivers_directory, driver_path)) + + resources_audio_dir = os.path.join(self.result_dir, "EFI", "OC", "Resources", "Audio") + if os.path.exists(resources_audio_dir): + files_to_remove.append(resources_audio_dir) + + picker_variant = config_data.get("Misc", {}).get("Boot", {}).get("PickerVariant") + if picker_variant in (None, "Auto"): + picker_variant = "Acidanthera/GoldenGate" + if os.name == "nt": + picker_variant = picker_variant.replace("/", "\\") + + resources_image_dir = os.path.join(self.result_dir, "EFI", "OC", "Resources", "Image") + available_picker_variants = self.u.find_matching_paths(resources_image_dir, type_filter="dir") + + for variant_name, variant_type in available_picker_variants: + variant_path = os.path.join(resources_image_dir, variant_name) + if ".icns" in ", ".join(os.listdir(variant_path)): + if picker_variant not in variant_name: + files_to_remove.append(variant_path) + + tools_directory = os.path.join(self.result_dir, "EFI", "OC", "Tools") + tool_list = self.u.find_matching_paths(tools_directory, extension_filter=".efi") + tool_loaded = [tool.get("Path") for tool in config_data.get("Misc").get("Tools")] + for tool_path, type in tool_list: + if not tool_path in tool_loaded: + files_to_remove.append(os.path.join(tools_directory, tool_path)) + + removal_error = None + for file_path in files_to_remove: + try: + if os.path.isdir(file_path): + shutil.rmtree(file_path) + else: + os.remove(file_path) + except Exception as e: + removal_error = True + print("Failed to remove file: {}".format(e)) + + if removal_error: + print("") + + print("Done") + print("") + print("OpenCore EFI build complete.") + time.sleep(2) def results(self, hardware_report, smbios_model): self.u.head("Results") @@ -176,7 +285,7 @@ class OCPE: self.k.select_required_kexts(hardware_report, smbios_model, macos_version, self.ac.patches) elif option == 6: self.gathering_files() - self.b.build_efi(hardware_report, unsupported_devices, smbios_model, macos_version, self.ac, self.k) + self.build_opencore_efi(hardware_report, unsupported_devices, smbios_model, macos_version) self.results(hardware_report, smbios_model) if __name__ == '__main__': diff --git a/Scripts/efi_builder.py b/Scripts/efi_builder.py deleted file mode 100644 index 8e38752..0000000 --- a/Scripts/efi_builder.py +++ /dev/null @@ -1,95 +0,0 @@ -from Scripts import config_prodigy -from Scripts import kext_maestro -from Scripts import utils -import os -import shutil -import re - -class builder: - def __init__(self): - self.config = config_prodigy.ConfigProdigy() - self.kext = kext_maestro.KextMaestro() - self.utils = utils.Utils() - - def clean_up(self, config, efi_directory): - files_to_remove = [] - - drivers_directory = os.path.join(efi_directory, "EFI", "OC", "Drivers") - driver_list = self.utils.find_matching_paths(drivers_directory, extension_filter=".efi") - driver_loaded = [kext.get("Path") for kext in config.get("UEFI").get("Drivers")] - for driver_path, type in driver_list: - if not driver_path in driver_loaded: - files_to_remove.append(os.path.join(drivers_directory, driver_path)) - - tools_directory = os.path.join(efi_directory, "EFI", "OC", "Tools") - tool_list = self.utils.find_matching_paths(tools_directory, extension_filter=".efi") - tool_loaded = [tool.get("Path") for tool in config.get("Misc").get("Tools")] - for tool_path, type in tool_list: - if not tool_path in tool_loaded: - files_to_remove.append(os.path.join(tools_directory, tool_path)) - - error = None - for path in files_to_remove: - try: - if os.path.isdir(path): - shutil.rmtree(path) - else: - os.remove(path) - except Exception as e: - error = True - print("\nFailed to remove file: {}".format(e), end="") - continue - - if error: - print("") - self.utils.request_input() - - def build_efi(self, hardware_report, unsupported_devices, smbios_model, macos_version, acpi_guru, kext_maestro): - efi_directory = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "Results") - - self.utils.create_folder(efi_directory, remove_content=True) - - if not os.path.exists(self.kext.ock_files_dir): - raise Exception("Directory '{}' does not exist.".format(self.kext.ock_files_dir)) - - source_efi_dir = os.path.join(self.kext.ock_files_dir, "OpenCore") - shutil.copytree(source_efi_dir, efi_directory, dirs_exist_ok=True) - - config_file = os.path.join(efi_directory, "EFI", "OC", "config.plist") - config_data = self.utils.read_file(config_file) - - if not config_data: - raise Exception("Error: The file {} does not exist.".format(config_file)) - - self.config.genarate(hardware_report, unsupported_devices, smbios_model, macos_version, kext_maestro.kexts, config_data) - - acpi_guru.hardware_report = hardware_report - acpi_guru.unsupported_devices = unsupported_devices - acpi_guru.acpi_directory = os.path.join(efi_directory, "EFI", "OC", "ACPI") - acpi_guru.smbios_model = smbios_model - acpi_guru.get_low_pin_count_bus_device() - - for patch in acpi_guru.patches: - if patch.checked: - if patch.name == "BATP": - patch.checked = getattr(acpi_guru, patch.function_name)() - continue - - acpi_load = getattr(acpi_guru, patch.function_name)() - - if not isinstance(acpi_load, dict): - continue - - config_data["ACPI"]["Add"].extend(acpi_load.get("Add", [])) - config_data["ACPI"]["Delete"].extend(acpi_load.get("Delete", [])) - config_data["ACPI"]["Patch"].extend(acpi_load.get("Patch", [])) - - config_data["ACPI"]["Patch"] = acpi_guru.apply_acpi_patches(config_data["ACPI"]["Patch"]) - - kexts_directory = os.path.join(efi_directory, "EFI", "OC", "Kexts") - kext_maestro.install_kexts_to_efi(macos_version, kexts_directory) - config_data["Kernel"]["Add"] = kext_maestro.load_kexts(macos_version, kexts_directory) - - self.utils.write_file(config_file, config_data) - - self.clean_up(config_data, efi_directory) \ No newline at end of file