``-S <path-to-source>``
 Path to root directory of the CMake project to build.

``-B <path-to-build>``
 Path to directory which CMake will use as the root of build directory.

 If the directory doesn't already exist CMake will make it.

``-C <initial-cache>``
 Pre-load a script to populate the cache.

 When CMake is first run in an empty build tree, it creates a
 ``CMakeCache.txt`` file and populates it with customizable settings for
 the project.  This option may be used to specify a file from which
 to load cache entries before the first pass through the project's
 CMake listfiles.  The loaded entries take priority over the
 project's default values.  The given file should be a CMake script
 containing :command:`set` commands that use the ``CACHE`` option, not a
 cache-format file.

 References to :variable:`CMAKE_SOURCE_DIR` and :variable:`CMAKE_BINARY_DIR`
 within the script evaluate to the top-level source and build tree.

``-D <var>:<type>=<value>, -D <var>=<value>``
 Create or update a CMake ``CACHE`` entry.

 When CMake is first run in an empty build tree, it creates a
 ``CMakeCache.txt`` file and populates it with customizable settings for
 the project.  This option may be used to specify a setting that
 takes priority over the project's default value.  The option may be
 repeated for as many ``CACHE`` entries as desired.

 If the ``:<type>`` portion is given it must be one of the types
 specified by the :command:`set` command documentation for its
 ``CACHE`` signature.
 If the ``:<type>`` portion is omitted the entry will be created
 with no type if it does not exist with a type already.  If a
 command in the project sets the type to ``PATH`` or ``FILEPATH``
 then the ``<value>`` will be converted to an absolute path.

 This option may also be given as a single argument:
 ``-D<var>:<type>=<value>`` or ``-D<var>=<value>``.

``-U <globbing_expr>``
 Remove matching entries from CMake ``CACHE``.

 This option may be used to remove one or more variables from the
 ``CMakeCache.txt`` file, globbing expressions using ``*`` and ``?`` are
 supported.  The option may be repeated for as many ``CACHE`` entries as
 desired.

 Use with care, you can make your ``CMakeCache.txt`` non-working.

``-G <generator-name>``
 Specify a build system generator.

 CMake may support multiple native build systems on certain
 platforms.  A generator is responsible for generating a particular
 build system.  Possible generator names are specified in the
 :manual:`cmake-generators(7)` manual.

 If not specified, CMake checks the :envvar:`CMAKE_GENERATOR` environment
 variable and otherwise falls back to a builtin default selection.

``-T <toolset-spec>``
 Toolset specification for the generator, if supported.

 Some CMake generators support a toolset specification to tell
 the native build system how to choose a compiler.  See the
 :variable:`CMAKE_GENERATOR_TOOLSET` variable for details.

``-A <platform-name>``
 Specify platform name if supported by generator.

 Some CMake generators support a platform name to be given to the
 native build system to choose a compiler or SDK.  See the
 :variable:`CMAKE_GENERATOR_PLATFORM` variable for details.

``-Wno-dev``
 Suppress developer warnings.

 Suppress warnings that are meant for the author of the
 ``CMakeLists.txt`` files. By default this will also turn off
 deprecation warnings.

``-Wdev``
 Enable developer warnings.

 Enable warnings that are meant for the author of the ``CMakeLists.txt``
 files. By default this will also turn on deprecation warnings.

``-Werror=dev``
 Make developer warnings errors.

 Make warnings that are meant for the author of the ``CMakeLists.txt`` files
 errors. By default this will also turn on deprecated warnings as errors.

``-Wno-error=dev``
 Make developer warnings not errors.

 Make warnings that are meant for the author of the ``CMakeLists.txt`` files not
 errors. By default this will also turn off deprecated warnings as errors.

``-Wdeprecated``
 Enable deprecated functionality warnings.

 Enable warnings for usage of deprecated functionality, that are meant
 for the author of the ``CMakeLists.txt`` files.

``-Wno-deprecated``
 Suppress deprecated functionality warnings.

 Suppress warnings for usage of deprecated functionality, that are meant
 for the author of the ``CMakeLists.txt`` files.

``-Werror=deprecated``
 Make deprecated macro and function warnings errors.

 Make warnings for usage of deprecated macros and functions, that are meant
 for the author of the ``CMakeLists.txt`` files, errors.

``-Wno-error=deprecated``
 Make deprecated macro and function warnings not errors.

 Make warnings for usage of deprecated macros and functions, that are meant
 for the author of the ``CMakeLists.txt`` files, not errors.
