summary refs log tree commit diff
path: root/pkgs/development/compilers/crystal
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
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')
-rw-r--r--pkgs/development/compilers/crystal/build-package.nix53
-rw-r--r--pkgs/development/compilers/crystal/default.nix11
2 files changed, 61 insertions, 3 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;
+  };
+})
diff --git a/pkgs/development/compilers/crystal/default.nix b/pkgs/development/compilers/crystal/default.nix
index db57bc3e9df..0cb0a3733ed 100644
--- a/pkgs/development/compilers/crystal/default.nix
+++ b/pkgs/development/compilers/crystal/default.nix
@@ -1,6 +1,7 @@
 { stdenv, lib, fetchFromGitHub, fetchurl, makeWrapper
 , coreutils, git, gmp, nettools, openssl, readline, tzdata, libxml2, libyaml
-, boehmgc, libatomic_ops, pcre, libevent, libiconv, llvm, clang, which, zlib }:
+, boehmgc, libatomic_ops, pcre, libevent, libiconv, llvm, clang, which, zlib
+, callPackage }:
 
 # We need multiple binaries as a given binary isn't always able to build
 # (even slightly) older or newer versions.
@@ -37,7 +38,7 @@ let
   };
 
   generic = { version, sha256, binary, doCheck ? true }:
-  stdenv.mkDerivation rec {
+  let compiler = stdenv.mkDerivation rec {
     pname = "crystal";
     inherit doCheck version;
 
@@ -134,6 +135,10 @@ let
       export PATH=${lib.makeBinPath checkInputs}:$PATH
     '';
 
+    passthru.buildCrystalPackage = callPackage ./build-package.nix {
+      crystal = compiler;
+    };
+
     meta = with lib; {
       description = "A compiled language with Ruby like syntax and type inference";
       homepage = https://crystal-lang.org/;
@@ -141,7 +146,7 @@ let
       maintainers = with maintainers; [ manveru david50407 peterhoeg ];
       platforms = builtins.attrNames archs;
     };
-  };
+  }; in compiler;
 
 in rec {
   binaryCrystal_0_26 = genericBinary {