nixpkgs/pkgs/os-specific/darwin/moltenvk/default.nix

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

190 lines
6.0 KiB
Nix
Raw Normal View History

2022-02-07 23:32:02 +00:00
{ lib
, overrideCC
2022-02-07 23:32:02 +00:00
, stdenv
, fetchurl
, fetchFromGitHub
, cctools
, sigtool
, cereal
, libcxx
2022-02-07 23:32:02 +00:00
, glslang
, spirv-cross
, spirv-headers
, spirv-tools
, vulkan-headers
, xcbuild
2022-02-07 23:32:02 +00:00
, AppKit
, Foundation
, Libsystem
, MacOSX-SDK
2022-02-07 23:32:02 +00:00
, Metal
, QuartzCore
}:
stdenv.mkDerivation (finalAttrs: {
2022-02-07 23:32:02 +00:00
pname = "MoltenVK";
2022-08-14 19:27:04 +00:00
version = "1.1.11";
2022-02-07 23:32:02 +00:00
buildInputs = [ AppKit Foundation Metal QuartzCore cereal ]
++ lib.attrValues finalAttrs.passthru;
nativeBuildInputs = [ cctools sigtool xcbuild ];
2022-02-07 23:32:02 +00:00
outputs = [ "out" "bin" "dev" ];
2022-02-07 23:32:02 +00:00
# MoltenVK requires specific versions of its dependencies.
# Pin them here except for cereal, which is four years old and has several CVEs.
passthru = {
glslang = (glslang.overrideAttrs (old: {
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "glslang";
2022-08-14 19:27:04 +00:00
rev = "73c9630da979017b2f7e19c6549e2bdb93d9b238";
hash = "sha256-+NKp/4e3iruAcTunpxksvCHxoVYmPd0kFI8JDJJUVg4=";
2022-02-07 23:32:02 +00:00
};
})).override { inherit (finalAttrs.passthru) spirv-headers spirv-tools; };
2022-02-07 23:32:02 +00:00
spirv-cross = spirv-cross.overrideAttrs (old: {
cmakeFlags = (old.cmakeFlags or [ ])
++ [ "-DSPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross" ];
2022-02-07 23:32:02 +00:00
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "SPIRV-Cross";
2022-08-14 19:27:04 +00:00
rev = "61c603f3baa5270e04bcfb6acf83c654e3c57679";
hash = "sha256-gV5ba8SlPmkUptZkQfrrEDoFXrFTfs3eVOf807cO/f8=";
2022-02-07 23:32:02 +00:00
};
});
spirv-headers = spirv-headers.overrideAttrs (_: {
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "spirv-headers";
2022-08-14 19:27:04 +00:00
rev = "b2a156e1c0434bc8c99aaebba1c7be98be7ac580";
hash = "sha256-qYhFoRrQOlvYvVXhIFsa3dZuORDpZyVC5peeYmGNimw=";
2022-02-07 23:32:02 +00:00
};
});
spirv-tools = (spirv-tools.overrideAttrs (old: {
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "spirv-tools";
2022-08-14 19:27:04 +00:00
rev = "5e61ea2098220059e89523f1f47b0bcd8c33b89a";
hash = "sha256-jpVvjrNrTAKUY4sjUT/gCUElLtW4BrznH1DbStojGB8=";
2022-02-07 23:32:02 +00:00
};
})).override { inherit (finalAttrs.passthru) spirv-headers; };
2022-02-07 23:32:02 +00:00
vulkan-headers = vulkan-headers.overrideAttrs (old: {
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "Vulkan-Headers";
2022-08-14 19:27:04 +00:00
rev = "c896e2f920273bfee852da9cca2a356bc1c2031e";
hash = "sha256-zUT5+Ttmkrj51a9FS1tQxoYMS0Y0xV8uaCEJNur4khc=";
2022-02-07 23:32:02 +00:00
};
});
};
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "MoltenVK";
rev = "v${finalAttrs.version}";
2022-08-14 19:27:04 +00:00
hash = "sha256-+/vlZvEuake0E2jFZOcctEVGMCcXelGPQJXt1EI06us=";
2022-02-07 23:32:02 +00:00
};
patches = [
# Fix the Xcode projects to play nicely with `xcbuild`.
./MoltenVKShaderConverter.xcodeproj.patch
./MoltenVK.xcodeproj.patch
];
postPatch = ''
# Move `mvkGitRevDerived.h` to a stable location
2022-02-07 23:32:02 +00:00
substituteInPlace Scripts/gen_moltenvk_rev_hdr.sh \
--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"
2022-02-07 23:32:02 +00:00
'';
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/"
];
2022-02-07 23:32:02 +00:00
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"
2022-02-07 23:32:02 +00:00
# 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 \
-lOGLCompiler \
-lglslang \
-lOSDependent \
-lSPIRV \
-lSPIRV-Tools \
-lSPIRV-Tools-opt \
-lspirv-cross-msl \
-lspirv-cross-core \
-lspirv-cross-glsl"
2022-02-07 23:32:02 +00:00
pushd MoltenVKShaderConverter
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"
2022-02-07 23:32:02 +00:00
done
popd
NIX_LDFLAGS+=" \
-lobjc \
-lMoltenVKShaderConverter \
-lspirv-cross-reflect"
2022-02-07 23:32:02 +00:00
pushd MoltenVK
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"
2022-02-07 23:32:02 +00:00
popd
'';
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 \
2022-04-20 00:33:54 +00:00
--replace ./libMoltenVK.dylib "$out/lib/libMoltenVK.dylib"
2022-02-07 23:32:02 +00:00
'';
postFixup = ''
install_name_tool -id "$out/lib/libMoltenVK.dylib" "$out/lib/libMoltenVK.dylib"
codesign -s - -f "$out/lib/libMoltenVK.dylib"
2022-02-07 23:32:02 +00:00
'';
meta = {
description = "A Vulkan Portability implementation built on top of Apples Metal API";
homepage = "https://github.com/KhronosGroup/MoltenVK";
changelog = "https://github.com/KhronosGroup/MoltenVK/releases";
maintainers = [ lib.maintainers.reckenrode ];
license = lib.licenses.asl20;
platforms = lib.platforms.darwin;
};
})