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