nixpkgs/pkgs/by-name/mo/moltenvk/package.nix
2024-10-21 19:18:21 +01:00

216 lines
6.9 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
lib,
stdenv,
fetchFromGitHub,
fetchpatch2,
gitUpdater,
apple-sdk_15,
darwinMinVersionHook,
cereal,
libcxx,
glslang,
spirv-cross,
spirv-headers,
spirv-tools,
vulkan-headers,
xcbuildHook,
enableStatic ? stdenv.hostPlatform.isStatic,
# MoltenVK supports using private APIs to implement some Vulkan functionality.
# Applications that use private APIs cant be distributed on the App Store,
# but thats 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,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "MoltenVK";
version = "1.2.11";
strictDeps = true;
buildInputs = [
apple-sdk_15
cereal
(darwinMinVersionHook "10.15")
glslang
spirv-cross
spirv-headers
spirv-tools
vulkan-headers
];
nativeBuildInputs = [ xcbuildHook ];
outputs = [
"out"
"bin"
"dev"
];
src = fetchFromGitHub {
owner = "KhronosGroup";
repo = "MoltenVK";
rev = "v${finalAttrs.version}";
hash = "sha256-24qQnJ0RnJP2M4zSlSlQ4c4dVZtHutNiCvjrsCDw6wY=";
};
patches = [
# Cherry-pick patch to fix build failure due to a hardcoded SPIRV-Cross namespace.
# This can be dropped for MoltenVK 1.2.12.
(fetchpatch2 {
url = "https://github.com/KhronosGroup/MoltenVK/commit/856c8237ac3b32178caae3408effc35bedfdffa1.patch?full_index=1";
hash = "sha256-dVTop8sU19Swdb3ajbI+6S715NaxTqd7d0yQ/FDqxqY=";
})
];
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}
# 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 MetalGLShaderConverterTool MoltenVKShaderConverter \
--replace-fail MetalGLShaderConverter-macOS MoltenVKShaderConverter
# Dont try to build `xcframework`s because `xcbuild` cant 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 "${glslang.src}" "build/include/glslang"
'';
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"
# MoltenVK prints a lot of verbose output to the console out of
# the box; we adjust this to match Homebrews default log level.
"-DMVK_CONFIG_LOG_LEVEL=MVK_CONFIG_LOG_LEVEL_NONE"
]
++ lib.optional enablePrivateAPIUsage "-DMVK_USE_METAL_PRIVATE_API=1"
);
env.NIX_LDFLAGS = toString [
"-lglslang"
"-lSPIRV"
"-lSPIRV-Tools"
"-lSPIRV-Tools-opt"
"-lspirv-cross-msl"
"-lspirv-cross-core"
"-lspirv-cross-glsl"
"-lspirv-cross-reflect"
];
preBuild = ''
NIX_CFLAGS_COMPILE+=" \
-I$NIX_BUILD_TOP/$sourceRoot/build/include \
-I$NIX_BUILD_TOP/$sourceRoot/Common"
'';
xcbuildFlags = [
"-configuration"
"Release"
"-project"
"MoltenVKPackaging.xcodeproj"
"-scheme"
"MoltenVK Package (macOS only)"
"-destination"
"generic/platform=macOS"
"-arch"
stdenv.hostPlatform.darwinArch
];
postBuild =
if enableStatic then
''
mkdir -p Package/Release/MoltenVK/static
cp Products/Release/libMoltenVK.a Package/Release/MoltenVK/static
''
else
''
# MoltenVKs Xcode project builds the dylib, but it doesnt 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 = ''
runHook preInstall
libraryExtension=${if enableStatic then ".a" else ".dylib"}
packagePath=${if enableStatic 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"
runHook postInstall
'';
__structuredAttrs = true;
passthru.updateScript = gitUpdater {
rev-prefix = "v";
ignoredVersions = ".*-(beta|rc).*";
};
meta = {
description = "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;
};
})