annotate docs/CMakePrimer.rst @ 120:1172e4bd9c6f

update 4.0.0
author mir3636
date Fri, 25 Nov 2016 19:14:25 +0900
parents
children 803732b1fca8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 ============
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 CMake Primer
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
3 ============
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
4
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
5 .. contents::
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 :local:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8 .. warning::
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 Disclaimer: This documentation is written by LLVM project contributors `not`
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 anyone affiliated with the CMake project. This document may contain
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 inaccurate terminology, phrasing, or technical details. It is provided with
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 the best intentions.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15 Introduction
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16 ============
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18 The LLVM project and many of the core projects built on LLVM build using CMake.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19 This document aims to provide a brief overview of CMake for developers modifying
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 LLVM projects or building their own projects on top of LLVM.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 The official CMake language references is available in the cmake-language
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23 manpage and `cmake-language online documentation
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24 <https://cmake.org/cmake/help/v3.4/manual/cmake-language.7.html>`_.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26 10,000 ft View
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27 ==============
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 CMake is a tool that reads script files in its own language that describe how a
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30 software project builds. As CMake evaluates the scripts it constructs an
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 internal representation of the software project. Once the scripts have been
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 fully processed, if there are no errors, CMake will generate build files to
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 actually build the project. CMake supports generating build files for a variety
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 of command line build tools as well as for popular IDEs.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 When a user runs CMake it performs a variety of checks similar to how autoconf
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 worked historically. During the checks and the evaluation of the build
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38 description scripts CMake caches values into the CMakeCache. This is useful
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 because it allows the build system to skip long-running checks during
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40 incremental development. CMake caching also has some drawbacks, but that will be
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41 discussed later.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 Scripting Overview
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 ==================
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46 CMake's scripting language has a very simple grammar. Every language construct
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47 is a command that matches the pattern _name_(_args_). Commands come in three
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 primary types: language-defined (commands implemented in C++ in CMake), defined
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 functions, and defined macros. The CMake distribution also contains a suite of
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 CMake modules that contain definitions for useful functionality.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 The example below is the full CMake build for building a C++ "Hello World"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53 program. The example uses only CMake language-defined functions.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57 cmake_minimum_required(VERSION 3.2)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
58 project(HelloWorld)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 add_executable(HelloWorld HelloWorld.cpp)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 The CMake language provides control flow constructs in the form of foreach loops
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62 and if blocks. To make the example above more complicated you could add an if
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 block to define "APPLE" when targeting Apple platforms:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
67 cmake_minimum_required(VERSION 3.2)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68 project(HelloWorld)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69 add_executable(HelloWorld HelloWorld.cpp)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
70 if(APPLE)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
71 target_compile_definitions(HelloWorld PUBLIC APPLE)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
72 endif()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74 Variables, Types, and Scope
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75 ===========================
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
76
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
77 Dereferencing
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
78 -------------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
79
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
80 In CMake variables are "stringly" typed. All variables are represented as
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
81 strings throughout evaluation. Wrapping a variable in ``${}`` dereferences it
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
82 and results in a literal substitution of the name for the value. CMake refers to
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
83 this as "variable evaluation" in their documentation. Dereferences are performed
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
84 *before* the command being called receives the arguments. This means
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
85 dereferencing a list results in multiple separate arguments being passed to the
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
86 command.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
87
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
88 Variable dereferences can be nested and be used to model complex data. For
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
89 example:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
90
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
91 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 set(var_name var1)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
94 set(${var_name} foo) # same as "set(var1 foo)"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 set(${${var_name}}_var bar) # same as "set(foo_var bar)"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
96
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
97 Dereferencing an unset variable results in an empty expansion. It is a common
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
98 pattern in CMake to conditionally set variables knowing that it will be used in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
99 code paths that the variable isn't set. There are examples of this throughout
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
100 the LLVM CMake build system.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
101
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
102 An example of variable empty expansion is:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
103
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
104 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
105
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
106 if(APPLE)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
107 set(extra_sources Apple.cpp)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
108 endif()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
109 add_executable(HelloWorld HelloWorld.cpp ${extra_sources})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
110
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
111 In this example the ``extra_sources`` variable is only defined if you're
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
112 targeting an Apple platform. For all other targets the ``extra_sources`` will be
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
113 evaluated as empty before add_executable is given its arguments.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
114
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
115 One big "Gotcha" with variable dereferencing is that ``if`` commands implicitly
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
116 dereference values. This has some unexpected results. For example:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
117
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
118 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
119
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
120 if("${SOME_VAR}" STREQUAL "MSVC")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
121
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
122 In this code sample MSVC will be implicitly dereferenced, which will result in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
123 the if command comparing the value of the dereferenced variables ``SOME_VAR``
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
124 and ``MSVC``. A common workaround to this solution is to prepend strings being
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
125 compared with an ``x``.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
126
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
127 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
128
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
129 if("x${SOME_VAR}" STREQUAL "xMSVC")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
130
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
131 This works because while ``MSVC`` is a defined variable, ``xMSVC`` is not. This
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
132 pattern is uncommon, but it does occur in LLVM's CMake scripts.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
133
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
134 .. note::
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
135
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
136 Once the LLVM project upgrades its minimum CMake version to 3.1 or later we
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
137 can prevent this behavior by setting CMP0054 to new. For more information on
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
138 CMake policies please see the cmake-policies manpage or the `cmake-policies
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
139 online documentation
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
140 <https://cmake.org/cmake/help/v3.4/manual/cmake-policies.7.html>`_.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
141
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
142 Lists
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
143 -----
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
144
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
145 In CMake lists are semi-colon delimited strings, and it is strongly advised that
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
146 you avoid using semi-colons in lists; it doesn't go smoothly. A few examples of
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
147 defining lists:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
148
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
149 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
150
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
151 # Creates a list with members a, b, c, and d
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
152 set(my_list a b c d)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
153 set(my_list "a;b;c;d")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
154
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
155 # Creates a string "a b c d"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
156 set(my_string "a b c d")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
157
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
158 Lists of Lists
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
159 --------------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
160
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
161 One of the more complicated patterns in CMake is lists of lists. Because a list
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
162 cannot contain an element with a semi-colon to construct a list of lists you
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
163 make a list of variable names that refer to other lists. For example:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
164
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
165 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
166
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
167 set(list_of_lists a b c)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
168 set(a 1 2 3)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
169 set(b 4 5 6)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
170 set(c 7 8 9)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
171
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
172 With this layout you can iterate through the list of lists printing each value
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
173 with the following code:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
174
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
175 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
176
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
177 foreach(list_name IN LISTS list_of_lists)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
178 foreach(value IN LISTS ${list_name})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
179 message(${value})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
180 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
181 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
182
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
183 You'll notice that the inner foreach loop's list is doubly dereferenced. This is
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
184 because the first dereference turns ``list_name`` into the name of the sub-list
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
185 (a, b, or c in the example), then the second dereference is to get the value of
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
186 the list.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
187
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
188 This pattern is used throughout CMake, the most common example is the compiler
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
189 flags options, which CMake refers to using the following variable expansions:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
190 CMAKE_${LANGUAGE}_FLAGS and CMAKE_${LANGUAGE}_FLAGS_${CMAKE_BUILD_TYPE}.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
191
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
192 Other Types
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
193 -----------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
194
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
195 Variables that are cached or specified on the command line can have types
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
196 associated with them. The variable's type is used by CMake's UI tool to display
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
197 the right input field. The variable's type generally doesn't impact evaluation.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
198 One of the few examples is PATH variables, which CMake does have some special
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
199 handling for. You can read more about the special handling in `CMake's set
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
200 documentation
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
201 <https://cmake.org/cmake/help/v3.5/command/set.html#set-cache-entry>`_.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
202
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
203 Scope
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
204 -----
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
205
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
206 CMake inherently has a directory-based scoping. Setting a variable in a
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
207 CMakeLists file, will set the variable for that file, and all subdirectories.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
208 Variables set in a CMake module that is included in a CMakeLists file will be
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
209 set in the scope they are included from, and all subdirectories.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
210
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
211 When a variable that is already set is set again in a subdirectory it overrides
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
212 the value in that scope and any deeper subdirectories.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
213
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
214 The CMake set command provides two scope-related options. PARENT_SCOPE sets a
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
215 variable into the parent scope, and not the current scope. The CACHE option sets
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
216 the variable in the CMakeCache, which results in it being set in all scopes. The
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
217 CACHE option will not set a variable that already exists in the CACHE unless the
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
218 FORCE option is specified.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
219
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
220 In addition to directory-based scope, CMake functions also have their own scope.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
221 This means variables set inside functions do not bleed into the parent scope.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
222 This is not true of macros, and it is for this reason LLVM prefers functions
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
223 over macros whenever reasonable.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
224
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
225 .. note::
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
226 Unlike C-based languages, CMake's loop and control flow blocks do not have
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
227 their own scopes.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
228
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
229 Control Flow
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
230 ============
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
231
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
232 CMake features the same basic control flow constructs you would expect in any
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
233 scripting language, but there are a few quarks because, as with everything in
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
234 CMake, control flow constructs are commands.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
235
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
236 If, ElseIf, Else
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
237 ----------------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
238
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
239 .. note::
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
240 For the full documentation on the CMake if command go
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
241 `here <https://cmake.org/cmake/help/v3.4/command/if.html>`_. That resource is
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
242 far more complete.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
243
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
244 In general CMake if blocks work the way you'd expect:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
245
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
246 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
247
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
248 if(<condition>)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
249 message("do stuff")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
250 elseif(<condition>)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
251 message("do other stuff")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
252 else()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
253 message("do other other stuff")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
254 endif()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
255
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
256 The single most important thing to know about CMake's if blocks coming from a C
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
257 background is that they do not have their own scope. Variables set inside
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
258 conditional blocks persist after the ``endif()``.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
259
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
260 Loops
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
261 -----
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
262
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
263 The most common form of the CMake ``foreach`` block is:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
264
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
265 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
266
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
267 foreach(var ...)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
268 message("do stuff")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
269 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
270
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
271 The variable argument portion of the ``foreach`` block can contain dereferenced
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
272 lists, values to iterate, or a mix of both:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
273
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
274 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
275
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
276 foreach(var foo bar baz)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
277 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
278 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
279 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
280 # foo
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
281 # bar
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
282 # baz
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
283
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
284 set(my_list 1 2 3)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
285 foreach(var ${my_list})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
286 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
287 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
288 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
289 # 1
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
290 # 2
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
291 # 3
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
292
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
293 foreach(var ${my_list} out_of_bounds)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
294 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
295 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
296 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
297 # 1
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
298 # 2
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
299 # 3
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
300 # out_of_bounds
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
301
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
302 There is also a more modern CMake foreach syntax. The code below is equivalent
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
303 to the code above:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
304
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
305 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
306
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
307 foreach(var IN ITEMS foo bar baz)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
308 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
309 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
310 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
311 # foo
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
312 # bar
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
313 # baz
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
314
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
315 set(my_list 1 2 3)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
316 foreach(var IN LISTS my_list)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
317 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
318 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
319 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
320 # 1
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
321 # 2
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
322 # 3
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
323
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
324 foreach(var IN LISTS my_list ITEMS out_of_bounds)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
325 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
326 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
327 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
328 # 1
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
329 # 2
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
330 # 3
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
331 # out_of_bounds
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
332
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
333 Similar to the conditional statements, these generally behave how you would
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
334 expect, and they do not have their own scope.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
335
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
336 CMake also supports ``while`` loops, although they are not widely used in LLVM.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
337
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
338 Modules, Functions and Macros
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
339 =============================
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
340
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
341 Modules
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
342 -------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
343
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
344 Modules are CMake's vehicle for enabling code reuse. CMake modules are just
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
345 CMake script files. They can contain code to execute on include as well as
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
346 definitions for commands.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
347
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
348 In CMake macros and functions are universally referred to as commands, and they
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
349 are the primary method of defining code that can be called multiple times.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
350
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
351 In LLVM we have several CMake modules that are included as part of our
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
352 distribution for developers who don't build our project from source. Those
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
353 modules are the fundamental pieces needed to build LLVM-based projects with
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
354 CMake. We also rely on modules as a way of organizing the build system's
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
355 functionality for maintainability and re-use within LLVM projects.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
356
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
357 Argument Handling
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
358 -----------------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
359
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
360 When defining a CMake command handling arguments is very useful. The examples
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
361 in this section will all use the CMake ``function`` block, but this all applies
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
362 to the ``macro`` block as well.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
363
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
364 CMake commands can have named arguments, but all commands are implicitly
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
365 variable argument. If the command has named arguments they are required and must
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
366 be specified at every call site. Below is a trivial example of providing a
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
367 wrapper function for CMake's built in function ``add_dependencies``.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
368
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
369 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
370
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
371 function(add_deps target)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
372 add_dependencies(${target} ${ARGV})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
373 endfunction()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
374
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
375 This example defines a new macro named ``add_deps`` which takes a required first
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
376 argument, and just calls another function passing through the first argument and
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
377 all trailing arguments. When variable arguments are present CMake defines them
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
378 in a list named ``ARGV``, and the count of the arguments is defined in ``ARGN``.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
379
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
380 CMake provides a module ``CMakeParseArguments`` which provides an implementation
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
381 of advanced argument parsing. We use this all over LLVM, and it is recommended
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
382 for any function that has complex argument-based behaviors or optional
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
383 arguments. CMake's official documentation for the module is in the
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
384 ``cmake-modules`` manpage, and is also available at the
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
385 `cmake-modules online documentation
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
386 <https://cmake.org/cmake/help/v3.4/module/CMakeParseArguments.html>`_.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
387
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
388 .. note::
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
389 As of CMake 3.5 the cmake_parse_arguments command has become a native command
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
390 and the CMakeParseArguments module is empty and only left around for
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
391 compatibility.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
392
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
393 Functions Vs Macros
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
394 -------------------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
395
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
396 Functions and Macros look very similar in how they are used, but there is one
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
397 fundamental difference between the two. Functions have their own scope, and
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
398 macros don't. This means variables set in macros will bleed out into the calling
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
399 scope. That makes macros suitable for defining very small bits of functionality
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
400 only.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
401
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
402 The other difference between CMake functions and macros is how arguments are
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
403 passed. Arguments to macros are not set as variables, instead dereferences to
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
404 the parameters are resolved across the macro before executing it. This can
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
405 result in some unexpected behavior if using unreferenced variables. For example:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
406
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
407 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
408
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
409 macro(print_list my_list)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
410 foreach(var IN LISTS my_list)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
411 message("${var}")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
412 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
413 endmacro()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
414
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
415 set(my_list a b c d)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
416 set(my_list_of_numbers 1 2 3 4)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
417 print_list(my_list_of_numbers)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
418 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
419 # a
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
420 # b
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
421 # c
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
422 # d
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
423
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
424 Generally speaking this issue is uncommon because it requires using
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
425 non-dereferenced variables with names that overlap in the parent scope, but it
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
426 is important to be aware of because it can lead to subtle bugs.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
427
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
428 LLVM Project Wrappers
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
429 =====================
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
430
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
431 LLVM projects provide lots of wrappers around critical CMake built-in commands.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
432 We use these wrappers to provide consistent behaviors across LLVM components
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
433 and to reduce code duplication.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
434
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
435 We generally (but not always) follow the convention that commands prefaced with
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
436 ``llvm_`` are intended to be used only as building blocks for other commands.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
437 Wrapper commands that are intended for direct use are generally named following
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
438 with the project in the middle of the command name (i.e. ``add_llvm_executable``
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
439 is the wrapper for ``add_executable``). The LLVM ``add_*`` wrapper functions are
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
440 all defined in ``AddLLVM.cmake`` which is installed as part of the LLVM
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
441 distribution. It can be included and used by any LLVM sub-project that requires
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
442 LLVM.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
443
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
444 .. note::
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
445
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
446 Not all LLVM projects require LLVM for all use cases. For example compiler-rt
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
447 can be built without LLVM, and the compiler-rt sanitizer libraries are used
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
448 with GCC.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
449
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
450 Useful Built-in Commands
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
451 ========================
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
452
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
453 CMake has a bunch of useful built-in commands. This document isn't going to
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
454 go into details about them because The CMake project has excellent
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
455 documentation. To highlight a few useful functions see:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
456
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
457 * `add_custom_command <https://cmake.org/cmake/help/v3.4/command/add_custom_command.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
458 * `add_custom_target <https://cmake.org/cmake/help/v3.4/command/add_custom_target.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
459 * `file <https://cmake.org/cmake/help/v3.4/command/file.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
460 * `list <https://cmake.org/cmake/help/v3.4/command/list.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
461 * `math <https://cmake.org/cmake/help/v3.4/command/math.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
462 * `string <https://cmake.org/cmake/help/v3.4/command/string.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
463
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
464 The full documentation for CMake commands is in the ``cmake-commands`` manpage
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
465 and available on `CMake's website <https://cmake.org/cmake/help/v3.4/manual/cmake-commands.7.html>`_