Sean Silva | 13b5e11 | 2013-01-02 12:40:15 +0000 | [diff] [blame] | 1 | ================================================= |
| 2 | Choosing the Right Interface for Your Application |
| 3 | ================================================= |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 4 | |
| 5 | Clang provides infrastructure to write tools that need syntactic and semantic |
| 6 | information about a program. This document will give a short introduction of |
| 7 | the different ways to write clang tools, and their pros and cons. |
| 8 | |
| 9 | LibClang |
| 10 | -------- |
| 11 | |
| 12 | `LibClang <http://clang.llvm.org/doxygen/group__CINDEX.html>`_ is a stable high |
| 13 | level C interface to clang. When in doubt LibClang is probably the interface |
| 14 | you want to use. Consider the other interfaces only when you have a good |
| 15 | reason not to use LibClang. |
| 16 | |
| 17 | Canonical examples of when to use LibClang: |
| 18 | |
| 19 | * Xcode |
| 20 | * Clang Python Bindings |
| 21 | |
| 22 | Use LibClang when you...: |
| 23 | |
| 24 | * want to interface with clang from other languages than C++ |
| 25 | * need a stable interface that takes care to be backwards compatible |
| 26 | * want powerful high-level abstractions, like iterating through an AST with a |
| 27 | cursor, and don't want to learn all the nitty gritty details of Clang's AST. |
| 28 | |
| 29 | Do not use LibClang when you...: |
| 30 | |
| 31 | * want full control over the Clang AST |
| 32 | |
| 33 | Clang Plugins |
| 34 | ------------- |
| 35 | |
Sean Silva | 159cc9e | 2013-01-02 13:07:47 +0000 | [diff] [blame] | 36 | :doc:`Clang Plugins <ClangPlugins>` allow you to run additional actions on the |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 37 | AST as part of a compilation. Plugins are dynamic libraries that are loaded at |
| 38 | runtime by the compiler, and they're easy to integrate into your build |
| 39 | environment. |
| 40 | |
| 41 | Canonical examples of when to use Clang Plugins: |
| 42 | |
| 43 | * special lint-style warnings or errors for your project |
| 44 | * creating additional build artifacts from a single compile step |
| 45 | |
| 46 | Use Clang Plugins when you...: |
| 47 | |
| 48 | * need your tool to rerun if any of the dependencies change |
| 49 | * want your tool to make or break a build |
| 50 | * need full control over the Clang AST |
| 51 | |
| 52 | Do not use Clang Plugins when you...: |
| 53 | |
| 54 | * want to run tools outside of your build environment |
| 55 | * want full control on how Clang is set up, including mapping of in-memory |
| 56 | virtual files |
| 57 | * need to run over a specific subset of files in your project which is not |
| 58 | necessarily related to any changes which would trigger rebuilds |
| 59 | |
| 60 | LibTooling |
| 61 | ---------- |
| 62 | |
Sean Silva | 159cc9e | 2013-01-02 13:07:47 +0000 | [diff] [blame] | 63 | :doc:`LibTooling <LibTooling>` is a C++ interface aimed at writing standalone |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 64 | tools, as well as integrating into services that run clang tools. Canonical |
| 65 | examples of when to use LibTooling: |
| 66 | |
| 67 | * a simple syntax checker |
| 68 | * refactoring tools |
| 69 | |
| 70 | Use LibTooling when you...: |
| 71 | |
| 72 | * want to run tools over a single file, or a specific subset of files, |
| 73 | independently of the build system |
| 74 | * want full control over the Clang AST |
Sean Silva | 6fad575 | 2013-01-02 20:22:14 +0000 | [diff] [blame] | 75 | * want to share code with Clang Plugins |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 76 | |
| 77 | Do not use LibTooling when you...: |
| 78 | |
| 79 | * want to run as part of the build triggered by dependency changes |
| 80 | * want a stable interface so you don't need to change your code when the AST API |
| 81 | changes |
| 82 | * want high level abstractions like cursors and code completion out of the box |
| 83 | * do not want to write your tools in C++ |
| 84 | |
Sean Silva | 159cc9e | 2013-01-02 13:07:47 +0000 | [diff] [blame] | 85 | :doc:`Clang tools <ClangTools>` are a collection of specific developer tools |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 86 | built on top of the LibTooling infrastructure as part of the Clang project. |
| 87 | They are targeted at automating and improving core development activities of |
| 88 | C/C++ developers. |
| 89 | |
| 90 | Examples of tools we are building or planning as part of the Clang project: |
| 91 | |
| 92 | * Syntax checking (:program:`clang-check`) |
| 93 | * Automatic fixing of compile errors (:program:`clang-fixit`) |
Sean Silva | 9cc4c39 | 2013-01-02 12:49:25 +0000 | [diff] [blame] | 94 | * Automatic code formatting (:program:`clang-format`) |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 95 | * Migration tools for new features in new language standards |
| 96 | * Core refactoring tools |
| 97 | |