mirror of
				https://github.com/MaskRay/ccls.git
				synced 2025-10-31 04:32:33 +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