| ============ | 
 | 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.2) | 
 |    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.2) | 
 |    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 requried 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>`_ |