Ninja Multi-Config ------------------ Generates multiple ``build-.ninja`` files. This generator is very much like the :generator:`Ninja` generator, but with some key differences. Only these differences will be discussed in this document. Unlike the :generator:`Ninja` generator, ``Ninja Multi-Config`` generates multiple configurations at once with :variable:`CMAKE_CONFIGURATION_TYPES` instead of only one configuration with :variable:`CMAKE_BUILD_TYPE`. One ``build-.ninja`` file will be generated for each of these configurations (with ```` being the configuration name.) No ``build.ninja`` file is generated, unless :variable:`CMAKE_NINJA_MULTI_DEFAULT_BUILD_TYPE` is specified. You must specify the desired ``build-.ninja`` file with ``ninja -f``. Running ``cmake --build . --config --target `` will run Ninja with ``build-.ninja`` as the ``-f`` file and ```` as the build target. Executables and libraries of any configuration can be built regardless of which ``build-.ninja`` file is used, simply by specifying ``:`` as the Ninja target. You can also specify ``:all`` to build a target in all configurations. Each ``build-.ninja`` file will additionally have ```` targets which are aliases for ``:``. However, custom commands and custom targets will always use the configuration specified in ``build-.ninja``. This is due to the fact that it is impossible in Ninja for the same file to be output with different commands in the same build graph. Consider the following example: .. code-block:: cmake cmake_minimum_required(VERSION 3.16) project(MultiConfigNinja C) add_executable(generator generator.c) add_custom_command(OUTPUT generated.c COMMAND generator generated.c) add_library(generated ${CMAKE_BINARY_DIR}/generated.c) Now assume you configure the project with ``Ninja Multi-Config`` and run one of the following commands: .. code-block:: shell ninja -f build-Debug.ninja generated # OR cmake --build . --config Debug --target generated This would build the ``Debug`` configuration of ``generator``, which would be used to generate ``generated.c``, which would be used to build the ``Debug`` configuration of ``generated``. But if you run the following instead: .. code-block:: shell ninja -f build-Release.ninja generated:Debug # OR cmake --build . --config Release --target generated:Debug This would build the ``Release`` configuration of ``generator``, which would be used to generate ``generated.c``, which would be used to build the ``Debug`` configuration of ``generated``. This is useful for running a release-optimized version of a generator utility while still building the debug version of the targets built with the generated code. As a convenience, ``Ninja Multi-Config`` offers a :variable:`CMAKE_NINJA_MULTI_DEFAULT_BUILD_TYPE` setting. If this variable is specified, a ``build.ninja`` file will be generated which points to the specified ``build-.ninja`` file.