89 lines
3.6 KiB
ReStructuredText
89 lines
3.6 KiB
ReStructuredText
|
==============================================
|
||
|
JSON Compilation Database Format Specification
|
||
|
==============================================
|
||
|
|
||
|
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.
|