annotate docs/CMakePrimer.rst @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents 803732b1fca8
children
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 Lists
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
116 -----
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
117
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
118 In CMake lists are semi-colon delimited strings, and it is strongly advised that
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
119 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
120 defining lists:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
121
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
122 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
123
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
124 # Creates a list with members a, b, c, and d
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
125 set(my_list a b c d)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
126 set(my_list "a;b;c;d")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
127
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
128 # Creates a string "a b c d"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
129 set(my_string "a b c d")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
130
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
131 Lists of Lists
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
132 --------------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
133
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
134 One of the more complicated patterns in CMake is lists of lists. Because a list
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
135 cannot contain an element with a semi-colon to construct a list of lists you
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
136 make a list of variable names that refer to other lists. For example:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
137
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
138 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
139
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
140 set(list_of_lists a b c)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
141 set(a 1 2 3)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
142 set(b 4 5 6)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
143 set(c 7 8 9)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
144
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
145 With this layout you can iterate through the list of lists printing each value
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
146 with the following code:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
147
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
148 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
149
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
150 foreach(list_name IN LISTS list_of_lists)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
151 foreach(value IN LISTS ${list_name})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
152 message(${value})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
153 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
154 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
155
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
156 You'll notice that the inner foreach loop's list is doubly dereferenced. This is
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
157 because the first dereference turns ``list_name`` into the name of the sub-list
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
158 (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
159 the list.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
160
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
161 This pattern is used throughout CMake, the most common example is the compiler
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
162 flags options, which CMake refers to using the following variable expansions:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
163 CMAKE_${LANGUAGE}_FLAGS and CMAKE_${LANGUAGE}_FLAGS_${CMAKE_BUILD_TYPE}.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
164
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
165 Other Types
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
166 -----------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
167
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
168 Variables that are cached or specified on the command line can have types
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
169 associated with them. The variable's type is used by CMake's UI tool to display
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
170 the right input field. A variable's type generally doesn't impact evaluation,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
171 however CMake does have special handling for some variables such as PATH.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
172 You can read more about the special handling in `CMake's set documentation
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
173 <https://cmake.org/cmake/help/v3.5/command/set.html#set-cache-entry>`_.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
174
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
175 Scope
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
176 -----
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
177
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
178 CMake inherently has a directory-based scoping. Setting a variable in a
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
179 CMakeLists file, will set the variable for that file, and all subdirectories.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
180 Variables set in a CMake module that is included in a CMakeLists file will be
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
181 set in the scope they are included from, and all subdirectories.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
182
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
183 When a variable that is already set is set again in a subdirectory it overrides
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
184 the value in that scope and any deeper subdirectories.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
185
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
186 The CMake set command provides two scope-related options. PARENT_SCOPE sets a
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
187 variable into the parent scope, and not the current scope. The CACHE option sets
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
188 the variable in the CMakeCache, which results in it being set in all scopes. The
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
189 CACHE option will not set a variable that already exists in the CACHE unless the
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
190 FORCE option is specified.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
191
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
192 In addition to directory-based scope, CMake functions also have their own scope.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
193 This means variables set inside functions do not bleed into the parent scope.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
194 This is not true of macros, and it is for this reason LLVM prefers functions
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
195 over macros whenever reasonable.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
196
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
197 .. note::
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
198 Unlike C-based languages, CMake's loop and control flow blocks do not have
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
199 their own scopes.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
200
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
201 Control Flow
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
202 ============
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
203
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
204 CMake features the same basic control flow constructs you would expect in any
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
205 scripting language, but there are a few quirks because, as with everything in
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
206 CMake, control flow constructs are commands.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
207
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
208 If, ElseIf, Else
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
209 ----------------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
210
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
211 .. note::
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
212 For the full documentation on the CMake if command go
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
213 `here <https://cmake.org/cmake/help/v3.4/command/if.html>`_. That resource is
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
214 far more complete.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
215
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
216 In general CMake if blocks work the way you'd expect:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
217
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
218 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
219
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
220 if(<condition>)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
221 message("do stuff")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
222 elseif(<condition>)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
223 message("do other stuff")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
224 else()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
225 message("do other other stuff")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
226 endif()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
227
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
228 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
229 background is that they do not have their own scope. Variables set inside
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
230 conditional blocks persist after the ``endif()``.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
231
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
232 Loops
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
233 -----
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
234
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
235 The most common form of the CMake ``foreach`` block is:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
236
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
237 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
238
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
239 foreach(var ...)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
240 message("do stuff")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
241 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
242
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
243 The variable argument portion of the ``foreach`` block can contain dereferenced
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
244 lists, values to iterate, or a mix of both:
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 foreach(var foo bar baz)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
249 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
250 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
251 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
252 # foo
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
253 # bar
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
254 # baz
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
255
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
256 set(my_list 1 2 3)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
257 foreach(var ${my_list})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
258 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
259 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
260 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
261 # 1
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
262 # 2
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
263 # 3
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
264
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
265 foreach(var ${my_list} out_of_bounds)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
266 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
267 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
268 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
269 # 1
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
270 # 2
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
271 # 3
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
272 # out_of_bounds
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
273
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
274 There is also a more modern CMake foreach syntax. The code below is equivalent
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
275 to the code above:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
276
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
277 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
278
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
279 foreach(var IN ITEMS foo bar baz)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
280 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
281 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
282 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
283 # foo
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
284 # bar
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
285 # baz
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
286
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
287 set(my_list 1 2 3)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
288 foreach(var IN LISTS my_list)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
289 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
290 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
291 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
292 # 1
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
293 # 2
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
294 # 3
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
295
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
296 foreach(var IN LISTS my_list ITEMS out_of_bounds)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
297 message(${var})
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
298 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
299 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
300 # 1
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
301 # 2
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
302 # 3
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
303 # out_of_bounds
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
304
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
305 Similar to the conditional statements, these generally behave how you would
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
306 expect, and they do not have their own scope.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
307
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
308 CMake also supports ``while`` loops, although they are not widely used in LLVM.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
309
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
310 Modules, Functions and Macros
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
311 =============================
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
312
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
313 Modules
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
314 -------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
315
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
316 Modules are CMake's vehicle for enabling code reuse. CMake modules are just
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
317 CMake script files. They can contain code to execute on include as well as
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
318 definitions for commands.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
319
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
320 In CMake macros and functions are universally referred to as commands, and they
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
321 are the primary method of defining code that can be called multiple times.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
322
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
323 In LLVM we have several CMake modules that are included as part of our
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
324 distribution for developers who don't build our project from source. Those
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
325 modules are the fundamental pieces needed to build LLVM-based projects with
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
326 CMake. We also rely on modules as a way of organizing the build system's
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
327 functionality for maintainability and re-use within LLVM projects.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
328
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
329 Argument Handling
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
330 -----------------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
331
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
332 When defining a CMake command handling arguments is very useful. The examples
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
333 in this section will all use the CMake ``function`` block, but this all applies
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
334 to the ``macro`` block as well.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
335
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
336 CMake commands can have named arguments that are requried at every call site. In
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
337 addition, all commands will implicitly accept a variable number of extra
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
338 arguments (In C parlance, all commands are varargs functions). When a command is
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
339 invoked with extra arguments (beyond the named ones) CMake will store the full
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
340 list of arguments (both named and unnamed) in a list named ``ARGV``, and the
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
341 sublist of unnamed arguments in ``ARGN``. Below is a trivial example of
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
342 providing a wrapper function for CMake's built in function ``add_dependencies``.
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
343
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
344 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
345
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
346 function(add_deps target)
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
347 add_dependencies(${target} ${ARGN})
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
348 endfunction()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
349
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
350 This example defines a new macro named ``add_deps`` which takes a required first
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
351 argument, and just calls another function passing through the first argument and
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
352 all trailing arguments.
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
353
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
354 CMake provides a module ``CMakeParseArguments`` which provides an implementation
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
355 of advanced argument parsing. We use this all over LLVM, and it is recommended
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
356 for any function that has complex argument-based behaviors or optional
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
357 arguments. CMake's official documentation for the module is in the
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
358 ``cmake-modules`` manpage, and is also available at the
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
359 `cmake-modules online documentation
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
360 <https://cmake.org/cmake/help/v3.4/module/CMakeParseArguments.html>`_.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
361
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
362 .. note::
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
363 As of CMake 3.5 the cmake_parse_arguments command has become a native command
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
364 and the CMakeParseArguments module is empty and only left around for
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
365 compatibility.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
366
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
367 Functions Vs Macros
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
368 -------------------
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
369
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
370 Functions and Macros look very similar in how they are used, but there is one
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
371 fundamental difference between the two. Functions have their own scope, and
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
372 macros don't. This means variables set in macros will bleed out into the calling
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
373 scope. That makes macros suitable for defining very small bits of functionality
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
374 only.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
375
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
376 The other difference between CMake functions and macros is how arguments are
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
377 passed. Arguments to macros are not set as variables, instead dereferences to
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
378 the parameters are resolved across the macro before executing it. This can
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
379 result in some unexpected behavior if using unreferenced variables. For example:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
380
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
381 .. code-block:: cmake
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
382
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
383 macro(print_list my_list)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
384 foreach(var IN LISTS my_list)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
385 message("${var}")
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
386 endforeach()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
387 endmacro()
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
388
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
389 set(my_list a b c d)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
390 set(my_list_of_numbers 1 2 3 4)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
391 print_list(my_list_of_numbers)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
392 # prints:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
393 # a
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
394 # b
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
395 # c
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
396 # d
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
397
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
398 Generally speaking this issue is uncommon because it requires using
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
399 non-dereferenced variables with names that overlap in the parent scope, but it
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
400 is important to be aware of because it can lead to subtle bugs.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
401
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
402 LLVM Project Wrappers
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
403 =====================
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
404
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
405 LLVM projects provide lots of wrappers around critical CMake built-in commands.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
406 We use these wrappers to provide consistent behaviors across LLVM components
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
407 and to reduce code duplication.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
408
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
409 We generally (but not always) follow the convention that commands prefaced with
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
410 ``llvm_`` are intended to be used only as building blocks for other commands.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
411 Wrapper commands that are intended for direct use are generally named following
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
412 with the project in the middle of the command name (i.e. ``add_llvm_executable``
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
413 is the wrapper for ``add_executable``). The LLVM ``add_*`` wrapper functions are
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
414 all defined in ``AddLLVM.cmake`` which is installed as part of the LLVM
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
415 distribution. It can be included and used by any LLVM sub-project that requires
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
416 LLVM.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
417
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
418 .. note::
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
419
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
420 Not all LLVM projects require LLVM for all use cases. For example compiler-rt
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
421 can be built without LLVM, and the compiler-rt sanitizer libraries are used
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
422 with GCC.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
423
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
424 Useful Built-in Commands
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
425 ========================
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
426
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
427 CMake has a bunch of useful built-in commands. This document isn't going to
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
428 go into details about them because The CMake project has excellent
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
429 documentation. To highlight a few useful functions see:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
430
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
431 * `add_custom_command <https://cmake.org/cmake/help/v3.4/command/add_custom_command.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
432 * `add_custom_target <https://cmake.org/cmake/help/v3.4/command/add_custom_target.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
433 * `file <https://cmake.org/cmake/help/v3.4/command/file.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
434 * `list <https://cmake.org/cmake/help/v3.4/command/list.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
435 * `math <https://cmake.org/cmake/help/v3.4/command/math.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
436 * `string <https://cmake.org/cmake/help/v3.4/command/string.html>`_
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
437
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
438 The full documentation for CMake commands is in the ``cmake-commands`` manpage
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
439 and available on `CMake's website <https://cmake.org/cmake/help/v3.4/manual/cmake-commands.7.html>`_