Skip to content
/ Bear Public
forked from rizsotto/Bear

Bear is a tool that generates a compilation database for clang tooling.

License

Notifications You must be signed in to change notification settings

smhc/Bear

 
 

Repository files navigation

Packaging status GitHub release GitHub Release Date Continuous Integration Contributors Gitter

ʕ·ᴥ·ʔ Build EAR

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.

How it works

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).

How to install

Bear is packaged for many distributions. Check out your package manager. Or build it from source.

How to use

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.

Problem reports

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

About

Bear is a tool that generates a compilation database for clang tooling.

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C++ 80.2%
  • Shell 7.0%
  • CMake 4.8%
  • C 4.2%
  • Roff 2.4%
  • Python 1.2%
  • Other 0.2%