Bear is a tool that generates a compilation database for clang tooling.
The JSON compilation database is used in the clang project to provide information on how a single compilation unit is processed. With this, it is easy to re-run the compilation with alternate programs.
One way to get a compilation database is to use cmake
as the build
tool. Passing -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
to cmake generates
the compile_commands.json
file into the current directory.
For non-cmake projects, Bear generates the JSON file during the build process.
The concept behind Bear is: to execute the original build command and intercept the command executions issued by the build tool. From the log of command executions it tries to identify the compiler calls and creates the final compilation database.
For intercepting the compiler executions, Bear uses the LD_PRELOAD
or DYLD_INSERT_LIBRARIES
mechanisms provided by the dynamic linker.
When the dynamic linker is not working (because the executable is not a
dynamically linked executable or security protection disables the linker)
then Bear uses compiler wrappers to record the compiler calls. The wrapper
sends execution report and calls the real compiler. (Not only compilers,
but linkers, assemblers and other tools are also wrapped.)
The intercepted commands are filtered and only the compiler executions goes into the compilation database. Those commands which ends up in the final output are transformed a little bit (some compiler flags are removed).
Bear is packaged for many distributions. Check out your package manager. Or build it from source.
After installation the usage is like this:
bear -- <your-build-command>
The output file called compile_commands.json
is saved in the current directory.
For more options you can check the man page or pass --help
parameter. Note
that if you want to pass parameter to Bear, pass those before the --
sign,
everything after that will be the build command.
Side note: Since Bear is executing the build command, only those commands will
be recorded which were actually executed during the current build. Which means
if you have already built your project and you re-run the build command with
Bear you probably end up to have an empty output. (Practically it means you
need to run make clean
before you run bear make
.)
For more read the wiki of the project, which talks about limitations, known issues and platform specific usage.
Before you open a new problem report, please look at the wiki if your problem is a known one with documented workaround. It's also helpful to look at older (maybe closed) issues before you open a new one.
If you decided to report a problem, try to give as much context as it would help me to reproduce the error you see. If you just have a question about the usage, please don't be shy, ask your question in an issue or in chat.
If you found a bug, but also found a fix for it, please share it with me and open a pull request.
Please follow the contribution guide when you do these.
Thanks to JetBrains for donating product licenses to help develop Bear