-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathflake.nix
More file actions
146 lines (125 loc) · 4.66 KB
/
flake.nix
File metadata and controls
146 lines (125 loc) · 4.66 KB
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
{
description = "baboon build environment";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
inputs.flake-utils.url = "github:numtide/flake-utils";
inputs.squish-find-the-brains.url = "github:7mind/squish-find-the-brains";
inputs.squish-find-the-brains.inputs.nixpkgs.follows = "nixpkgs";
inputs.squish-find-the-brains.inputs.flake-utils.follows = "flake-utils";
inputs.mudyla.url = "github:7mind/mudyla";
inputs.mudyla.inputs.nixpkgs.follows = "nixpkgs";
outputs =
{ self
, nixpkgs
, flake-utils
, squish-find-the-brains
, mudyla
}:
flake-utils.lib.eachDefaultSystem (
system:
let
pkgs = import nixpkgs {
inherit system;
config.allowUnfree = true;
};
# Read version from version.sbt
versionSbt = builtins.readFile ./version.sbt;
versionMatch = builtins.match ''.*"([0-9]+\.[0-9]+\.[0-9]+)(-SNAPSHOT)?".*'' versionSbt;
version = builtins.elemAt versionMatch 0;
coursierCache = squish-find-the-brains.lib.mkCoursierCache {
inherit pkgs;
lockfilePath = ./deps.lock.json;
};
sbtSetup = squish-find-the-brains.lib.mkSbtSetup {
inherit pkgs coursierCache;
jdk = pkgs.graalvmPackages.graalvm-ce;
};
# GraalVM --libc=musl needs a musl cross-compiler and musl CLibraryPaths.
# The Nix native-image wrapper injects glibc CLibraryPaths which conflict
# with musl, so we create a custom wrapper that bypasses the Nix glibc
# injection and provides musl paths instead.
# GraalVM only supports --libc=musl on x86_64-linux (not aarch64).
# Only referenced in isX86Linux guards; Nix laziness prevents evaluation elsewhere.
isX86Linux = system == "x86_64-linux";
arch = pkgs.stdenv.hostPlatform.parsed.cpu.name;
muslCc = pkgs.pkgsMusl.stdenv.cc;
muslZlibStatic = pkgs.pkgsMusl.zlib.static;
graalvm = pkgs.graalvmPackages.graalvm-ce;
muslGccAlias = pkgs.runCommand "musl-gcc-alias" {} ''
mkdir -p $out/bin
ln -s ${muslCc}/bin/cc $out/bin/${arch}-linux-musl-gcc
'';
nativeImageMusl = pkgs.writeShellScriptBin "native-image" ''
export PATH="${muslGccAlias}/bin:${muslCc}/bin:$PATH"
exec "${graalvm}/lib/svm/bin/native-image" \
-H:CLibraryPath=${pkgs.musl}/lib \
-H:CLibraryPath=${muslZlibStatic}/lib \
"$@"
'';
in
{
packages = rec {
baboon = pkgs.stdenv.mkDerivation {
inherit version;
pname = "baboon";
src = ./.;
nativeBuildInputs = sbtSetup.nativeBuildInputs ++ [ pkgs.curl ]
++ pkgs.lib.optionals isX86Linux [
nativeImageMusl
];
inherit (sbtSetup) JAVA_HOME;
buildPhase = ''
${sbtSetup.setupScript}
${pkgs.lib.optionalString isX86Linux ''
export PATH="${nativeImageMusl}/bin:$PATH"
''}
${pkgs.lib.optionalString pkgs.stdenv.isDarwin ''
HOME="$TMPDIR" \
SBT_OPTS="-Duser.home=$TMPDIR -Dsbt.global.base=$TMPDIR/.sbt -Dsbt.ivy.home=$TMPDIR/.ivy2 -Divy.home=$TMPDIR/.ivy2 -Dsbt.boot.directory=$TMPDIR/.sbt/boot" \
sbt baboonJVM/GraalVMNativeImage/packageBin
''}
${pkgs.lib.optionalString (!pkgs.stdenv.isDarwin) ''
sbt baboonJVM/GraalVMNativeImage/packageBin
''}
'';
installPhase = ''
mkdir -p $out/bin
cp baboon-compiler/.jvm/target/graalvm-native-image/baboon $out/bin/baboon
'';
};
default = baboon;
};
devShells.default = pkgs.mkShell ({
nativeBuildInputs =
pkgs.lib.optionals isX86Linux [
nativeImageMusl
] ++
(with pkgs.buildPackages; [
ncurses
gitMinimal
nix
graalvmPackages.graalvm-ce
coursier
pkgs.sbt
dotnet-sdk_9
coreutils
shellspec
zip
rsync
rustc
cargo
squish-find-the-brains.packages.${system}.generate-lockfile
mudyla.packages.${system}.default
nodejs_24
tree-sitter
kotlin
gradle
maven
dart
]) ++ pkgs.lib.optionals pkgs.stdenv.isLinux [
pkgs.buildPackages.swift
pkgs.buildPackages.swiftpm
];
});
}
);
}