summary refs log tree commit diff
path: root/pkgs/development/tools
diff options
context:
space:
mode:
authorCharles Strahan <charles@cstrahan.com>2017-02-09 23:39:16 -0500
committerCharles Strahan <charles@cstrahan.com>2017-02-10 01:01:22 -0500
commit53a5117cde14e1905cbe67e294f9b2b974dbe09a (patch)
tree42c8d546e18c9dfce2c819c6d12749044a637661 /pkgs/development/tools
parentb27edc45374309fb30b6b7454b4115e4923b17bf (diff)
downloadnixlib-53a5117cde14e1905cbe67e294f9b2b974dbe09a.tar
nixlib-53a5117cde14e1905cbe67e294f9b2b974dbe09a.tar.gz
nixlib-53a5117cde14e1905cbe67e294f9b2b974dbe09a.tar.bz2
nixlib-53a5117cde14e1905cbe67e294f9b2b974dbe09a.tar.lz
nixlib-53a5117cde14e1905cbe67e294f9b2b974dbe09a.tar.xz
nixlib-53a5117cde14e1905cbe67e294f9b2b974dbe09a.tar.zst
nixlib-53a5117cde14e1905cbe67e294f9b2b974dbe09a.zip
ycmd: use vendored python libs
YouCompleteMe needs the packages to be available in ycmd's third_party
directory, and things start getting pretty complicated when we try to
use our package libs instead of the vendored ones. We can revisit this
at a later time, but we'll need to ensure that we don't break the vim
plugin.

