diff options
Diffstat (limited to 'pkgs/development/compilers/crystal/build-package.nix')
-rw-r--r-- | pkgs/development/compilers/crystal/build-package.nix | 53 |
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; + }; +}) |