Setting up include-what-you-need (IWYU)

Use following instructions to install IWYU (https://include-what-you-use.org/) on Ubuntu 18.04.3 LTS:

sudo apt-get update
sudo apt-get install -y build-essential cmake git zlib1g-dev libncurses5-dev llvm-6.0-dev libclang-6.0-dev libclang-6.0-dev clang-6.0
git clone https://github.com/include-what-you-use/include-what-you-use.git iwyu.git
cd iwyu.git
git checkout clang_6.0
mkdir -p build
cd build
cmake -DIWYU_LLVM_ROOT_PATH=/usr/lib/llvm-6.0 ..
make 
make install

Once installation is complete, you will find `include-what-you-need`

# include-what-you-use --version
include-what-you-use 0.10 (git:a1878c4) based on clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)

To execute include-what-you-need:

Build your cpp project with cmake and pass on an extra parameter `-DCMAKE_EXPORT_COMPILE_COMMANDS=TRUE` to cmake. It will produceĀ  `compile_commands.json` file in your build folder for the project.

  • Execute `iwyu_tool.py -p </path/to/folder/having/compile_command.json>`. It may take time depending upon the code size.
  • `fix_includes` can be used to apply recommended changes.

To use it in VSCode add following to the `tasks.json`

{
    "label": "CXX Analysis -- iwyu",
    "detail": "Run IWYU tool for CPP project",
    "command": "iwyu_tool.py",
    "args": [
        "-p",
        "${workspaceRoot}/build"
    ],
    "presentation": {
        "echo": true,
        "reveal": "always",
        "focus": true,
        "panel": "shared",
        "showReuseMessage": true,
        "clear": false
    },
    "problemMatcher": "$gcc"
}

Ref: https://gist.github.com/aakbar5/268a2072138345893b7f82590dcc3d26

symlinks in virtualbox

If you are using Windows in Virtualbox ontop of Linux based (i.e: Ubuntu) machine, you might have seen this problem that accessing symlinks in windows does not work. Instead of showing contents after resolving Linux symlinks, you will end up with “Protocol error”.

This error can be fixed using vBoxManage by setting a boolean property (SharedFoldersEnableSymlinksCreate) against each folder shared with VirtualBox based machine.

VBoxManage setextradata <VirtualMachineName> VBoxInternal2/SharedFoldersEnableSymlinksCreate/<SharedFolderName> 1

After executing above command, verify your change with following:

VBoxManage getextradata <VirtualMachineName> enumerate