1{
2 stdenv,
3 lib,
4 fetchurl,
5 makeWrapper,
6 jre,
7 gnugrep,
8 coreutils,
9 writeScript,
10 common-updater-scripts,
11 git,
12 gnused,
13 nix,
14 majorVersion,
15}:
16
17let
18 repo = "git@github.com:scala/scala.git";
19
20 versionMap = {
21 "2.12" = {
22 version = "2.12.18";
23 hash = "sha256-naIJCET+YPrbXln39F9aU3DBdnjcn7PYMmhDxETOA5g=";
24 pname = "scala_2_12";
25 };
26
27 "2.13" = {
28 version = "2.13.15";
29 hash = "sha256-jXIZ0q2IHIHPdwmp5JU05s4S0Bft4Uc+r9Hpuyh8ObE=";
30 pname = "scala_2_13";
31 };
32 };
33
34in
35with versionMap.${majorVersion};
36
37stdenv.mkDerivation rec {
38 inherit version;
39
40 name = "scala-${version}";
41
42 src = fetchurl {
43 inherit hash;
44 url = "https://www.scala-lang.org/files/archive/scala-${version}.tgz";
45 };
46
47 propagatedBuildInputs = [ jre ];
48
49 nativeBuildInputs = [ makeWrapper ];
50
51 installPhase = ''
52 runHook preInstall
53 mkdir -p $out
54 rm bin/*.bat
55 mv * $out
56 # put docs in correct subdirectory
57 mkdir -p $out/share/doc
58 mv $out/doc $out/share/doc/${name}
59 mv $out/man $out/share/man
60 for p in $(ls $out/bin/) ; do
61 wrapProgram $out/bin/$p \
62 --prefix PATH ":" ${coreutils}/bin \
63 --prefix PATH ":" ${gnugrep}/bin \
64 --prefix PATH ":" ${jre}/bin \
65 --set JAVA_HOME ${jre}
66 done
67 runHook postInstall
68 '';
69
70 doInstallCheck = true;
71 installCheckPhase = ''
72 $out/bin/scalac -version 2>&1 | grep '^Scala compiler version ${version}'
73
74 echo 'println("foo"*3)' | $out/bin/scala 2>/dev/null | grep "foofoofoo"
75 '';
76
77 passthru = {
78 updateScript = writeScript "update.sh" ''
79 #!${stdenv.shell}
80 set -o errexit
81 PATH=${
82 lib.makeBinPath [
83 common-updater-scripts
84 coreutils
85 git
86 gnused
87 nix
88 ]
89 }
90 versionSelect='v${lib.versions.major version}.${lib.versions.minor version}.*'
91 oldVersion="$(nix-instantiate --eval -E "with import ./. {}; lib.getVersion ${pname}" | tr -d '"')"
92 latestTag="$(git -c 'versionsort.suffix=-' ls-remote --exit-code --refs --sort='version:refname' --tags ${repo} "$versionSelect" | tail --lines=1 | cut --delimiter='/' --fields=3 | sed 's|^v||g')"
93 if [ "$oldVersion" != "$latestTag" ]; then
94 update-source-version ${pname} "$latestTag" --version-key=version --print-changes
95 else
96 echo "${pname} is already up-to-date"
97 fi
98 '';
99 };
100
101 meta = with lib; {
102 description = "General purpose programming language";
103 longDescription = ''
104 Scala is a general purpose programming language designed to express
105 common programming patterns in a concise, elegant, and type-safe way.
106 It smoothly integrates features of object-oriented and functional
107 languages, enabling Java and other programmers to be more productive.
108 Code sizes are typically reduced by a factor of two to three when
109 compared to an equivalent Java application.
110 '';
111 homepage = "https://www.scala-lang.org/";
112 license = licenses.bsd3;
113 platforms = platforms.all;
114 branch = versions.majorMinor version;
115 maintainers = with maintainers; [
116 nequissimus
117 kashw2
118 ];
119 };
120}