summary refs log tree commit diff
path: root/pkgs/development/compilers/crystal/build-package.nix
diff options
context:
space:
mode:
authorSilvan Mosberger <infinisil@icloud.com>2019-08-26 18:22:55 +0200
committerSilvan Mosberger <infinisil@icloud.com>2019-08-26 18:22:55 +0200
commita3aec20f266c57d989524f02b1243b4ad24020a2 (patch)
treea7ceefd55742ceb1f826e7019e27ab271ae9c92a /pkgs/development/compilers/crystal/build-package.nix
parent8c60f67f2dbc0b1eeddf67db317964ae3619d646 (diff)
downloadnixpkgs-a3aec20f266c57d989524f02b1243b4ad24020a2.tar
nixpkgs-a3aec20f266c57d989524f02b1243b4ad24020a2.tar.gz
nixpkgs-a3aec20f266c57d989524f02b1243b4ad24020a2.tar.bz2
nixpkgs-a3aec20f266c57d989524f02b1243b4ad24020a2.tar.lz
nixpkgs-a3aec20f266c57d989524f02b1243b4ad24020a2.tar.xz
nixpkgs-a3aec20f266c57d989524f02b1243b4ad24020a2.tar.zst
nixpkgs-a3aec20f266c57d989524f02b1243b4ad24020a2.zip
Implement crystal.buildCrystalPackage
Diffstat (limited to 'pkgs/development/compilers/crystal/build-package.nix')
-rw-r--r--pkgs/development/compilers/crystal/build-package.nix53
1 files changed, 53 insertions, 0 deletions
diff --git a/pkgs/development/compilers/crystal/build-package.nix b/pkgs/development/compilers/crystal/build-package.nix
new file mode 100644
index 00000000000..8ffa89a11b4
--- /dev/null
+++ b/pkgs/development/compilers/crystal/build-package.nix
@@ -0,0 +1,53 @@
+{ stdenv, lib, crystal, linkFarm, fetchFromGitHub }:
+{ # Generate shards.nix with `nix-shell -p crystal2nix --run crystal2nix` in the projects root
+  shardsFile ? null
+  # Specify binaries to build in the form { foo.src = "src/foo.cr"; }
+  # The default `crystal build` options can be overridden with { foo.options = [ "--no-debug" ]; }
+, crystalBinaries ? {}
+, ...
+}@args:
+let
+  mkDerivationArgs = builtins.removeAttrs args [ "shardsFile" "crystalBinaries" ];
+
+  crystalLib = linkFarm "crystal-lib" (lib.mapAttrsToList (name: value: {
+    inherit name;
+    path = fetchFromGitHub value;
+  }) (import shardsFile));
+
+  defaultOptions = [ "--release" "--progress" "--no-debug" "--verbose" ];
+
+in stdenv.mkDerivation (mkDerivationArgs // {
+
+  configurePhase = args.configurePhase or ''
+    runHook preConfigure
+    ${lib.optionalString (shardsFile != null) "ln -s ${crystalLib} lib"}
+    runHook postConfigure
+  '';
+
+  buildInputs = args.buildInputs or [] ++ [ crystal ];
+
+  buildPhase = args.buildPhase or ''
+    runHook preBuild
+    ${lib.concatStringsSep "\n" (lib.mapAttrsToList (bin: attrs: ''
+      crystal ${lib.escapeShellArgs ([
+        "build"
+        "-o" bin
+        (attrs.src or (throw "No source file for crystal binary ${bin} provided"))
+      ] ++ attrs.options or defaultOptions)}
+    '') crystalBinaries)}
+    runHook postBuild
+  '';
+
+  installPhase = args.installPhase or ''
+    runHook preInstall
+    mkdir -p "$out/bin"
+    ${lib.concatMapStringsSep "\n" (bin: ''
+      mv ${lib.escapeShellArgs [ bin "${placeholder "out"}/bin/${bin}" ]}
+    '') (lib.attrNames crystalBinaries)}
+    runHook postInstall
+  '';
+
+  meta = args.meta or {} // {
+    platforms = args.meta.platforms or crystal.meta.platforms;
+  };
+})