forked from helix-editor/helix
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fetch and build grammars with nix in flake
This commit replaces the out-of-date builder in the flake which relied on submodules for fetching and the compiler for building. Now we disable fetching and building explicitly with the environment variable and then use builtins.fetchGit and a derivation mostly derived from upstream to compile the grammars. Anecdotally, this is still quite slow as builtins.fetchGit does not seem to do shallow clones. I'm not sure I see a way around it though without recording sha256s, which seems cumbersome.
- Loading branch information
1 parent
b157c5a
commit 37520f4
Showing
2 changed files
with
113 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
{ stdenv, lib, runCommand, yj }: | ||
let | ||
# HACK: nix < 2.6 has a bug in the toml parser, so we convert to JSON | ||
# before parsing | ||
languages-json = runCommand "languages-toml-to-json" { } '' | ||
${yj}/bin/yj -t < ${./languages.toml} > $out | ||
''; | ||
languagesConfig = | ||
builtins.fromJSON (builtins.readFile (builtins.toPath languages-json)); | ||
isGitGrammar = (grammar: | ||
builtins.hasAttr "source" grammar && builtins.hasAttr "git" grammar.source | ||
&& builtins.hasAttr "rev" grammar.source); | ||
gitGrammars = builtins.filter isGitGrammar languagesConfig.grammar; | ||
buildGrammar = grammar: | ||
let | ||
source = builtins.fetchGit { | ||
url = grammar.source.git; | ||
rev = grammar.source.rev; | ||
allRefs = true; | ||
}; | ||
in stdenv.mkDerivation rec { | ||
# see https://github.com/NixOS/nixpkgs/blob/fbdd1a7c0bc29af5325e0d7dd70e804a972eb465/pkgs/development/tools/parsing/tree-sitter/grammar.nix | ||
|
||
pname = "helix-tree-sitter-${grammar.name}"; | ||
version = grammar.source.rev; | ||
|
||
src = if builtins.hasAttr "subpath" grammar.source then | ||
"${source}/${grammar.source.subpath}" | ||
else | ||
source; | ||
|
||
dontUnpack = true; | ||
dontConfigure = true; | ||
|
||
FLAGS = [ | ||
"-I${src}/src" | ||
"-g" | ||
"-O3" | ||
"-fPIC" | ||
"-fno-exceptions" | ||
"-Wl,-z,relro,-z,now" | ||
]; | ||
|
||
NAME = grammar.name; | ||
|
||
buildPhase = '' | ||
runHook preBuild | ||
if [[ -e "$src/src/scanner.cc" ]]; then | ||
$CXX -c "$src/src/scanner.cc" -o scanner.o $FLAGS | ||
elif [[ -e "$src/src/scanner.c" ]]; then | ||
$CC -c "$src/src/scanner.c" -o scanner.o $FLAGS | ||
fi | ||
$CC -c "$src/src/parser.c" -o parser.o $FLAGS | ||
$CXX -shared -o $NAME.so *.o | ||
ls -al | ||
runHook postBuild | ||
''; | ||
|
||
installPhase = '' | ||
runHook preInstall | ||
mkdir $out | ||
mv $NAME.so $out/ | ||
runHook postInstall | ||
''; | ||
|
||
# Strip failed on darwin: strip: error: symbols referenced by indirect symbol table entries that can't be stripped | ||
fixupPhase = lib.optionalString stdenv.isLinux '' | ||
runHook preFixup | ||
$STRIP $out/$NAME.so | ||
runHook postFixup | ||
''; | ||
}; | ||
builtGrammars = builtins.map (grammar: { | ||
inherit (grammar) name; | ||
artifact = buildGrammar grammar; | ||
}) gitGrammars; | ||
grammarLinks = builtins.map (grammar: | ||
"ln -s ${grammar.artifact}/${grammar.name}.so $out/${grammar.name}.so") | ||
builtGrammars; | ||
in runCommand "consolidated-helix-grammars" { } '' | ||
mkdir -p $out | ||
${builtins.concatStringsSep "\n" grammarLinks} | ||
'' |