linux_xanmod: 5.11.14 -> 5.11.15
[NixPkgs.git] / pkgs / development / libraries / vapoursynth / plugin-interface.nix
blob55b2b03c893e2fc23c671fa7d83b270ca5a64f57
1 { lib, python3, buildEnv, writeText, runCommandCC, stdenv, runCommand
2 , vapoursynth, makeWrapper, withPlugins }:
4 plugins: let
5   pythonEnvironment = python3.buildEnv.override {
6     extraLibs = plugins;
7   };
9   getRecursivePropagatedBuildInputs = pkgs: lib.flatten
10     (map
11       (pkg: pkg.propagatedBuildInputs ++ (getRecursivePropagatedBuildInputs pkg.propagatedBuildInputs))
12       pkgs);
14   deepPlugins = plugins ++ (getRecursivePropagatedBuildInputs plugins);
16   pluginsEnv = buildEnv {
17     name = "vapoursynth-plugins-env";
18     pathsToLink = [ "/lib/vapoursynth" ];
19     paths = deepPlugins;
20   };
22   pluginLoader = let
23     source = writeText "vapoursynth-nix-plugins.c" ''
24       void VSLoadPluginsNix(void (*load)(void *data, const char *path), void *data) {
25       ${lib.concatMapStringsSep "" (path: "load(data, \"${path}/lib/vapoursynth\");") deepPlugins}
26       }
27     '';
28   in
29   runCommandCC "vapoursynth-plugin-loader" {
30     executable = true;
31     preferLocalBuild = true;
32     allowSubstitutes = false;
33   } ''
34     mkdir -p $out/lib
35     $CC -shared -fPIC ${source} -o "$out/lib/libvapoursynth-nix-plugins${ext}"
36   '';
38   ext = stdenv.targetPlatform.extensions.sharedLibrary;
40 runCommand "${vapoursynth.name}-with-plugins" {
41   nativeBuildInputs = [ makeWrapper ];
42   passthru = {
43     inherit python3;
44     withPlugins = plugins': withPlugins (plugins ++ plugins');
45   };
46 } ''
47   mkdir -p \
48     $out/bin \
49     $out/lib/pkgconfig \
50     $out/lib/vapoursynth \
51     $out/${python3.sitePackages}
53   for textFile in \
54       lib/pkgconfig/vapoursynth{,-script}.pc \
55       lib/libvapoursynth.la \
56       lib/libvapoursynth-script.la \
57       ${python3.sitePackages}/vapoursynth.la
58   do
59       substitute ${vapoursynth}/$textFile $out/$textFile \
60           --replace "${vapoursynth}" "$out"
61   done
63   for binaryPlugin in ${pluginsEnv}/lib/vapoursynth/*; do
64       ln -s $binaryPlugin $out/''${binaryPlugin#"${pluginsEnv}/"}
65   done
67   for pythonPlugin in ${pythonEnvironment}/${python3.sitePackages}/*; do
68       ln -s $pythonPlugin $out/''${pythonPlugin#"${pythonEnvironment}/"}
69   done
71   for binaryFile in \
72       lib/libvapoursynth${ext} \
73       lib/libvapoursynth-script${ext}.0.0.0
74   do
75     old_rpath=$(patchelf --print-rpath ${vapoursynth}/$binaryFile)
76     new_rpath="$old_rpath:$out/lib"
77     patchelf \
78         --set-rpath "$new_rpath" \
79         --output $out/$binaryFile \
80         ${vapoursynth}/$binaryFile
81     patchelf \
82         --add-needed libvapoursynth-nix-plugins${ext} \
83         $out/$binaryFile
84   done
86   for binaryFile in \
87       ${python3.sitePackages}/vapoursynth${ext} \
88       bin/.vspipe-wrapped
89   do
90       old_rpath=$(patchelf --print-rpath ${vapoursynth}/$binaryFile)
91       new_rpath="''${old_rpath//"${vapoursynth}"/"$out"}"
92       patchelf \
93           --set-rpath "$new_rpath" \
94           --output $out/$binaryFile \
95           ${vapoursynth}/$binaryFile
96   done
98   ln -s \
99       ${pluginLoader}/lib/libvapoursynth-nix-plugins${ext} \
100       $out/lib/libvapoursynth-nix-plugins${ext}
101   ln -s ${vapoursynth}/include $out/include
102   ln -s ${vapoursynth}/lib/vapoursynth/* $out/lib/vapoursynth
103   ln -s \
104       libvapoursynth-script${ext}.0.0.0 \
105       $out/lib/libvapoursynth-script${ext}
106   ln -s \
107       libvapoursynth-script${ext}.0.0.0 \
108       $out/lib/libvapoursynth-script${ext}.0
110   makeWrapper $out/bin/.vspipe-wrapped $out/bin/vspipe \
111       --prefix PYTHONPATH : $out/${python3.sitePackages}