git.s-ol.nu openxPriments / main flake.nix
main

Tree @main (Download .tar.gz)

flake.nix @mainraw · history · blame

{
  description = "VR experiments with OpenXR, Vulkan and Zig";

  inputs = {
    nixpkgs.url = github:NixOS/nixpkgs/master;
    monado-src = {
      url = git+https://gitlab.freedesktop.org/monado/monado.git;
      flake = false;
    };
    diligent-core-src = {
      url = github:DiligentGraphics/DiligentCore;
      flake = false;
    };
  };

  outputs = { self, nixpkgs, monado-src, diligent-core-src }: rec {
    packages.x86_64-linux =
      with import nixpkgs { system = "x86_64-linux"; };
      {
        diligent-core = stdenv.mkDerivation {
          name = "DiligentCore";
          src = diligent-core-src;

          nativeBuildInputs = with pkgs; [
            cmake clang vulkan-headers mesa
            xorg.libxcb xorg.libX11 git python3
          ];

          configurePhase = ''
          	cat <<EOF >BuildConfig.cmake
            function(custom_post_configure_target TARGET)
                set_target_properties(''${TARGET} PROPERTIES LINK_OPTIONS -static-libstdc++)
            endfunction()
          	EOF
            mkdir build
            cd build
            cmake .. \
            	-D CMAKE_INSTALL_PREFIX=install \
            	-D CMAKE_BUILD_TYPE=RelWithDebInfo \
            	-D BUILD_CONFIGURATION_FILE=BuildConfig.cmake \
              -D DILIGENT_NO_DIRECT3D11=ON \
              -D DILIGENT_NO_DIRECT3D12=ON \
              -D DILIGENT_NO_OPENGL=ON \
              -D DILIGENT_NO_METAL=ON \
              -D DILIGENT_NO_GLSLANG=ON \
              -D DILIGENT_NO_HLSL=ON \
              -D DILIGENT_NO_FORMAT_VALIDATION=ON
          '';

          buildPhase = ''
            make -j$NIX_BUILD_CORES
          '';

          installPhase = ''
            make install
            cp -r install/{lib,include} "$out"/
          '';
        };

        monado = stdenv.mkDerivation {
          name = "monado";
          src = monado-src;

          nativeBuildInputs = with pkgs; [
            cmake clang vulkan-headers mesa libusb libudev glslang
            eigen openhmd wayland-protocols wayland hidapi opencv
            zlib pkgconfig libjpeg egl-wayland vulkan-loader python3
          ];

          configurePhase = ''
            mkdir build
            cd build
            cmake ..
          '';

          buildPhase = ''
            make
          '';

          installPhase = ''
            make DESTDIR=. install
            mkdir -p $out/etc "$out/bin"
            mv var/empty/local/* "$out/"
            mv etc/var/empty/local "$out/etc"

            substituteInPlace $out/lib/systemd/user/monado.service \
              --replace "/var/empty/local" "$out"
            substituteInPlace $out/share/openxr/1/openxr_monado.json \
              --replace "/var/empty/local" "$out"
          '';
        };

        openxPriments = stdenv.mkDerivation {
          name = "openxPriments";
          src = self;

          buildInputs = [
            packages.x86_64-linux.monado
          ];

          nativeBuildInputs = with pkgs; [
            vulkan-headers vulkan-loader openxr-loader
            gdb zig
          ];

          LD_LIBRARY_PATH = with pkgs; lib.strings.makeLibraryPath [ vulkan-loader stdenv.cc.cc.lib ];
          XR_RUNTIME_JSON = "${packages.x86_64-linux.monado}/share/openxr/1/openxr_monado.json";

          configurePhase = "";

          buildPhase = ''
            zig build
          '';

          installPhase = ''
            mkdir -p $out/bin
            install -t $out/bin zig-cache/bin/openxPriments
          '';
        };
      };

    defaultPackage.x86_64-linux = self.packages.x86_64-linux.openxPriments;
  };
}