{ inputs.nixpkgs.url = "github:NixOS/nixpkgs"; inputs.self.submodules = true; outputs = { nixpkgs, ... }: let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; mruby = pkgs.stdenv.mkDerivation { pname = "mruby"; version = "0.0.1"; src = pkgs.lib.cleanSourceWith { src = ./libs; name = "mruby-src"; }; patches = [ ./libs/changes.patch ]; nativeBuildInputs = with pkgs; [ ruby gnumake gcc ]; buildPhase = '' (cd mruby && rake) ''; installPhase = '' mkdir -p $out cp -r mruby/build/host/lib $out/ ''; }; kutu = pkgs.stdenv.mkDerivation { pname = "kutu"; version = "0.1.0"; src = ./.; nativeBuildInputs = with pkgs; [ dune_3 ocaml ocamlPackages.findlib ]; buildInputs = with pkgs; [ libxcb xcbutilwm ocamlPackages.ctypes ocamlPackages.ctypes-foreign mruby ]; buildPhase = '' export MRUBY_LIB=${mruby}/lib dune build src/main.exe --release ''; installPhase = '' mkdir -p $out/bin cp _build/default/src/main.exe $out/bin/kutu ''; }; in { packages.${system} = { default = kutu; kutu = kutu; mruby = mruby; }; apps.${system}.default = { type = "app"; program = "${pkgs.writeShellScript "kutu-run" '' set -e if [ -z "$DISPLAY" ]; then exec ${pkgs.xinit}/bin/startx \ ${kutu}/bin/kutu \ -- \ ${pkgs.xorg-server}/bin/X else DISPLAY_NUM=:100 ${pkgs.xorg-server}/bin/Xephyr \ $DISPLAY_NUM \ -screen 1280x720 \ -ac \ > /tmp/kutu-xephyr.log 2>&1 & XEPHYR_PID=$! cleanup() { kill "$XEPHYR_PID" 2>/dev/null || true; } trap cleanup EXIT INT TERM sleep 1 DISPLAY=$DISPLAY_NUM ${kutu}/bin/kutu echo "Returned: $?" fi ''}"; }; devShells.${system}.default = pkgs.mkShell { inputsFrom = [ kutu ]; packages = with pkgs; [ ocamlPackages.utop ocamlPackages.ocaml-lsp ocamlPackages.ocamlformat ]; shellHook = '' export CC=clang export CXX=clang++ export LD=clang export MRUBY_LIB=${mruby}/lib ''; }; }; }