mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-22 07:35:08 +00:00
Rework Project-Setup.md
parent
62321899f2
commit
e7a4a1f900
106
Project-Setup.md
106
Project-Setup.md
@ -1,11 +1,38 @@
|
|||||||
|
ccls typically indexes an entire project. In order for this to work properly,
|
||||||
|
`ccls` needs to be able to obtain the source file list and their compilation
|
||||||
|
command lines.
|
||||||
|
|
||||||
|
There are two main ways this happens:
|
||||||
|
|
||||||
|
1. Provide `compile_commands.json` at the project root
|
||||||
|
2. Provide `.ccls`. It is a line-based text file describing compiler flags.
|
||||||
|
Recursively listed source files (headers excluded) will be indexed.
|
||||||
|
|
||||||
|
If neither exists, then when ccls starts it will not index anything: instead it
|
||||||
|
will wait for LSP clients to open files and index only those files.
|
||||||
|
|
||||||
|
## `compile_commands.json`
|
||||||
|
|
||||||
[Guillaume Papin(@Sarcasm)](https://github.com/sarcasm) has [a thorough article about compilation databases](https://sarcasm.github.io/notes/dev/compilation-database.html).
|
[Guillaume Papin(@Sarcasm)](https://github.com/sarcasm) has [a thorough article about compilation databases](https://sarcasm.github.io/notes/dev/compilation-database.html).
|
||||||
|
|
||||||
|
Generally this file is not checked into source control, but rather is
|
||||||
|
generated by the build system. This means it's best to generate it in a new
|
||||||
|
project before starting the `ccls` server in that project.
|
||||||
|
|
||||||
|
Because this file is auto-generated it's not easy to customize. As a result
|
||||||
|
it's possible to provide _both_ `compile_commands.json` _and_ `.ccls` in the
|
||||||
|
same project and have the `.ccls` configuration enhance the options from
|
||||||
|
`compile_commands.json`.
|
||||||
|
|
||||||
|
If your `compile_commands.json` is not kept in the project root, set the
|
||||||
|
initialization option `compilationDatabaseDirectory` to an alternative
|
||||||
|
directory containing `compile_commands.json`.
|
||||||
|
|
||||||
### [CMake](https://cmake.org/)
|
### [CMake](https://cmake.org/)
|
||||||
|
|
||||||
```zsh
|
```zsh
|
||||||
% mkdir build
|
% cmake -H. -BDebug -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=YES
|
||||||
% (cd build; cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=YES ..)
|
% ln -s Debug/compile_commands.json
|
||||||
% ln -s build/compile_commands.json
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Caveat on Windows: CMake dumps Windows shell command line directly into `command`, depends on how ccls was built, it may confuse this field as command line from a POSIX shell, in which Windows path separator '\\' is a escape character. You can use jq to convert such entries to use `arguments` which does not have this issue:
|
Caveat on Windows: CMake dumps Windows shell command line directly into `command`, depends on how ccls was built, it may confuse this field as command line from a POSIX shell, in which Windows path separator '\\' is a escape character. You can use jq to convert such entries to use `arguments` which does not have this issue:
|
||||||
@ -70,7 +97,7 @@ You may use the initialization option `"compilationDatabaseCommand"` to provide
|
|||||||
```
|
```
|
||||||
|
|
||||||
```elisp
|
```elisp
|
||||||
(setq ccls-extra-init-params '(:compilationDatabaseCommand "mycompdb"))
|
(setq ccls-initialization-options '(:compilationDatabaseCommand "mycompdb"))
|
||||||
```
|
```
|
||||||
|
|
||||||
Suppose the project is at `/tmp/c`, `mycompdb /tmp/c` will be executed with stdin=initializationOptions and the stdout should be a JSON compilation database.
|
Suppose the project is at `/tmp/c`, `mycompdb /tmp/c` will be executed with stdin=initializationOptions and the stdout should be a JSON compilation database.
|
||||||
@ -104,7 +131,72 @@ with open(os.path.join(sys.argv[1], 'compile_commands.json')) as f:
|
|||||||
json.dump(db, sys.stdout)
|
json.dump(db, sys.stdout)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Examples
|
## `.ccls`
|
||||||
|
|
||||||
|
`.ccls` is a line-based text file at the project root. It's main function is
|
||||||
|
to specify compiler flags needed to properly index your code: `-I` `-D` etc.
|
||||||
|
Each line consists of one argument. No whitespace splitting is performed on the
|
||||||
|
argument, thus `-I foo` cannot be used (use `-Ifoo` or `-I\nfoo`).
|
||||||
|
|
||||||
|
Subdirectories of the project can also contain `.ccls` files, if needed, to
|
||||||
|
specify compiler flags specific to those directories.
|
||||||
|
|
||||||
|
A line may start with zero or more `%` directives.
|
||||||
|
|
||||||
|
Available directives include:
|
||||||
|
|
||||||
|
### `%compile_commands.json`
|
||||||
|
|
||||||
|
By default `.ccls` specify compiler flags of files not listed in
|
||||||
|
`compile_commands.json`. If this directive appears first in `.ccls` then after
|
||||||
|
`compile_commands.json` is parsed, the rest lines of `.ccls` will be appended
|
||||||
|
to the compiler flags.
|
||||||
|
|
||||||
|
### `%clang`
|
||||||
|
|
||||||
|
Resolves to either `clang` (C) or `clang++` (C++). This is useful if your
|
||||||
|
project has both C and C++ source files, because if unconditional `clang++` is
|
||||||
|
used instead, `clang++ a.c` parses `a.c` as C++.
|
||||||
|
|
||||||
|
### `%c` / `%cpp` / `%objective-c` / `%objective-cpp`
|
||||||
|
|
||||||
|
This argument should be added only when parsing C (`%c`), C++ (`%cpp`),
|
||||||
|
Objective-C (`%objective-c`), or Objective-C++ (`%objective-c++`) files.
|
||||||
|
|
||||||
|
### `%h` / `%hpp`
|
||||||
|
|
||||||
|
This argument should be added only when indexing C header files (`%h`: `*.h`) or C++
|
||||||
|
header files (`%hpp`: `*.hh` `*.hpp`). Note, `*.h` files are considered as C, not C++.
|
||||||
|
|
||||||
|
## `.ccls` examples
|
||||||
|
|
||||||
|
#### Example A
|
||||||
|
|
||||||
|
```
|
||||||
|
%clang
|
||||||
|
%c -std=c11
|
||||||
|
%cpp -std=c++2a
|
||||||
|
%h %hpp --include=Global.h
|
||||||
|
-Iinc
|
||||||
|
-DMACRO
|
||||||
|
````
|
||||||
|
|
||||||
|
`*.h *.hh *.hpp` files will be parsed with extra `--include=Global.h`
|
||||||
|
|
||||||
|
#### Example B
|
||||||
|
|
||||||
|
```
|
||||||
|
%compile_commands.json
|
||||||
|
%c -std=c11
|
||||||
|
%cpp -std=c++14
|
||||||
|
%c %cpp -pthread
|
||||||
|
%h %hpp --include=Global.h
|
||||||
|
-Iinc
|
||||||
|
```
|
||||||
|
|
||||||
|
It appends flags so `%clang` should not be used.
|
||||||
|
|
||||||
|
## `compile_commands.json` examples
|
||||||
|
|
||||||
### Linux kernel
|
### Linux kernel
|
||||||
|
|
||||||
@ -130,7 +222,3 @@ mkdir Debug; cd Debug
|
|||||||
bear make -j
|
bear make -j
|
||||||
cd ..; ln -s Debug/compile_commands.json
|
cd ..; ln -s Debug/compile_commands.json
|
||||||
```
|
```
|
||||||
|
|
||||||
## Misc
|
|
||||||
|
|
||||||
`compile_commands.json` should reside in the project root. Set the initialization option `compilationDatabaseDirectory` for an alternative directory containing `compile_commands.json`.
|
|
||||||
|
14
_Sidebar.md
14
_Sidebar.md
@ -1,10 +1,6 @@
|
|||||||
* [[Home]]
|
[[Home]]
|
||||||
- [[Getting started]]
|
* [[Build]]
|
||||||
- [[Build]]
|
* [[Editor Configuration]]
|
||||||
- [[compile_commands.json]]
|
|
||||||
- [[Initialization options]]
|
|
||||||
- [[FAQ]]
|
|
||||||
* Editor configuration
|
|
||||||
- [[Atom]]
|
- [[Atom]]
|
||||||
- Emacs
|
- Emacs
|
||||||
+ [[lsp-mode]] (+ emacs-ccls)
|
+ [[lsp-mode]] (+ emacs-ccls)
|
||||||
@ -14,6 +10,8 @@
|
|||||||
+ [[LanguageClient-neovim]]
|
+ [[LanguageClient-neovim]]
|
||||||
+ [[vim-lsp]]
|
+ [[vim-lsp]]
|
||||||
- [[Visual Studio Code]]
|
- [[Visual Studio Code]]
|
||||||
|
* [[Project Setup]]
|
||||||
|
* [[Customization]]
|
||||||
* [[Debugging]]
|
* [[Debugging]]
|
||||||
* [[Client feature table]]
|
* [[FAQ]]
|
||||||
* [[LSP]]
|
* [[LSP]]
|
||||||
|
Loading…
Reference in New Issue
Block a user