diff options
Diffstat (limited to 'nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix')
-rw-r--r-- | nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix | 201 |
1 files changed, 93 insertions, 108 deletions
diff --git a/nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix b/nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix index dc7f3f58fd3a..1d8f89deff19 100644 --- a/nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix +++ b/nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix @@ -1,103 +1,80 @@ { lib +, overrideCC , stdenv -, stdenvNoCC , fetchurl , fetchFromGitHub , cctools , sigtool , cereal +, libcxx , glslang , spirv-cross , spirv-headers , spirv-tools , vulkan-headers +, xcbuild , AppKit , Foundation +, Libsystem +, MacOSX-SDK , Metal , QuartzCore }: -# Even though the derivation is currently impure, it is written to build successfully using -# `xcbuild`. Once the SDK on x86_64-darwin is updated, it should be possible to switch from being -# an impure derivation. -# -# The `sandboxProfile` was copied from the iTerm2 derivation. In order to build you at least need -# the `sandbox` option set to `relaxed` or `false`. Xcode should be available in the default -# location. -let - libcxx.dev = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr"; -in -stdenvNoCC.mkDerivation rec { +stdenv.mkDerivation (finalAttrs: { pname = "MoltenVK"; - version = "1.1.8"; + version = "1.1.10"; - buildInputs = [ - AppKit - Foundation - Metal - QuartzCore - ]; + buildInputs = [ AppKit Foundation Metal QuartzCore cereal ] + ++ lib.attrValues finalAttrs.passthru; + + nativeBuildInputs = [ cctools sigtool xcbuild ]; - outputs = [ "out" "bin" ]; + outputs = [ "out" "bin" "dev" ]; # MoltenVK requires specific versions of its dependencies. # Pin them here except for cereal, which is four years old and has several CVEs. passthru = { - # The patch required to support DXVK may different from version to version. This should never - # be used except with DXVK, so there’s no package for it. To emphasize that this patch should - # never be used except with DXVK, `dxvk` provides a function for applying this patch. - dxvkPatch = ./dxvk-moltenvk-compat.patch; glslang = (glslang.overrideAttrs (old: { src = fetchFromGitHub { owner = "KhronosGroup"; repo = "glslang"; - rev = "90d4bd05cd77ef5782a6779a0fe3d084440dc80d"; - hash = "sha256-Q0sk4bPj/skPat1n4GJyuXAlZqpfEn4Td8Bm2IBNUqE="; + rev = "adbf0d3106b26daa237b10b9bf72b1af7c31092d"; + hash = "sha256-sjidkiPtRADhyOEKDb2cHCBXnFjLwk2F5Lppv5/fwNQ="; }; - })).override { - inherit (passthru) spirv-headers spirv-tools; - }; + })).override { inherit (finalAttrs.passthru) spirv-headers spirv-tools; }; spirv-cross = spirv-cross.overrideAttrs (old: { - cmakeFlags = (old.cmakeFlags or [ ]) ++ [ - "-DSPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross" - ]; + cmakeFlags = (old.cmakeFlags or [ ]) + ++ [ "-DSPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross" ]; src = fetchFromGitHub { owner = "KhronosGroup"; repo = "SPIRV-Cross"; - rev = "131278458ea8eebe6a6e9c476fbcf71278726e1a"; - hash = "sha256-LrRYDFGv3Zxfy4qRNLwM2OOa8jbcq0ttPxDamCH21xU="; + rev = "50b4d5389b6a06f86fb63a2848e1a7da6d9755ca"; + hash = "sha256-SsupPHJ3VHxJhEAUl3EeQwN4texYhdDjxTnGD+bkNAw="; }; }); spirv-headers = spirv-headers.overrideAttrs (_: { src = fetchFromGitHub { owner = "KhronosGroup"; repo = "spirv-headers"; - rev = "b42ba6d92faf6b4938e6f22ddd186dbdacc98d78"; - hash = "sha256-ks9JCj5rj+Xu++7z5RiHDkU3/sFXhcScw8dATfB/ot0"; + rev = "5a121866927a16ab9d49bed4788b532c7fcea766"; + hash = "sha256-X4GuFesX015mrzutguhZLrIGlllCgAZ+DUBGSADt8xU="; }; }); spirv-tools = (spirv-tools.overrideAttrs (old: { src = fetchFromGitHub { owner = "KhronosGroup"; repo = "spirv-tools"; - rev = "45dd184c790d6bfc78a5a74a10c37e888b1823fa"; - hash = "sha256-DSqZlwfNTbN4fyIrVBKltm5U2U4GthW3L+Ksw4lSVG8="; + rev = "b930e734ea198b7aabbbf04ee1562cf6f57962f0"; + hash = "sha256-NWpFSRoxtYWi+hLUt9gpw0YScM3shcUwv9yUmbivRb0="; }; - meta = old.meta // { - platforms = old.meta.platforms ++ lib.platforms.darwin; - }; - })).override { - inherit (passthru) spirv-headers; - }; + })).override { inherit (finalAttrs.passthru) spirv-headers; }; vulkan-headers = vulkan-headers.overrideAttrs (old: { src = fetchFromGitHub { owner = "KhronosGroup"; repo = "Vulkan-Headers"; - rev = "1dace16d8044758d32736eb59802d171970e9448"; - hash = "sha256-C6YgxWcinI3QumcWmoJaiTAf0u6jSDc8sCIarn2t04k"; - }; - meta = old.meta // { - platforms = old.meta.platforms ++ lib.platforms.darwin; + rev = "3ef4c97fd6ea001d75a8e9da408ee473c180e456"; + hash = "sha256-jHzW3m9smuzEGbZrSyBI74K9rFozxiG3M5Xql/WOw7U="; }; }); }; @@ -105,92 +82,100 @@ stdenvNoCC.mkDerivation rec { src = fetchFromGitHub { owner = "KhronosGroup"; repo = "MoltenVK"; - rev = "v${version}"; - hash = "sha256-IfTBtA2fM7YN4qaSDUTfsiCXzn+omSV6oroL1ivKiVA="; + rev = "v${finalAttrs.version}"; + hash = "sha256-LZvCCP2yelTaWcNt+WvG+RZnVLHRgMDTlNWwRIey7ZM="; }; patches = [ - # Specify the libraries to link directly since XCFrameworks are not being used. - ./createDylib.patch - # Move `mvkGitRevDerived.h` to a stable location - ./gitRevHeaderStability.patch # Fix the Xcode projects to play nicely with `xcbuild`. ./MoltenVKShaderConverter.xcodeproj.patch ./MoltenVK.xcodeproj.patch ]; postPatch = '' - substituteInPlace MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj \ - --replace @@sourceRoot@@ $(pwd) \ - --replace @@libcxx@@ "${libcxx.dev}" \ - --replace @@glslang@@ "${passthru.glslang}" \ - --replace @@spirv-cross@@ "${passthru.spirv-cross}" \ - --replace @@spirv-tools@@ "${passthru.glslang.spirv-tools}" \ - --replace @@spirv-headers@@ "${passthru.glslang.spirv-headers}" - substituteInPlace MoltenVK/MoltenVK.xcodeproj/project.pbxproj \ - --replace @@sourceRoot@@ $(pwd) \ - --replace @@libcxx@@ "${libcxx.dev}" \ - --replace @@cereal@@ "${cereal}" \ - --replace @@spirv-cross@@ "${passthru.spirv-cross}" \ - --replace @@vulkan-headers@@ "${passthru.vulkan-headers}" - substituteInPlace Scripts/create_dylib.sh \ - --replace @@sourceRoot@@ $(pwd) \ - --replace @@glslang@@ "${passthru.glslang}" \ - --replace @@spirv-tools@@ "${passthru.glslang.spirv-tools}" \ - --replace @@spirv-cross@@ "${passthru.spirv-cross}" + # Move `mvkGitRevDerived.h` to a stable location substituteInPlace Scripts/gen_moltenvk_rev_hdr.sh \ - --replace @@sourceRoot@@ $(pwd) \ - --replace '$(git rev-parse HEAD)' ${src.rev} + --replace '$'''{BUILT_PRODUCTS_DIR}' "$NIX_BUILD_TOP/$sourceRoot/build/include" \ + --replace '$(git rev-parse HEAD)' ${finalAttrs.src.rev} + # 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. + mkdir -p build/include + ln -s "${MacOSX-SDK}/usr/include/simd" "build/include" ''; dontConfigure = true; + NIX_CFLAGS_COMPILE = [ + "-isystem ${lib.getDev libcxx}/include/c++/v1" + "-I${finalAttrs.passthru.spirv-cross}/include/spirv_cross" + "-I${finalAttrs.passthru.spirv-headers}/include/spirv/unified1/" + ]; + buildPhase = '' + 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`. - derived_data_path=$(pwd)/DerivedData + build=$NIX_BUILD_TOP/$sourceRoot/build + mkdir -p "$build/bin" "$build/lib" + + NIX_LDFLAGS+=" \ + -lMachineIndependent \ + -lGenericCodeGen \ + -lOGLCompiler \ + -lglslang \ + -lOSDependent \ + -lSPIRV \ + -lSPIRV-Tools \ + -lSPIRV-Tools-opt \ + -lspirv-cross-msl \ + -lspirv-cross-core \ + -lspirv-cross-glsl" + pushd MoltenVKShaderConverter - /usr/bin/xcodebuild build \ - -jobs $NIX_BUILD_CORES \ - -derivedDataPath "$derived_data_path" \ - -configuration Release \ - -project MoltenVKShaderConverter.xcodeproj \ - -scheme MoltenVKShaderConverter \ - -arch ${stdenv.targetPlatform.darwinArch} - popd - mkdir -p outputs/bin outputs/lib - declare -A outputs=( [MoltenVKShaderConverter]=bin [libMoltenVKShaderConverter.a]=lib ) - for output in "''${!outputs[@]}"; do - cp DerivedData/Build/Products/Release/$output "outputs/''${outputs[$output]}/$output" + xcodebuild build \ + -jobs $NIX_BUILD_CORES \ + -configuration Release \ + -project MoltenVKShaderConverter.xcodeproj \ + -scheme MoltenVKShaderConverter \ + -arch ${stdenv.targetPlatform.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 - /usr/bin/xcodebuild build \ - -jobs $NIX_BUILD_CORES \ - -derivedDataPath "$derived_data_path" \ - -configuration Release \ - -project MoltenVK.xcodeproj \ - -scheme MoltenVK-macOS \ - -arch ${stdenv.targetPlatform.darwinArch} + xcodebuild build \ + -jobs $NIX_BUILD_CORES \ + -configuration Release \ + -project MoltenVK.xcodeproj \ + -scheme MoltenVK-macOS \ + -arch ${stdenv.targetPlatform.darwinArch} + cp MoltenVK-*/Build/Products/Release/dynamic/libMoltenVK.dylib "$build/lib/libMoltenVK.dylib" popd - cp DerivedData/Build/Products/Release/dynamic/libMoltenVK.dylib outputs/lib/libMoltenVK.dylib ''; installPhase = '' - mkdir -p "$out/lib" "$out/share/vulkan/icd.d" "$bin/bin" - cp outputs/bin/MoltenVKShaderConverter "$bin/bin/" - cp outputs/lib/libMoltenVK.dylib "$out/lib/" - ${cctools}/bin/install_name_tool -id "$out/lib/libMoltenVK.dylib" "$out/lib/libMoltenVK.dylib" - # FIXME: https://github.com/NixOS/nixpkgs/issues/148189 - /usr/bin/codesign -s - -f "$out/lib/libMoltenVK.dylib" + 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 \ - --replace ./libMoltenVK.dylib "$out/share/vulkan/icd.d/MoltenVK_icd.json" + --replace ./libMoltenVK.dylib "$out/lib/libMoltenVK.dylib" ''; - sandboxProfile = '' - (allow file-read* file-write* process-exec mach-lookup) - ; block homebrew dependencies - (deny file-read* file-write* process-exec mach-lookup (subpath "/usr/local") (with no-log)) + postFixup = '' + install_name_tool -id "$out/lib/libMoltenVK.dylib" "$out/lib/libMoltenVK.dylib" + codesign -s - -f "$out/lib/libMoltenVK.dylib" ''; meta = { @@ -201,4 +186,4 @@ stdenvNoCC.mkDerivation rec { license = lib.licenses.asl20; platforms = lib.platforms.darwin; }; -} +}) |