1 | =================================== |
2 | How To Setup Clang Tooling For LLVM |
3 | =================================== |
4 | |
5 | Clang Tooling provides infrastructure to write tools that need syntactic |
6 | and semantic information about a program. This term also relates to a set |
7 | of specific tools using this infrastructure (e.g. ``clang-check``). This |
8 | document provides information on how to set up and use Clang Tooling for |
9 | the LLVM source code. |
10 | |
11 | Introduction |
12 | ============ |
13 | |
14 | Clang Tooling needs a compilation database to figure out specific build |
15 | options for each file. Currently it can create a compilation database |
16 | from the ``compile_commands.json`` file, generated by CMake. When |
17 | invoking clang tools, you can either specify a path to a build directory |
18 | using a command line parameter ``-p`` or let Clang Tooling find this |
19 | file in your source tree. In either case you need to configure your |
20 | build using CMake to use clang tools. |
21 | |
22 | Setup Clang Tooling Using CMake and Make |
23 | ======================================== |
24 | |
25 | If you intend to use make to build LLVM, you should have CMake 2.8.6 or |
26 | later installed (can be found `here <https://cmake.org>`_). |
27 | |
28 | First, you need to generate Makefiles for LLVM with CMake. You need to |
29 | make a build directory and run CMake from it: |
30 | |
31 | .. code-block:: console |
32 | |
33 | $ mkdir your/build/directory |
34 | $ cd your/build/directory |
35 | $ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources |
36 | |
37 | If you want to use clang instead of GCC, you can add |
38 | ``-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++``. |
39 | You can also use ``ccmake``, which provides a curses interface to configure |
40 | CMake variables for lazy people. |
41 | |
42 | As a result, the new ``compile_commands.json`` file should appear in the |
43 | current directory. You should link it to the LLVM source tree so that |
44 | Clang Tooling is able to use it: |
45 | |
46 | .. code-block:: console |
47 | |
48 | $ ln -s $PWD/compile_commands.json path/to/llvm/source/ |
49 | |
50 | Now you are ready to build and test LLVM using make: |
51 | |
52 | .. code-block:: console |
53 | |
54 | $ make check-all |
55 | |
56 | Using Clang Tools |
57 | ================= |
58 | |
59 | After you completed the previous steps, you are ready to run clang tools. If |
60 | you have a recent clang installed, you should have ``clang-check`` in |
61 | ``$PATH``. Try to run it on any ``.cpp`` file inside the LLVM source tree: |
62 | |
63 | .. code-block:: console |
64 | |
65 | $ clang-check tools/clang/lib/Tooling/CompilationDatabase.cpp |
66 | |
67 | If you're using vim, it's convenient to have clang-check integrated. Put |
68 | this into your ``.vimrc``: |
69 | |
70 | :: |
71 | |
72 | function! ClangCheckImpl(cmd) |
73 | if &autowrite | wall | endif |
74 | echo "Running " . a:cmd . " ..." |
75 | let l:output = system(a:cmd) |
76 | cexpr l:output |
77 | cwindow |
78 | let w:quickfix_title = a:cmd |
79 | if v:shell_error != 0 |
80 | cc |
81 | endif |
82 | let g:clang_check_last_cmd = a:cmd |
83 | endfunction |
84 | |
85 | function! ClangCheck() |
86 | let l:filename = expand('%') |
87 | if l:filename =~ '\.\(cpp\|cxx\|cc\|c\)$' |
88 | call ClangCheckImpl("clang-check " . l:filename) |
89 | elseif exists("g:clang_check_last_cmd") |
90 | call ClangCheckImpl(g:clang_check_last_cmd) |
91 | else |
92 | echo "Can't detect file's compilation arguments and no previous clang-check invocation!" |
93 | endif |
94 | endfunction |
95 | |
96 | nmap <silent> <F5> :call ClangCheck()<CR><CR> |
97 | |
98 | When editing a .cpp/.cxx/.cc/.c file, hit F5 to reparse the file. In |
99 | case the current file has a different extension (for example, .h), F5 |
100 | will re-run the last clang-check invocation made from this vim instance |
101 | (if any). The output will go into the error window, which is opened |
102 | automatically when clang-check finds errors, and can be re-opened with |
103 | ``:cope``. |
104 | |
105 | Other ``clang-check`` options that can be useful when working with clang |
106 | AST: |
107 | |
108 | * ``-ast-print`` --- Build ASTs and then pretty-print them. |
109 | * ``-ast-dump`` --- Build ASTs and then debug dump them. |
110 | * ``-ast-dump-filter=<string>`` --- Use with ``-ast-dump`` or ``-ast-print`` to |
111 | dump/print only AST declaration nodes having a certain substring in a |
112 | qualified name. Use ``-ast-list`` to list all filterable declaration node |
113 | names. |
114 | * ``-ast-list`` --- Build ASTs and print the list of declaration node qualified |
115 | names. |
116 | |
117 | Examples: |
118 | |
119 | .. code-block:: console |
120 | |
121 | $ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-dump -ast-dump-filter ActionFactory::newASTConsumer |
122 | Processing: tools/clang/tools/clang-check/ClangCheck.cpp. |
123 | Dumping ::ActionFactory::newASTConsumer: |
124 | clang::ASTConsumer *newASTConsumer() (CompoundStmt 0x44da290 </home/alexfh/local/llvm/tools/clang/tools/clang-check/ClangCheck.cpp:64:40, line:72:3> |
125 | (IfStmt 0x44d97c8 <line:65:5, line:66:45> |
126 | <<<NULL>>> |
127 | (ImplicitCastExpr 0x44d96d0 <line:65:9> '_Bool':'_Bool' <UserDefinedConversion> |
128 | ... |
129 | $ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-print -ast-dump-filter ActionFactory::newASTConsumer |
130 | Processing: tools/clang/tools/clang-check/ClangCheck.cpp. |
131 | Printing <anonymous namespace>::ActionFactory::newASTConsumer: |
132 | clang::ASTConsumer *newASTConsumer() { |
133 | if (this->ASTList.operator _Bool()) |
134 | return clang::CreateASTDeclNodeLister(); |
135 | if (this->ASTDump.operator _Bool()) |
136 | return clang::CreateASTDumper(nullptr /*Dump to stdout.*/, |
137 | this->ASTDumpFilter); |
138 | if (this->ASTPrint.operator _Bool()) |
139 | return clang::CreateASTPrinter(&llvm::outs(), this->ASTDumpFilter); |
140 | return new clang::ASTConsumer(); |
141 | } |
142 | |
143 | (Experimental) Using Ninja Build System |
144 | ======================================= |
145 | |
146 | Optionally you can use the `Ninja <https://github.com/martine/ninja>`_ |
147 | build system instead of make. It is aimed at making your builds faster. |
148 | Currently this step will require building Ninja from sources. |
149 | |
150 | To take advantage of using Clang Tools along with Ninja build you need |
151 | at least CMake 2.8.9. |
152 | |
153 | Clone the Ninja git repository and build Ninja from sources: |
154 | |
155 | .. code-block:: console |
156 | |
157 | $ git clone git://github.com/martine/ninja.git |
158 | $ cd ninja/ |
159 | $ ./bootstrap.py |
160 | |
161 | This will result in a single binary ``ninja`` in the current directory. |
162 | It doesn't require installation and can just be copied to any location |
163 | inside ``$PATH``, say ``/usr/local/bin/``: |
164 | |
165 | .. code-block:: console |
166 | |
167 | $ sudo cp ninja /usr/local/bin/ |
168 | $ sudo chmod a+rx /usr/local/bin/ninja |
169 | |
170 | After doing all of this, you'll need to generate Ninja build files for |
171 | LLVM with CMake. You need to make a build directory and run CMake from |
172 | it: |
173 | |
174 | .. code-block:: console |
175 | |
176 | $ mkdir your/build/directory |
177 | $ cd your/build/directory |
178 | $ cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources |
179 | |
180 | If you want to use clang instead of GCC, you can add |
181 | ``-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++``. |
182 | You can also use ``ccmake``, which provides a curses interface to configure |
183 | CMake variables in an interactive manner. |
184 | |
185 | As a result, the new ``compile_commands.json`` file should appear in the |
186 | current directory. You should link it to the LLVM source tree so that |
187 | Clang Tooling is able to use it: |
188 | |
189 | .. code-block:: console |
190 | |
191 | $ ln -s $PWD/compile_commands.json path/to/llvm/source/ |
192 | |
193 | Now you are ready to build and test LLVM using Ninja: |
194 | |
195 | .. code-block:: console |
196 | |
197 | $ ninja check-all |
198 | |
199 | Other target names can be used in the same way as with make. |
200 | |
201 | |