nixpkgs/pkgs/development/tools/misc/ycmd/default.nix
ryneeverett 30328c3c33 ycmd: typescript completion support
Link the already-packaged typescript package so that ycmd will support
completions for javascript and typescript filetypes.

The structure of these installation directories is "documented" here:
<https://github.com/ycm-core/ycmd/blob/master/build.py>.

I don't completely understand why the language support is passed as
optional attrs Is it because folks want to build leaner packages and
pass null or because they want to target particular dependencies? At any
rate I followed the pattern.
2020-04-24 19:02:31 +00:00

100 lines
3.2 KiB
Nix

{ stdenv, lib, fetchgit, cmake, llvmPackages, boost, python
, gocode ? null
, godef ? null
, gotools ? null
, nodePackages ? null
, rustracerd ? null
, fixDarwinDylibNames, Cocoa ? null
}:
stdenv.mkDerivation {
pname = "ycmd";
version = "2020-02-22";
disabled = !python.isPy3k;
src = fetchgit {
url = "https://github.com/Valloric/ycmd.git";
rev = "9a6b86e3a156066335b678c328f226229746bae5";
sha256 = "1c5axdngxaxj5vc6lr8sxb99mr5adsm1dnjckaxc23kq78pc8cn7";
};
nativeBuildInputs = [ cmake ];
buildInputs = [ boost llvmPackages.libclang ]
++ stdenv.lib.optional stdenv.isDarwin [ fixDarwinDylibNames Cocoa ];
buildPhase = ''
export EXTRA_CMAKE_ARGS=-DPATH_TO_LLVM_ROOT=${llvmPackages.clang-unwrapped}
${python.interpreter} build.py --system-libclang --clang-completer --system-boost
'';
dontConfigure = true;
# remove the tests
#
# make __main__.py executable and add shebang
#
# copy over third-party libs
# note: if we switch to using our packaged libs, we'll need to symlink them
# into the same spots, as YouCompleteMe (the vim plugin) expects those paths
# to be available
#
# symlink completion backends where ycmd expects them
installPhase = ''
rm -rf ycmd/tests
chmod +x ycmd/__main__.py
sed -i "1i #!${python.interpreter}\
" ycmd/__main__.py
mkdir -p $out/lib/ycmd
cp -r ycmd/ CORE_VERSION libclang.so.* libclang.dylib* ycm_core.so $out/lib/ycmd/
mkdir -p $out/bin
ln -s $out/lib/ycmd/ycmd/__main__.py $out/bin/ycmd
# Copy everything: the structure of third_party has been known to change.
# When linking our own libraries below, do so with '-f'
# to clobber anything we may have copied here.
mkdir -p $out/lib/ycmd/third_party
cp -r third_party/* $out/lib/ycmd/third_party/
'' + lib.optionalString (gocode != null) ''
TARGET=$out/lib/ycmd/third_party/gocode
mkdir -p $TARGET
ln -sf ${gocode}/bin/gocode $TARGET
'' + lib.optionalString (godef != null) ''
TARGET=$out/lib/ycmd/third_party/godef
mkdir -p $TARGET
ln -sf ${godef}/bin/godef $TARGET
'' + lib.optionalString (gotools != null) ''
TARGET=$out/lib/ycmd/third_party/go/src/golang.org/x/tools/cmd/gopls
mkdir -p $TARGET
ln -sf ${gotools}/bin/gopls $TARGET
'' + lib.optionalString (nodePackages != null) ''
TARGET=$out/lib/ycmd/third_party/tsserver
ln -sf ${nodePackages.typescript} $TARGET
'' + lib.optionalString (rustracerd != null) ''
TARGET=$out/lib/ycmd/third_party/racerd/target/release
mkdir -p $TARGET
ln -sf ${rustracerd}/bin/racerd $TARGET
'';
# fixup the argv[0] and replace __file__ with the corresponding path so
# python won't be thrown off by argv[0]
postFixup = ''
substituteInPlace $out/lib/ycmd/ycmd/__main__.py \
--replace $out/lib/ycmd/ycmd/__main__.py \
$out/bin/ycmd \
--replace __file__ \
"'$out/lib/ycmd/ycmd/__main__.py'"
'';
meta = with stdenv.lib; {
description = "A code-completion and comprehension server";
homepage = "https://github.com/Valloric/ycmd";
license = licenses.gpl3;
maintainers = with maintainers; [ rasendubi cstrahan lnl7 ];
platforms = platforms.all;
};
}