Package: compile-commands
Compilation Database Manipulation UtilityThis utility facilitates the use and modifications of compilation databases (CDB).Modifying compilation databases can be useful especially when you don't have control over how a project is built.Installpipinstallcompile-commandsRequirementsRequires at least python 3.8UsageThis tool has many possible uses, some of them are listed below.In a project composed of subproject with their own build directories, you can use--mergeand indicate the root--dirand it will merge them.
This is particularly useful for LSP servers that don't handle these projects well.compile-commands--dir/path/to/project--mergeThis may be slow if the project is big one alternative would to specify "by hand" the compilation databases with--files.compile-commands--files$(fdcompile_commands.json)compile-commands--filesmyproject1/build/compile_commands.jsonmyproject2/build/compile_commands.json--mergeThe output file will named by default "compile_commands.json" in the current working directory. You can use-o,--outputto override this behavior.You can also indicate to a LSP server that you prefer using libc++ instead of libstdc++ even if your buildsystem doesn't use it.compile-commands--filecompile-commands.json\--add_flags='-stdlib=libc++'--add_flagstakes in a string so you can add multiple flags easilycompile-commands--filecompile-commands.json\--add_flags='-stdlib=libc++ -O0'You can combine--add_flagswith--runto monitor warnings:compile-commands--filecompile-commands.json\--add_flags='-Wall -Wextra -pedantic -fsyntax'\--run--threads=12You can decide to treat only a subset of your project by using--filter_filesor--remove_files.--filter_filestakes in a regular expression whereas--remove_filestakes in a comma-separated list of absolute paths.You can as example filter out .c files from the database:compile-commands--filecompile-commands.json\--filter_files='.*\.c$'\--remove_filespath/to/file1path/to/file2You can decide to treat only a subset of your project by using--include_fileswhich takes in a comma-separated list of absolute paths. You can also prefix each paths passed to--include_filesand--remove_filesby using--path-prefix.compile-commands--filecompile-commands.json\--include_files=path/to/file1path/to/file2You can use the-oflag to specify the name of the output file in case you don't want to overwritecompile-commands--filecompile-commands.json\--filter_files='.c\$'\-omy-db-without-c-files.jsonYou can also filter out parts of the commands based on a regular expression using--filter.This is particularly useful when you need to modify the-ofrom the compiler's command.
A good example of that is usingClangBuildAnalyzer.mkdirftimecdftime
compile-commands--file=/path/to/project/compile-commands.json\--add_flags='-ftime-trace'\--filter='-o .*\\.o'\--run-j12# .json and .o files are created in-place!ClangBuildAnalyzer--all.capture_file
ClangBuildAnalyzer--analyzecapture_fileWe add the clang's-ftime-traceas required by ClangBuildAnalyzer and remove every occurences of -o path/to/object/file.o and run each commands to produces the json tracings.What if g++ was used during the creation of compilation database ? In this case we can use--clangand--gccto switch between the two compilers and even change the path of the compiler with--compiler_pathif let's say gcc is in/usr/binand the clang we want to use is in/usr/bin/local.compile-commands--file=/path/to/project/compile-commands.json\--clang--compiler_path='/usr/bin/local'\--add_flags='-ftime-trace'\--filter='-o .*\\.o'\--run-j12--filteralso accepts a replacement through the--replacementflag, it accepts reference to groups within the regular expression as perre.sub().--filteris also useful to remove flags that are not compatible with both gcc and clang.If you are a user of the Ninja buildsystem you might notice that the above example does not work. That is because generating a CDB through CMake using Ninja as the generator will result in having relative include paths within the CDB (relative to "directory" that is). This is inconvenient because the above effectively moves the build directory but does not move dependencies. To fix that you can use--absolute_include_directorieswhich will modify relative includes paths into absolute include paths.