1{ lib, stdenv, fetchFromGitHub, coreutils, ocaml-ng, zlib, pcre, pcre2, neko, mbedtls_2, Security }:
2
3let
4 ocamlDependencies = version:
5 if lib.versionAtLeast version "4.3"
6 then with ocaml-ng.ocamlPackages_4_14; [
7 ocaml
8 findlib
9 sedlex
10 xml-light
11 ptmap
12 camlp5
13 sha
14 dune_3
15 luv
16 extlib
17 ] else with ocaml-ng.ocamlPackages_4_10; [
18 ocaml
19 findlib
20 sedlex
21 xml-light
22 ptmap
23 camlp5
24 sha
25 dune_3
26 luv
27 extlib-1-7-7
28 ];
29
30 defaultPatch = ''
31 substituteInPlace extra/haxelib_src/src/haxelib/client/Main.hx \
32 --replace '"neko"' '"${neko}/bin/neko"'
33 '';
34
35 generic = { hash, version, prePatch ? defaultPatch }:
36 stdenv.mkDerivation {
37 pname = "haxe";
38 inherit version;
39
40 buildInputs = [ zlib neko ]
41 ++ (if lib.versionAtLeast version "4.3" then [pcre2] else [pcre])
42 ++ lib.optional (lib.versionAtLeast version "4.1") mbedtls_2
43 ++ lib.optional (lib.versionAtLeast version "4.1" && stdenv.isDarwin) Security
44 ++ ocamlDependencies version;
45
46 src = fetchFromGitHub {
47 owner = "HaxeFoundation";
48 repo = "haxe";
49 rev = version;
50 fetchSubmodules = true;
51 inherit hash;
52 };
53
54 inherit prePatch;
55
56 buildFlags = [ "all" "tools" ];
57
58 installPhase = ''
59 install -vd "$out/bin" "$out/lib/haxe/std"
60 cp -vr haxe haxelib std "$out/lib/haxe"
61
62 # make wrappers which provide a temporary HAXELIB_PATH with symlinks to multiple repositories HAXELIB_PATH may point to
63 for name in haxe haxelib; do
64 cat > $out/bin/$name <<EOF
65 #!{bash}/bin/bash
66
67 if [[ "\$HAXELIB_PATH" =~ : ]]; then
68 NEW_HAXELIB_PATH="\$(${coreutils}/bin/mktemp -d)"
69
70 IFS=':' read -ra libs <<< "\$HAXELIB_PATH"
71 for libdir in "\''${libs[@]}"; do
72 for lib in "\$libdir"/*; do
73 if [ ! -e "\$NEW_HAXELIB_PATH/\$(${coreutils}/bin/basename "\$lib")" ]; then
74 ${coreutils}/bin/ln -s "--target-directory=\$NEW_HAXELIB_PATH" "\$lib"
75 fi
76 done
77 done
78 export HAXELIB_PATH="\$NEW_HAXELIB_PATH"
79 $out/lib/haxe/$name "\$@"
80 rm -rf "\$NEW_HAXELIB_PATH"
81 else
82 exec $out/lib/haxe/$name "\$@"
83 fi
84 EOF
85 chmod +x $out/bin/$name
86 done
87 '';
88
89 setupHook = ./setup-hook.sh;
90
91 dontStrip = true;
92
93 # While it might be a good idea to run the upstream test suite, let's at
94 # least make sure we can actually run the compiler.
95 doInstallCheck = true;
96 installCheckPhase = ''
97 # Get out of the source directory to make sure the stdlib from the
98 # sources doesn't interfere with the installed one.
99 mkdir installcheck
100 pushd installcheck > /dev/null
101 cat >> InstallCheck.hx <<EOF
102 class InstallCheck {
103 public static function main() trace("test");
104 }
105 EOF
106 "$out/bin/haxe" -js installcheck.js -main InstallCheck
107 grep -q 'console\.log.*test' installcheck.js
108 popd > /dev/null
109 '';
110
111 meta = with lib; {
112 description = "Programming language targeting JavaScript, Flash, NekoVM, PHP, C++";
113 homepage = "https://haxe.org";
114 license = with licenses; [ gpl2Plus mit ]; # based on upstream opam file
115 maintainers = [ maintainers.marcweber maintainers.locallycompact maintainers.logo ];
116 platforms = platforms.linux ++ platforms.darwin;
117 };
118 };
119in {
120 haxe_4_0 = generic {
121 version = "4.0.5";
122 hash = "sha256-Ck/py+tZS7dBu/uikhSLKBRNljpg2h5PARX0Btklozg=";
123 };
124 haxe_4_1 = generic {
125 version = "4.1.5";
126 hash = "sha256-QP5/jwexQXai1A5Iiwiyrm+/vkdAc+9NVGt+jEQz2mY=";
127 };
128 haxe_4_3 = generic {
129 version = "4.3.4";
130 hash = "sha256-XGV4VG8nUofHGjHbtrLA+2kIpnnPqw5IlcNrP3EsL+Q=";
131 };
132}