186 lines
7 KiB
Org Mode
186 lines
7 KiB
Org Mode
#+TITLE: lang/cc
|
|
#+DATE: January 16, 2017
|
|
#+SINCE: v2.0
|
|
#+STARTUP: inlineimages
|
|
|
|
* Table of Contents :TOC_3:noexport:
|
|
- [[#description][Description]]
|
|
- [[#module-flags][Module Flags]]
|
|
- [[#plugins][Plugins]]
|
|
- [[#prerequisites][Prerequisites]]
|
|
- [[#irony-server][irony-server]]
|
|
- [[#macos][MacOS]]
|
|
- [[#arch-linux][Arch Linux]]
|
|
- [[#opensuse][openSUSE]]
|
|
- [[#rtags][rtags]]
|
|
- [[#configure][Configure]]
|
|
- [[#project-compile-settings][Project compile settings]]
|
|
- [[#known-issues-with-bear-on-macos][Known issues with bear on macOS]]
|
|
- [[#appendix][Appendix]]
|
|
- [[#eglot-specific-bindings][Eglot specific bindings]]
|
|
|
|
* Description
|
|
This module adds support for the C-family of languages: C, C++, and Objective-C.
|
|
|
|
+ Code completion (~company-irony~)
|
|
+ eldoc support (~irony-eldoc~)
|
|
+ Syntax-checking (~flycheck-irony~)
|
|
+ Code navigation (~rtags~)
|
|
+ File Templates ([[../../editor/file-templates/templates/c-mode][c-mode]], [[../../editor/file-templates/templates/c++-mode][c++-mode]])
|
|
+ Snippets ([[https://github.com/hlissner/doom-snippets/tree/master/cc-mode][cc-mode]], [[https://github.com/hlissner/doom-snippets/tree/master/c-mode][c-mode]], [[https://github.com/hlissner/doom-snippets/tree/master/c++-mode][c++-mode]])
|
|
+ Several improvements to C++11 indentation and syntax highlighting.
|
|
|
|
** Module Flags
|
|
+ ~+lsp~ Disables irony+rtags and replaces them with LSP (ccls by default). This
|
|
requires the =:tools lsp= module.
|
|
|
|
** Plugins
|
|
+ [[https://github.com/Kitware/CMake][cmake-mode]]
|
|
+ [[https://github.com/chachi/cuda-mode][cuda-mode]]
|
|
+ [[https://github.com/liblit/demangle-mode][demangle-mode]]
|
|
+ [[https://github.com/jart/disaster][disaster]]
|
|
+ [[https://github.com/ludwigpacifici/modern-cpp-font-lock][modern-cpp-font-lock]]
|
|
+ [[https://github.com/salmanebah/opencl-mode][opencl-mode]]
|
|
+ [[https://github.com/jimhourihan/glsl-mode][glsl-mode]]*
|
|
+ [[https://github.com/guidoschmidt/company-glsl][company-glsl]]*
|
|
+ =+lsp=
|
|
+ [[https://github.com/MaskRay/emacs-ccls][ccls]] if =:tools lsp= has *no* =+eglot= flag
|
|
+ =-lsp=
|
|
+ [[https://github.com/Sarcasm/irony-mode][irony]]
|
|
+ [[https://github.com/ikirill/irony-eldoc][irony-eldoc]]
|
|
+ [[https://github.com/Sarcasm/flycheck-irony][flycheck-irony]]
|
|
+ [[https://github.com/Sarcasm/company-irony][company-irony]]
|
|
+ [[https://github.com/hotpxl/company-irony-c-headers][company-irony-c-headers]]
|
|
+ [[https://github.com/Andersbakken/rtags][rtags]]
|
|
+ [[https://github.com/Andersbakken/rtags][ivy-rtags]]
|
|
+ [[https://github.com/Andersbakken/rtags][helm-rtags]]
|
|
|
|
* Prerequisites
|
|
This module requires
|
|
|
|
+ irony-server
|
|
+ rtags
|
|
|
|
** irony-server
|
|
Irony powers the code completion, eldoc and syntax checking systems.
|
|
|
|
After installing its dependencies, run ~M-x irony-install-server~ in Emacs.
|
|
|
|
*** MacOS
|
|
Due to linking issues, MacOS users must compile irony-server manually:
|
|
|
|
#+BEGIN_SRC sh
|
|
brew install cmake
|
|
brew install llvm # 1gb+ installation! May take a while!
|
|
|
|
git clone https://github.com/Sarcasm/irony-mode irony-mode
|
|
mkdir irony-mode/server/build
|
|
pushd irony-mode/server/build
|
|
|
|
DEST="$HOME/.emacs.d/.local/etc/irony-server/"
|
|
cmake -DCMAKE_PREFIX_PATH=/usr/local/opt/llvm \
|
|
-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \
|
|
-DCMAKE_INSTALL_PREFIX="$DEST" ../
|
|
cmake --build . --use-stderr --config Release --target install
|
|
|
|
install_name_tool -change @rpath/libclang.dylib \
|
|
/usr/local/opt/llvm/lib/libclang.dylib \
|
|
"$DEST/bin/irony-server"
|
|
|
|
# cleanup
|
|
popd
|
|
rm -rf irony-mode
|
|
#+END_SRC
|
|
|
|
*** Arch Linux
|
|
#+BEGIN_SRC sh
|
|
pacman -S clang cmake
|
|
#+END_SRC
|
|
|
|
*** openSUSE
|
|
#+BEGIN_SRC sh :dir /sudo::
|
|
sudo zypper install clang cmake
|
|
#+END_SRC
|
|
|
|
** rtags
|
|
Code navigation requires an [[https://github.com/Andersbakken/rtags][rtags]] server (~rdm~) installed. This should be
|
|
available through your OS's package manager.
|
|
|
|
This module will auto-start ~rdm~ when you open C/C++ buffers (so long as one
|
|
isn't already running). If you prefer to run it yourself:
|
|
|
|
#+BEGIN_SRC sh
|
|
rdm &
|
|
rc -J $PROJECT_ROOT # loads PROJECT_ROOT's compile_commands.json
|
|
#+END_SRC
|
|
|
|
* Configure
|
|
** Project compile settings
|
|
By default, a set of default compile settings are defined in
|
|
~+cc-default-compiler-options~ for C, C++ and Objective C. Irony, rtags and
|
|
flycheck will fall back to these.
|
|
|
|
To make these tools aware of project specific build settings, you need a JSON
|
|
[[https://sarcasm.github.io/notes/dev/compilation-database.html#ninja][compilation database]] present (i.e. a ~compile_commands.json~ file).
|
|
|
|
There are [[https://sarcasm.github.io/notes/dev/compilation-database.html][many ways to generate one]]. I use [[http://www.cmake.org/][CMake]] or [[https://github.com/rizsotto/Bear][bear]]:
|
|
|
|
#+BEGIN_SRC sh
|
|
# For CMake projects
|
|
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .
|
|
|
|
# For non-CMake projects
|
|
make clean
|
|
bear make
|
|
#+END_SRC
|
|
|
|
Use ~M-x +cc/reload-compile-db~ to reload your compile db in an already-open
|
|
C/C++/ObjC buffer.
|
|
|
|
*** Known issues with bear on macOS
|
|
MacOS' [[https://support.apple.com/en-us/HT204899][System Integrity Protection (SIP)]] might interfere with bear if ~make~ is
|
|
under ~/usr/bin/~ which results in an empty compilation database.
|
|
|
|
From the bear [[https://github.com/rizsotto/Bear#empty-compilation-database-on-os-x-captain-or-fedora][readme]]:
|
|
|
|
#+begin_quote
|
|
Security extension/modes on different operating systems might disable library
|
|
preloads. This case Bear behaves normally, but the result compilation database
|
|
will be empty. (Please make sure it's not the case when reporting bugs.) Notable
|
|
examples for enabled security modes are: OS X 10.11 (check with csrutil status |
|
|
grep 'System Integrity Protection'), and Fedora, CentOS, RHEL (check with
|
|
sestatus | grep 'SELinux status').
|
|
|
|
Workaround could be to disable the security feature while running Bear. (This
|
|
might involve reboot of your computer, so might be heavy workaround.) Another
|
|
option if the build tool is not installed under certain directories. Or use
|
|
tools which are using compiler wrappers. (It injects a fake compiler which does
|
|
record the compiler invocation and calls the real compiler too.) An example for
|
|
such tool might be scan-build. The build system shall respect CC and CXX
|
|
environment variables.
|
|
#+end_quote
|
|
|
|
A workaround might be to install ~make~ via Homebrew which puts ~gmake~
|
|
under ~/usr/local/~.
|
|
|
|
#+BEGIN_SRC sh
|
|
brew install make
|
|
#+END_SRC
|
|
|
|
#+BEGIN_SRC sh
|
|
make clean
|
|
bear gmake
|
|
#+END_SRC
|
|
|
|
Additional info:
|
|
+ [[https://github.com/rizsotto/Bear/issues/158][Empty compilation database with compiler in /usr/local]]
|
|
+ [[https://github.com/rizsotto/Bear/issues/152][Workaround for 'Empty compilation database on OS X Captain]]
|
|
|
|
* Appendix
|
|
** Eglot specific bindings
|
|
When using =+lsp= and =:tools (lsp +eglot)=, lsp-mode is replaced with eglot,
|
|
and an additional function to get inheritance type hierarchy is added
|
|
| Binding | Description |
|
|
|------------------------------+--------------------------------------------------|
|
|
| ~<localleader> c t~ | ~Display inheritance type hierarchy (upwards)~ |
|
|
| ~<prefix> <localleader> c t~ | ~Display inheritance type hierarchy (downwards)~ |
|