summaryrefslogtreecommitdiffstats
path: root/Help/command/if.rst
diff options
context:
space:
mode:
Diffstat (limited to 'Help/command/if.rst')
-rw-r--r--Help/command/if.rst238
1 files changed, 238 insertions, 0 deletions
diff --git a/Help/command/if.rst b/Help/command/if.rst
new file mode 100644
index 0000000..b879ae1
--- /dev/null
+++ b/Help/command/if.rst
@@ -0,0 +1,238 @@
+if
+--
+
+Conditionally execute a group of commands.
+
+::
+
+ if(expression)
+ # then section.
+ COMMAND1(ARGS ...)
+ COMMAND2(ARGS ...)
+ ...
+ elseif(expression2)
+ # elseif section.
+ COMMAND1(ARGS ...)
+ COMMAND2(ARGS ...)
+ ...
+ else(expression)
+ # else section.
+ COMMAND1(ARGS ...)
+ COMMAND2(ARGS ...)
+ ...
+ endif(expression)
+
+Evaluates the given expression. If the result is true, the commands
+in the THEN section are invoked. Otherwise, the commands in the else
+section are invoked. The elseif and else sections are optional. You
+may have multiple elseif clauses. Note that the expression in the
+else and endif clause is optional. Long expressions can be used and
+there is a traditional order of precedence. Parenthetical expressions
+are evaluated first followed by unary operators such as EXISTS,
+COMMAND, and DEFINED. Then any EQUAL, LESS, GREATER, STRLESS,
+STRGREATER, STREQUAL, MATCHES will be evaluated. Then NOT operators
+and finally AND, OR operators will be evaluated. Possible expressions
+are:
+
+::
+
+ if(<constant>)
+
+True if the constant is 1, ON, YES, TRUE, Y, or a non-zero number.
+False if the constant is 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, '',
+or ends in the suffix '-NOTFOUND'. Named boolean constants are
+case-insensitive. If the argument is not one of these constants, it
+is treated as a variable:
+
+::
+
+ if(<variable>)
+
+True if the variable is defined to a value that is not a false
+constant. False otherwise. (Note macro arguments are not variables.)
+
+::
+
+ if(NOT <expression>)
+
+True if the expression is not true.
+
+::
+
+ if(<expr1> AND <expr2>)
+
+True if both expressions would be considered true individually.
+
+::
+
+ if(<expr1> OR <expr2>)
+
+True if either expression would be considered true individually.
+
+::
+
+ if(COMMAND command-name)
+
+True if the given name is a command, macro or function that can be
+invoked.
+
+::
+
+ if(POLICY policy-id)
+
+True if the given name is an existing policy (of the form CMP<NNNN>).
+
+::
+
+ if(TARGET target-name)
+
+True if the given name is an existing target, built or imported.
+
+::
+
+ if(EXISTS file-name)
+ if(EXISTS directory-name)
+
+True if the named file or directory exists. Behavior is well-defined
+only for full paths.
+
+::
+
+ if(file1 IS_NEWER_THAN file2)
+
+True if file1 is newer than file2 or if one of the two files doesn't
+exist. Behavior is well-defined only for full paths. If the file
+time stamps are exactly the same, an IS_NEWER_THAN comparison returns
+true, so that any dependent build operations will occur in the event
+of a tie. This includes the case of passing the same file name for
+both file1 and file2.
+
+::
+
+ if(IS_DIRECTORY directory-name)
+
+True if the given name is a directory. Behavior is well-defined only
+for full paths.
+
+::
+
+ if(IS_SYMLINK file-name)
+
+True if the given name is a symbolic link. Behavior is well-defined
+only for full paths.
+
+::
+
+ if(IS_ABSOLUTE path)
+
+True if the given path is an absolute path.
+
+::
+
+ if(<variable|string> MATCHES regex)
+
+True if the given string or variable's value matches the given regular
+expression.
+
+::
+
+ if(<variable|string> LESS <variable|string>)
+ if(<variable|string> GREATER <variable|string>)
+ if(<variable|string> EQUAL <variable|string>)
+
+True if the given string or variable's value is a valid number and the
+inequality or equality is true.
+
+::
+
+ if(<variable|string> STRLESS <variable|string>)
+ if(<variable|string> STRGREATER <variable|string>)
+ if(<variable|string> STREQUAL <variable|string>)
+
+True if the given string or variable's value is lexicographically less
+(or greater, or equal) than the string or variable on the right.
+
+::
+
+ if(<variable|string> VERSION_LESS <variable|string>)
+ if(<variable|string> VERSION_EQUAL <variable|string>)
+ if(<variable|string> VERSION_GREATER <variable|string>)
+
+Component-wise integer version number comparison (version format is
+major[.minor[.patch[.tweak]]]).
+
+::
+
+ if(DEFINED <variable>)
+
+True if the given variable is defined. It does not matter if the
+variable is true or false just if it has been set.
+
+::
+
+ if((expression) AND (expression OR (expression)))
+
+The expressions inside the parenthesis are evaluated first and then
+the remaining expression is evaluated as in the previous examples.
+Where there are nested parenthesis the innermost are evaluated as part
+of evaluating the expression that contains them.
+
+The if command was written very early in CMake's history, predating
+the ${} variable evaluation syntax, and for convenience evaluates
+variables named by its arguments as shown in the above signatures.
+Note that normal variable evaluation with ${} applies before the if
+command even receives the arguments. Therefore code like
+
+::
+
+ set(var1 OFF)
+ set(var2 "var1")
+ if(${var2})
+
+appears to the if command as
+
+::
+
+ if(var1)
+
+and is evaluated according to the if(<variable>) case documented
+above. The result is OFF which is false. However, if we remove the
+${} from the example then the command sees
+
+::
+
+ if(var2)
+
+which is true because var2 is defined to "var1" which is not a false
+constant.
+
+Automatic evaluation applies in the other cases whenever the
+above-documented signature accepts <variable|string>:
+
+1) The left hand argument to MATCHES is first checked to see if it is
+a defined variable, if so the variable's value is used, otherwise the
+original value is used.
+
+2) If the left hand argument to MATCHES is missing it returns false
+without error
+
+3) Both left and right hand arguments to LESS GREATER EQUAL are
+independently tested to see if they are defined variables, if so their
+defined values are used otherwise the original value is used.
+
+4) Both left and right hand arguments to STRLESS STREQUAL STRGREATER
+are independently tested to see if they are defined variables, if so
+their defined values are used otherwise the original value is used.
+
+5) Both left and right hand argumemnts to VERSION_LESS VERSION_EQUAL
+VERSION_GREATER are independently tested to see if they are defined
+variables, if so their defined values are used otherwise the original
+value is used.
+
+6) The right hand argument to NOT is tested to see if it is a boolean
+constant, if so the value is used, otherwise it is assumed to be a
+variable and it is dereferenced.
+
+7) The left and right hand arguments to AND OR are independently
+tested to see if they are boolean constants, if so they are used as
+such, otherwise they are assumed to be variables and are dereferenced.