OLD | NEW |
1 # Clang Tool Refactoring | 1 # Clang Tool Refactoring |
2 | 2 |
3 [TOC] | 3 [TOC] |
4 | 4 |
5 ## Caveats | 5 ## Caveats |
6 | 6 |
7 * The current workflow requires git. | 7 * The current workflow requires git. |
8 * This doesn't work on Windows... yet. I'm hoping to have a proof-of-concept | 8 * This doesn't work on Windows... yet. I'm hoping to have a proof-of-concept |
9 working on Windows as well ~~in a month~~ several centuries from now. | 9 working on Windows as well ~~in a month~~ several centuries from now. |
10 | 10 |
11 ## Prerequisites | 11 ## Prerequisites |
12 | 12 |
13 Everything needed should be in a default Chromium checkout using gclient. | 13 Everything needed should be in a default Chromium checkout using gclient. |
14 `third_party/llvm-build/Release+Asserts/bin` should be in your `$PATH`. | 14 `third_party/llvm-build/Release+Asserts/bin` should be in your `$PATH`. |
15 | 15 |
16 ## Writing the Tool | 16 ## Writing the Tool |
17 | 17 |
18 An example clang tool is being implemented in | 18 An example clang tool is being implemented in |
19 https://codereview.chromium.org/12746010/. Other useful resources might be the | 19 https://codereview.chromium.org/12746010/. Other useful resources might be the |
20 [basic tutorial for Clang's AST matchers](http://clang.llvm.org/docs/LibASTMatch
ersTutorial.html) | 20 [basic tutorial for Clang's AST matchers](http://clang.llvm.org/docs/LibASTMatch
ersTutorial.html) |
21 or the | 21 or the |
22 [AST matcher reference](http://clang.llvm.org/docs/LibASTMatchersReference.html)
. | 22 [AST matcher reference](http://clang.llvm.org/docs/LibASTMatchersReference.html)
. |
23 | 23 |
24 Build your tool by running the following command (requires cmake version 2.8.10 | 24 Build your tool by running the following command (requires cmake version 2.8.10 |
25 or later): | 25 or later): |
26 | 26 |
27 ```shell | 27 ```shell |
28 tools/clang/scripts/update.sh --force-local-build --without-android \ | 28 tools/clang/scripts/update.py --force-local-build --without-android \ |
29 --with-chrome-tools <tools> | 29 --with-chrome-tools <tools> |
30 ``` | 30 ``` |
31 | 31 |
32 `<tools>` is a semicolon delimited list of subdirectories in `tools/clang` to | 32 `<tools>` is a semicolon delimited list of subdirectories in `tools/clang` to |
33 build. The resulting binary will end up in | 33 build. The resulting binary will end up in |
34 `third_party/llvm-build/Release+Asserts/bin`. For example, to build the Chrome | 34 `third_party/llvm-build/Release+Asserts/bin`. For example, to build the Chrome |
35 plugin and the empty\_string tool, run the following: | 35 plugin and the empty\_string tool, run the following: |
36 | 36 |
37 ```shell | 37 ```shell |
38 tools/clang/scripts/update.sh --force-local-build --without-android \ | 38 tools/clang/scripts/update.py --force-local-build --without-android \ |
39 --with-chrome-tools "plugins;empty_string" | 39 --with-chrome-tools "plugins;empty_string" |
40 ``` | 40 ``` |
41 | 41 |
42 When writing AST matchers, the following can be helpful to see what clang thinks | 42 When writing AST matchers, the following can be helpful to see what clang thinks |
43 the AST is: | 43 the AST is: |
44 | 44 |
45 ```shell | 45 ```shell |
46 clang++ -cc1 -ast-dump foo.cc | 46 clang++ -cc1 -ast-dump foo.cc |
47 ``` | 47 ``` |
48 | 48 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 | 91 |
92 ```shell | 92 ```shell |
93 test_tool.py <tool name> | 93 test_tool.py <tool name> |
94 ``` | 94 ``` |
95 | 95 |
96 Note that name of the built tool and the subdirectory it lives in at | 96 Note that name of the built tool and the subdirectory it lives in at |
97 `tools/clang` must match. What the test harness does is find all files that | 97 `tools/clang` must match. What the test harness does is find all files that |
98 match the pattern `*-original.cc` in your tool's tests subdirectory. It then | 98 match the pattern `*-original.cc` in your tool's tests subdirectory. It then |
99 runs the tool across those files and compares it to the expected result, stored | 99 runs the tool across those files and compares it to the expected result, stored |
100 in `*-expected.cc` | 100 in `*-expected.cc` |
OLD | NEW |