diff options
author | Frederik Rietdijk <fridh@fridh.nl> | 2019-08-31 10:04:20 +0200 |
---|---|---|
committer | Frederik Rietdijk <fridh@fridh.nl> | 2019-08-31 10:04:20 +0200 |
commit | ad1d58c6227abf2a9c80311eb09166a532384ed2 (patch) | |
tree | 852498ff298f9b01c0d2c8b4c883da1a00912260 /pkgs/development/compilers/crystal | |
parent | ebe4fd146b29c92fb59f243f75e46afc9f1a9048 (diff) | |
parent | fc74ba8291a8a93cba428de6bc2e7c8c7f9330f4 (diff) |
Merge staging-next into staging
Diffstat (limited to 'pkgs/development/compilers/crystal')
-rw-r--r-- | pkgs/development/compilers/crystal/build-package.nix | 53 | ||||
-rw-r--r-- | pkgs/development/compilers/crystal/crystal2nix.cr | 42 | ||||
-rw-r--r-- | pkgs/development/compilers/crystal/crystal2nix.nix | 16 | ||||
-rw-r--r-- | pkgs/development/compilers/crystal/default.nix | 19 |
4 files changed, 124 insertions, 6 deletions
diff --git a/pkgs/development/compilers/crystal/build-package.nix b/pkgs/development/compilers/crystal/build-package.nix new file mode 100644 index 0000000000000..8ffa89a11b4ae --- /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/crystal2nix.cr b/pkgs/development/compilers/crystal/crystal2nix.cr new file mode 100644 index 0000000000000..0610de5cfa4d7 --- /dev/null +++ b/pkgs/development/compilers/crystal/crystal2nix.cr @@ -0,0 +1,42 @@ +require "yaml" +require "json" + +class PrefetchJSON + JSON.mapping(sha256: String) +end + +class ShardLock + YAML.mapping( + version: Float32, + shards: Hash(String, Hash(String, String)) + ) +end + +File.open "shards.nix", "w+" do |file| + file.puts %({) + yaml = ShardLock.from_yaml(File.read("shard.lock")) + yaml.shards.each do |key, value| + owner, repo = value["github"].split("/") + url = "https://github.com/#{value["github"]}" + rev = if value["version"]? + "v#{value["version"]}" + else + value["commit"] + end + + sha256 = "" + args = ["--url", url, "--rev", rev] + Process.run("@nixPrefetchGit@", args: args) do |x| + x.error.each_line { |e| puts e } + sha256 = PrefetchJSON.from_json(x.output).sha256 + end + + file.puts %( #{key} = {) + file.puts %( owner = "#{owner}";) + file.puts %( repo = "#{repo}";) + file.puts %( rev = "#{rev}";) + file.puts %( sha256 = "#{sha256}";) + file.puts %( };) + end + file.puts %(}) +end diff --git a/pkgs/development/compilers/crystal/crystal2nix.nix b/pkgs/development/compilers/crystal/crystal2nix.nix new file mode 100644 index 0000000000000..ac69b9b3d965b --- /dev/null +++ b/pkgs/development/compilers/crystal/crystal2nix.nix @@ -0,0 +1,16 @@ +{ lib, crystal, nix-prefetch-git }: +crystal.buildCrystalPackage { + pname = "crystal2nix"; + version = "unstable-2018-07-31"; + + nixPrefetchGit = "${lib.getBin nix-prefetch-git}/bin/nix-prefetch-git"; + unpackPhase = "substituteAll ${./crystal2nix.cr} crystal2nix.cr"; + + crystalBinaries.crystal2nix.src = "crystal2nix.cr"; + + meta = with lib; { + description = "Utility to convert Crystal's shard.lock files to a Nix file"; + license = licenses.mit; + maintainers = [ maintainers.manveru ]; + }; +} diff --git a/pkgs/development/compilers/crystal/default.nix b/pkgs/development/compilers/crystal/default.nix index d9392721fa5a2..409ac03d92f71 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 }: +, coreutils, git, gmp, nettools, openssl_1_0_2, readline, tzdata, libxml2, libyaml +, 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. @@ -19,7 +20,7 @@ let arch = archs.${stdenv.system} or (throw "system ${stdenv.system} not supported"); - checkInputs = [ git gmp openssl readline libxml2 libyaml ]; + checkInputs = [ git gmp openssl_1_0_2 readline libxml2 libyaml ]; genericBinary = { version, sha256s, rel ? 1 }: stdenv.mkDerivation rec { @@ -38,7 +39,7 @@ let }; generic = { version, sha256, binary, doCheck ? true }: - stdenv.mkDerivation rec { + let compiler = stdenv.mkDerivation rec { pname = "crystal"; inherit doCheck version; @@ -73,7 +74,7 @@ let buildInputs = [ boehmgc libatomic_ops pcre libevent libyaml - llvm zlib openssl + llvm zlib openssl_1_0_2 ] ++ stdenv.lib.optionals stdenv.isDarwin [ libiconv ]; @@ -135,6 +136,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/; @@ -142,7 +147,7 @@ let maintainers = with maintainers; [ manveru david50407 peterhoeg ]; platforms = builtins.attrNames archs; }; - }; + }; in compiler; in rec { binaryCrystal_0_26 = genericBinary { @@ -208,4 +213,6 @@ in rec { }; crystal = crystal_0_30; + + crystal2nix = callPackage ./crystal2nix.nix {}; } |