vim 13 - Install YouCompleteME - 실패기

6 분 소요

vim 13 - Install YouCompleteME - 실패기

  • Vim에서 프로그래밍을 하기 위해, AutoComplete Plugin 인 github - YouCompleteme - Installation를 설치하려고 하였으나, 결국은 되지 않아서 그 실패기를 정리합니다.
  • macOS Monterey(12.1)에 설치를 시도했으며, 결국은 되지 않았습니다. 해당 이슈는 맥북에서만 빈번하게 등장하는 이슈인 것으로 보이기는 하는데요.

Install YouCompleteMe - Try

  • Vundle을 이용해서 설치하기 위해 .vimrc 파일 내에 아래와 같이 YouCompleteMe를 등록해줍니다.
Plugin 'Valloric/YouCompleteMe'
  • 그리고, :PluginInstall을 사용하여 설칙를 완료하면, 다음과 같이 YouCompleteMe를 Compile해줘야 한다는 메세지가 뜹니다. 지금은 안하고, 나중에 할거에요.
The ycmd server SHUT DOWN (restart with ':YcmRestartServer'). YCM core library not detected; you need to compile YCM before using it. Follow the instructions in the documentation.
  • python, vim, cmake를 설치하라고 하는데, 이미 다 설치되어 있습니다. 그리고, 설치하라는 말은 없지만, 명령어에는 go, nodejs까지 모두 설치하라고 되어 있는데, 뭐 하는 김애 다 설치해보기로 합니다. 그리고, vim은 mac에 기본으로 설치되어 있는 vim을 사용해서는 안됩니다. 이는 해당 vim –verion을 실행해보면 확인할 수 있는데요, 초기에 mac에 그대로 설치되어 있는 vim에는 python이 포함되어 있지 않아서 그렇습니다. 뭐 추가를 해주면 됩니다만.
$ brew install go 
$ brew install nodejs
  • 둘다 설치 완료했구요.
  • mono라고 하는, .NET Framework 도 설치하라는데…얘는 맥 인텔 칩이냐, M1 칩이냐 에 따라서 조금 다른 것 같기는 합니다. 아무튼, 뭐 얘도 설치해보겠습니다.
$ brew install mono
  • java의 지원을 받으려면 아래도 사용하라고 하는데요.
  • linux command ln은 “link”의 약자이며, 일종의 “바로가기”를 만드는 커맨드라고 생각하시면 됩니다. “hard link”와 “soft link”로 구분될 수 있는데요, “hard link”는 원본을 그대로 복사하는 것(hard copy), “soft link”는 원복을 가리키는 포인터를 만드는 것(soft copy) 라고 일단은 생각하시면 될 것 같습니다. 아래 command에서는 s를 argument로 넘겨서 soft link로 처리해줍니다.
  • ln -s source link의 형태로 표현됩니다. 즉, source에 대한 soft link를 link라는 파일에 연결해주겠다, 라는 말이 되죠.
  • f argument는 force를 의미하구요.
  • 실행 후에 해당 경로로 가서 link가 잘 생성되었는지 확인해 봅니다.
$ brew install java
$ sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
$ cd /Library/Java/JavaVirtualMachines/
$ ls 
  • YouCompleteMe 를 Compile해봅시다. 끝에 argument --all을 설정해준 것은 모든 언어들에 대해서 지원하도록 하겠다는 이야기죠.
cd ~/.vim/bundle/YouCompleteMe
python3 install.py --all
  • 설치되었다면, 아래 명령어를 통해 .ycm_extra_conf.py 파일을 옮겨줍니다.
cp  ~/.vim/bundle/youcompleteme/third_party/ycmd/.ycm_extra_conf.py  ~/.vim/
  • 복사된 파일을 열어보면 아래와 같은 경고 메세지가 뜨는 것을 확인할 수 있습니다.
$ cd ~/.vim
$ vi .ycm_extra_conf.py
# The ycmd server SHUT DOWN (restart with ':YcmRestartServer'). Unexpected exit code -6. Type ':YcmToggleLogs ycmd_63006_stderr_hdwr32nn.log' to check the logs.
  • 이런 경우 버전의 문제가 있을 수도 있어서, 재설치해주는 게 좋다는 의견이 있어 재설치를 하기로 합니다.
$ cd ~/.vim/bundle/YouCompleteMe
$ git pull --recurse-submodules origin master

From https://github.com/Valloric/YouCompleteMe
 * branch              master     -> FETCH_HEAD
