Language Basics#
Single Line Comments#
Like in C++ (well, approximately 🤨)
Single-line comments
# message("hello")
message("hello") # comment
Multiline Comments (“Bracketed Comments”)#
Start with a hash (“#”), two opening square brackets (“[“), interleaved with any number of equal signs (“=”)
Closed with the same pattern, only with closing square brackets (“]”)
#[[
message("this message is commented out")
#]]
Nesting of comments possible by varying the number of equal signs
#[[
message("this message is commented out")
#[==[
message("this message is commented out too")
#]==]
#]]
Trick: turning multiline nested comments into live code - comment out the comment
##[[ # <--- this is now a single-line comment
message("this message is not commented out anymore")
#[==[
message("this message is still commented out")
#]==]
#]] # <--- this is now a single-line comment (it lacks its opening counterpart)
Command Execution#
Command names are case insensitive (arguments are just strings, so sensitivity depends upon what the command wants from them)
Arguments are separated by whitespaces
Example: command
message
invoked with two arguments
message("hello" world)
MESSAGE("hello" world) # same
Message("hello" world) # same
outputs
...
helloworld
helloworld
helloworld
...
Commands: String Evaluation, And Quoting#
When are aruments quoted?
⟶ when you want evaluation
⟶ interpolation of variables into them
Different argument type
Bracketed arguments
Quoted arguments
Unquoted arguments
Commands: Bracketed Arguments#
Passing multiline strings into commands
Much like multiline comments
Of limited use - pre-formatted text blocks, at most
message([[this is line 1
this is line 2]]
)
# same -->
message([==[this is line 1
this is line 2]==])
No string interpolation occurs
set(some_variable "value")
message([[the variable
${some_variable} is not interpolated]])
$ cmake -P bracket-no-evaluate.cmake
the variable
${some_variable} is not interpolated
Commands: Quoted Arguments#
C-like escape chararcters
message("*** A Clike linefeed (\\n): >>>\n separate line\n<<<") message("*** A C-like double-quote escape: \"")
$ cmake -P quoted-c-escapes.cmake *** A Clike linefeed (\n): >>> separate line <<< *** A C-like double-quote escape: "
Multiline strings
message("This is a multiline string Second line")
$ cmake -P multiline-strings.cmake This is a multiline string Second line
Variable expansion
set(some_variable "value") message("Here is the content of \"some_variable\": >>>${some_variable}<<<")
$ cmake -P variable-expansion.cmake Here is the content of "some_variable": >>>value<<<
Commands: Unquoted Arguments#
Attention
Always Quote Arguments
Unquoted arguments, if used correctly, can save a few keystrokes
It’s just hard to use unquoted arguments correctly
⟶ Try to always quote your arguments!
Correct usage example
set(some_variable "some value") message(some_variable) message(${some_variable}) message("${some_variable}") # <--- MUCH preferred
$ cmake -P unquoted-arguments-correct.cmake some_variable some value some value
List confusion
Lists are strings that are separated by
;
⟶ what if a string contains;
?set(some_variable "undesired;hello;world") message(some_variable) message(${some_variable}) message("${some_variable}") # <--- MUCH preferred
$ cmake -P unquoted-arguments-list.cmake some_variable undesiredhelloworld undesired;hello;world