============
CMake Primer
============

.. contents::
   :local:

.. warning::
   Disclaimer: This documentation is written by LLVM project contributors `not`
   anyone affiliated with the CMake project. This document may contain
   inaccurate terminology, phrasing, or technical details. It is provided with
   the best intentions.


Introduction
============

The LLVM project and many of the core projects built on LLVM build using CMake.
This document aims to provide a brief overview of CMake for developers modifying
LLVM projects or building their own projects on top of LLVM.

The official CMake language references is available in the cmake-language
manpage and `cmake-language online documentation
<https://cmake.org/cmake/help/v3.4/manual/cmake-language.7.html>`_.

10,000 ft View
==============

CMake is a tool that reads script files in its own language that describe how a
software project builds. As CMake evaluates the scripts it constructs an
internal representation of the software project. Once the scripts have been
fully processed, if there are no errors, CMake will generate build files to
actually build the project. CMake supports generating build files for a variety
of command line build tools as well as for popular IDEs.

When a user runs CMake it performs a variety of checks similar to how autoconf
worked historically. During the checks and the evaluation of the build
description scripts CMake caches values into the CMakeCache. This is useful
because it allows the build system to skip long-running checks during
incremental development. CMake caching also has some drawbacks, but that will be
discussed later.

Scripting Overview
==================

CMake's scripting language has a very simple grammar. Every language construct
is a command that matches the pattern _name_(_args_). Commands come in three
primary types: language-defined (commands implemented in C++ in CMake), defined
functions, and defined macros. The CMake distribution also contains a suite of
CMake modules that contain definitions for useful functionality.

The example below is the full CMake build for building a C++ "Hello World"
program. The example uses only CMake language-defined functions.

.. code-block:: cmake

   cmake_minimum_required(VERSION 3.15)
   project(HelloWorld)
   add_executable(HelloWorld HelloWorld.cpp)

The CMake language provides control flow constructs in the form of foreach loops
and if blocks. To make the example above more complicated you could add an if
block to define "APPLE" when targeting Apple platforms:

.. code-block:: cmake

   cmake_minimum_required(VERSION 3.15)
   project(HelloWorld)
   add_executable(HelloWorld HelloWorld.cpp)
   if(APPLE)
     target_compile_definitions(HelloWorld PUBLIC APPLE)
   endif()

Variables, Types, and Scope
===========================

Dereferencing
-------------

In CMake variables are "stringly" typed. All variables are represented as
strings throughout evaluation. Wrapping a variable in ``${}`` dereferences it
and results in a literal substitution of the name for the value. CMake refers to
this as "variable evaluation" in their documentation. Dereferences are performed
*before* the command being called receives the arguments. This means
dereferencing a list results in multiple separate arguments being passed to the
command.

Variable dereferences can be nested and be used to model complex data. For
example:

.. code-block:: cmake

   set(var_name var1)
   set(${var_name} foo) # same as "set(var1 foo)"
   set(${${var_name}}_var bar) # same as "set(foo_var bar)"

Dereferencing an unset variable results in an empty expansion. It is a common
pattern in CMake to conditionally set variables knowing that it will be used in
code paths that the variable isn't set. There are examples of this throughout
the LLVM CMake build system.

An example of variable empty expansion is:

.. code-block:: cmake

   if(APPLE)
     set(extra_sources Apple.cpp)
   endif()
   add_executable(HelloWorld HelloWorld.cpp ${extra_sources})

In this example the ``extra_sources`` variable is only defined if you're
targeting an Apple platform. For all other targets the ``extra_sources`` will be
evaluated as empty before add_executable is given its arguments.

Lists
-----

In CMake lists are semi-colon delimited strings, and it is strongly advised that
you avoid using semi-colons in lists; it doesn't go smoothly. A few examples of
defining lists:

.. code-block:: cmake

   # Creates a list with members a, b, c, and d
   set(my_list a b c d)
   set(my_list "a;b;c;d")

   # Creates a string "a b c d"
   set(my_string "a b c d")

Lists of Lists
--------------

One of the more complicated patterns in CMake is lists of lists. Because a list
cannot contain an element with a semi-colon to construct a list of lists you
make a list of variable names that refer to other lists. For example:

.. code-block:: cmake

   set(list_of_lists a b c)
   set(a 1 2 3)
   set(b 4 5 6)
   set(c 7 8 9)

With this layout you can iterate through the list of lists printing each value
with the following code:

