forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			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.
 |