From e1f44d60926b8477a6a29f559608db09a333dc3b Mon Sep 17 00:00:00 2001 From: Boey Maun Suang Date: Wed, 15 Feb 2023 20:24:12 +1100 Subject: [PATCH 1/3] linuxkit: Fix building on Darwin Nixpkgs on Darwin can currently build against either the macOS 10.12 or the 11 SDK, but some vendored code in linuxkit expects at least the macOS 12 SDK at build time, even though useful parts of that vendored code still run on macOS 11, and the rest of linuxkit still runs on 10.12. This commit enables building against the macOS 11 SDK. --- .../tools/misc/linuxkit/default.nix | 6 +- .../misc/linuxkit/support-apple-11-sdk.patch | 811 ++++++++++++++++++ pkgs/top-level/all-packages.nix | 2 +- 3 files changed, 816 insertions(+), 3 deletions(-) create mode 100644 pkgs/development/tools/misc/linuxkit/support-apple-11-sdk.patch diff --git a/pkgs/development/tools/misc/linuxkit/default.nix b/pkgs/development/tools/misc/linuxkit/default.nix index be07f7e9c246..61ad37233f68 100644 --- a/pkgs/development/tools/misc/linuxkit/default.nix +++ b/pkgs/development/tools/misc/linuxkit/default.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, buildGoModule, fetchFromGitHub, git, Virtualization, testers, linuxkit }: +{ lib, stdenv, buildGoModule, fetchFromGitHub, git, Cocoa, Virtualization, testers, linuxkit }: buildGoModule rec { pname = "linuxkit"; @@ -15,7 +15,9 @@ buildGoModule rec { modRoot = "./src/cmd/linuxkit"; - buildInputs = lib.optionals stdenv.isDarwin [ Virtualization ]; + patches = [ ./support-apple-11-sdk.patch ]; + + buildInputs = lib.optionals stdenv.isDarwin [ Cocoa Virtualization ]; ldflags = [ "-s" diff --git a/pkgs/development/tools/misc/linuxkit/support-apple-11-sdk.patch b/pkgs/development/tools/misc/linuxkit/support-apple-11-sdk.patch new file mode 100644 index 000000000000..70393977715b --- /dev/null +++ b/pkgs/development/tools/misc/linuxkit/support-apple-11-sdk.patch @@ -0,0 +1,811 @@ +diff --git a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_12.m b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_12.m +index 567172ba2..e2c1ac047 100644 +--- a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_12.m ++++ b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_12.m +@@ -8,6 +8,7 @@ + + bool vmCanStop(void *machine, void *queue) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + __block BOOL result; + dispatch_sync((dispatch_queue_t)queue, ^{ +@@ -15,12 +16,13 @@ bool vmCanStop(void *machine, void *queue) + }); + return (bool)result; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + void stopWithCompletionHandler(void *machine, void *queue, void *completionHandler) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + vm_completion_handler_t handler = makeVMCompletionHandler(completionHandler); + dispatch_sync((dispatch_queue_t)queue, ^{ +@@ -29,7 +31,7 @@ void stopWithCompletionHandler(void *machine, void *queue, void *completionHandl + Block_release(handler); + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -38,10 +40,11 @@ void stopWithCompletionHandler(void *machine, void *queue, void *completionHandl + */ + void *newVZGenericPlatformConfiguration() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZGenericPlatformConfiguration alloc] init]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -51,11 +54,12 @@ void *newVZGenericPlatformConfiguration() + */ + void setDirectorySharingDevicesVZVirtualMachineConfiguration(void *config, void *directorySharingDevices) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZVirtualMachineConfiguration *)config setDirectorySharingDevices:[(NSMutableArray *)directorySharingDevices copy]]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -66,11 +70,12 @@ void setDirectorySharingDevicesVZVirtualMachineConfiguration(void *config, void + */ + void setPlatformVZVirtualMachineConfiguration(void *config, void *platform) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZVirtualMachineConfiguration *)config setPlatform:(VZPlatformConfiguration *)platform]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -80,11 +85,12 @@ void setPlatformVZVirtualMachineConfiguration(void *config, void *platform) + */ + void setGraphicsDevicesVZVirtualMachineConfiguration(void *config, void *graphicsDevices) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZVirtualMachineConfiguration *)config setGraphicsDevices:[(NSMutableArray *)graphicsDevices copy]]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -94,11 +100,12 @@ void setGraphicsDevicesVZVirtualMachineConfiguration(void *config, void *graphic + */ + void setPointingDevicesVZVirtualMachineConfiguration(void *config, void *pointingDevices) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZVirtualMachineConfiguration *)config setPointingDevices:[(NSMutableArray *)pointingDevices copy]]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -108,11 +115,12 @@ void setPointingDevicesVZVirtualMachineConfiguration(void *config, void *pointin + */ + void setKeyboardsVZVirtualMachineConfiguration(void *config, void *keyboards) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZVirtualMachineConfiguration *)config setKeyboards:[(NSMutableArray *)keyboards copy]]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -122,11 +130,12 @@ void setKeyboardsVZVirtualMachineConfiguration(void *config, void *keyboards) + */ + void setAudioDevicesVZVirtualMachineConfiguration(void *config, void *audioDevices) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZVirtualMachineConfiguration *)config setAudioDevices:[(NSMutableArray *)audioDevices copy]]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -136,10 +145,11 @@ void setAudioDevicesVZVirtualMachineConfiguration(void *config, void *audioDevic + */ + void *newVZVirtioSoundDeviceConfiguration() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZVirtioSoundDeviceConfiguration alloc] init]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -148,11 +158,12 @@ void *newVZVirtioSoundDeviceConfiguration() + */ + void setStreamsVZVirtioSoundDeviceConfiguration(void *audioDeviceConfiguration, void *streams) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZVirtioSoundDeviceConfiguration *)audioDeviceConfiguration setStreams:[(NSMutableArray *)streams copy]]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -162,10 +173,11 @@ void setStreamsVZVirtioSoundDeviceConfiguration(void *audioDeviceConfiguration, + */ + void *newVZVirtioSoundDeviceInputStreamConfiguration() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZVirtioSoundDeviceInputStreamConfiguration alloc] init]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -174,12 +186,13 @@ void *newVZVirtioSoundDeviceInputStreamConfiguration() + */ + void *newVZVirtioSoundDeviceHostInputStreamConfiguration() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZVirtioSoundDeviceInputStreamConfiguration *inputStream = (VZVirtioSoundDeviceInputStreamConfiguration *)newVZVirtioSoundDeviceInputStreamConfiguration(); + [inputStream setSource:[[VZHostAudioInputStreamSource alloc] init]]; + return inputStream; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -189,10 +202,11 @@ void *newVZVirtioSoundDeviceHostInputStreamConfiguration() + */ + void *newVZVirtioSoundDeviceOutputStreamConfiguration() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZVirtioSoundDeviceOutputStreamConfiguration alloc] init]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -201,12 +215,13 @@ void *newVZVirtioSoundDeviceOutputStreamConfiguration() + */ + void *newVZVirtioSoundDeviceHostOutputStreamConfiguration() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZVirtioSoundDeviceOutputStreamConfiguration *outputStream = (VZVirtioSoundDeviceOutputStreamConfiguration *)newVZVirtioSoundDeviceOutputStreamConfiguration(); + [outputStream setSink:[[VZHostAudioOutputStreamSink alloc] init]]; + return outputStream; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -220,12 +235,13 @@ void *newVZVirtioSoundDeviceHostOutputStreamConfiguration() + */ + void *newVZSharedDirectory(const char *dirPath, bool readOnly) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + NSString *dirPathNSString = [NSString stringWithUTF8String:dirPath]; + NSURL *dirURL = [NSURL fileURLWithPath:dirPathNSString]; + return [[VZSharedDirectory alloc] initWithURL:dirURL readOnly:(BOOL)readOnly]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -237,10 +253,11 @@ void *newVZSharedDirectory(const char *dirPath, bool readOnly) + */ + void *newVZSingleDirectoryShare(void *sharedDirectory) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZSingleDirectoryShare alloc] initWithDirectory:(VZSharedDirectory *)sharedDirectory]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -252,10 +269,11 @@ void *newVZSingleDirectoryShare(void *sharedDirectory) + */ + void *newVZMultipleDirectoryShare(void *sharedDirectories) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZMultipleDirectoryShare alloc] initWithDirectories:(NSDictionary *)sharedDirectories]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -267,6 +285,7 @@ void *newVZMultipleDirectoryShare(void *sharedDirectories) + */ + void *newVZVirtioFileSystemDeviceConfiguration(const char *tag, void **error) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + NSString *tagNSString = [NSString stringWithUTF8String:tag]; + BOOL valid = [VZVirtioFileSystemDeviceConfiguration validateTag:tagNSString error:(NSError *_Nullable *_Nullable)error]; +@@ -275,7 +294,7 @@ void *newVZVirtioFileSystemDeviceConfiguration(const char *tag, void **error) + } + return [[VZVirtioFileSystemDeviceConfiguration alloc] initWithTag:tagNSString]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -284,11 +303,12 @@ void *newVZVirtioFileSystemDeviceConfiguration(const char *tag, void **error) + */ + void setVZVirtioFileSystemDeviceConfigurationShare(void *config, void *share) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZVirtioFileSystemDeviceConfiguration *)config setShare:(VZDirectoryShare *)share]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -298,10 +318,11 @@ void setVZVirtioFileSystemDeviceConfigurationShare(void *config, void *share) + */ + void *newVZUSBScreenCoordinatePointingDeviceConfiguration() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZUSBScreenCoordinatePointingDeviceConfiguration alloc] init]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -311,10 +332,11 @@ void *newVZUSBScreenCoordinatePointingDeviceConfiguration() + */ + void *newVZUSBKeyboardConfiguration() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZUSBKeyboardConfiguration alloc] init]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -328,6 +350,7 @@ void sharedApplication() + + void startVirtualMachineWindow(void *machine, double width, double height) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + @autoreleasepool { + AppDelegate *appDelegate = [[[AppDelegate alloc] +@@ -340,5 +363,6 @@ void startVirtualMachineWindow(void *machine, double width, double height) + return; + } + } ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } +diff --git a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_12_arm64.m b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_12_arm64.m +index 4fbaf6cb7..452adb747 100644 +--- a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_12_arm64.m ++++ b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_12_arm64.m +@@ -30,6 +30,7 @@ + */ + void *newVZMacAuxiliaryStorageWithCreating(const char *storagePath, void *hardwareModel, void **error) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + NSString *storagePathNSString = [NSString stringWithUTF8String:storagePath]; + NSURL *storageURL = [NSURL fileURLWithPath:storagePathNSString]; +@@ -38,7 +39,7 @@ void *newVZMacAuxiliaryStorageWithCreating(const char *storagePath, void *hardwa + options:VZMacAuxiliaryStorageInitializationOptionAllowOverwrite + error:(NSError *_Nullable *_Nullable)error]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -49,6 +50,7 @@ void *newVZMacAuxiliaryStorageWithCreating(const char *storagePath, void *hardwa + */ + void *newVZMacAuxiliaryStorage(const char *storagePath) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + NSString *storagePathNSString = [NSString stringWithUTF8String:storagePath]; + NSURL *storageURL = [NSURL fileURLWithPath:storagePathNSString]; +@@ -56,7 +58,7 @@ void *newVZMacAuxiliaryStorage(const char *storagePath) + // https://developer.apple.com/documentation/virtualization/vzmacauxiliarystorage?language=objc + return [[VZMacAuxiliaryStorage alloc] initWithContentsOfURL:storageURL]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -80,10 +82,11 @@ void *newVZMacAuxiliaryStorage(const char *storagePath) + */ + void *newVZMacPlatformConfiguration() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZMacPlatformConfiguration alloc] init]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -92,17 +95,19 @@ void *newVZMacPlatformConfiguration() + */ + void setHardwareModelVZMacPlatformConfiguration(void *config, void *hardwareModel) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZMacPlatformConfiguration *)config setHardwareModel:(VZMacHardwareModel *)hardwareModel]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + // Store the hardware model to disk so that we can retrieve them for subsequent boots. + void storeHardwareModelDataVZMacPlatformConfiguration(void *config, const char *filePath) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacPlatformConfiguration *macPlatformConfiguration = (VZMacPlatformConfiguration *)config; + NSString *filePathNSString = [NSString stringWithUTF8String:filePath]; +@@ -110,7 +115,7 @@ void storeHardwareModelDataVZMacPlatformConfiguration(void *config, const char * + [macPlatformConfiguration.hardwareModel.dataRepresentation writeToURL:fileURL atomically:YES]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -121,17 +126,19 @@ void storeHardwareModelDataVZMacPlatformConfiguration(void *config, const char * + */ + void setMachineIdentifierVZMacPlatformConfiguration(void *config, void *machineIdentifier) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZMacPlatformConfiguration *)config setMachineIdentifier:(VZMacMachineIdentifier *)machineIdentifier]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + // Store the machine identifier to disk so that we can retrieve them for subsequent boots. + void storeMachineIdentifierDataVZMacPlatformConfiguration(void *config, const char *filePath) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacPlatformConfiguration *macPlatformConfiguration = (VZMacPlatformConfiguration *)config; + NSString *filePathNSString = [NSString stringWithUTF8String:filePath]; +@@ -139,7 +146,7 @@ void storeMachineIdentifierDataVZMacPlatformConfiguration(void *config, const ch + [macPlatformConfiguration.machineIdentifier.dataRepresentation writeToURL:fileURL atomically:YES]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -151,11 +158,12 @@ void storeMachineIdentifierDataVZMacPlatformConfiguration(void *config, const ch + */ + void setAuxiliaryStorageVZMacPlatformConfiguration(void *config, void *auxiliaryStorage) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZMacPlatformConfiguration *)config setAuxiliaryStorage:(VZMacAuxiliaryStorage *)auxiliaryStorage]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -169,10 +177,11 @@ void setAuxiliaryStorageVZMacPlatformConfiguration(void *config, void *auxiliary + */ + void *newVZMacOSBootLoader() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZMacOSBootLoader alloc] init]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -182,10 +191,11 @@ void *newVZMacOSBootLoader() + */ + void *newVZMacGraphicsDeviceConfiguration() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZMacGraphicsDeviceConfiguration alloc] init]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -194,11 +204,12 @@ void *newVZMacGraphicsDeviceConfiguration() + */ + void setDisplaysVZMacGraphicsDeviceConfiguration(void *graphicsConfiguration, void *displays) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZMacGraphicsDeviceConfiguration *)graphicsConfiguration setDisplays:[(NSMutableArray *)displays copy]]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -210,13 +221,14 @@ void setDisplaysVZMacGraphicsDeviceConfiguration(void *graphicsConfiguration, vo + */ + void *newVZMacGraphicsDisplayConfiguration(NSInteger widthInPixels, NSInteger heightInPixels, NSInteger pixelsPerInch) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZMacGraphicsDisplayConfiguration alloc] + initWithWidthInPixels:widthInPixels + heightInPixels:heightInPixels + pixelsPerInch:pixelsPerInch]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -226,6 +238,7 @@ void *newVZMacGraphicsDisplayConfiguration(NSInteger widthInPixels, NSInteger he + */ + void *newVZMacHardwareModelWithPath(const char *hardwareModelPath) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacHardwareModel *hardwareModel; + NSString *hardwareModelPathNSString = [NSString stringWithUTF8String:hardwareModelPath]; +@@ -236,12 +249,13 @@ void *newVZMacHardwareModelWithPath(const char *hardwareModelPath) + } + return hardwareModel; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + void *newVZMacHardwareModelWithBytes(void *hardwareModelBytes, int len) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacHardwareModel *hardwareModel; + @autoreleasepool { +@@ -250,7 +264,7 @@ void *newVZMacHardwareModelWithBytes(void *hardwareModelBytes, int len) + } + return hardwareModel; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -259,10 +273,11 @@ void *newVZMacHardwareModelWithBytes(void *hardwareModelBytes, int len) + */ + void *newVZMacMachineIdentifier() + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[VZMacMachineIdentifier alloc] init]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -274,6 +289,7 @@ void *newVZMacMachineIdentifier() + */ + void *newVZMacMachineIdentifierWithPath(const char *machineIdentifierPath) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacMachineIdentifier *machineIdentifier; + NSString *machineIdentifierPathNSString = [NSString stringWithUTF8String:machineIdentifierPath]; +@@ -284,12 +300,13 @@ void *newVZMacMachineIdentifierWithPath(const char *machineIdentifierPath) + } + return machineIdentifier; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + void *newVZMacMachineIdentifierWithBytes(void *machineIdentifierBytes, int len) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacMachineIdentifier *machineIdentifier; + @autoreleasepool { +@@ -298,12 +315,13 @@ void *newVZMacMachineIdentifierWithBytes(void *machineIdentifierBytes, int len) + } + return machineIdentifier; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + nbyteslice getVZMacMachineIdentifierDataRepresentation(void *machineIdentifierPtr) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacMachineIdentifier *machineIdentifier = (VZMacMachineIdentifier *)machineIdentifierPtr; + NSData *data = [machineIdentifier dataRepresentation]; +@@ -313,12 +331,13 @@ nbyteslice getVZMacMachineIdentifierDataRepresentation(void *machineIdentifierPt + }; + return ret; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + VZMacOSRestoreImageStruct convertVZMacOSRestoreImage2Struct(void *restoreImagePtr) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacOSRestoreImage *restoreImage = (VZMacOSRestoreImage *)restoreImagePtr; + VZMacOSRestoreImageStruct ret; +@@ -329,12 +348,13 @@ VZMacOSRestoreImageStruct convertVZMacOSRestoreImage2Struct(void *restoreImagePt + ret.mostFeaturefulSupportedConfiguration = (void *)CFBridgingRetain([restoreImage mostFeaturefulSupportedConfiguration]); + return ret; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + void fetchLatestSupportedMacOSRestoreImageWithCompletionHandler(void *cgoHandler) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [VZMacOSRestoreImage fetchLatestSupportedWithCompletionHandler:^(VZMacOSRestoreImage *restoreImage, NSError *error) { + VZMacOSRestoreImageStruct restoreImageStruct = convertVZMacOSRestoreImage2Struct(restoreImage); +@@ -342,12 +362,13 @@ void fetchLatestSupportedMacOSRestoreImageWithCompletionHandler(void *cgoHandler + }]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + void loadMacOSRestoreImageFile(const char *ipswPath, void *cgoHandler) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + NSString *ipswPathNSString = [NSString stringWithUTF8String:ipswPath]; + NSURL *ipswURL = [NSURL fileURLWithPath:ipswPathNSString]; +@@ -358,12 +379,13 @@ void loadMacOSRestoreImageFile(const char *ipswPath, void *cgoHandler) + }]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + VZMacOSConfigurationRequirementsStruct convertVZMacOSConfigurationRequirements2Struct(void *requirementsPtr) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacOSConfigurationRequirements *requirements = (VZMacOSConfigurationRequirements *)requirementsPtr; + VZMacOSConfigurationRequirementsStruct ret; +@@ -373,12 +395,13 @@ VZMacOSConfigurationRequirementsStruct convertVZMacOSConfigurationRequirements2S + ret.hardwareModel = (void *)CFBridgingRetain([requirements hardwareModel]); + return ret; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + VZMacHardwareModelStruct convertVZMacHardwareModel2Struct(void *hardwareModelPtr) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacHardwareModel *hardwareModel = (VZMacHardwareModel *)hardwareModelPtr; + VZMacHardwareModelStruct ret; +@@ -391,7 +414,7 @@ VZMacHardwareModelStruct convertVZMacHardwareModel2Struct(void *hardwareModelPtr + ret.dataRepresentation = retByteSlice; + return ret; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -405,6 +428,7 @@ VZMacHardwareModelStruct convertVZMacHardwareModel2Struct(void *hardwareModelPtr + */ + void *newVZMacOSInstaller(void *virtualMachine, void *vmQueue, const char *restoreImageFilePath) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + __block VZMacOSInstaller *ret; + NSString *restoreImageFilePathNSString = [NSString stringWithUTF8String:restoreImageFilePath]; +@@ -414,7 +438,7 @@ void *newVZMacOSInstaller(void *virtualMachine, void *vmQueue, const char *resto + }); + return ret; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -425,6 +449,7 @@ void *newProgressObserverVZMacOSInstaller() + + void installByVZMacOSInstaller(void *installerPtr, void *vmQueue, void *progressObserverPtr, void *completionHandler, void *fractionCompletedHandler) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacOSInstaller *installer = (VZMacOSInstaller *)installerPtr; + dispatch_sync((dispatch_queue_t)vmQueue, ^{ +@@ -439,12 +464,13 @@ void installByVZMacOSInstaller(void *installerPtr, void *vmQueue, void *progress + }); + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + + void cancelInstallVZMacOSInstaller(void *installerPtr) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + VZMacOSInstaller *installer = (VZMacOSInstaller *)installerPtr; + if (installer.progress.cancellable) { +@@ -452,7 +478,7 @@ void cancelInstallVZMacOSInstaller(void *installerPtr) + } + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +diff --git a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_debug.m b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_debug.m +index 67fe356ae..af81a46b0 100644 +--- a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_debug.m ++++ b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_debug.m +@@ -12,10 +12,11 @@ + */ + void *newVZGDBDebugStubConfiguration(uint32_t port) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + return [[_VZGDBDebugStubConfiguration alloc] initWithPort:(NSInteger)port]; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } + +@@ -24,10 +25,11 @@ void *newVZGDBDebugStubConfiguration(uint32_t port) + */ + void setDebugStubVZVirtualMachineConfiguration(void *config, void *debugStub) + { ++#ifdef INCLUDE_TARGET_OSX_12 + if (@available(macOS 12, *)) { + [(VZVirtualMachineConfiguration *)config _setDebugStub:(_VZDebugStubConfiguration *)debugStub]; + return; + } +- ++#endif + RAISE_UNSUPPORTED_MACOS_EXCEPTION(); + } +\ No newline at end of file +diff --git a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_helper.h b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_helper.h +index 995b40882..9da0700b9 100644 +--- a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_helper.h ++++ b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_helper.h +@@ -18,6 +18,13 @@ NSDictionary *dumpProcessinfo(); + __builtin_unreachable(); \ + } while (0) + ++// for macOS 12 API ++#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 120000 ++#define INCLUDE_TARGET_OSX_12 1 ++#else ++#pragma message("macOS 12 API has been disabled") ++#endif ++ + // for macOS 12.3 API + #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 120300 + #define INCLUDE_TARGET_OSX_12_3 1 +diff --git a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_view.h b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_view.h +index ab00b9225..15d306f66 100644 +--- a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_view.h ++++ b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_view.h +@@ -23,9 +23,11 @@ + - (instancetype)init; + @end + ++#ifdef INCLUDE_TARGET_OSX_12 + API_AVAILABLE(macos(12.0)) + @interface AppDelegate : NSObject + - (instancetype)initWithVirtualMachine:(VZVirtualMachine *)virtualMachine + windowWidth:(CGFloat)windowWidth + windowHeight:(CGFloat)windowHeight; +-@end +\ No newline at end of file ++@end ++#endif +\ No newline at end of file +diff --git a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_view.m b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_view.m +index 9031c44f1..33b20d91b 100644 +--- a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_view.m ++++ b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/virtualization_view.m +@@ -165,6 +165,7 @@ + + @end + ++#ifdef INCLUDE_TARGET_OSX_12 + @implementation AppDelegate { + VZVirtualMachine *_virtualMachine; + VZVirtualMachineView *_virtualMachineView; +@@ -372,3 +373,4 @@ + [aboutPanel makeKeyAndOrderFront:nil]; + } + @end ++#endif diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 9a657e77af38..3894c3e398e9 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -18096,7 +18096,7 @@ with pkgs; libwhich = callPackage ../development/tools/misc/libwhich { }; linuxkit = callPackage ../development/tools/misc/linuxkit { - inherit (darwin.apple_sdk_11_0.frameworks) Virtualization; + inherit (darwin.apple_sdk_11_0.frameworks) Cocoa Virtualization; }; listenbrainz-mpd = callPackage ../applications/audio/listenbrainz-mpd { From 64faf2372d12d7d603af253a29bca10aaf3293cb Mon Sep 17 00:00:00 2001 From: Boey Maun Suang Date: Wed, 15 Feb 2023 20:24:20 +1100 Subject: [PATCH 2/3] linuxkit: Fix Darwin runtime OS detection The wrapper that linuxkit uses around the macOS Virtualization framework tries to detect which OS it is running on, and aborts if it thinks that the macOS version is not new enough to have the required framework features. This commit (mostly) fixes that macOS version detection when the code is linked as if it is linked against the 10.12 SDK (as the current Darwin ld wrapper does via the -platform_version switch), but is then run on macOS 11 or later. --- .../misc/linuxkit/darwin-os-version.patch | 53 +++++++++++++++++++ .../tools/misc/linuxkit/default.nix | 2 +- 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 pkgs/development/tools/misc/linuxkit/darwin-os-version.patch diff --git a/pkgs/development/tools/misc/linuxkit/darwin-os-version.patch b/pkgs/development/tools/misc/linuxkit/darwin-os-version.patch new file mode 100644 index 000000000000..aaa603e4ead1 --- /dev/null +++ b/pkgs/development/tools/misc/linuxkit/darwin-os-version.patch @@ -0,0 +1,53 @@ +diff --git a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/osversion.go b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/osversion.go +index d72a7856d..b186d3aff 100644 +--- a/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/osversion.go ++++ b/src/cmd/linuxkit/vendor/github.com/Code-Hex/vz/v3/osversion.go +@@ -9,6 +9,7 @@ import "C" + import ( + "errors" + "fmt" ++ "os/exec" + "strconv" + "strings" + "sync" +@@ -48,6 +49,40 @@ func fetchMajorMinorVersion() (float64, error) { + if err != nil { + return 0, err + } ++ ++ // For backward compatibility reasons, if code compiled against an SDK ++ // earlier than macOS 11 is run on macOS 11 or later, and then tries to read ++ // value of kern.osproductversion, the OS will return the value "10.16" ++ // instead of the real OS version string. By contrast, the command `sw_vers ++ // -productVersion` will return the real OS version string unless the ++ // environment variable SYSTEM_VERSION_COMPAT is set to 1 or 2, in which ++ // case it will respectively return "10.16" and "15.7" (the latter is for ++ // some iOS compatibility reason). ++ // ++ // The only (currently) sure way to get the real OS version string ++ // regardless of SYSTEM_VERSION_COMPAT or the SDK compiled against is ++ // apparently to parse ++ // /System/Library/CoreServices/.SystemVersionPlatform.plist if it exists, ++ // and /System/Library/CoreServices/SystemVersion.plist otherwise. Doing ++ // so, however, requires parsing XML plist files. ++ // ++ // Given what this library does, it doesn't seem likely that there would be ++ // a good reason to run its code with SYSTEM_VERSION_COMPAT set, so using ++ // `sw_vers` should be adequate until a proper parsing of plist files is ++ // added. ++ // ++ // See https://github.com/ziglang/zig/issues/7569, ++ // https://github.com/ziglang/zig/pull/7714 and ++ // https://eclecticlight.co/2020/08/13/macos-version-numbering-isnt-so-simple/ ++ // for more information. ++ if osver == "10.16" { ++ out, err := exec.Command("sw_vers", "-productVersion").Output() ++ if err != nil { ++ return 0, err ++ } ++ osver = strings.TrimRight(string(out), "\r\n") ++ } ++ + prefix := "v" + majorMinor := strings.TrimPrefix(semver.MajorMinor(prefix+osver), prefix) + version, err := strconv.ParseFloat(majorMinor, 64) diff --git a/pkgs/development/tools/misc/linuxkit/default.nix b/pkgs/development/tools/misc/linuxkit/default.nix index 61ad37233f68..fa48239b5a08 100644 --- a/pkgs/development/tools/misc/linuxkit/default.nix +++ b/pkgs/development/tools/misc/linuxkit/default.nix @@ -15,7 +15,7 @@ buildGoModule rec { modRoot = "./src/cmd/linuxkit"; - patches = [ ./support-apple-11-sdk.patch ]; + patches = [ ./darwin-os-version.patch ./support-apple-11-sdk.patch ]; buildInputs = lib.optionals stdenv.isDarwin [ Cocoa Virtualization ]; From 137b97e2f619cee1fbb8a624f5ad395a84efcca3 Mon Sep 17 00:00:00 2001 From: Boey Maun Suang Date: Wed, 15 Feb 2023 20:24:23 +1100 Subject: [PATCH 3/3] linuxkit: Sign binary with entitlements on Darwin In order to use the Virtualization framework at runtime, a macOS binary must be signed with the appropriate entitlement(s). The default targets in the linuxkit Makefiles would do this for us, but the current package definition does not use those Makefiles, so we must call the right target directly. --- .../tools/misc/linuxkit/default.nix | 23 +++++++++++++++++-- pkgs/top-level/all-packages.nix | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/pkgs/development/tools/misc/linuxkit/default.nix b/pkgs/development/tools/misc/linuxkit/default.nix index fa48239b5a08..68a908483d13 100644 --- a/pkgs/development/tools/misc/linuxkit/default.nix +++ b/pkgs/development/tools/misc/linuxkit/default.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, buildGoModule, fetchFromGitHub, git, Cocoa, Virtualization, testers, linuxkit }: +{ lib, stdenv, buildGoModule, fetchFromGitHub, git, Cocoa, Virtualization, sigtool, testers, linuxkit }: buildGoModule rec { pname = "linuxkit"; @@ -15,8 +15,16 @@ buildGoModule rec { modRoot = "./src/cmd/linuxkit"; - patches = [ ./darwin-os-version.patch ./support-apple-11-sdk.patch ]; + patches = [ + ./darwin-os-version.patch + ./support-apple-11-sdk.patch + ]; + # - On macOS, an executable must be signed with the right entitlement(s) to be + # able to use the Virtualization framework at runtime. + # - sigtool is allows us to validly sign such executables with a dummy + # authority. + nativeBuildInputs = lib.optionals stdenv.isDarwin [ sigtool ]; buildInputs = lib.optionals stdenv.isDarwin [ Cocoa Virtualization ]; ldflags = [ @@ -27,6 +35,17 @@ buildGoModule rec { nativeCheckInputs = [ git ]; + # - Because this package definition doesn't build using the source's Makefile, + # we must manually call the sign target. + # - The binary stripping that nixpkgs does by default in the + # fixup phase removes such signing and entitlements, so we have to sign + # after stripping. + # - Finally, at the start of the fixup phase, the working directory is + # $sourceRoot/src/cmd/linuxkit, so it's simpler to use the sign target from + # the Makefile in that directory rather than $sourceRoot/Makefile. + postFixup = lib.optionalString stdenv.isDarwin '' + make sign LOCAL_TARGET=$out/bin/linuxkit + ''; passthru.tests.version = testers.testVersion { package = linuxkit; command = "linuxkit version"; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 3894c3e398e9..c36e16a78da4 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -18097,6 +18097,7 @@ with pkgs; linuxkit = callPackage ../development/tools/misc/linuxkit { inherit (darwin.apple_sdk_11_0.frameworks) Cocoa Virtualization; + inherit (darwin) sigtool; }; listenbrainz-mpd = callPackage ../applications/audio/listenbrainz-mpd {