compiledb

by nickdiego

nickdiego / compiledb

Tool for generating Clang's JSON Compilation Database files for make-based build systems.

527 Stars 50 Forks Last release: Not found GNU General Public License v3.0 185 Commits 10 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

Compilation Database Generator

CircleCI branch PyPI PyPI - Python Version GitHub

Tool for generating Clang's JSON Compilation Database file for GNU

make
-based build systems.

It's aimed mainly at non-cmake (cmake already generates compilation database) large codebases. Inspired by projects like YCM-Generator and Bear, but faster (mainly with large projects), since in most cases it doesn't need a clean build (as the mentioned tools do) to generate the compilation database file, to achieve this it uses the make options such as

-n
/
--dry-run
and
-k
/
--keep-going
to extract the compile commands. Also, it's more cross-compiling friendly than YCM-generator's fake-toolchanin approach.

Installation

# pip install compiledb
  • Supports Python 2.x and 3.x (for now, tested only with 2.7 and 3.6 versions)
  • For bash completion support, add the content of
    sh-completion/compiledb.bash
    file to your
    .bashrc
    file, for example.
  • ZSH completion coming soon :)

Usage

compiledb
provides a
make
python wrapper script which, besides to execute the make build command, updates the JSON compilation database file corresponding to that build, resulting in a command-line interface similar to Bear.

To generate

compile_commands.json
file using compiledb's "make wrapper" script, executing Makefile target
all
:
bash
$ compiledb make

compiledb
forwards all the options/arguments passed after
make
subcommand to GNU Make, so one can, for example, generate
compile_commands.json
using
core/main.mk
as main makefile (
-f
flag), starting the build from
build
directory (
-C
flag):
bash
$ compiledb make -f core/main.mk -C build

By default,

compiledb make
generates the compilation database and runs the actual build command requested (acting as a make wrapper), the build step can be skipped using the
-n
or
--no-build
options.
bash
$ compiledb -n make

compiledb
base command has been designed so that it can be used to parse compile commands from arbitrary text files (or stdin), assuming it has a build log (ideally generated using
make -Bnwk
command), and generates the corresponding JSON Compilation database.

For example, to generate the compilation database from

build-log.txt
file, use the following command.
bash
$ compiledb --parse build-log.txt

or its equivalent:

bash
$ compiledb < build-log.txt

Or even, to pipe make's output and print the compilation database to the standard output:

bash
$ make -Bnwk | compiledb -o-

By default

compiledb
generates a JSON compilation database in the "arguments" list format. The "command" string format is also supported through the use of the
--command-style
flag:
bash
$ compiledb --command-style make

Testing / Contributing

I've implemented this tool because I needed to index some AOSP's modules for navigating and studying purposes (after having no satisfatory results with current tools available by the time such as YCM-Generator and Bear). So I've reworked YCM-Generator, which resulted in the initial version of compiledb/parser.py and used successfully to generate

compile_commands.json
for some AOSP modules in ~1min running in a Docker container and then could use it with some great tools, such as:

Notice: - Windows: tested on Windows 10 with cmd, wsl(Ubuntu), mingw32 - Linux: tested only on Arch Linux and Ubuntu 18 so far - Mac: tested on macOS 10.13 and 10.14

Patches are always welcome :)

License

GNU GPLv3

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.