.. code-block:: cmake

   foreach(list_name IN LISTS list_of_lists)
     foreach(value IN LISTS ${list_name})
       message(${value})
     endforeach()
   endforeach()

You'll notice that the inner foreach loop's list is doubly dereferenced. This is
because the first dereference turns ``list_name`` into the name of the sub-list
(a, b, or c in the example), then the second dereference is to get the value of
the list.

This pattern is used throughout CMake, the most common example is the compiler
flags options, which CMake refers to using the following variable expansions:
CMAKE_${LANGUAGE}_FLAGS and CMAKE_${LANGUAGE}_FLAGS_${CMAKE_BUILD_TYPE}.

Other Types
-----------

Variables that are cached or specified on the command line can have types
associated with them. The variable's type is used by CMake's UI tool to display
the right input field. A variable's type generally doesn't impact evaluation,
however CMake does have special handling for some variables such as PATH.
You can read more about the special handling in `CMake's set documentation
<https://cmake.org/cmake/help/v3.5/command/set.html#set-cache-entry>`_.

Scope
-----

CMake inherently has a directory-based scoping. Setting a variable in a
CMakeLists file, will set the variable for that file, and all subdirectories.
Variables set in a CMake module that is included in a CMakeLists file will be
set in the scope they are included from, and all subdirectories.

When a variable that is already set is set again in a subdirectory it overrides
the value in that scope and any deeper subdirectories.

The CMake set command provides two scope-related options. PARENT_SCOPE sets a
variable into the parent scope, and not the current scope. The CACHE option sets
the variable in the CMakeCache, which results in it being set in all scopes. The
CACHE option will not set a variable that already exists in the CACHE unless the
FORCE option is specified.

In addition to directory-based scope, CMake functions also have their own scope.
This means variables set inside functions do not bleed into the parent scope.
This is not true of macros, and it is for this reason LLVM prefers functions
over macros whenever reasonable.

.. note::
  Unlike C-based languages, CMake's loop and control flow blocks do not have
  their own scopes.

Control Flow
============

CMake features the same basic control flow constructs you would expect in any
scripting language, but there are a few quirks because, as with everything in
CMake, control flow constructs are commands.

If, ElseIf, Else
----------------

.. note::
  For the full documentation on the CMake if command go
  `here <https://cmake.org/cmake/help/v3.4/command/if.html>`_. That resource is
  far more complete.

In general CMake if blocks work the way you'd expect:

.. code-block:: cmake

  if(<condition>)
    message("do stuff")
  elseif(<condition>)
    message("do other stuff")
  else()
    message("do other other stuff")
  endif()

The single most important thing to know about CMake's if blocks coming from a C
background is that they do not have their own scope. Variables set inside
conditional blocks persist after the ``endif()``.

Loops
-----

The most common form of the CMake ``foreach`` block is:

.. code-block:: cmake

  foreach(var ...)
    message("do stuff")
  endforeach()

The variable argument portion of the ``foreach`` block can contain dereferenced
lists, values to iterate, or a mix of both:

.. code-block:: cmake

  foreach(var foo bar baz)
    message(${var})
  endforeach()
  # prints:
  #  foo
  #  bar
  #  baz

  set(my_list 1 2 3)
  foreach(var ${my_list})
    message(${var})
  endforeach()
  # prints:
  #  1
  #  2
  #  3

  foreach(var ${my_list} out_of_bounds)
    message(${var})
  endforeach()
  # prints:
  #  1
  #  2
  #  3
  #  out_of_bounds

There is also a more modern CMake foreach syntax. The code below is equivalent
to the code above:

.. code-block:: cmake

  foreach(var IN ITEMS foo bar baz)
    message(${var})
  endforeach()
  # prints:
  #  foo
  #  bar
  #  baz

  set(my_list 1 2 3)
  foreach(var IN LISTS my_list)
    message(${var})
  endforeach()
  # prints:
  #  1
  #  2
  #  3

  foreach(var IN LISTS my_list ITEMS out_of_bounds)
    message(${var})
  endforeach()
  # prints:
  #  1
  #  2
  #  3
  #  out_of_bounds

Similar to the conditional statements, these generally behave how you would
expect, and they do not have their own scope.

CMake also supports ``while`` loops, although they are not widely used in LLVM.

Modules, Functions and Macros
=============================

Modules
-------

Modules are CMake's vehicle for enabling code reuse. CMake modules are just
CMake script files. They can contain code to execute on include as well as
definitions for commands.

In CMake macros and functions are universally referred to as commands, and they
are the primary method of defining code that can be called multiple times.

