diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..809ba6b --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Uiua +*.uasm + +# Nix +result +result-* diff --git a/flake.nix b/flake.nix index a6a95a2..43ee999 100644 --- a/flake.nix +++ b/flake.nix @@ -5,13 +5,38 @@ outputs = { self, nixpkgs }: let - system = "x86_64-linux"; - pkgs = import nixpkgs { inherit system; }; + inherit (nixpkgs) lib; + + systems = [ + "x86_64-linux" + "aarch64-linux" + "x86_64-darwin" + "aarch64-darwin" + ]; + + forAllSystems = f: lib.genAttrs systems (system: let + pkgs = nixpkgs.legacyPackages.${system}; + in f system pkgs); in { - devShells.x86_64-linux.default = pkgs.mkShell { - buildInputs = with pkgs; [ - uiua-unstable - ]; - }; + apps = forAllSystems (system: pkgs: { + default = { + type = "app"; + program = "${lib.getExe self.packages.${system}.default}"; + meta.description = "Run uash as a normal executable"; + }; + }); + + devShells = forAllSystems (system: pkgs: { + default = pkgs.mkShell { + buildInputs = with pkgs; [ + uiua-unstable + ]; + }; + }); + + packages = forAllSystems (system: pkgs: { + default = self.packages.${system}.uash; + uash = pkgs.callPackage ./nix/package.nix { }; + }); }; } diff --git a/nix/package.nix b/nix/package.nix new file mode 100644 index 0000000..19ffe37 --- /dev/null +++ b/nix/package.nix @@ -0,0 +1,44 @@ +{ + lib +, uiua +, stdenvNoCC +, runtimeShell +}: + +stdenvNoCC.mkDerivation { + pname = "uash"; + version = "unstable"; + + src = lib.fileset.toSource { + root = ./..; + fileset = lib.fileset.unions [ + ../uash.ua + ]; + }; + + nativeBuildInputs = [ uiua ]; + + buildPhase = '' + runHook preBuild + uiua build --output .uash.uasm uash.ua + runHook postBuild + ''; + + wrapper = '' + #!${runtimeShell} + "${uiua}"/bin/uiua run ${placeholder "out"}/bin/.uash.uasm + ''; + + passAsFile = [ "wrapper" ]; + + installPhase = '' + runHook preInstall + install -Dm444 .uash.uasm -t "$out"/bin + install -Dm555 "$wrapperPath" "$out"/bin/uash + runHook postInstall + ''; + + shellPath = "/bin/uash"; + + meta.mainProgram = "uash"; +}