Merge pull request #268619 from tweag/lib-descriptions
[NixPkgs.git] / pkgs / development / tools / parsing / tree-sitter / grammar.nix
blobce46e3623baeaa6fce3c817cf7c176b341116c3f
1 { stdenv
2 , nodejs
3 , tree-sitter
4 , lib
5 }:
7 # Build a parser grammar and put the resulting shared object in `$out/parser`
10   # language name
11   language
12 , version
13 , src
14 , location ? null
15 , generate ? false
16 , ...
17 }@args:
19 stdenv.mkDerivation ({
20   pname = "${language}-grammar";
22   inherit src version;
24   nativeBuildInputs = lib.optionals generate [ nodejs tree-sitter ];
26   CFLAGS = [ "-Isrc" "-O2" ];
27   CXXFLAGS = [ "-Isrc" "-O2" ];
29   stripDebugList = [ "parser" ];
31   configurePhase = lib.optionalString (location != null) ''
32     cd ${location}
33   '' + lib.optionalString generate ''
34     tree-sitter generate
35   '';
37   # When both scanner.{c,cc} exist, we should not link both since they may be the same but in
38   # different languages. Just randomly prefer C++ if that happens.
39   buildPhase = ''
40     runHook preBuild
41     if [[ -e src/scanner.cc ]]; then
42       $CXX -fPIC -c src/scanner.cc -o scanner.o $CXXFLAGS
43     elif [[ -e src/scanner.c ]]; then
44       $CC -fPIC -c src/scanner.c -o scanner.o $CFLAGS
45     fi
46     $CC -fPIC -c src/parser.c -o parser.o $CFLAGS
47     rm -rf parser
48     $CXX -shared -o parser *.o
49     runHook postBuild
50   '';
52   installPhase = ''
53     runHook preInstall
54     mkdir $out
55     mv parser $out/
56     if [[ -d queries ]]; then
57       cp -r queries $out
58     fi
59     runHook postInstall
60   '';
61 } // removeAttrs args [ "language" "location" "generate" ])