aboutsummaryrefslogtreecommitdiff
path: root/grammars.nix
diff options
context:
space:
mode:
authorMichael Davis2022-02-15 03:50:08 +0000
committerBlaž Hrastnik2022-03-10 08:31:57 +0000
commit37520f46ae891f77f81f4049cbb7dc2dbe2d5fc3 (patch)
tree08658b41071f7959187423824b53fa1fac646417 /grammars.nix
parentb157c5a8a4472cff68de3a9be66e220dc4b80a9f (diff)
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.
Diffstat (limited to 'grammars.nix')
-rw-r--r--grammars.nix87
1 files changed, 87 insertions, 0 deletions
diff --git a/grammars.nix b/grammars.nix
new file mode 100644
index 00000000..6dbc05c8
--- /dev/null
+++ b/grammars.nix
@@ -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}
+''