├── macOS Virtual Machine ├── Assets.xcassets │ ├── Contents.json │ ├── AccentColor.colorset │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── VirtualMac2,1.ipsw ├── AppDelegate.swift ├── macOS Virtual Machine.entitlements ├── ViewController.swift └── Base.lproj │ └── Main.storyboard ├── .gitignore ├── README.md └── macOS Virtual Machine.xcodeproj └── project.pbxproj /macOS Virtual Machine/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /macOS Virtual Machine/VirtualMac2,1.ipsw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ming900518/macOS-Virtual-Machine/HEAD/macOS Virtual Machine/VirtualMac2,1.ipsw -------------------------------------------------------------------------------- /macOS Virtual Machine/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /macOS Virtual Machine/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // macOS Virtual Machine 4 | // 5 | // Created by Ming Chang on 6/29/21. 6 | // 7 | 8 | import Cocoa 9 | 10 | @main 11 | class AppDelegate: NSObject, NSApplicationDelegate { 12 | 13 | 14 | 15 | 16 | func applicationDidFinishLaunching(_ aNotification: Notification) { 17 | // Insert code here to initialize your application 18 | } 19 | 20 | func applicationWillTerminate(_ aNotification: Notification) { 21 | // Insert code here to tear down your application 22 | } 23 | 24 | func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { 25 | return true 26 | } 27 | 28 | 29 | } 30 | 31 | -------------------------------------------------------------------------------- /macOS Virtual Machine/macOS Virtual Machine.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.device.audio-input 8 | 9 | com.apple.security.device.bluetooth 10 | 11 | com.apple.security.device.camera 12 | 13 | com.apple.security.device.usb 14 | 15 | com.apple.security.files.downloads.read-write 16 | 17 | com.apple.security.files.user-selected.read-write 18 | 19 | com.apple.security.network.client 20 | 21 | com.apple.security.network.server 22 | 23 | com.apple.security.print 24 | 25 | com.apple.security.virtualization 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /macOS Virtual Machine/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "scale" : "1x", 6 | "size" : "16x16" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "scale" : "2x", 11 | "size" : "16x16" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "scale" : "1x", 16 | "size" : "32x32" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "scale" : "2x", 21 | "size" : "32x32" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "scale" : "1x", 26 | "size" : "128x128" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "scale" : "2x", 31 | "size" : "128x128" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "scale" : "1x", 36 | "size" : "256x256" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "scale" : "2x", 41 | "size" : "256x256" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "scale" : "1x", 46 | "size" : "512x512" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "scale" : "2x", 51 | "size" : "512x512" 52 | } 53 | ], 54 | "info" : { 55 | "author" : "xcode", 56 | "version" : 1 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/macos,xcode 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=macos,xcode 4 | 5 | ### macOS ### 6 | # General 7 | .DS_Store 8 | .AppleDouble 9 | .LSOverride 10 | 11 | # Icon must end with two \r 12 | Icon 13 | 14 | 15 | # Thumbnails 16 | ._* 17 | 18 | # Files that might appear in the root of a volume 19 | .DocumentRevisions-V100 20 | .fseventsd 21 | .Spotlight-V100 22 | .TemporaryItems 23 | .Trashes 24 | .VolumeIcon.icns 25 | .com.apple.timemachine.donotpresent 26 | 27 | # Directories potentially created on remote AFP share 28 | .AppleDB 29 | .AppleDesktop 30 | Network Trash Folder 31 | Temporary Items 32 | .apdisk 33 | 34 | ### Xcode ### 35 | # Xcode 36 | # 37 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 38 | 39 | ## User settings 40 | xcuserdata/ 41 | 42 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 43 | *.xcscmblueprint 44 | *.xccheckout 45 | 46 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 47 | build/ 48 | DerivedData/ 49 | *.moved-aside 50 | *.pbxuser 51 | !default.pbxuser 52 | *.mode1v3 53 | !default.mode1v3 54 | *.mode2v3 55 | !default.mode2v3 56 | *.perspectivev3 57 | !default.perspectivev3 58 | 59 | ## Gcc Patch 60 | /*.gcno 61 | 62 | ### Xcode Patch ### 63 | *.xcodeproj/* 64 | !*.xcodeproj/project.pbxproj 65 | !*.xcodeproj/xcshareddata/ 66 | !*.xcworkspace/contents.xcworkspacedata 67 | **/xcshareddata/WorkspaceSettings.xcsettings 68 | 69 | # End of https://www.toptal.com/developers/gitignore/api/macos,xcode 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # macOS Virtual Machine 2 | 3 |
4 | 5 | Use [VirtualApple edited by me](https://github.com/ming900518/VirtualApple), [VirtualApple](https://github.com/saagarjha/VirtualApple) or [MacVM](https://github.com/KhaosT/MacVM) instead if you want a much stable experience. 6 | 7 |
8 | 9 | A ARM macOS Virtual Machine, using macOS 12's new Virtualization framework. 10 | I copied KhaosT's code from [here](https://gist.github.com/KhaosT/fb0499130bbfcb5754d2174e78cb68b9), all I did is change some path, add some entitlements and add a simple GUI. 11 | 12 |

I successfully created a macOS 12 Virtual Machine!
Thanks @KhaosT for sharing his code, he make this possible. pic.twitter.com/nDD5IMzhlb

— Ming Chang (@mingchang137) June 29, 2021
13 | 14 | Screen Shot 2021-06-30 at 3 04 50 PM 15 | 16 | ### Requirements 17 | - Apple Silicon Mac (running macOS 12) 18 | - Xcode 13 19 | - Apple Configurator 2 20 | - macOS 12 IPSW 21 | - a empty dmg image (This will be your system storage, name it disk.dmg, you can create it from Disk Utility) 22 | 23 | ### First Time Setup 24 | 25 | 1. Clone this project 26 | 2. Run (This project works on my Mac but might not run on yours) 27 | 3. Quit the app when "Virtual Machine" window showed up, move disk.dmg into the app's container 28 | 4. Run it again 29 | 5. Open Apple Configurator 2, if everything works, There should have a VirtualMac in DFU mode 30 | 6. Temporary disable macOS Firewall and iCloud Private Relay (Apple Configurator 2 can't restore VM with those features enabled) 31 | 7. Drag macOS 12 IPSW file into Apple Configurator 2, click Restore to install macOS 32 | 8. When it's done, you should see a purple window greeting to you. Bon Appétit! 33 | 34 | ### It's not working / Apple Configurator 2 keeps failing! 35 | 36 | Try removing aux.img in the app's container, restart the app and using "Start Virtual Machine Manually" function in the menu bar before restoring. 37 | 38 | Special thanks to [KhaosT](https://github.com/KhaosT), his code make this possible, here is the [project](https://github.com/KhaosT/MacVM) made by him, provides better GUI. 39 | -------------------------------------------------------------------------------- /macOS Virtual Machine/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // macOS Virtual Machine 4 | // 5 | // Created by Khaos Tian on 6/8/21. 6 | // Modified by Ming Chang on 6/29/21. 7 | // 8 | 9 | import Cocoa 10 | import Virtualization 11 | 12 | class ViewController: NSViewController, VZVirtualMachineDelegate { 13 | 14 | private var virtualMachine: VZVirtualMachine? 15 | 16 | override func loadView() { 17 | let view = VZVirtualMachineView() 18 | view.capturesSystemKeys = true 19 | self.view = view 20 | } 21 | 22 | override func viewDidLoad() { 23 | startVM() 24 | } 25 | 26 | @IBAction func didTapStartVM(_ sender: Any) { 27 | startVM() 28 | } 29 | 30 | private func startVM() { 31 | let restoreImageURL = URL(fileURLWithPath: Bundle.main.path(forResource: "VirtualMac2,1", ofType: "ipsw")!) 32 | VZMacOSRestoreImage.load(from: restoreImageURL) { result in 33 | switch result { 34 | case .success(let image): 35 | DispatchQueue.main.async { 36 | self.setupVM(with: image) 37 | } 38 | case .failure(let error): 39 | NSLog("Error: \(error)") 40 | } 41 | } 42 | } 43 | 44 | private func setupVM(with image: VZMacOSRestoreImage) { 45 | guard let supportedConfig = image.mostFeaturefulSupportedConfiguration else { 46 | NSLog("No supported config") 47 | return 48 | } 49 | 50 | 51 | let bootloader = VZMacOSBootLoader() 52 | let entropy = VZVirtioEntropyDeviceConfiguration() 53 | let networkDevice = VZVirtioNetworkDeviceConfiguration() 54 | networkDevice.attachment = VZNATNetworkDeviceAttachment() 55 | 56 | guard let mainScreen = NSScreen.main else { 57 | assertionFailure() 58 | return 59 | } 60 | let mainScreenWidth = Int(mainScreen.frame.size.width) * 2 61 | let mainScreenHeight = Int(mainScreen.frame.size.height) * 2 62 | 63 | let graphics = VZMacGraphicsDeviceConfiguration() 64 | graphics.displays = [ 65 | VZMacGraphicsDisplayConfiguration( 66 | widthInPixels: mainScreenWidth, 67 | heightInPixels: mainScreenHeight, 68 | pixelsPerInch: 220 69 | ) 70 | ] 71 | 72 | let keyboard = VZUSBKeyboardConfiguration() 73 | let pointingDevice = VZUSBScreenCoordinatePointingDeviceConfiguration() 74 | 75 | var storages: [VZStorageDeviceConfiguration] = [] 76 | do { 77 | let attachment = try VZDiskImageStorageDeviceAttachment( 78 | url: URL(fileURLWithPath: "\(NSHomeDirectory())/disk.dmg"), 79 | readOnly: false 80 | ) 81 | 82 | let storage = VZVirtioBlockDeviceConfiguration(attachment: attachment) 83 | storages.append(storage) 84 | } catch { 85 | NSLog("Storage Error: \(error)") 86 | } 87 | 88 | 89 | let configuration = VZVirtualMachineConfiguration() 90 | configuration.bootLoader = bootloader 91 | 92 | let platform = VZMacPlatformConfiguration() 93 | platform.hardwareModel = supportedConfig.hardwareModel 94 | 95 | if let machineID = UserDefaults.standard.object(forKey: "machine_id") as? Data { 96 | if let identifier = VZMacMachineIdentifier(dataRepresentation: machineID) { 97 | platform.machineIdentifier = identifier 98 | } else { 99 | NSLog("Failed to recreate machine id") 100 | } 101 | } else { 102 | UserDefaults.standard.set( 103 | platform.machineIdentifier.dataRepresentation, 104 | forKey: "machine_id" 105 | ) 106 | } 107 | 108 | if FileManager.default.fileExists(atPath: "\(NSHomeDirectory())/aux.img") { 109 | platform.auxiliaryStorage = VZMacAuxiliaryStorage( 110 | contentsOf: URL(fileURLWithPath: "\(NSHomeDirectory())/aux.img") 111 | ) 112 | } else { 113 | platform.auxiliaryStorage = try? VZMacAuxiliaryStorage( 114 | creatingStorageAt: URL(fileURLWithPath: "\(NSHomeDirectory())/aux.img"), 115 | hardwareModel: platform.hardwareModel, 116 | options: [] 117 | ) 118 | } 119 | configuration.platform = platform 120 | 121 | configuration.cpuCount = 8 122 | configuration.memorySize = 8 * 1024 * 1024 * 1024 123 | configuration.entropyDevices = [entropy] 124 | configuration.networkDevices = [networkDevice] 125 | configuration.graphicsDevices = [graphics] 126 | configuration.keyboards = [keyboard] 127 | configuration.pointingDevices = [pointingDevice] 128 | configuration.storageDevices = storages 129 | 130 | do { 131 | try configuration.validate() 132 | 133 | let vm = VZVirtualMachine(configuration: configuration, queue: .main) 134 | vm.delegate = self 135 | 136 | if let view = view as? VZVirtualMachineView { 137 | view.virtualMachine = vm 138 | } 139 | 140 | vm.start { result in 141 | switch result { 142 | case .success: 143 | NSLog("Virtual Machine Started.") 144 | case .failure(let error): 145 | NSLog("Error: \(error)") 146 | } 147 | } 148 | self.virtualMachine = vm 149 | } catch { 150 | NSLog("Error: \(error)") 151 | } 152 | } 153 | 154 | func guestDidStop(_ virtualMachine: VZVirtualMachine) { 155 | exit(0) 156 | } 157 | 158 | func virtualMachine(_ virtualMachine: VZVirtualMachine, didStopWithError error: Error) { 159 | NSLog("Stop with Error: \(error)") 160 | } 161 | } 162 | 163 | -------------------------------------------------------------------------------- /macOS Virtual Machine/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /macOS Virtual Machine.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 55; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 7A12DA58268C0A4400A75D28 /* VirtualMac2,1.ipsw in Resources */ = {isa = PBXBuildFile; fileRef = 7A12DA57268C0A4400A75D28 /* VirtualMac2,1.ipsw */; }; 11 | 7AF9F9F3268B03C0008F58AE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF9F9F2268B03C0008F58AE /* AppDelegate.swift */; }; 12 | 7AF9F9F5268B03C0008F58AE /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF9F9F4268B03C0008F58AE /* ViewController.swift */; }; 13 | 7AF9F9F7268B03C1008F58AE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7AF9F9F6268B03C1008F58AE /* Assets.xcassets */; }; 14 | 7AF9F9FA268B03C1008F58AE /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7AF9F9F8268B03C1008F58AE /* Main.storyboard */; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXFileReference section */ 18 | 7A0D14F1268B205B00ADB8CE /* macOS Virtual Machine.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "macOS Virtual Machine.entitlements"; sourceTree = ""; }; 19 | 7A12DA57268C0A4400A75D28 /* VirtualMac2,1.ipsw */ = {isa = PBXFileReference; lastKnownFileType = file; path = "VirtualMac2,1.ipsw"; sourceTree = ""; }; 20 | 7AF9F9EF268B03C0008F58AE /* macOS Virtual Machine.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "macOS Virtual Machine.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | 7AF9F9F2268B03C0008F58AE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 22 | 7AF9F9F4268B03C0008F58AE /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 23 | 7AF9F9F6268B03C1008F58AE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 24 | 7AF9F9F9268B03C1008F58AE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 25 | /* End PBXFileReference section */ 26 | 27 | /* Begin PBXFrameworksBuildPhase section */ 28 | 7AF9F9EC268B03C0008F58AE /* Frameworks */ = { 29 | isa = PBXFrameworksBuildPhase; 30 | buildActionMask = 2147483647; 31 | files = ( 32 | ); 33 | runOnlyForDeploymentPostprocessing = 0; 34 | }; 35 | /* End PBXFrameworksBuildPhase section */ 36 | 37 | /* Begin PBXGroup section */ 38 | 7AF9F9E6268B03C0008F58AE = { 39 | isa = PBXGroup; 40 | children = ( 41 | 7AF9F9F1268B03C0008F58AE /* macOS Virtual Machine */, 42 | 7AF9F9F0268B03C0008F58AE /* Products */, 43 | ); 44 | sourceTree = ""; 45 | }; 46 | 7AF9F9F0268B03C0008F58AE /* Products */ = { 47 | isa = PBXGroup; 48 | children = ( 49 | 7AF9F9EF268B03C0008F58AE /* macOS Virtual Machine.app */, 50 | ); 51 | name = Products; 52 | sourceTree = ""; 53 | }; 54 | 7AF9F9F1268B03C0008F58AE /* macOS Virtual Machine */ = { 55 | isa = PBXGroup; 56 | children = ( 57 | 7A12DA57268C0A4400A75D28 /* VirtualMac2,1.ipsw */, 58 | 7A0D14F1268B205B00ADB8CE /* macOS Virtual Machine.entitlements */, 59 | 7AF9F9F2268B03C0008F58AE /* AppDelegate.swift */, 60 | 7AF9F9F4268B03C0008F58AE /* ViewController.swift */, 61 | 7AF9F9F6268B03C1008F58AE /* Assets.xcassets */, 62 | 7AF9F9F8268B03C1008F58AE /* Main.storyboard */, 63 | ); 64 | path = "macOS Virtual Machine"; 65 | sourceTree = ""; 66 | }; 67 | /* End PBXGroup section */ 68 | 69 | /* Begin PBXNativeTarget section */ 70 | 7AF9F9EE268B03C0008F58AE /* macOS Virtual Machine */ = { 71 | isa = PBXNativeTarget; 72 | buildConfigurationList = 7AF9F9FD268B03C1008F58AE /* Build configuration list for PBXNativeTarget "macOS Virtual Machine" */; 73 | buildPhases = ( 74 | 7AF9F9EB268B03C0008F58AE /* Sources */, 75 | 7AF9F9EC268B03C0008F58AE /* Frameworks */, 76 | 7AF9F9ED268B03C0008F58AE /* Resources */, 77 | ); 78 | buildRules = ( 79 | ); 80 | dependencies = ( 81 | ); 82 | name = "macOS Virtual Machine"; 83 | productName = "macOS Virtual Machine"; 84 | productReference = 7AF9F9EF268B03C0008F58AE /* macOS Virtual Machine.app */; 85 | productType = "com.apple.product-type.application"; 86 | }; 87 | /* End PBXNativeTarget section */ 88 | 89 | /* Begin PBXProject section */ 90 | 7AF9F9E7268B03C0008F58AE /* Project object */ = { 91 | isa = PBXProject; 92 | attributes = { 93 | BuildIndependentTargetsInParallel = 1; 94 | LastSwiftUpdateCheck = 1300; 95 | LastUpgradeCheck = 1300; 96 | TargetAttributes = { 97 | 7AF9F9EE268B03C0008F58AE = { 98 | CreatedOnToolsVersion = 13.0; 99 | }; 100 | }; 101 | }; 102 | buildConfigurationList = 7AF9F9EA268B03C0008F58AE /* Build configuration list for PBXProject "macOS Virtual Machine" */; 103 | compatibilityVersion = "Xcode 13.0"; 104 | developmentRegion = en; 105 | hasScannedForEncodings = 0; 106 | knownRegions = ( 107 | en, 108 | Base, 109 | ); 110 | mainGroup = 7AF9F9E6268B03C0008F58AE; 111 | productRefGroup = 7AF9F9F0268B03C0008F58AE /* Products */; 112 | projectDirPath = ""; 113 | projectRoot = ""; 114 | targets = ( 115 | 7AF9F9EE268B03C0008F58AE /* macOS Virtual Machine */, 116 | ); 117 | }; 118 | /* End PBXProject section */ 119 | 120 | /* Begin PBXResourcesBuildPhase section */ 121 | 7AF9F9ED268B03C0008F58AE /* Resources */ = { 122 | isa = PBXResourcesBuildPhase; 123 | buildActionMask = 2147483647; 124 | files = ( 125 | 7AF9F9F7268B03C1008F58AE /* Assets.xcassets in Resources */, 126 | 7A12DA58268C0A4400A75D28 /* VirtualMac2,1.ipsw in Resources */, 127 | 7AF9F9FA268B03C1008F58AE /* Main.storyboard in Resources */, 128 | ); 129 | runOnlyForDeploymentPostprocessing = 0; 130 | }; 131 | /* End PBXResourcesBuildPhase section */ 132 | 133 | /* Begin PBXSourcesBuildPhase section */ 134 | 7AF9F9EB268B03C0008F58AE /* Sources */ = { 135 | isa = PBXSourcesBuildPhase; 136 | buildActionMask = 2147483647; 137 | files = ( 138 | 7AF9F9F5268B03C0008F58AE /* ViewController.swift in Sources */, 139 | 7AF9F9F3268B03C0008F58AE /* AppDelegate.swift in Sources */, 140 | ); 141 | runOnlyForDeploymentPostprocessing = 0; 142 | }; 143 | /* End PBXSourcesBuildPhase section */ 144 | 145 | /* Begin PBXVariantGroup section */ 146 | 7AF9F9F8268B03C1008F58AE /* Main.storyboard */ = { 147 | isa = PBXVariantGroup; 148 | children = ( 149 | 7AF9F9F9268B03C1008F58AE /* Base */, 150 | ); 151 | name = Main.storyboard; 152 | sourceTree = ""; 153 | }; 154 | /* End PBXVariantGroup section */ 155 | 156 | /* Begin XCBuildConfiguration section */ 157 | 7AF9F9FB268B03C1008F58AE /* Debug */ = { 158 | isa = XCBuildConfiguration; 159 | buildSettings = { 160 | ALWAYS_SEARCH_USER_PATHS = NO; 161 | CLANG_ANALYZER_NONNULL = YES; 162 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 163 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 164 | CLANG_CXX_LIBRARY = "libc++"; 165 | CLANG_ENABLE_MODULES = YES; 166 | CLANG_ENABLE_OBJC_ARC = YES; 167 | CLANG_ENABLE_OBJC_WEAK = YES; 168 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 169 | CLANG_WARN_BOOL_CONVERSION = YES; 170 | CLANG_WARN_COMMA = YES; 171 | CLANG_WARN_CONSTANT_CONVERSION = YES; 172 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 173 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 174 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 175 | CLANG_WARN_EMPTY_BODY = YES; 176 | CLANG_WARN_ENUM_CONVERSION = YES; 177 | CLANG_WARN_INFINITE_RECURSION = YES; 178 | CLANG_WARN_INT_CONVERSION = YES; 179 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 180 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 181 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 182 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 183 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 184 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 185 | CLANG_WARN_STRICT_PROTOTYPES = YES; 186 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 187 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 188 | CLANG_WARN_UNREACHABLE_CODE = YES; 189 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 190 | COPY_PHASE_STRIP = NO; 191 | DEBUG_INFORMATION_FORMAT = dwarf; 192 | ENABLE_STRICT_OBJC_MSGSEND = YES; 193 | ENABLE_TESTABILITY = YES; 194 | GCC_C_LANGUAGE_STANDARD = gnu11; 195 | GCC_DYNAMIC_NO_PIC = NO; 196 | GCC_NO_COMMON_BLOCKS = YES; 197 | GCC_OPTIMIZATION_LEVEL = 0; 198 | GCC_PREPROCESSOR_DEFINITIONS = ( 199 | "DEBUG=1", 200 | "$(inherited)", 201 | ); 202 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 203 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 204 | GCC_WARN_UNDECLARED_SELECTOR = YES; 205 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 206 | GCC_WARN_UNUSED_FUNCTION = YES; 207 | GCC_WARN_UNUSED_VARIABLE = YES; 208 | MACOSX_DEPLOYMENT_TARGET = 12.0; 209 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 210 | MTL_FAST_MATH = YES; 211 | ONLY_ACTIVE_ARCH = YES; 212 | SDKROOT = macosx; 213 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 214 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 215 | }; 216 | name = Debug; 217 | }; 218 | 7AF9F9FC268B03C1008F58AE /* Release */ = { 219 | isa = XCBuildConfiguration; 220 | buildSettings = { 221 | ALWAYS_SEARCH_USER_PATHS = NO; 222 | CLANG_ANALYZER_NONNULL = YES; 223 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 224 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 225 | CLANG_CXX_LIBRARY = "libc++"; 226 | CLANG_ENABLE_MODULES = YES; 227 | CLANG_ENABLE_OBJC_ARC = YES; 228 | CLANG_ENABLE_OBJC_WEAK = YES; 229 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 230 | CLANG_WARN_BOOL_CONVERSION = YES; 231 | CLANG_WARN_COMMA = YES; 232 | CLANG_WARN_CONSTANT_CONVERSION = YES; 233 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 234 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 235 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 236 | CLANG_WARN_EMPTY_BODY = YES; 237 | CLANG_WARN_ENUM_CONVERSION = YES; 238 | CLANG_WARN_INFINITE_RECURSION = YES; 239 | CLANG_WARN_INT_CONVERSION = YES; 240 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 241 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 242 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 243 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 244 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 245 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 246 | CLANG_WARN_STRICT_PROTOTYPES = YES; 247 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 248 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 249 | CLANG_WARN_UNREACHABLE_CODE = YES; 250 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 251 | COPY_PHASE_STRIP = NO; 252 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 253 | ENABLE_NS_ASSERTIONS = NO; 254 | ENABLE_STRICT_OBJC_MSGSEND = YES; 255 | GCC_C_LANGUAGE_STANDARD = gnu11; 256 | GCC_NO_COMMON_BLOCKS = YES; 257 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 258 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 259 | GCC_WARN_UNDECLARED_SELECTOR = YES; 260 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 261 | GCC_WARN_UNUSED_FUNCTION = YES; 262 | GCC_WARN_UNUSED_VARIABLE = YES; 263 | MACOSX_DEPLOYMENT_TARGET = 12.0; 264 | MTL_ENABLE_DEBUG_INFO = NO; 265 | MTL_FAST_MATH = YES; 266 | SDKROOT = macosx; 267 | SWIFT_COMPILATION_MODE = wholemodule; 268 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 269 | }; 270 | name = Release; 271 | }; 272 | 7AF9F9FE268B03C1008F58AE /* Debug */ = { 273 | isa = XCBuildConfiguration; 274 | buildSettings = { 275 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 276 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 277 | CODE_SIGN_ENTITLEMENTS = "macOS Virtual Machine/macOS Virtual Machine.entitlements"; 278 | CODE_SIGN_STYLE = Manual; 279 | COMBINE_HIDPI_IMAGES = YES; 280 | CURRENT_PROJECT_VERSION = 1; 281 | DEVELOPMENT_TEAM = ""; 282 | ENABLE_APP_SANDBOX = YES; 283 | ENABLE_HARDENED_RUNTIME = YES; 284 | ENABLE_USER_SELECTED_FILES = readonly; 285 | GENERATE_INFOPLIST_FILE = YES; 286 | INFOPLIST_KEY_CFBundleExecutable = "macOS Virtual Machine"; 287 | INFOPLIST_KEY_CFBundleName = "macOS Virtual Machine"; 288 | INFOPLIST_KEY_CFBundleVersion = 1; 289 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 290 | INFOPLIST_KEY_NSMainStoryboardFile = Main; 291 | INFOPLIST_KEY_NSPrincipalClass = NSApplication; 292 | LD_RUNPATH_SEARCH_PATHS = ( 293 | "$(inherited)", 294 | "@executable_path/../Frameworks", 295 | ); 296 | MARKETING_VERSION = 0.1; 297 | PRODUCT_BUNDLE_IDENTIFIER = "com.mingchang.macosvm.macOS-Virtual-Machine"; 298 | PRODUCT_NAME = "$(TARGET_NAME)"; 299 | PROVISIONING_PROFILE_SPECIFIER = ""; 300 | SWIFT_EMIT_LOC_STRINGS = YES; 301 | SWIFT_VERSION = 5.0; 302 | }; 303 | name = Debug; 304 | }; 305 | 7AF9F9FF268B03C1008F58AE /* Release */ = { 306 | isa = XCBuildConfiguration; 307 | buildSettings = { 308 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 309 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 310 | CODE_SIGN_ENTITLEMENTS = "macOS Virtual Machine/macOS Virtual Machine.entitlements"; 311 | CODE_SIGN_STYLE = Manual; 312 | COMBINE_HIDPI_IMAGES = YES; 313 | CURRENT_PROJECT_VERSION = 1; 314 | DEVELOPMENT_TEAM = ""; 315 | ENABLE_APP_SANDBOX = YES; 316 | ENABLE_HARDENED_RUNTIME = YES; 317 | ENABLE_USER_SELECTED_FILES = readonly; 318 | GENERATE_INFOPLIST_FILE = YES; 319 | INFOPLIST_KEY_CFBundleExecutable = "macOS Virtual Machine"; 320 | INFOPLIST_KEY_CFBundleName = "macOS Virtual Machine"; 321 | INFOPLIST_KEY_CFBundleVersion = 1; 322 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 323 | INFOPLIST_KEY_NSMainStoryboardFile = Main; 324 | INFOPLIST_KEY_NSPrincipalClass = NSApplication; 325 | LD_RUNPATH_SEARCH_PATHS = ( 326 | "$(inherited)", 327 | "@executable_path/../Frameworks", 328 | ); 329 | MARKETING_VERSION = 0.1; 330 | PRODUCT_BUNDLE_IDENTIFIER = "com.mingchang.macosvm.macOS-Virtual-Machine"; 331 | PRODUCT_NAME = "$(TARGET_NAME)"; 332 | PROVISIONING_PROFILE_SPECIFIER = ""; 333 | SWIFT_EMIT_LOC_STRINGS = YES; 334 | SWIFT_VERSION = 5.0; 335 | }; 336 | name = Release; 337 | }; 338 | /* End XCBuildConfiguration section */ 339 | 340 | /* Begin XCConfigurationList section */ 341 | 7AF9F9EA268B03C0008F58AE /* Build configuration list for PBXProject "macOS Virtual Machine" */ = { 342 | isa = XCConfigurationList; 343 | buildConfigurations = ( 344 | 7AF9F9FB268B03C1008F58AE /* Debug */, 345 | 7AF9F9FC268B03C1008F58AE /* Release */, 346 | ); 347 | defaultConfigurationIsVisible = 0; 348 | defaultConfigurationName = Release; 349 | }; 350 | 7AF9F9FD268B03C1008F58AE /* Build configuration list for PBXNativeTarget "macOS Virtual Machine" */ = { 351 | isa = XCConfigurationList; 352 | buildConfigurations = ( 353 | 7AF9F9FE268B03C1008F58AE /* Debug */, 354 | 7AF9F9FF268B03C1008F58AE /* Release */, 355 | ); 356 | defaultConfigurationIsVisible = 0; 357 | defaultConfigurationName = Release; 358 | }; 359 | /* End XCConfigurationList section */ 360 | }; 361 | rootObject = 7AF9F9E7268B03C0008F58AE /* Project object */; 362 | } 363 | --------------------------------------------------------------------------------