Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions pkgs/by-name/ka/kak-tree-sitter-unwrapped/package.nix
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
lib,
rustPlatform,
fetchFromSourcehut,
nix-update-script,
testers,
kak-tree-sitter-unwrapped,
}:
Expand All @@ -21,7 +20,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
cargoHash = "sha256-5hCBFQsZpUyPlgO/iUmBXmdcC5ceG1w4IiB27oBxRxQ=";

passthru = {
updateScript = nix-update-script { };
updateScript = ./update.sh;
tests.version = testers.testVersion { package = kak-tree-sitter-unwrapped; };
};

Expand Down
5 changes: 5 additions & 0 deletions pkgs/by-name/ka/kak-tree-sitter-unwrapped/update.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/usr/bin/env nix-shell
#! nix-shell -i bash -p bash nix-update
set -e
nix-update kak-tree-sitter-unwrapped --version-regex 'kak-tree-sitter-v(.*)'
./pkgs/by-name/ka/kak-tree-sitter/update-parsers.sh
55 changes: 55 additions & 0 deletions pkgs/by-name/ka/kak-tree-sitter/make-parser.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{
lib,
runCommandCC,
kak-tree-sitter-unwrapped,
yq,
configFile ? "${kak-tree-sitter-unwrapped.src}/kak-tree-sitter-config/default-config.toml",
}:
{
grammarSrc,
queriesSrc,
grammarPin,
queriesPin,
lang,
}:

assert grammarSrc != null || queriesSrc != null;
assert grammarSrc != null -> grammarPin != null;
assert queriesSrc != null -> queriesPin != null;

runCommandCC "kak-tree-sitter-parser-${lang}"
{
nativeBuildInputs = [ yq ];
}
(
''
mkdir -p $out/share/kak-tree-sitter
''
+ lib.optionalString (grammarSrc != null) ''
mkdir -p $TMP/grammar-build
cd $TMP/grammar-build
cp -r ${grammarSrc} ./source
chmod -R +w ./source

build_dir="./source/$(tomlq -r '.grammar["${lang}"].path? // "src"' "${configFile}")/build"
compile="$(tomlq -r '.grammar["${lang}"].compile? // "cc"' "${configFile}")"
compile_args="$(tomlq -r '.grammar["${lang}"].compile_args? // ["-c", "-fpic", "../parser.c", "-I", ".."] | join(" ")' "${configFile}")"
compile_flags="$(tomlq -r '.grammar["${lang}"].compile_flags? // ["-O3"] | join(" ")' "${configFile}")"
link="$(tomlq -r '.grammar["${lang}"].link? // "cc"' "${configFile}")"
link_args="$(tomlq -r '.grammar["${lang}"].link_args? // ["-shared", "-fpic", "parser.o", "-o", "${lang}.so"] | join(" ")' "${configFile}")"
link_flags="$(tomlq -r '.grammar["${lang}"].link_flags? // ["-O3"] | join(" ")' "${configFile}")"

mkdir -p "$build_dir"
cd "$build_dir"
"$compile" $compile_args $compile_flags
"$link" $link_args $link_flags

mkdir -p $out/share/kak-tree-sitter/grammars/${lang}
cp ${lang}.so $out/share/kak-tree-sitter/grammars/${lang}/${grammarPin}.so
''
+ lib.optionalString (queriesSrc != null) ''
queries_dir="${queriesSrc}/$(tomlq -r '.language["${lang}"].queries?.path? // "runtime/queries/${lang}"' "${configFile}")"
mkdir -p $out/share/kak-tree-sitter/queries/${lang}
cp -r "$queries_dir" "$out/share/kak-tree-sitter/queries/${lang}/${queriesPin}"
''
)
78 changes: 71 additions & 7 deletions pkgs/by-name/ka/kak-tree-sitter/package.nix
Original file line number Diff line number Diff line change
@@ -1,27 +1,91 @@
{
lib,
makeWrapper,
fetchgit,
callPackage,
symlinkJoin,
tinycc,
kak-tree-sitter-unwrapped,
bundledParsers ? [ ],
}:
let
mkParserRaw = callPackage ./make-parser.nix { };
parserSources = builtins.fromJSON (builtins.readFile ./parsers.json);
mkParser' =
lang:
let
getSrc =
info:
if info == null then
null
else
fetchgit {
inherit (info) url hash;
rev = info.pin;
fetchSubmodules = false;
};
grammarSrcInfo = parserSources.grammar.${lang} or null;
queriesSrcInfo = parserSources.queries.${lang} or null;
grammarSrc = getSrc grammarSrcInfo;
queriesSrc = getSrc queriesSrcInfo;
in
mkParserRaw {
inherit grammarSrc queriesSrc lang;
grammarPin = parserSources.grammar.${lang}.pin or null;
queriesPin = parserSources.queries.${lang}.pin or null;
};
mkParser = nameOrPkg: if builtins.isString nameOrPkg then mkParser' nameOrPkg else nameOrPkg;
allParserNames' = lib.lists.uniqueStrings (
(builtins.attrNames parserSources.grammar) ++ (builtins.attrNames parserSources.queries)
);
allParserNames = lib.lists.remove "astro" allParserNames'; # config broken
allParsers = map mkParser allParserNames;
requestedParsers = if bundledParsers == "all" then allParsers else map mkParser bundledParsers;

in
symlinkJoin (finalAttrs: {
pname = lib.replaceStrings [ "-unwrapped" ] [ "" ] kak-tree-sitter-unwrapped.pname;
inherit (kak-tree-sitter-unwrapped) version;
name = "${finalAttrs.pname}-${finalAttrs.version}";

paths = [ kak-tree-sitter-unwrapped ];
paths = [ kak-tree-sitter-unwrapped ] ++ requestedParsers;
nativeBuildInputs = [ makeWrapper ];

# Tree-Sitter grammars are C programs that need to be compiled
# Use tinycc as cc to reduce closure size
postBuild = ''
mkdir -p $out/libexec/tinycc/bin
ln -s ${lib.getExe tinycc} $out/libexec/tinycc/bin/cc
wrapProgram "$out/bin/ktsctl" \
--suffix PATH : $out/libexec/tinycc/bin
'';
postBuild =
lib.optionalString (tinycc != null) ''
mkdir -p $out/libexec/tinycc/bin
ln -s ${lib.getExe tinycc} $out/libexec/tinycc/bin/cc
wrapProgram "$out/bin/ktsctl" \
--suffix PATH : $out/libexec/tinycc/bin
''
+ lib.optionalString (bundledParsers != [ ]) ''
rm "$out/bin/kak-tree-sitter"
cat >"$out/bin/kak-tree-sitter" <<EOF
#!/usr/bin/env bash
set -e
shopt -s nullglob
cfg="\''${XDG_DATA_HOME:-\$HOME/.local/share}/kak-tree-sitter"
if [[ "\$(readlink "\$cfg/.state")" != "$out" ]]; then
(cd $out/share/kak-tree-sitter; ls -d grammars/*/* queries/*/* 2>/dev/null | while read -r line; do
mkdir -p "\$cfg/\''${line%/*}"
ln -snf "\$PWD/\$line" "\$cfg/\$line"
done)
ln -snf "$out" "\$cfg/.state"
fi
exec "${lib.getBin kak-tree-sitter-unwrapped}/bin/kak-tree-sitter" "\$@"
EOF
chmod +x "$out/bin/kak-tree-sitter"
'';

passthru = {
inherit mkParser;
bundledParsers = requestedParsers;
};

__structuredAttrs = true;
strictDeps = true;

inherit (kak-tree-sitter-unwrapped) meta;
})
Loading
Loading