diff options
author | Randy Eckenrode <randy@largeandhighquality.com> | 2023-08-27 10:58:27 +0200 |
---|---|---|
committer | Michael Raskin <7c6f434c@mail.ru> | 2023-08-27 10:58:27 +0200 |
commit | bdf47492d43d88844db5bd758150bb493aa22ff1 (patch) | |
tree | edcf7878081215b8a667f5405d5990675a11a1b3 | |
parent | 0f3611743aa1d4ba189d74716e5044460a435a1b (diff) | |
download | nixpkgs-bdf47492d43d88844db5bd758150bb493aa22ff1.tar nixpkgs-bdf47492d43d88844db5bd758150bb493aa22ff1.tar.gz nixpkgs-bdf47492d43d88844db5bd758150bb493aa22ff1.tar.bz2 nixpkgs-bdf47492d43d88844db5bd758150bb493aa22ff1.tar.lz nixpkgs-bdf47492d43d88844db5bd758150bb493aa22ff1.tar.xz nixpkgs-bdf47492d43d88844db5bd758150bb493aa22ff1.tar.zst nixpkgs-bdf47492d43d88844db5bd758150bb493aa22ff1.zip |
wine64Packages.unstable: Darwin compatibility fixes
- Wine 8.12 changed the implementation of `macdrv_get_gpus_from_metal`, causing the patch used by nixpkgs to break. This patch splits that patch up to apply cleanly depending on the version; - Silence an implicit pointer to integer conversion warning due to the above patch (required by the Clang 16 stdenv bump); - Add the PCSC framework on Darwin, which is required as of Wine 8.14. Wine 8.14 changes the implementation of `macdrv_get_gpus_from_metal`, causing the patch to no longer apply cleanly. Splitting the patch allows only the parts that are still needed to apply cleanly dependin gon the Wine version being built.
3 files changed, 39 insertions, 23 deletions
diff --git a/pkgs/applications/emulators/wine/base.nix b/pkgs/applications/emulators/wine/base.nix index bc8051d6de5..50a2e7d7566 100644 --- a/pkgs/applications/emulators/wine/base.nix +++ b/pkgs/applications/emulators/wine/base.nix @@ -90,7 +90,7 @@ stdenv.mkDerivation ((lib.optionalAttrs (buildScript != null) { ++ lib.optionals tlsSupport [ pkgs.openssl pkgs.gnutls ] ++ lib.optionals (openglSupport && !stdenv.isDarwin) [ pkgs.libGLU pkgs.libGL pkgs.mesa.osmesa pkgs.libdrm ] ++ lib.optionals stdenv.isDarwin (with pkgs.buildPackages.darwin.apple_sdk.frameworks; [ - CoreServices Foundation ForceFeedback AppKit OpenGL IOKit DiskArbitration Security + CoreServices Foundation ForceFeedback AppKit OpenGL IOKit DiskArbitration PCSC Security ApplicationServices AudioToolbox CoreAudio AudioUnit CoreMIDI OpenCL Cocoa Carbon ]) ++ lib.optionals (stdenv.isLinux && !waylandSupport) (with pkgs.xorg; [ @@ -103,14 +103,27 @@ stdenv.mkDerivation ((lib.optionalAttrs (buildScript != null) { patches = [ ] ++ lib.optionals stdenv.isDarwin [ - # Wine requires `MTLDevice.registryID` for `winemac.drv`, but that property is not available - # in the 10.12 SDK (current SDK on x86_64-darwin). Work around that by using selector syntax. + # Wine uses `MTLDevice.registryID` in `winemac.drv`, but that property is not available in + # the 10.12 SDK (current SDK on x86_64-darwin). That can be worked around by using selector + # syntax. As of Wine 8.12, the logic has changed and uses selector syntax, but it still + # uses property syntax in one place. The first patch is necessary only with older + # versions of Wine. The second is needed on all versions of Wine. + (lib.optional (lib.versionOlder version "8.12") ./darwin-metal-compat-pre8.12.patch) ./darwin-metal-compat.patch # Wine requires `qos.h`, which is not included by default on the 10.12 SDK in nixpkgs. ./darwin-qos.patch ] ++ patches'; + # Because the 10.12 SDK doesn’t define `registryID`, clang assumes the undefined selector returns + # `id`, which is a pointer. This causes implicit pointer to integer errors in clang 15+. + # The following post-processing step adds a cast to `uint64_t` before the selector invocation to + # silence these errors. + postPatch = lib.optionalString stdenv.isDarwin '' + sed -e 's|\(\[[A-Za-z_][][A-Za-z_0-9]* registryID\]\)|(uint64_t)\1|' \ + -i dlls/winemac.drv/cocoa_display.m + ''; + configureFlags = prevConfigFlags ++ lib.optionals supportFlags.waylandSupport [ "--with-wayland" ] ++ lib.optionals supportFlags.vulkanSupport [ "--with-vulkan" ] diff --git a/pkgs/applications/emulators/wine/darwin-metal-compat-pre8.12.patch b/pkgs/applications/emulators/wine/darwin-metal-compat-pre8.12.patch new file mode 100644 index 00000000000..aaf8a1b89bf --- /dev/null +++ b/pkgs/applications/emulators/wine/darwin-metal-compat-pre8.12.patch @@ -0,0 +1,22 @@ +diff --git a/dlls/winemac.drv/cocoa_display.m b/dlls/winemac.drv/cocoa_display.m +--- a/dlls/winemac.drv/cocoa_display.m ++++ b/dlls/winemac.drv/cocoa_display.m +@@ -289,7 +289,7 @@ static int macdrv_get_gpus_from_metal(struct macdrv_gpu** new_gpus, int* count) + * the primary GPU because we need to hide the integrated GPU for an automatic graphic switching pair to avoid apps + * using the integrated GPU. This is the behavior of Windows on a Mac. */ + primary_device = [MTLCreateSystemDefaultDevice() autorelease]; +- if (macdrv_get_gpu_info_from_registry_id(&primary_gpu, primary_device.registryID)) ++ if (macdrv_get_gpu_info_from_registry_id(&primary_gpu, [primary_device registryID])) + goto done; + + /* Hide the integrated GPU if the system default device is a dedicated GPU */ +@@ -301,7 +301,7 @@ static int macdrv_get_gpus_from_metal(struct macdrv_gpu** new_gpus, int* count) + + for (i = 0; i < devices.count; i++) + { +- if (macdrv_get_gpu_info_from_registry_id(&gpus[gpu_count], devices[i].registryID)) ++ if (macdrv_get_gpu_info_from_registry_id(&gpus[gpu_count], [devices[i] registryID])) + goto done; + + if (hide_integrated && devices[i].isLowPower) + diff --git a/pkgs/applications/emulators/wine/darwin-metal-compat.patch b/pkgs/applications/emulators/wine/darwin-metal-compat.patch index aeee7533bbd..181b2a0d1a4 100644 --- a/pkgs/applications/emulators/wine/darwin-metal-compat.patch +++ b/pkgs/applications/emulators/wine/darwin-metal-compat.patch @@ -1,31 +1,12 @@ diff --git a/dlls/winemac.drv/cocoa_display.m b/dlls/winemac.drv/cocoa_display.m -index f64a6c0f6ad..6da0391e3fa 100644 --- a/dlls/winemac.drv/cocoa_display.m +++ b/dlls/winemac.drv/cocoa_display.m -@@ -289,7 +289,7 @@ static int macdrv_get_gpus_from_metal(struct macdrv_gpu** new_gpus, int* count) - * the primary GPU because we need to hide the integrated GPU for an automatic graphic switching pair to avoid apps - * using the integrated GPU. This is the behavior of Windows on a Mac. */ - primary_device = [MTLCreateSystemDefaultDevice() autorelease]; -- if (macdrv_get_gpu_info_from_registry_id(&primary_gpu, primary_device.registryID)) -+ if (macdrv_get_gpu_info_from_registry_id(&primary_gpu, (uint64_t)[primary_device registryID])) - goto done; - - /* Hide the integrated GPU if the system default device is a dedicated GPU */ -@@ -301,7 +301,7 @@ static int macdrv_get_gpus_from_metal(struct macdrv_gpu** new_gpus, int* count) - - for (i = 0; i < devices.count; i++) - { -- if (macdrv_get_gpu_info_from_registry_id(&gpus[gpu_count], devices[i].registryID)) -+ if (macdrv_get_gpu_info_from_registry_id(&gpus[gpu_count], (uint64_t)[devices[i] registryID])) - goto done; - - if (hide_integrated && devices[i].isLowPower) @@ -354,7 +354,7 @@ static int macdrv_get_gpu_info_from_display_id_using_metal(struct macdrv_gpu* gp device = [CGDirectDisplayCopyCurrentMetalDevice(display_id) autorelease]; if (device && [device respondsToSelector:@selector(registryID)]) - ret = macdrv_get_gpu_info_from_registry_id(gpu, device.registryID); -+ ret = macdrv_get_gpu_info_from_registry_id(gpu, (uint64_t)[device registryID]); ++ ret = macdrv_get_gpu_info_from_registry_id(gpu, [device registryID]); done: [pool release]; |