Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
CMake
CMake
Commits
2af966d9
Commit
2af966d9
authored
Dec 27, 2013
by
Stephen Kelly
Browse files
Genex: Add EQUAL expression.
Support decimal, hex, octal and binary literals.
parent
2d663800
Changes
5
Hide whitespace changes
Inline
Side-by-side
Help/manual/cmake-generator-expressions.7.rst
View file @
2af966d9
...
...
@@ -55,6 +55,8 @@ otherwise expands to nothing.
``0`` if ``?`` is ``1``, else ``1``
``$<STREQUAL:a,b>``
``1`` if ``a`` is STREQUAL ``b``, else ``0``
``$<EQUAL:a,b>``
``1`` if ``a`` is EQUAL ``b`` in a numeric comparison, else ``0``
``$<CONFIG:cfg>``
``1`` if config is ``cfg``, else ``0``. This is a case-insensitive comparison.
The mapping in :prop_tgt:`MAP_IMPORTED_CONFIG_<CONFIG>` is also considered by
...
...
Source/cmGeneratorExpressionEvaluator.cxx
View file @
2af966d9
...
...
@@ -19,6 +19,7 @@
#include <cmsys/String.h>
#include <assert.h>
#include <errno.h>
//----------------------------------------------------------------------------
#if !defined(__SUNPRO_CC) || __SUNPRO_CC > 0x510
...
...
@@ -196,6 +197,92 @@ static const struct StrEqualNode : public cmGeneratorExpressionNode
}
}
strEqualNode
;
//----------------------------------------------------------------------------
static
const
struct
EqualNode
:
public
cmGeneratorExpressionNode
{
EqualNode
()
{}
virtual
int
NumExpectedParameters
()
const
{
return
2
;
}
std
::
string
Evaluate
(
const
std
::
vector
<
std
::
string
>
&
parameters
,
cmGeneratorExpressionContext
*
context
,
const
GeneratorExpressionContent
*
content
,
cmGeneratorExpressionDAGChecker
*
)
const
{
char
*
pEnd
;
int
base
=
0
;
bool
flipSign
=
false
;
const
char
*
lhs
=
parameters
[
0
].
c_str
();
if
(
cmHasLiteralPrefix
(
lhs
,
"0b"
))
{
base
=
2
;
lhs
+=
2
;
}
if
(
cmHasLiteralPrefix
(
lhs
,
"-0b"
))
{
base
=
2
;
lhs
+=
3
;
flipSign
=
true
;
}
if
(
cmHasLiteralPrefix
(
lhs
,
"+0b"
))
{
base
=
2
;
lhs
+=
3
;
}
long
lnum
=
strtol
(
lhs
,
&
pEnd
,
base
);
if
(
pEnd
==
lhs
||
*
pEnd
!=
'\0'
||
errno
==
ERANGE
)
{
reportError
(
context
,
content
->
GetOriginalExpression
(),
"$<EQUAL> parameter "
+
parameters
[
0
]
+
" is not a valid integer."
);
return
std
::
string
();
}
if
(
flipSign
)
{
lnum
=
-
lnum
;
}
base
=
0
;
flipSign
=
false
;
const
char
*
rhs
=
parameters
[
1
].
c_str
();
if
(
cmHasLiteralPrefix
(
rhs
,
"0b"
))
{
base
=
2
;
rhs
+=
2
;
}
if
(
cmHasLiteralPrefix
(
rhs
,
"-0b"
))
{
base
=
2
;
rhs
+=
3
;
flipSign
=
true
;
}
if
(
cmHasLiteralPrefix
(
rhs
,
"+0b"
))
{
base
=
2
;
rhs
+=
3
;
}
long
rnum
=
strtol
(
rhs
,
&
pEnd
,
base
);
if
(
pEnd
==
rhs
||
*
pEnd
!=
'\0'
||
errno
==
ERANGE
)
{
reportError
(
context
,
content
->
GetOriginalExpression
(),
"$<EQUAL> parameter "
+
parameters
[
1
]
+
" is not a valid integer."
);
return
std
::
string
();
}
if
(
flipSign
)
{
rnum
=
-
rnum
;
}
return
lnum
==
rnum
?
"1"
:
"0"
;
}
}
equalNode
;
//----------------------------------------------------------------------------
static
const
struct
LowerCaseNode
:
public
cmGeneratorExpressionNode
{
...
...
@@ -1492,6 +1579,8 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier)
return
&
targetSoNameFileDirNode
;
else
if
(
identifier
==
"STREQUAL"
)
return
&
strEqualNode
;
else
if
(
identifier
==
"EQUAL"
)
return
&
equalNode
;
else
if
(
identifier
==
"LOWER_CASE"
)
return
&
lowerCaseNode
;
else
if
(
identifier
==
"UPPER_CASE"
)
...
...
Tests/CompatibleInterface/CMakeLists.txt
View file @
2af966d9
...
...
@@ -60,7 +60,7 @@ set_property(TARGET CompatibleInterface PROPERTY STRING_PROP2 prop2)
set_property
(
TARGET CompatibleInterface PROPERTY STRING_PROP3 prop3
)
set_property
(
TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP1 50
)
set_property
(
TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP2 250
)
set_property
(
TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP3 0x
A
)
set_property
(
TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP3 0x
a
)
set_property
(
TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP4 0x1A
)
set_property
(
TARGET CompatibleInterface PROPERTY NUMBER_MAX_PROP1 50
)
set_property
(
TARGET CompatibleInterface PROPERTY NUMBER_MAX_PROP2 250
)
...
...
@@ -75,7 +75,7 @@ target_compile_definitions(CompatibleInterface
$<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP3>,prop3>:STRING_PROP3>
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP1>,50>:NUMBER_MIN_PROP1=50>
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP2>,200>:NUMBER_MIN_PROP2=200>
$<$<
STR
EQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP3>,0xA>:NUMBER_MIN_PROP3=0xA>
$<$<EQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP3>,0xA>:NUMBER_MIN_PROP3=0xA>
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP4>,0x10>:NUMBER_MIN_PROP4=0x10>
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MAX_PROP1>,100>:NUMBER_MAX_PROP1=100>
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MAX_PROP2>,250>:NUMBER_MAX_PROP2=250>
...
...
Tests/GeneratorExpression/CMakeLists.txt
View file @
2af966d9
...
...
@@ -196,6 +196,27 @@ add_custom_target(check-part3 ALL
-Dlower_case=$<LOWER_CASE:Mi,XeD>
-Dupper_case=$<UPPER_CASE:MiX,eD>
-Dmake_c_identifier=$<MAKE_C_IDENTIFIER:4f,oo:+bar-$>
-Dequal1=$<EQUAL:1,2>
-Dequal2=$<EQUAL:1,1>
-Dequal3=$<EQUAL:0x1,1>
-Dequal4=$<EQUAL:0x1,2>
-Dequal5=$<EQUAL:0xA,0xa>
-Dequal6=$<EQUAL:0xA,10>
-Dequal7=$<EQUAL:0xA,012>
-Dequal8=$<EQUAL:10,012>
-Dequal9=$<EQUAL:10,010>
-Dequal10=$<EQUAL:10,0b1010>
-Dequal11=$<EQUAL:-10,-0xa>
-Dequal12=$<EQUAL:10,+0xa>
-Dequal13=$<EQUAL:+10,+0xa>
-Dequal14=$<EQUAL:+10,0xa>
-Dequal15=$<EQUAL:-10,-0xa>
-Dequal16=$<EQUAL:-10,-0b1010>
-Dequal17=$<EQUAL:-10,+0b1010>
-Dequal18=$<EQUAL:10,+0b1010>
-Dequal19=$<EQUAL:10,+012>
-Dequal20=$<EQUAL:10,-012>
-Dequal21=$<EQUAL:-10,-012>
-P
${
CMAKE_CURRENT_SOURCE_DIR
}
/check-part3.cmake
COMMAND
${
CMAKE_COMMAND
}
-E echo
"check done (part 3 of 3)"
VERBATIM
...
...
Tests/GeneratorExpression/check-part3.cmake
View file @
2af966d9
...
...
@@ -37,3 +37,24 @@ endforeach()
check
(
lower_case
"mi,xed"
)
check
(
upper_case
"MIX,ED"
)
check
(
make_c_identifier
"_4f_oo__bar__"
)
check
(
equal1
"0"
)
check
(
equal2
"1"
)
check
(
equal3
"1"
)
check
(
equal4
"0"
)
check
(
equal5
"1"
)
check
(
equal6
"1"
)
check
(
equal7
"1"
)
check
(
equal8
"1"
)
check
(
equal9
"0"
)
check
(
equal10
"1"
)
check
(
equal11
"1"
)
check
(
equal12
"1"
)
check
(
equal13
"1"
)
check
(
equal14
"1"
)
check
(
equal15
"1"
)
check
(
equal16
"1"
)
check
(
equal17
"0"
)
check
(
equal18
"1"
)
check
(
equal19
"1"
)
check
(
equal20
"0"
)
check
(
equal21
"1"
)
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment