Kotlin bindings to JSON Compilation Database Format.
This library is inspired by tools such as nickdiego/compiledb and rizsotto/Bear.
See the project website for documentation and APIs.
compile_commands.json
.-I
, -include
, -isystem
and so on) recognized;-D
) and undefined (-U
) preprocessor macros recognized;c++17
, gnu++14
) recognized;-nostdinc
, -nostdinc++
and similar switches recognized.The latest release is available from both GitHub Packages and Maven Central. For GitHub Packages, the repository can be added as follows.
For build.gradle.kts
:
repositories { maven { name = "saveourtool/kompiledb" url = uri("https://maven.pkg.github.com/saveourtool/kompiledb") content { includeGroup("com.saveourtool.kompiledb") } credentials { username = project.findProperty("gpr.user") as String? ?: System.getenv("GITHUB_ACTOR") password = project.findProperty("gpr.key") as String? ?: System.getenv("GITHUB_TOKEN") } } }
For settings.gradle.kts
:
dependencyResolutionManagement { repositories { maven { name = "saveourtool/kompiledb" url = uri("https://maven.pkg.github.com/saveourtool/kompiledb") content { includeGroup("com.saveourtool.kompiledb") } credentials { username = providers.gradleProperty("gpr.user").orNull ?: System.getenv("GITHUB_ACTOR") password = providers.gradleProperty("gpr.key").orNull ?: System.getenv("GITHUB_TOKEN") } } } }
Then add the dependency as usual:
dependencies { implementation("com.saveourtool.kompiledb:kompiledb-gson:1.0.0") }
If your build system produces a JSON different from the compilation database format, you can preprocess it with the jq
utility.
Example input:
{ "compiler_info": [ { "compiler_name": "/usr/bin/gcc", "environment": [ "PWD=/proc/self/cwd", "LANG=C.UTF-8", "JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8", "SHELL=/bin/bash", "SHLVL=9", "HISTSIZE=10000", "LD_PRELOAD=", "GCC_COLORS=error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01" ], "uuid": "8a3117fde10aa7cdc517ffa313174af5", "version": "4.2.1", "machine": "x86_64-pc-linux-gnu", "bits": "-m64", "system_include": [ "/usr/include" ], "pre_define_macros": [ "-DDEBUG=1", "-D__GNUC_MINOR__=2", "-D__GNUC_PATCHLEVEL__=1", "-D__GNUC_STDC_INLINE__=1", "-D__GNUC__=4" ] }, { "compiler_name": "/usr/bin/clang", "environment": [ "PWD=/proc/self/cwd", "LANG=C.UTF-8", "JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8", "SHELL=/bin/bash", "SHLVL=9", "HISTSIZE=10000", "LD_PRELOAD=", "GCC_COLORS=error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01" ], "uuid": "cfc0dbb9c58d9ee084ee0bec7cf69c25", "version": "4.2.1", "machine": "x86_64-redhat-linux-gnu", "bits": "-m32", "system_include": [ "/usr/include" ], "pre_define_macros": [ "-DDEBUG=1", "-D__GNUC_MINOR__=2", "-D__GNUC_PATCHLEVEL__=1", "-D__GNUC_STDC_INLINE__=1", "-D__GNUC__=4" ] } ], "compilation_unit": [ { "arguments": [ "gcc", "-c", "file1.c" ], "compiler": "/usr/bin/gcc", "directory": "/path/to/project", "file": [ "/path/to/project/file1.c" ], "id": "23ba91c4f1ae11edb2e4fa163e78cf7a", "language": "C_LANG", "object": [ "/path/to/project/file1.o" ], "timestamp": 1683996285773040, "original_command_id": "21f3529cf1ae11edb2e4fa163e78cf7a", "uuid": "cfc0dbb9c58d9ee084ee0bec7cf69c25", "head_include": [], "preprocess_file": [ "/path/to/project/file1.i" ] }, { "arguments": [ "clang", "-c", "file2.c" ], "compiler": "/usr/bin/clang", "directory": "/path/to/project", "file": [ "/path/to/project/file2.c" ], "id": "23bc7a02f1ae11edb2e4fa163e78cf7a", "language": "C_LANG", "object": [], "timestamp": 1683996379854618, "original_command_id": "21f3529ef1ae11edb2e4fa163e78cf7a", "uuid": "d15a90fcd7c5a199fbccab08440fd12e", "head_include": [], "preprocess_file": [ "/path/to/project/file2.i" ] } ] }
Running the file through the following filter:
jq '.compilation_unit | map(.file = .file[0] | .output = .object[0] | del(.compiler, .id, .language, .timestamp, .original_command_id, .uuid, .head_include, .preprocess_file, .preprocess_status, .object)) | del(..|nulls)' <example.json >compile_commands.json
— will result in the compile_commands.json
of the following content:
[ { "arguments": [ "gcc", "-c", "file1.c" ], "directory": "/path/to/project", "file": "/path/to/project/file1.c", "output": "/path/to/project/file1.o" }, { "arguments": [ "clang", "-c", "file2.c" ], "directory": "/path/to/project", "file": "/path/to/project/file2.c" } ]
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4