Replace misleading example in the if() documentation (#10773)

Remove the example explained by the misleading phrase "CMake will treat
it as if you wrote".  This was originally added by commit a73071ca
(modified the if command to address bug 9123 some, 2009-06-12).  Later
related information elsewhere in the documentation was corrected and
made precise by commit cb185d93 (Fix if() command and CMP0012 OLD/NEW
behavior, 2009-10-27) but the misleading example was not corrected.

Replace the example with a correct one that more directly covers the
case that typically surprises newcomers.  Avoid recommending a "correct"
way to write code because this behavior is always specific to each case.
Also update the main documentation of the behavior to be more explicit.
This commit is contained in:
Brad King 2011-01-14 18:28:56 -05:00
parent 63d21c1f8e
commit e4e14e8568
1 changed files with 25 additions and 34 deletions

View File

@ -126,9 +126,12 @@ public:
"False if the constant is 0, OFF, NO, FALSE, N, IGNORE, \"\", "
"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:"
"\n"
" if(<variable>)\n"
"True if the variable's value is not a false constant."
"True if the variable is defined to a value that is not a false "
"constant. False otherwise. "
"\n"
" if(NOT <expression>)\n"
"True if the expression is not true."
@ -199,38 +202,26 @@ public:
"that contains them."
"\n"
"The if statement was written fairly early in CMake's history "
"and it has some convenience features that are worth covering. "
"The if statement reduces operations until there is "
"a single remaining value, at that point if the case "
"insensitive value is: ON, 1, YES, TRUE, Y it returns true, if "
"it is OFF, 0, NO, FALSE, N, NOTFOUND, *-NOTFOUND, IGNORE it "
"will return false. \n"
"This is fairly reasonable. The convenience feature that sometimes "
"throws new authors is how CMake handles values that do not "
"match the true or false list. Those values are treated as "
"variables and are dereferenced even though they do not have "
"the required ${} syntax. This means that if you write\n"
" if (boobah)\n"
"CMake will treat it as if you wrote \n"
" if (${boobah})\n"
"likewise if you write \n"
" if (fubar AND sol)\n"
"CMake will conveniently treat it as \n"
" if (\"${fubar}\" AND \"${sol}\")\n"
"The later is really the correct way to write it, but the "
"former will work as well. Only some operations in the if "
"statement have this special handling of arguments. The "
"specific details follow: \n"
"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. "
"Note that normal variable evaluation with ${} applies before the "
"if command even receives the arguments. "
"Therefore code like\n"
" set(var1 OFF)\n"
" set(var2 \"var1\")\n"
" if(${var2})\n"
"appears to the if command as\n"
" if(var1)\n"
"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\n"
" if(var2)\n"
"which is true because var2 is defined to \"var1\" which is not "
"a false constant."
"\n"
"Automatic evaluation applies in the other cases as follows:\n"
"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 "