math(EXPR) rejects expressions with negative numbers. This is awful because math() can reject its own negative results. For example, this code fails:

 math(EXPR negative "1 - 2")
 math(EXPR sum "100 + ${negative}")

The second expression, "100 + -1", causes an error.

This contradicts cmake --help-command math, which claims, "Supported operators are + - * / % | & ^ ~ << >> * / %. They have the same meaning as they do in c code."

I can write -2 or ~2 in C, but not in CMake. The ~ (bitwise not) seems impossible to use. My every attempt to use ~ in math() causes an error.

To fix this bug, I taught the grammar about unary operators:

diff --git a/Source/cmExprParser.y b/Source/cmExprParser.y
index 317b0ba..57820ec 100644
--- a/Source/cmExprParser.y
+++ b/Source/cmExprParser.y
@@ -150,6 +150,16 @@ term exp_MOD factor
 {$<Number>$ = $<Number>1 % $<Number>3;}

 factor:
+value
+{$<Number>$ = $<Number>1;}
+|
+exp_MINUS factor
+{$<Number>$ = -$<Number>2;}
+|
+exp_NOT factor
+{$<Number>$ = ~$<Number>2;}
+
+value:
 exp_NUMBER
 {$<Number>$ = $<Number>1;}
 |

I pasted this same patch at http://pastebin.com/7j5Pu3AL

After applying this patch, one must run the bison command from the comment in cmExprParser.y.

--George Koehler

--

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to