In LLVM we have several CMake modules that are included as part of our
distribution for developers who don't build our project from source. Those
modules are the fundamental pieces needed to build LLVM-based projects with
CMake. We also rely on modules as a way of organizing the build system's
functionality for maintainability and re-use within LLVM projects.

Argument Handling
-----------------

When defining a CMake command handling arguments is very useful. The examples
in this section will all use the CMake ``function`` block, but this all applies
to the ``macro`` block as well.

CMake commands can have named arguments that are required at every call site. In
addition, all commands will implicitly accept a variable number of extra
arguments (In C parlance, all commands are varargs functions). When a command is
invoked with extra arguments (beyond the named ones) CMake will store the full
list of arguments (both named and unnamed) in a list named ``ARGV``, and the
sublist of unnamed arguments in ``ARGN``. Below is a trivial example of
providing a wrapper function for CMake's built in function ``add_dependencies``.

.. code-block:: cmake

   function(add_deps target)
     add_dependencies(${target} ${ARGN})
   endfunction()

This example defines a new macro named ``add_deps`` which takes a required first
argument, and just calls another function passing through the first argument and
all trailing arguments.

CMake provides a module ``CMakeParseArguments`` which provides an implementation
of advanced argument parsing. We use this all over LLVM, and it is recommended
for any function that has complex argument-based behaviors or optional
arguments. CMake's official documentation for the module is in the
``cmake-modules`` manpage, and is also available at the
`cmake-modules online documentation
<https://cmake.org/cmake/help/v3.4/module/CMakeParseArguments.html>`_.

.. note::
  As of CMake 3.5 the cmake_parse_arguments command has become a native command
  and the CMakeParseArguments module is empty and only left around for
  compatibility.

Functions Vs Macros
-------------------

Functions and Macros look very similar in how they are used, but there is one
fundamental difference between the two. Functions have their own scope, and
macros don't. This means variables set in macros will bleed out into the calling
scope. That makes macros suitable for defining very small bits of functionality
only.

The other difference between CMake functions and macros is how arguments are
passed. Arguments to macros are not set as variables, instead dereferences to
the parameters are resolved across the macro before executing it. This can
result in some unexpected behavior if using unreferenced variables. For example:

.. code-block:: cmake

   macro(print_list my_list)
     foreach(var IN LISTS my_list)
       message("${var}")
     endforeach()
   endmacro()

   set(my_list a b c d)
   set(my_list_of_numbers 1 2 3 4)
   print_list(my_list_of_numbers)
   # prints:
   # a
   # b
   # c
   # d

Generally speaking this issue is uncommon because it requires using
non-dereferenced variables with names that overlap in the parent scope, but it
is important to be aware of because it can lead to subtle bugs.

LLVM Project Wrappers
=====================

LLVM projects provide lots of wrappers around critical CMake built-in commands.
We use these wrappers to provide consistent behaviors across LLVM components
and to reduce code duplication.

We generally (but not always) follow the convention that commands prefaced with
``llvm_`` are intended to be used only as building blocks for other commands.
Wrapper commands that are intended for direct use are generally named following
with the project in the middle of the command name (i.e. ``add_llvm_executable``
is the wrapper for ``add_executable``). The LLVM ``add_*`` wrapper functions are
all defined in ``AddLLVM.cmake`` which is installed as part of the LLVM
distribution. It can be included and used by any LLVM sub-project that requires
LLVM.

.. note::

   Not all LLVM projects require LLVM for all use cases. For example compiler-rt
   can be built without LLVM, and the compiler-rt sanitizer libraries are used
   with GCC.

Useful Built-in Commands
========================

CMake has a bunch of useful built-in commands. This document isn't going to
go into details about them because The CMake project has excellent
documentation. To highlight a few useful functions see:

* `add_custom_command <https://cmake.org/cmake/help/v3.4/command/add_custom_command.html>`_
* `add_custom_target <https://cmake.org/cmake/help/v3.4/command/add_custom_target.html>`_
* `file <https://cmake.org/cmake/help/v3.4/command/file.html>`_
* `list <https://cmake.org/cmake/help/v3.4/command/list.html>`_
* `math <https://cmake.org/cmake/help/v3.4/command/math.html>`_
* `string <https://cmake.org/cmake/help/v3.4/command/string.html>`_

The full documentation for CMake commands is in the ``cmake-commands`` manpage
and available on `CMake's website <https://cmake.org/cmake/help/v3.4/manual/cmake-commands.7.html>`_
