maddouri / vscode-cmake-tools-helper

VSCode extension that enables cpptools to automatically know the information parsed by CMake Tools (e.g. include directories and defines)
https://marketplace.visualstudio.com/items?itemName=maddouri.cmake-tools-helper
BSD 3-Clause "New" or "Revised" License
16 stars 6 forks source link
c cmake cpp vscode vscode-extension

CMake Tools Helper

Version Installs Ratings

Dependencies Status DevDependencies Status

This extension helps to bridge a gap between 2 great extensions:

CMake Tools Helper enables cpptools to automatically know the information parsed by CMake Tools (such as include directories and defines) and use it to provide auto-completion, go to definition, etc.

In addition to that, this extension tries to reduce "friction" when using CMake by implementing convenient features. (e.g. managing multiple CMake versions)

Features

Prerequisites

Why

TL;DR: I just want to open a CMake-based project and immediately start coding without configuring anything in VSCode. (Ok, maybe execute a "CMake configure", but that's all!)

In order to provide some its features, cpptools relies on a JSON file (c_cpp_properties.json) that contains project-related information such as include paths and defines.

At the same time, CMake Tools parses the project's CMake files and extracts all the information that is needed to build it (e.g. compiler flags, includes, defines, etc.) and stores it in another JSON file. (.cmaketools.json)

Currently, (I mean... before this extension was released :wink: ) there is no way for cpptools to automatically benefit from what CMake Tools knows -- i.e. The users have to manually copy the include paths and defines from their CMake files (or CMake Tools' .cmaketools.json) to c_cpp_properties.json.

Having found nothing to do the above automatically, I decided to create this extension!

Please note that discussions were started at https://github.com/vector-of-bool/vscode-cmake-tools/issues/22 and https://github.com/Microsoft/vscode-cpptools/issues/156 to try to address the issue, but AFAIK there is nothing concrete yet.

Another issue when wanting to use CMake, lazy users (such as myself ;) ) usually find themselves stuck with outdated versions of CMake. This extension tries to alleviate the "pain" of getting the latest version from cmake.com/download by proposing to download, extract and enable any version of CMake directly from VS Code.

How Does It Work

TL;DR: Ugly hacks, sweat and tears :)

Getting the Information from CMake Tools

A combination of:

Mirroring the Information to cpptools

Each time CMake Tools Helper is notified, the following happens:

  1. CMake Tools Helper
    1. Gets the current configuration and target name from CMake Tools
    2. Overrides the content of c_cpp_properties.json using the information from step 1
  2. VSCode notifies cpptools that c_cpp_properties.json has changed (as of cpptools v0.11.2 has a file watcher on it)
  3. cpptools:
    1. Parses c_cpp_properties.json
    2. Finds a single configuration (the one that mirrors CMake Tools' current configuration)
    3. Uses this configuration as the active one
    4. Generates all bells and whistles for your C or C++ project

Managing CMake Versions

Limitations / Known Issues

  1. In order to force cpptools to use CMake Tools' current configuration, at any given point in time, only that configuration is present in c_cpp_properties.json. This is a workaround to the fact that cpptools doesn't export any API that other extensions could use to interact with it. This particular solution was inspired by the implementation of handleConfigurationChange (ms-vscode.cpptools-0.11.2/out/src/LanguageServer/C_Cpp_ConfigurationProperties.js)
  2. CMake's extra targets (e.g. all, clean, ALL_BUILD, ZERO_CHECK, etc...) are not handled and selecting them results in a null configuration in c_cpp_properties.json (if you have ideas on what to do when those targets are selected, please feel free to open an issue at github.com/maddouri/vscode-cmake-tools-helper/issues, I'll see what I can do ;)
  3. I use and test this extension exclusively in an up-to-date version of VSCode Insiders
  4. Currently, the extension allows downloading precompiled versions of CMake. I could perhaps add the option to download the sources and compile them if a precompiled version is not found...

Contributions

Any contribution (feature requests, bug fixes, questions, ideas on how to make things better, etc.) is WELCOME !

Just head to github.com/maddouri/vscode-cmake-tools-helper ;)