Tested in vim.
Diffstat (limited to 'pkgs/development/tools')
-rw-r--r--pkgs/development/tools/misc/ycmd/2-ycm-cmake.patch40
-rw-r--r--pkgs/development/tools/misc/ycmd/default.nix43
2 files changed, 60 insertions, 23 deletions
diff --git a/pkgs/development/tools/misc/ycmd/2-ycm-cmake.patch b/pkgs/development/tools/misc/ycmd/2-ycm-cmake.patch
new file mode 100644
index 000000000000..76b996ec2cca
--- /dev/null
+++ b/pkgs/development/tools/misc/ycmd/2-ycm-cmake.patch
@@ -0,0 +1,40 @@
+diff --git a/cpp/ycm/CMakeLists.txt b/cpp/ycm/CMakeLists.txt
+index 2074c58e..9ecd6e57 100644
+--- a/cpp/ycm/CMakeLists.txt
++++ b/cpp/ycm/CMakeLists.txt
+@@ -366,35 +366,6 @@ if( LIBCLANG_TARGET )
+       POST_BUILD
+       COMMAND ${CMAKE_COMMAND} -E copy "${LIBCLANG_TARGET}" "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
+     )
+-
+-    if( APPLE )
+-      # In OS X El Capitan, Apple introduced System Integrity Protection.
+-      # Amongst other things, this introduces features to the dynamic loader
+-      # (dyld) which cause it to "sanitise" (and complain about) embedded
+-      # LC_RPATH entries which contain @executable_path when then are loaded
+-      # into "restricted" binaries.  For our purposes, "restricted" here means
+-      # "supplied by Apple" and includes the system versions of python.  For
+-      # unknown reasons, the libclang.dylib that comes from llvm.org includes an
+-      # LC_RPATH entry '@executable_path/../lib' which causes the OS X dynamic
+-      # loader to print a cryptic warning to stderr of the form:
+-      #
+-      #    dyld: warning, LC_RPATH @executable_path/../lib in
+-      #    /path/to/ycmd/libclang.dylib being ignored in restricted program
+-      #    because of @executable_path
+-      #
+-      # In order to prevent this harmless and annoying message appearing, we
+-      # simply strip the rpath entry from the dylib.  There's no way any
+-      # @executable_path that python might have could be in any way useful to
+-      # libclang.dylib, so this seems perfectly safe.
+-      get_filename_component( LIBCLANG_TAIL ${LIBCLANG_TARGET} NAME )
+-      add_custom_command( TARGET ${PROJECT_NAME}
+-                          POST_BUILD
+-                          COMMAND install_name_tool
+-                          "-delete_rpath"
+-                          "@executable_path/../lib"
+-                          "$<TARGET_FILE_DIR:${PROJECT_NAME}>/${LIBCLANG_TAIL}"
+-                        )
+-    endif()
+   endif()
+ endif()
+ 
diff --git a/pkgs/development/tools/misc/ycmd/default.nix b/pkgs/development/tools/misc/ycmd/default.nix
index 2153305953ed..9ac227ac0063 100644
--- a/pkgs/development/tools/misc/ycmd/default.nix
+++ b/pkgs/development/tools/misc/ycmd/default.nix
@@ -1,16 +1,13 @@
-{ stdenv, lib, fetchgit, cmake, llvmPackages, boost, python2Packages
+{ stdenv, lib, fetchgit, cmake, llvmPackages, boost, python
 , gocode ? null
 , godef ? null
 , rustracerd ? null
+, Cocoa ? null
 }:
 
-let
-  inherit (python2Packages) python mkPythonDerivation waitress frozendict bottle future argparse requests;
-  pathFixup =  "import os; os.environ['PATH'] = ('{0}:{1}' if os.getenv('PATH', '') != '' else '{1}').format('$program_PATH', os.getenv('PATH', ''))";
-in mkPythonDerivation rec {
+stdenv.mkDerivation rec {
   name = "ycmd-${version}";
   version = "2017-02-03";
-  namePrefix = "";
 
   src = fetchgit {
     url = "git://github.com/Valloric/ycmd.git";
@@ -18,30 +15,32 @@ in mkPythonDerivation rec {
     sha256 = "0rzxgqqqmmrv9r4k2ji074iprhw6sb0jkvh84wvi45yfyphsh0xi";
   };
 
-  buildInputs = [ cmake boost ];
-
-  propagatedBuildInputs = [ waitress frozendict bottle future argparse requests ];
+  buildInputs = [ cmake boost ]  ++ stdenv.lib.optional stdenv.isDarwin Cocoa;
 
   buildPhase = ''
     export EXTRA_CMAKE_ARGS=-DPATH_TO_LLVM_ROOT=${llvmPackages.clang-unwrapped}
     ${python.interpreter} build.py --clang-completer --system-boost
   '';
 
+  patches = [ ./2-ycm-cmake.patch ];
+
   configurePhase = ":";
 
   # remove the tests
   #
-  # make __main__.py executable so mkPythonDerivation's postFixup modifies the
-  # executable (e.g. fixup PYTHONPATH)
+  # make __main__.py executable and add shebang
   #
-  # add a shebang (will be rewritten by postFixup)
+  # 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 #!/usr/bin/env python\
+    sed -i "1i #!${python.interpreter}\
     " ycmd/__main__.py
 
     mkdir -p $out/lib/ycmd
@@ -51,7 +50,12 @@ in mkPythonDerivation rec {
     ln -s $out/lib/ycmd/ycmd/__main__.py $out/bin/ycmd
 
     mkdir -p $out/lib/ycmd/third_party/{gocode,godef,racerd/target/release}
-    cp -r third_party/JediHTTP/ $out/lib/ycmd/third_party
+
+    cp -r third_party/JediHTTP $out/lib/ycmd/third_party
+    for p in waitress frozendict bottle python-future argparse requests; do
+      cp -r third_party/$p $out/lib/ycmd/third_party
+    done
+
   '' + lib.optionalString (gocode != null) ''
     ln -s ${gocode}/bin/gocode $out/lib/ycmd/third_party/gocode
   '' + lib.optionalString (godef != null) ''
@@ -60,16 +64,9 @@ in mkPythonDerivation rec {
     ln -s ${rustracerd}/bin/racerd $out/lib/ycmd/third_party/racerd/target/release
   '';
 
-  # mkPythonDerivation will attempt to create a wrapper script (written in bash)
-  # but we don't want the indirection as several editor plugins want to invoke
-  # ycmd as `python path/to/ycmd`, which will obviously fail in that case -
-  # so we move the original file back over
-  #
-  # also fixup the argv[0] and replace __file__ with the corresponding path so
+  # fixup the argv[0] and replace __file__ with the corresponding path so
   # python won't be thrown off by argv[0]
   postFixup = ''
-    mv $out/lib/ycmd/ycmd/{.__main__.py-wrapped,__main__.py}
-
     substituteInPlace $out/lib/ycmd/ycmd/__main__.py \
       --replace $out/lib/ycmd/ycmd/__main__.py \
                 $out/bin/ycmd \
@@ -81,7 +78,7 @@ in mkPythonDerivation rec {
     description = "A code-completion and comprehension server";
     homepage = https://github.com/Valloric/ycmd;
     license = licenses.gpl3;
-    maintainers = with maintainers; [ rasendubi ];
+    maintainers = with maintainers; [ rasendubi cstrahan ];
     platforms = platforms.all;
   };
 }