Fetching submodule third_party/ycmd
Fetching submodule third_party/ycmd/third_party/bottle
Fetching submodule third_party/ycmd/third_party/jedi_deps/jedi
Fetching submodule third_party/ycmd/third_party/jedi_deps/jedi/jedi/third_party/django-stubs
Fetching submodule third_party/ycmd/third_party/jedi_deps/jedi/jedi/third_party/typeshed
Fetching submodule third_party/ycmd/third_party/jedi_deps/numpydoc
Fetching submodule third_party/ycmd/third_party/jedi_deps/numpydoc/doc/scipy-sphinx-theme
Fetching submodule third_party/ycmd/third_party/jedi_deps/parso
Fetching submodule third_party/ycmd/third_party/mrab-regex
Fetching submodule third_party/ycmd/third_party/watchdog_deps/watchdog
Already up to date.
$ ./install.py
  • PluginClean을 해보기도 하였지만, 잘 안됩니다.
:PluginClean

YMCD Start Manually - Failed

$ cd /path/to/YouCompleteMe/third_party/ycmd/
$ cat PYTHON_USED_DURING_BUILDING
/some/path/to/python3
$ cp ycmd/default_settings.json .
$ /some/path/to/python3 ycmd --options_file=default_settings.json
serving on http://localhost:<some port>

Fatal Python error: PyMUTEX_LOCK(_PyRuntime.ceval.gil.mutex) failed

[1]    73254 abort      python3 ycmd --options_file=default_settings.json
  • 직접 ymcd를 띄워보려고 하는데요, 띄워지지 않았습니다. 위 에러인 PyMUTEX_LOCK 문제는, macOS에서 Conda가 실행될 때만 발생하는 문제점이라고 알려져 있씁니다.
  • 발생한 곳은 다르지만, [BUG] Fatal Python error: PyMUTEX_LOCK(gil->mutex) failed #3081를 참고해보면, 다음과 같이, macOS에서 conde python으로 돌릴 때 발생하는 문제, 라는 말이 있죠.
  • conda에서 사용하는 clang은 버전10인데 반해, 설치된 python의 경우 clang11을 사용하여 발생한다는 말인 것 같습니다.
This only seems to appear when using conda's python on Mac OS. I haven't reproduced it elsewhere. Suspect that python is built with clang 10 from conda, while the python package in question is built with clang11, and some incompatibility arises.
  • MUTEX는 MUTually EXclusive의 약자로, 병렬 처리시 발생하는 문제를 막기 위해서 두 쓰레드(혹은 프로세스)가 동시에 접근하지 못하도록 처리하는 메커니즘이라고 보시면 됩니다. Python의 경우는 하나의 프로세스 내에서 단 1개의 Thread에서만 Interpreter를 사용할 수 있습니다. 이걸 GIL(Global Interpreter Lock)이라고 하며, Python에서 사용하는 MUTEX 메커니즘인 것으로 파악되네요.
  • 모든 python implementation(구현체)에서 GIL이 존재하는 것은 아니고, CPython에서만 GIL이 존재하는 것으로 알고 있습니다.
  • guswo

Python, Clang Version

  • clang은 맥에서 기본으로 사용하고 있는 compiler이며, LLVM의 메인 프론트엔드를 담당합니다. 소스 코드(c, c++, python 등)을 LLVM IR(Intermediate Representaion)으로 변환해 주죠.
  • Anaconda를 사용하여 설치한, python에서 사용하는 clang은 4.0.1인데, Apple에 설치되어 있는 clang의 버전은 13.0.0이라고 나옵니다. 어쩌면, 이 둘간의 차이로 인해 발생하는 문제가 아닐까 싶습니다.
$ python
Python 3.7.6 (default, Jan  8 2020, 13:42:34) 
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.

$ clang --version
Apple clang version 13.0.0 (clang-1300.0.29.30)
Target: x86_64-apple-darwin21.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
  • Anaconda를 직접 업데이트하면 Clang의 버전이 올라가면서 문제가 해결될까? 라는 생각을 하였는데, 아래 명령어로는 업데이트가 되지 않는 것 같아서, 여기서 홀드하였습니다.
$ conda update anaconda

Install by python

$ cd ~/.vim/bundle/YouCompleteMe
# 언어 옵션들을 확인해 봅니다.
$ python install.py --help    
usage: build.py [-h] [--clang-completer] [--clangd-completer] [--cs-completer]
                [--go-completer] [--rust-completer] [--java-completer]
                [--ts-completer] [--system-libclang] [--msvc {15,16,17}]
                [--ninja] [--all] [--enable-coverage] [--enable-debug]
                [--build-dir BUILD_DIR] [--quiet] [--verbose] [--skip-build]
                [--valgrind] [--clang-tidy] [--core-tests [CORE_TESTS]]
                [--cmake-path CMAKE_PATH] [--force-sudo]

