Go to file
Scott Ramsby d1babfe532 Add custom markdownlint config and update docs to be markdownlint clean 2018-05-29 22:10:09 +02:00
docs Add custom markdownlint config and update docs to be markdownlint clean 2018-05-29 22:10:09 +02:00
more_tests Terminology: as-typed -> as-written 2016-09-04 17:06:41 +02:00
tests Ignore the class qualifier in out of line methods 2018-04-23 21:58:59 +02:00
.clang-format Unix line endings for .clang-format 2016-03-01 21:46:53 +01:00
.gitignore Add Visual Studio Code exclusion to .gitignore 2018-05-26 02:07:14 +02:00
.markdownlint.json Add custom markdownlint config and update docs to be markdownlint clean 2018-05-29 22:10:09 +02:00
.travis.yml Update travis config to use new CMake 2018-05-28 21:02:46 +02:00
CMakeLists.txt Use LLVM and Clang CMake modules 2018-05-28 21:02:46 +02:00
CONTRIBUTING.md Add custom markdownlint config and update docs to be markdownlint clean 2018-05-29 22:10:09 +02:00
LICENSE.TXT Clean up third-party license listing 2015-11-11 19:57:10 +01:00
README.md Add custom markdownlint config and update docs to be markdownlint clean 2018-05-29 22:10:09 +02:00
boost-1.64-all-private.imp Add boost import reference files for version 1.64 2018-05-26 21:57:20 +02:00
boost-1.64-all.imp Add boost import reference files for version 1.64 2018-05-26 21:57:20 +02:00
boost-all-private.imp Collect Boost and Qt mappings created by Scott Howard aka @maqifrnswa. 2015-09-09 22:42:52 -07:00
boost-all.imp Collect Boost and Qt mappings created by Scott Howard aka @maqifrnswa. 2015-09-09 22:42:52 -07:00
clang-6.intrinsics.imp imp files for Intel intrinsics 2018-05-29 21:13:55 +02:00
dist.sh Add shebang line and specify error handling options in dist.sh script. 2013-10-20 17:43:09 +00:00
fix_includes.py Detect and preserve original file encoding 2018-04-08 19:03:35 +02:00
fix_includes_test.py Detect and preserve original file encoding 2018-04-08 19:03:35 +02:00
gcc-8.intrinsics.imp imp files for Intel intrinsics 2018-05-29 21:13:55 +02:00
gcc.libc.imp Add more libc mapping(s). 2016-02-01 21:50:10 -08:00
gcc.stl.headers.imp Add alternative mapping for std::function 2018-05-25 19:18:18 +02:00
gcc.symbols.imp Add additional mapping for size_t 2018-05-26 01:56:10 +02:00
iwyu.cc Ignore the class qualifier in out of line methods 2018-04-23 21:58:59 +02:00
iwyu.gcc.imp Specify public STL headers explicitly (issue #132). 2014-09-28 17:54:48 +00:00
iwyu_ast_util.cc Count free function definitions as uses 2018-03-09 20:37:52 +01:00
iwyu_ast_util.h Replace in_cxx_method_body with an extensible use-flag 2018-03-09 20:37:52 +01:00
iwyu_cache.cc Handle precomputed template arguments in libc++ like in libstdc++ (issue #132). 2014-09-07 01:04:27 +00:00
iwyu_cache.h Fix Clang-tidy warnings 2016-11-16 21:04:24 +01:00
iwyu_driver.cc Update to reflect changes in Clang 2017-01-06 10:56:09 +01:00
iwyu_driver.h Make header guards consistent 2016-05-25 22:17:31 +02:00
iwyu_getopt.cc Added getopt_long for Windows (resolves issue #52). 2012-08-11 18:15:00 +00:00
iwyu_getopt.h Make header guards consistent 2016-05-25 22:17:31 +02:00
iwyu_globals.cc Add --no_fwd_decls option 2017-12-19 20:55:54 +01:00
iwyu_globals.h Add --no_fwd_decls option 2017-12-19 20:55:54 +01:00
iwyu_include_picker.cc Add additional mapping for size_t 2018-05-26 01:56:10 +02:00
iwyu_include_picker.h Fix Clang-tidy warnings 2016-11-16 21:04:24 +01:00
iwyu_lexer_utils.cc Allow IWYU pragma: keep on forward declarations as an escape hatch for cases where IWYU incorrectly concludes that a forward declaration is not necessary and recommends its removal. 2017-06-20 21:55:20 -07:00
iwyu_lexer_utils.h Allow IWYU pragma: keep on forward declarations as an escape hatch for cases where IWYU incorrectly concludes that a forward declaration is not necessary and recommends its removal. 2017-06-20 21:55:20 -07:00
iwyu_location_util.cc Fix Clang-tidy warnings 2016-11-16 21:04:24 +01:00
iwyu_location_util.h Update to reflect changes in Clang. 2016-10-10 22:52:04 -07:00
iwyu_output.cc Refactor header sorting logic to be more clear 2018-05-26 02:09:43 +02:00
iwyu_output.h Count free function definitions as uses 2018-03-09 20:37:52 +01:00
iwyu_path_util.cc Add .H as a known header extension 2017-07-15 19:46:51 +02:00
iwyu_path_util.h Use absolute paths to build include names 2016-06-08 08:23:26 +02:00
iwyu_preprocessor.cc Update for Clang r332021 2018-05-12 10:27:45 +02:00
iwyu_preprocessor.h Update for Clang r332021 2018-05-12 10:27:45 +02:00
iwyu_stl_util.h Fix #310: Replace Each with C++11 range for loops 2016-07-11 07:19:51 +02:00
iwyu_string_util.h Fix some Clang-tidy warnings 2016-06-07 21:49:33 +02:00
iwyu_test_util.py Clean up output from test runner 2016-08-15 21:08:28 +02:00
iwyu_tool.py pick include-what-you-use from same path as iwyu_tool.py 2018-05-29 21:12:27 +02:00
iwyu_use_flags.h Count free function definitions as uses 2018-03-09 20:37:52 +01:00
iwyu_verrs.cc Fixed file heading comments not matching the filename (issue #83). Patch by Ryan Pavlik. 2012-11-25 22:09:37 +00:00
iwyu_verrs.h Handle internal headers guarded by macro and x-macros (fix issue #109). 2016-08-14 17:28:46 -07:00
iwyu_version.h Bump master to version 0.11 2018-04-29 14:25:17 +02:00
libcxx.imp <bits/move.h> is a part of <utility>. 2018-03-09 20:04:20 +01:00
port.h Fix warning on MinGW 2018-02-15 19:06:38 +01:00
qt4.imp Collect Boost and Qt mappings created by Scott Howard aka @maqifrnswa. 2015-09-09 22:42:52 -07:00
qt5_4.imp Mappings for qt5.4 2016-01-02 12:19:12 +01:00
run_iwyu_tests.py Recognize C++11 range-for statements 2018-03-09 22:01:11 +01:00
scrub-logs.py Let scrub-logs accept input from stdin 2017-05-06 16:41:56 +02:00
stl.c.headers.imp Specify public STL headers explicitly (issue #132). 2014-09-28 17:54:48 +00:00
third_party.imp Read private to public mappings from external file. Patch by Kim Gräsman. 2012-10-14 22:39:30 +00:00

README.md

Include What You Use

Build Status

For more in-depth documentation, see docs.

Instructions for Users

"Include what you use" means this: for every symbol (type, function, variable, or macro) that you use in foo.cc (or foo.cpp), either foo.cc or foo.h should include a .h file that exports the declaration of that symbol. (Similarly, for foo_test.cc, either foo_test.cc or foo.h should do the including.) Obviously symbols defined in foo.cc itself are excluded from this requirement.

This puts us in a state where every file includes the headers it needs to declare the symbols that it uses. When every file includes what it uses, then it is possible to edit any file and remove unused headers, without fear of accidentally breaking the upwards dependencies of that file. It also becomes easy to automatically track and update dependencies in the source code.

CAVEAT

This is alpha quality software -- at best (as of February 2011). It was written to work specifically in the Google source tree, and may make assumptions, or have gaps, that are immediately and embarrassingly evident in other types of code. For instance, we only run this on C++ code, not C or Objective C. Even for Google code, the tool still makes a lot of mistakes.

While we work to get IWYU quality up, we will be stinting new features, and will prioritize reported bugs along with the many existing, known bugs. The best chance of getting a problem fixed is to submit a patch that fixes it (along with a unittest case that verifies the fix)!

How to Build

Include-what-you-use makes heavy use of Clang internals, and will occasionally break when Clang is updated. Usually such discrepancies are detected by build bot and fixed promptly. The master branch follows Clang trunk.

We also have convenience tags and branches for released versions of Clang (called clang_<version>, e.g. clang_5.0). To build against a Clang release, check out the corresponding branch in IWYU before configuring the build. More details in the instructions below.

We assume you already have compiled LLVM and Clang libraries on your system, either via packages for your platform or built from source.

NOTE: If you use the Debian/Ubuntu packaging available from https://apt.llvm.org, you'll need the following packages installed:

  • llvm-<version>-dev
  • libclang-<version>-dev
  • clang-<version>

Packaging for other platforms will likely be subtly different.

To set up an environment for building:

  • Create a directory for IWYU development, e.g. iwyu

  • Clone the IWYU Git repo:

    iwyu$ git clone https://github.com/include-what-you-use/include-what-you-use.git
    
  • Presumably, you'll be building IWYU with a released version of LLVM and Clang, so check out the corresponding branch. For example, if you have Clang 6.0 installed, use the clang_6.0 branch. IWYU master tracks LLVM & Clang trunk:

    iwyu$ cd include-what-you-use
    iwyu/include-what-you-use$ git checkout clang_6.0
    
  • Create a build root and use CMake to generate a build system linked with LLVM/Clang prebuilts:

    # This example uses the Makefile generator, but anything should work.
    iwyu/include-what-you-use$ cd ..
    iwyu$ mkdir build && cd build
    
    # For IWYU 0.10/Clang 6 and earlier
    iwyu/build$ cmake -G "Unix Makefiles" -DIWYU_LLVM_ROOT_PATH=/usr/lib/llvm-6.0 ../include-what-you-use
    
    # For IWYU 0.11/Clang 7 and later
    iwyu/build$ cmake -G "Unix Makefiles" -DCMAKE_PREFIX_PATH=/usr/lib/llvm-7 ../include-what-you-use
    

    or, if you have a local LLVM and Clang build tree, you can specify that as CMAKE_PREFIX_PATH for IWYU 0.11 and later:

    iwyu/build$ cmake -G "Unix Makefiles" -DCMAKE_PREFIX_PATH=/llvm-trunk/build ../include-what-you-use
    
  • Once CMake has generated a build system, you can invoke it directly from build, e.g.

    iwyu/build$ make
    

Instructions for building Clang are available at https://clang.llvm.org/get_started.html.

How to Install

If you're building IWYU out-of-tree or installing pre-built binaries, you need to make sure it can find Clang built-in headers (stdarg.h and friends.)

Clang's default policy is to look in path/to/clang-executable/../lib/clang/<clang ver>/include. So if Clang 3.5.0 is installed in /usr/bin, it will search for built-ins in /usr/lib/clang/3.5.0/include.

Clang tools have the same policy by default, so in order for IWYU to analyze any non-trivial code, it needs to find Clang's built-ins in path/to/iwyu/../lib/clang/3.5.0/include where 3.5.0 is a stand-in for the version of Clang your IWYU was built against.

So for IWYU to function correctly, you need to copy in the Clang headers at a good location before running.

This weirdness is tracked in issue 100, hopefully we can make this more transparent over time.

How to Run

The original design was built for Make, but a number of alternative run modes have come up over the years.

Plugging into Make

The easiest way to run IWYU over your codebase is to run

  make -k CXX=/path/to/llvm/Debug+Asserts/bin/include-what-you-use

or

  make -k CXX=/path/to/llvm/Release/bin/include-what-you-use

(include-what-you-use always exits with an error code, so the build system knows it didn't build a .o file. Hence the need for -k.)

Include-what-you-use only analyzes .cc (or .cpp) files built by make, along with their corresponding .h files. If your project has a .h file with no corresponding .cc file, IWYU will ignore it unless you use the --check_also switch to add it for analysis together with a .cc file.

Using with CMake

CMake has grown native support for IWYU as of version 3.3. See their documentation for CMake-side details.

The CMAKE_CXX_INCLUDE_WHAT_YOU_USE option enables a mode where CMake first compiles a source file, and then runs IWYU on it.

Use it like this:

  mkdir build && cd build
  CC="clang" CXX="clang++" cmake -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE="path/to/iwyu;-Xiwyu;any;-Xiwyu;iwyu;-Xiwyu;args" ...

or, on Windows systems:

  mkdir build && cd build
  cmake -DCMAKE_CXX_COMPILER="%VCINSTALLDIR%/bin/cl.exe" -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE="path/to/iwyu;-Xiwyu;any;-Xiwyu;iwyu;-Xiwyu;args" -G Ninja ...

The option appears to be separately supported for both C and C++, so use CMAKE_C_INCLUDE_WHAT_YOU_USE for C code.

Note that with Microsoft's Visual C++ compiler, IWYU needs the --driver-mode=cl argument to understand the MSVC options from CMake.

Using with a compilation database

The iwyu_tool.py script predates the native CMake support, and works off the compilation database format. For example, CMake generates such a database named compile_commands.json with the CMAKE_EXPORT_COMPILE_COMMANDS option enabled.

The script's command-line syntax is designed to mimic Clang's LibTooling, but they are otherwise unrelated. It can be used like this:

  mkdir build && cd build
  CC="clang" CXX="clang++" cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ...
  iwyu_tool.py -p .

or, on Windows systems:

  mkdir build && cd build
  cmake -DCMAKE_CXX_COMPILER="%VCINSTALLDIR%/bin/cl.exe" -DCMAKE_C_COMPILER="%VCINSTALLDIR%/VC/bin/cl.exe" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G Ninja ...
  python iwyu_tool.py -p .

Unless a source filename is provided, all files in the project will be analyzed.

See iwyu_tool.py --help for more options.

Applying fixes

We also include a tool that automatically fixes up your source files based on the IWYU recommendations. This is also alpha-quality software! Here's how to use it (requires python):

  make -k CXX=/path/to/llvm/Debug+Asserts/bin/include-what-you-use 2> /tmp/iwyu.out
  python fix_includes.py < /tmp/iwyu.out

If you don't like the way fix_includes.py munges your #include lines, you can control its behavior via flags. fix_includes.py --help will give a full list, but these are some common ones:

  • -b: Put blank lines between system and Google includes
  • --nocomments: Don't add the 'why' comments next to includes

How to Correct IWYU Mistakes

  • If fix_includes.py has removed an #include you actually need, add it back in with the comment '// IWYU pragma: keep' at the end of the #include line. Note that the comment is case-sensitive.
  • If fix_includes.py has added an #include you don't need, just take it out. We hope to come up with a more permanent way of fixing later.
  • If fix_includes.py has wrongly added or removed a forward-declare, just fix it up manually.
  • If fix_includes.py has suggested a private header file (such as <bits/stl_vector.h>) instead of the proper public header file (<vector>), you can fix this by inserting a specially crafted comment near top of the private file (assuming you can write to it): '// IWYU pragma: private, include "the/public/file.h"'.

Current IWYU pragmas are described in IWYUPragmas.