about summary refs log tree commit diff
path: root/nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix')
-rw-r--r--nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix232
1 files changed, 139 insertions, 93 deletions
diff --git a/nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix b/nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix
index c6ada1f55d5f..4e332e6fe557 100644
--- a/nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix
+++ b/nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix
@@ -1,26 +1,31 @@
-{ lib
-, overrideCC
-, stdenv
-, fetchFromGitHub
-, gitUpdater
-, cctools
-, sigtool
-, cereal
-, libcxx
-, glslang
-, spirv-cross
-, spirv-headers
-, spirv-tools
-, vulkan-headers
-, xcbuild
-, AppKit
-, Foundation
-, Libsystem
-, MacOSX-SDK
-, Metal
-, QuartzCore
+{
+  lib,
+  stdenv,
+  fetchFromGitHub,
+  gitUpdater,
+  cereal,
+  libcxx,
+  glslang,
+  simd,
+  spirv-cross,
+  spirv-headers,
+  spirv-tools,
+  vulkan-headers,
+  xcbuild,
+  AppKit,
+  Foundation,
+  Metal,
+  QuartzCore,
+  # MoltenVK supports using private APIs to implement some Vulkan functionality.
+  # Applications that use private APIs can’t be distributed on the App Store,
+  # but that’s not really a concern for nixpkgs, so use them by default.
+  # See: https://github.com/KhronosGroup/MoltenVK/blob/main/README.md#metal_private_api
+  enablePrivateAPIUsage ? true,
 }:
 
+let
+  inherit (stdenv.hostPlatform) isStatic;
+in
 stdenv.mkDerivation (finalAttrs: {
   pname = "MoltenVK";
   version = "1.2.7";
@@ -32,15 +37,20 @@ stdenv.mkDerivation (finalAttrs: {
     QuartzCore
     cereal
     glslang
+    simd
     spirv-cross
     spirv-headers
     spirv-tools
     vulkan-headers
   ];
 
-  nativeBuildInputs = [ cctools sigtool xcbuild ];
+  nativeBuildInputs = [ xcbuild ];
 
-  outputs = [ "out" "bin" "dev" ];
+  outputs = [
+    "out"
+    "bin"
+    "dev"
+  ];
 
   src = fetchFromGitHub {
     owner = "KhronosGroup";
@@ -49,106 +59,142 @@ stdenv.mkDerivation (finalAttrs: {
     hash = "sha256-0+S/kueV+AEVt+oFnh4cgcDRVtEbUH1QiHFPhGhimCA=";
   };
 
-  patches = [
-    # Fix the Xcode projects to play nicely with `xcbuild`.
-    ./MoltenVKShaderConverter.xcodeproj.patch
-    ./MoltenVK.xcodeproj.patch
-  ];
-
   postPatch = ''
     # Move `mvkGitRevDerived.h` to a stable location
     substituteInPlace Scripts/gen_moltenvk_rev_hdr.sh \
       --replace-fail '$'''{BUILT_PRODUCTS_DIR}' "$NIX_BUILD_TOP/$sourceRoot/build/include" \
       --replace-fail '$(git rev-parse HEAD)' ${finalAttrs.src.rev}
-    # Use the SPIRV-Cross packaged in nixpkgs instead of one built specifically for MoltenVK.
-    substituteInPlace MoltenVK/MoltenVK.xcodeproj/project.pbxproj \
-      --replace-fail SPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross SPIRV_CROSS_NAMESPACE_OVERRIDE=spirv_cross
+
+    # Modify MoltenVK Xcode projects to build with xcbuild and dependencies from nixpkgs.
+    for proj in MoltenVK MoltenVKShaderConverter; do
+      # Remove xcframework dependencies from the Xcode projects. The basic format is:
+      #     (children|files) = (
+      #         DCFD7F822A45BDA0007BBBF7 /* SPIRVCross.xcframework in Frameworks */,
+      #         etc
+      #     )
+      # This regex will only remove lines matching `xcframework` that are in these blocks
+      # to avoid accidentally corrupting the project.
+      sed -E -e '/(children|files) = /,/;/{/xcframework/d}' \
+        -i "$proj/$proj.xcodeproj/project.pbxproj"
+      # Ensure the namespace used is consistent with the spirv-cross package in nixpkgs.
+      substituteInPlace "$proj/$proj.xcodeproj/project.pbxproj" \
+        --replace-fail SPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross SPIRV_CROSS_NAMESPACE_OVERRIDE=spirv_cross
+    done
     substituteInPlace MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj \
-      --replace-fail SPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross SPIRV_CROSS_NAMESPACE_OVERRIDE=spirv_cross
-    # Adding all of `usr/include` from the SDK results in header conflicts with `libcxx.dev`.
-    # Work around it by symlinking just the SIMD stuff needed by MoltenVK.
+      --replace-fail MetalGLShaderConverterTool MoltenVKShaderConverter \
+      --replace-fail MetalGLShaderConverter-macOS MoltenVKShaderConverter
+
+    # Don’t try to build `xcframework`s because `xcbuild` can’t build them.
+    sed -e '/xcframework/d' -i Scripts/package_all.sh
+
+    # Remove vendored dependency links.
+    find . -lname '*/External/*' -delete
+
+    # The library will be linked in the install phase regardless of version,
+    # so truncate it if it exists to avoid link failures.
+    test -f Scripts/create_dylib.sh && truncate --size 0 Scripts/create_dylib.sh
+
+    # Link glslang source because MoltenVK needs non-public headers to build.
     mkdir -p build/include
-    ln -s "${MacOSX-SDK}/usr/include/simd" "build/include"
     ln -s "${glslang.src}" "build/include/glslang"
   '';
 
-  dontConfigure = true;
-
-  env.NIX_CFLAGS_COMPILE = toString [
-    "-isystem ${lib.getDev libcxx}/include/c++/v1"
-    "-I${lib.getDev spirv-cross}/include/spirv_cross"
-    "-I${lib.getDev spirv-headers}/include/spirv/unified1/"
+  env.NIX_CFLAGS_COMPILE = toString (
+    [
+      "-isystem ${lib.getDev libcxx}/include/c++/v1"
+      "-I${lib.getDev spirv-cross}/include/spirv_cross"
+      "-I${lib.getDev spirv-headers}/include/spirv/unified1"
+    ]
+    ++ lib.optional enablePrivateAPIUsage "-DMVK_USE_METAL_PRIVATE_API=1"
+  );
+
+  env.NIX_LDFLAGS = toString [
+    "-lMachineIndependent"
+    "-lGenericCodeGen"
+    "-lglslang"
+    "-lOSDependent"
+    "-lSPIRV"
+    "-lSPIRV-Tools"
+    "-lSPIRV-Tools-opt"
+    "-lspirv-cross-msl"
+    "-lspirv-cross-core"
+    "-lspirv-cross-glsl"
+    "-lspirv-cross-reflect"
   ];
 
   buildPhase = ''
+    runHook preBuild
+
     NIX_CFLAGS_COMPILE+=" \
       -I$NIX_BUILD_TOP/$sourceRoot/build/include \
       -I$NIX_BUILD_TOP/$sourceRoot/Common"
-    NIX_LDFLAGS+=" -L$NIX_BUILD_TOP/$sourceRoot/build/lib"
-
-    # Build each project on its own because `xcbuild` fails to build `MoltenVKPackaging.xcodeproj`.
-    build=$NIX_BUILD_TOP/$sourceRoot/build
-    mkdir -p "$build/bin" "$build/lib"
-
-    NIX_LDFLAGS+=" \
-      -lMachineIndependent \
-      -lGenericCodeGen \
-      -lglslang \
-      -lOSDependent \
-      -lSPIRV \
-      -lSPIRV-Tools \
-      -lSPIRV-Tools-opt \
-      -lspirv-cross-msl \
-      -lspirv-cross-core \
-      -lspirv-cross-glsl"
-
-    pushd MoltenVKShaderConverter
-    xcodebuild build \
-      -jobs $NIX_BUILD_CORES \
-      -configuration Release \
-      -project MoltenVKShaderConverter.xcodeproj \
-      -scheme MoltenVKShaderConverter \
-      -arch ${stdenv.hostPlatform.darwinArch}
-    declare -A products=( [MoltenVKShaderConverter]=bin [libMoltenVKShaderConverter.a]=lib )
-    for product in "''${!products[@]}"; do
-      cp MoltenVKShaderConverter-*/Build/Products/Release/$product "$build/''${products[$product]}/$product"
-    done
-    popd
-
-    NIX_LDFLAGS+=" \
-      -lobjc \
-      -lMoltenVKShaderConverter \
-      -lspirv-cross-reflect"
 
-    pushd MoltenVK
     xcodebuild build \
+      SYMROOT=$PWD/Products OBJROOT=$PWD/Intermedates \
       -jobs $NIX_BUILD_CORES \
       -configuration Release \
-      -project MoltenVK.xcodeproj \
-      -scheme MoltenVK-macOS \
+      -project MoltenVKPackaging.xcodeproj \
+      -scheme 'MoltenVK Package (macOS only)' \
+      -destination generic/platform=macOS \
       -arch ${stdenv.hostPlatform.darwinArch}
-    cp MoltenVK-*/Build/Products/Release/dynamic/libMoltenVK.dylib "$build/lib/libMoltenVK.dylib"
-    popd
+
+    runHook postBuild
   '';
 
+  postBuild =
+    if isStatic then
+      ''
+        mkdir -p Package/Release/MoltenVK/static
+        cp Products/Release/libMoltenVK.a Package/Release/MoltenVK/static
+      ''
+    else
+      ''
+        # MoltenVK’s Xcode project builds the dylib, but it doesn’t seem to work with
+        # xcbuild. This is based on the script versions prior to 1.2.8 used.
+        mkdir -p Package/Release/MoltenVK/dynamic/dylib
+        clang++ -Wl,-all_load -Wl,-w \
+          -dynamiclib \
+          -compatibility_version 1.0.0 -current_version 1.0.0 \
+          -LProducts/Release \
+          -framework AppKit \
+          -framework CoreGraphics \
+          -framework Foundation \
+          -framework IOKit \
+          -framework IOSurface \
+          -framework Metal \
+          -framework QuartzCore \
+          -lobjc \
+          -lMoltenVKShaderConverter \
+          -lspirv-cross-reflect \
+          -install_name "$out/lib/libMoltenVK.dylib" \
+          -o Package/Release/MoltenVK/dynamic/dylib/libMoltenVK.dylib \
+          -force_load Products/Release/libMoltenVK.a
+      '';
+
   installPhase = ''
-    mkdir -p "$out/lib" "$out/share/vulkan/icd.d" "$bin/bin" "$dev/include/MoltenVK"
-    cp build/bin/MoltenVKShaderConverter "$bin/bin/"
-    cp build/lib/libMoltenVK.dylib "$out/lib/"
-    cp MoltenVK/MoltenVK/API/* "$dev/include/MoltenVK"
-    install -m644 MoltenVK/icd/MoltenVK_icd.json "$out/share/vulkan/icd.d/MoltenVK_icd.json"
-    substituteInPlace $out/share/vulkan/icd.d/MoltenVK_icd.json \
+    runHook preInstall
+
+    libraryExtension=${if isStatic then ".a" else ".dylib"}
+    packagePath=${if isStatic then "static" else "dynamic/dylib"}
+
+    mkdir -p "$out/lib" "$out/share/vulkan/icd.d" "$bin/bin" "$dev"
+
+    cp Package/Release/MoltenVKShaderConverter/Tools/MoltenVKShaderConverter "$bin/bin"
+    cp -r Package/Release/MoltenVK/include "$dev"
+    cp Package/Release/MoltenVK/$packagePath/libMoltenVK$libraryExtension "$out/lib"
+
+    # Install ICD definition for use with vulkan-loader.
+    install -m644 MoltenVK/icd/MoltenVK_icd.json \
+      "$out/share/vulkan/icd.d/MoltenVK_icd.json"
+    substituteInPlace "$out/share/vulkan/icd.d/MoltenVK_icd.json" \
       --replace-fail ./libMoltenVK.dylib "$out/lib/libMoltenVK.dylib"
-  '';
 
-  postFixup = ''
-    install_name_tool -id "$out/lib/libMoltenVK.dylib" "$out/lib/libMoltenVK.dylib"
-    codesign -s - -f "$out/lib/libMoltenVK.dylib"
-    codesign -s - -f "$bin/bin/MoltenVKShaderConverter"
+    runHook postInstall
   '';
 
   passthru.updateScript = gitUpdater {
     rev-prefix = "v";
+    ignoredVersions = ".*-(beta|rc).*";
   };
 
   meta = {