optional arguments:
  -h, --help            show this help message and exit
  --clang-completer     Enable C-family semantic completion engine through
                        libclang.
  --clangd-completer    Enable C-family semantic completion engine through
                        clangd lsp server.(EXPERIMENTAL)
  --cs-completer        Enable C# semantic completion engine.
  --go-completer        Enable Go semantic completion engine.
  --rust-completer      Enable Rust semantic completion engine.
  --java-completer      Enable Java semantic completion engine.
  --ts-completer        Enable JavaScript and TypeScript semantic completion
                        engine.
  --system-libclang     Use system libclang instead of downloading one from
                        llvm.org. NOT RECOMMENDED OR SUPPORTED!
  --msvc {15,16,17}     Choose the Microsoft Visual Studio version (default:
                        16).
  --ninja               Use Ninja build system.
  --all                 Enable all supported completers
  --enable-coverage     For developers: Enable gcov coverage for the c++
                        module
  --enable-debug        For developers: build ycm_core library with debug
                        symbols
  --build-dir BUILD_DIR
                        For developers: perform the build in the specified
                        directory, and do not delete the build output. This is
                        useful for incremental builds, and required for
                        coverage data
  --quiet               Quiet installation mode. Just print overall progress
                        and errors. This is the default, so this flag is
                        actually ignored. Ues --verbose to see more output.
  --verbose             Verbose installation mode; prints output from build
                        operations. Useful for debugging build failures.
  --skip-build          Don't build ycm_core lib, just install deps
  --valgrind            For developers: Run core tests inside valgrind.
  --clang-tidy          For developers: Run clang-tidy static analysis on the
                        ycm_core code itself.
  --core-tests [CORE_TESTS]
                        Run core tests and optionally filter them.
  --cmake-path CMAKE_PATH
                        For developers: specify the cmake executable. Useful
                        for testing with specific versions, or if the system
                        is unable to find cmake.
  --force-sudo          Compiling with sudo causes problems. If you know what
                        you are doing, proceed.
$ python install.py --clang-complete --go-completer                    
Generating ycmd build configuration...OK
Compiling ycmd target: ycm_core...OK
Building regex module...OK
Building watchdog module...OK
  • 이렇게 처리한 다음, .vimrc 파일 내에 python의 실행 경로를 추가해줍니다. python 실행 경로는 command line 에서 which python3를 통해 확인할 수 있습니다.
" YMC - YouCompleteMe
let g:ycm_server_python_interpreter = '/Users/seunghoonlee/opt/anaconda3/bin/python3'
  • 이렇게 처리한 다음, vim을 사용해 문서 파일을 열어 봄변, ycmd가 여전히 안되는 것은 마찬가지입니다.
  • 혹시나 싶어, python3로 변경하여 처리해봤지만, 여전히 안되고요.

Wrap-up

  • YouCompleteMe를 설치하려고 여러 방면에서 시도를 해보았으나, 잘 되지 않아서 그냥 포기하기로 했습니다. 대충 원인은 mac에서 사용하는 Clang과 anaconda를 통해 설치한 Clang의 버전이 달라지면서, 뭔가 문제가 생긴 것은 아닐까 싶지만, 일단은 이게 중요하지 않으니 넘어가기로 합니다.
  • 뭐…그래도 좋은 시도였다고 봅니다. 결국 원인은 Clang 그리고 GIL 때문인 것으로 파악되는데요, 나중에 시간이 생기면, 해당 모듈 코드를 뜯어보면서 어디가 원인인지 파악해 보면 재미있을 것 같아요.
  • github - neoclide - coc.nvim이 더 좋다고 해서, 다음에는 얘로 설치해보려고 합니다.

Uninstall Plugin

  • .vimrc 파일을 열어서, 불필요한 Plugin 부분을 지워주고, 아래를 순서대로 입력해줍니다.
:PluginInstall
:PluginClean
  • PluginClean중에 오류가 발생하여, 확인해보니, 아래 경로의 폴더가 지워지지 않은 것 같습니다. log를 뜯어 보면 대충 “Permission Denied”가 뜨던데요, 걍 해당 경로로 가서 바로 지워버립겠습니다.
$ cd ~/.vim/bundle/YouCompleteMe
$ sudo rm -rf third_party
$ cd ..
$ rmdir YouCompleteMe

reference

댓글남기기