.. _configuring: CMake Configuring ################# CMake Tools wraps the CMake *configure* process separately from the *build* process. .. seealso:: - :ref:`getting-started` A Crash-Course on CMake's Configuration Process *********************************************** For those new to CMake, *Configure* refers to the process of detecting requirements and generating the build files that will produce the final compiled artifacts. To understand how CMake Tools interacts with CMake's configure process, a few things must be discussed: - The *CMake Cache* is a list of key-value pairs that persist between executions of the configure process. It contains a few different types of values: - Values that are often heavy or slow to compute, such as whether a ``-flag`` or ``#include`` file is supported by the compiler. - Values that rarely change, such as the path to a header/library. - Values that offer control to the developer, such as ``BUILD_TESTING`` to determine whether or not to build test libraries/executables. - *Cache initializer arguments* are the arguments passed to CMake that set values in the cache before any CMake scripts are executed. This lets one control build settings. On the CMake command line, these appear as ``-D`` arguments [#cache-init]_. - Unless overwritten or deleted, values in the CMake Cache will persist between executions of CMake. - The result of a *configure* depends on the CMake *Generator*. The *Generator* tells CMake what kind of tool will be used to compile and generate the results of the build, since CMake doesn't do the build itself. There are several families of generators available: - *Ninja* - Emits files for the `Ninja build tool `_. This is the generator CMake Tools will always try first, unless configured otherwise. (See :ref:`conf-cmake.preferredGenerators`). - *Makefile* - Emits a ``Makefile`` for the project that can be built via ``make``. - *Visual Studio* - Emits visual studio solutions and project files. There are many different Visual Studio generators, so it is recommended to let CMake Tools automatically determine the appropriate generator. Regardless of generator, CMake Tools will always support building from within Visual Studio Code. Choosing a particular generator is unimportant [#use-ninja]_. .. Check if this still applies in the future: .. [#cache-init] CMake also supports a ``-C`` argument, but this isn't used by or configurable from CMake Tools. .. [#use-ninja] But you should use `Ninja `_. .. _configuring.how: How CMake Tools Configures ************************** CMake Tools speaks to CMake over *CMake Server*, an execution mode of CMake wherein a persistent connection is held open to query information and get project information. When CMake Tools runs the configure step, it takes a few things into consideration to run the configuration: #. *The active kit* - :ref:`CMake Tools' Kits ` tell CMake Tools about the toolchains available on your system that can be used with CMake to build your projects. - For :ref:`kits.types.toolchain`, CMake Tools sets the CMake cache variable ``CMAKE_TOOLCHAIN_FILE`` to the path to the file specified by the kit. - For :ref:`kits.types.compiler`, CMake Tools sets the ``CMAKE__COMPILER`` cache variable to point to the path for each ```` defined in the kit. - For :ref:`kits.types.vs`, CMake Tools starts the CMake Server process with the environment variables necessary to use the selected Visual Studio installation. It also sets ``CC`` and ``CXX`` to ``cl.exe`` to force CMake to detect the Visual C++ compiler as the primary compiler, even if other compilers like GCC are present on the ``$PATH``. Each kit may also define additional cache variable settings requires for the kit to operate. A kit may also define a ``preferredGenerator``. .. seealso:: - :ref:`kits` - Describes how Kits work - :ref:`kits.types` - The different types of kits #. *The generator to use* - CMake Tools tries not to let CMake decide implicitly on which generator to use. Instead it tries to detect a "preferred" generator from a variety of sources, stopping when it finds a valid generator: #. The config setting :ref:`conf-cmake.generator`. #. The config setting :ref:`conf-cmake.preferredGenerators` - Each element in this list is checked for validity, and if one matches, it is chosen. The list has a reasonable default that will work for most environments. #. The kit's :ref:`preferredGenerator ` attribute. Automatically generated Visual Studio kits will set this attribute to the Visual Studio generator matching their version. #. If no generator is found, CMake Tools produces an error. #. *The configuration options* - CMake Tools has a variety of locations where configuration options can be defined. They are searched in order and merged together, with later searches taking precedence in case of overlapping keys: #. The :ref:`conf-cmake.configureSettings` option from ``settings.json``. #. The ``settings`` value from the active :ref:`variants.opts`. #. ``BUILD_SHARED_LIBS`` is set based on :ref:`variants.opts`. #. ``CMAKE_BUILD_TYPE`` is set based on :ref:`variants.opts`. #. ``CMAKE_INSTALL_PREFIX`` is set based on :ref:`conf-cmake.installPrefix`. #. ``CMAKE_TOOLCHAIN_FILE`` is set for :ref:`kits.types.toolchain`. #. The :ref:`cmakeSettings ` attribute on the active kit. Additionally, :ref:`conf-cmake.configureArgs` are passed *before* any of the above. #. *The configure environment* - CMake Tools sets environment variables for the child process it runs for CMake. Like the configuration options, values are merged from different sources, with later sources taking precedence: #. The environment variables required by the active :ref:`kit `. #. The value of :ref:`conf-cmake.environment`. #. The value of :ref:`conf-cmake.configureEnvironment`. #. The environment variables required by the active :ref:`variant `. All of the above are taken into account to perform the configure. Once finished, CMake Tools will load project information from CMake and generate diagnostics based on CMake's output. :ref:`You are now ready to build! ` Configuring Outside of CMake Tools ********************************** CMake Tools is built to play nicely with an external CMake process. If you choose to run CMake from another command line or other IDE/tool, all should work successfully (provided the host environment is set up properly). Nevertheless, be aware: CMake Tools will be unaware of any changes made by an external CMake process, and you will need to re-run the CMake configure within CMake Tools to have up-to-date project information. A "Clean" Configure ******************* CMake Tools also has the concept of a "clean configure," executed by running *CMake: Delete cached built settings and reconfigure*. The process consists simply of deleting the ``CMakeCache.txt`` file and ``CMakeFiles`` directory from the build directory. This is enough to reset all of CMake's default state. Should additional cleaning be necessary, it must be done by hand. This process is required for certain build system changes, but may be convenient as a "reset" if you have tweaked any configuration settings outside of CMake Tools. CMake Tools will also do this *automatically* if you change the active :ref:`kit `. CMake can't yet properly handle changing the toolchain without deleting the configuration data.