12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- ==============================================
- JSON Compilation Database Format Specification
- ==============================================
- NOTE: this document applies to the original Clang project, not the DirectX
- Compiler. It's made available for informational purposes only.
- This document describes a format for specifying how to replay single
- compilations independently of the build system.
- Background
- ==========
- Tools based on the C++ Abstract Syntax Tree need full information how to
- parse a translation unit. Usually this information is implicitly
- available in the build system, but running tools as part of the build
- system is not necessarily the best solution:
- - Build systems are inherently change driven, so running multiple tools
- over the same code base without changing the code does not fit into
- the architecture of many build systems.
- - Figuring out whether things have changed is often an IO bound
- process; this makes it hard to build low latency end user tools based
- on the build system.
- - Build systems are inherently sequential in the build graph, for
- example due to generated source code. While tools that run
- independently of the build still need the generated source code to
- exist, running tools multiple times over unchanging source does not
- require serialization of the runs according to the build dependency
- graph.
- Supported Systems
- =================
- Currently `CMake <http://cmake.org>`_ (since 2.8.5) supports generation
- of compilation databases for Unix Makefile builds (Ninja builds in the
- works) with the option ``CMAKE_EXPORT_COMPILE_COMMANDS``.
- For projects on Linux, there is an alternative to intercept compiler
- calls with a tool called `Bear <https://github.com/rizsotto/Bear>`_.
- Clang's tooling interface supports reading compilation databases; see
- the :doc:`LibTooling documentation <LibTooling>`. libclang and its
- python bindings also support this (since clang 3.2); see
- `CXCompilationDatabase.h </doxygen/group__COMPILATIONDB.html>`_.
- Format
- ======
- A compilation database is a JSON file, which consist of an array of
- "command objects", where each command object specifies one way a
- translation unit is compiled in the project.
- Each command object contains the translation unit's main file, the
- working directory of the compile run and the actual compile command.
- Example:
- ::
- [
- { "directory": "/home/user/llvm/build",
- "command": "/usr/bin/clang++ -Irelative -DSOMEDEF=\"With spaces, quotes and \\-es.\" -c -o file.o file.cc",
- "file": "file.cc" },
- ...
- ]
- The contracts for each field in the command object are:
- - **directory:** The working directory of the compilation. All paths
- specified in the **command** or **file** fields must be either
- absolute or relative to this directory.
- - **file:** The main translation unit source processed by this
- compilation step. This is used by tools as the key into the
- compilation database. There can be multiple command objects for the
- same file, for example if the same source file is compiled with
- different configurations.
- - **command:** The compile command executed. After JSON unescaping,
- this must be a valid command to rerun the exact compilation step for
- the translation unit in the environment the build system uses.
- Parameters use shell quoting and shell escaping of quotes, with '``"``'
- and '``\``' being the only special characters. Shell expansion is not
- supported.
- Build System Integration
- ========================
- The convention is to name the file compile\_commands.json and put it at
- the top of the build directory. Clang tools are pointed to the top of
- the build directory to detect the file and use the compilation database
- to parse C++ code in the source tree.
|