From 4801eb633392eff95586709df570dabcdf0f5db1 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 4 Oct 2012 00:33:21 +0200 Subject: GenEx: It is not an error to specify an empty parameter This is allowed by the CONFIG and STREQUAL expressions. --- Source/cmGeneratorExpressionParser.cxx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Source/cmGeneratorExpressionParser.cxx b/Source/cmGeneratorExpressionParser.cxx index d3c4aa3..344e9f8 100644 --- a/Source/cmGeneratorExpressionParser.cxx +++ b/Source/cmGeneratorExpressionParser.cxx @@ -142,10 +142,6 @@ void cmGeneratorExpressionParser::ParseGeneratorExpression( --this->NestingLevel; ++this->it; } - if (parameters.empty()) - { - // ERROR - } } if (nestedLevel != this->NestingLevel) -- cgit v0.12 From d70650d6c3c94d1d903eb7f21998861d8f7bf2c6 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 4 Oct 2012 00:32:22 +0200 Subject: GenEx: Return after error reported. --- Source/cmGeneratorExpressionEvaluator.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 22f60d4..ad5f83c 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -288,6 +288,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode << target << "\" not found."; reportError(context, content->GetOriginalExpression(), e.str()); + return std::string(); } propertyName = parameters.at(1); } -- cgit v0.12 From a4985a9af9ed9762c1a51c369981609dd24f7425 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 4 Oct 2012 00:32:39 +0200 Subject: GenEx: Report actual target name not found, not "0" each time. --- Source/cmGeneratorExpressionEvaluator.cxx | 5 +++-- .../TargetPropertyGeneratorExpressions/BadNonTarget-result.txt | 1 + .../TargetPropertyGeneratorExpressions/BadNonTarget-stderr.txt | 6 ++++++ .../RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget.cmake | 7 +++++++ .../RunCMake/TargetPropertyGeneratorExpressions/RunCMakeTest.cmake | 1 + 5 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget-result.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget-stderr.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget.cmake diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index ad5f83c..80cffe9 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -278,14 +278,15 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode std::string propertyName = *parameters.begin(); if (parameters.size() == 2) { + std::string targetName = parameters.front(); target = context->Makefile->FindGeneratorTargetToUse( - parameters.begin()->c_str()); + targetName.c_str()); if (!target) { cmOStringStream e; e << "Target \"" - << target + << targetName << "\" not found."; reportError(context, content->GetOriginalExpression(), e.str()); return std::string(); diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget-result.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget-stderr.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget-stderr.txt new file mode 100644 index 0000000..d2ac7a9 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget-stderr.txt @@ -0,0 +1,6 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + Target "NonExistant" not found.$ diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget.cmake b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget.cmake new file mode 100644 index 0000000..b020c08 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadNonTarget.cmake @@ -0,0 +1,7 @@ + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp" + "int main(int, char **) { return 0; }\n") + +add_executable(TargetPropertyGeneratorExpressions + "${CMAKE_CURRENT_BINARY_DIR}/main.cpp") +include_directories("$") diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/RunCMakeTest.cmake b/Tests/RunCMake/TargetPropertyGeneratorExpressions/RunCMakeTest.cmake index f2ff05b..e2abd56 100644 --- a/Tests/RunCMake/TargetPropertyGeneratorExpressions/RunCMakeTest.cmake +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/RunCMakeTest.cmake @@ -6,3 +6,4 @@ run_cmake(BadSelfReference3) run_cmake(BadSelfReference4) run_cmake(BadSelfReference5) run_cmake(BadSelfReference6) +run_cmake(BadNonTarget) -- cgit v0.12 From b3d8f5dab7f33dba4f327ab7ef4bd7ea90d6b651 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 4 Oct 2012 00:34:03 +0200 Subject: GenEx: Parse comma after colon tokens specially Otherwise the comma is treated as plain text by ParseContent. $ should be valid and true. $ should be valid and false. $ should be non-valid as it is 3 parameters. $ should be non-valid as it is 3 parameters. Additionally, this allows reporting the correct error for other expressions. For example $ should be invalid because it has an empty target and empty property. It shouldn't attempt to read the property ',' on the 'implicit this' target. --- Source/cmGeneratorExpressionParser.cxx | 8 ++++- Tests/GeneratorExpression/CMakeLists.txt | 2 ++ Tests/GeneratorExpression/check.cmake | 2 ++ .../RunCMake/GeneratorExpression/BadNOT-stderr.txt | 2 +- .../GeneratorExpression/BadStrEqual-result.txt | 1 + .../GeneratorExpression/BadStrEqual-stderr.txt | 38 ++++++++++++++++++++++ .../RunCMake/GeneratorExpression/BadStrEqual.cmake | 6 ++++ .../GeneratorExpression/RunCMakeTest.cmake | 1 + 8 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 Tests/RunCMake/GeneratorExpression/BadStrEqual-result.txt create mode 100644 Tests/RunCMake/GeneratorExpression/BadStrEqual-stderr.txt create mode 100644 Tests/RunCMake/GeneratorExpression/BadStrEqual.cmake diff --git a/Source/cmGeneratorExpressionParser.cxx b/Source/cmGeneratorExpressionParser.cxx index 344e9f8..d95e1cc 100644 --- a/Source/cmGeneratorExpressionParser.cxx +++ b/Source/cmGeneratorExpressionParser.cxx @@ -118,10 +118,16 @@ void cmGeneratorExpressionParser::ParseGeneratorExpression( colonToken = this->it; parameters.resize(parameters.size() + 1); ++this->it; + while (this->it->TokenType == cmGeneratorExpressionToken::CommaSeparator) + { + commaTokens.push_back(this->it); + parameters.resize(parameters.size() + 1); + ++this->it; + } while(this->it->TokenType != cmGeneratorExpressionToken::EndExpression) { this->ParseContent(*(parameters.end() - 1)); - if (this->it->TokenType == cmGeneratorExpressionToken::CommaSeparator) + while (this->it->TokenType == cmGeneratorExpressionToken::CommaSeparator) { commaTokens.push_back(this->it); parameters.resize(parameters.size() + 1); diff --git a/Tests/GeneratorExpression/CMakeLists.txt b/Tests/GeneratorExpression/CMakeLists.txt index 79a8abb..6494107 100644 --- a/Tests/GeneratorExpression/CMakeLists.txt +++ b/Tests/GeneratorExpression/CMakeLists.txt @@ -37,6 +37,8 @@ add_custom_target(check ALL -Dtest_strequal_angle_r=$,$> -Dtest_strequal_comma=$,$> -Dtest_strequal_angle_r_comma=$,$> + -Dtest_strequal_both_empty=$ + -Dtest_strequal_one_empty=$ -Dtest_angle_r=$ -Dtest_comma=$ -P ${CMAKE_CURRENT_SOURCE_DIR}/check.cmake diff --git a/Tests/GeneratorExpression/check.cmake b/Tests/GeneratorExpression/check.cmake index 6fb87a2..7192470 100644 --- a/Tests/GeneratorExpression/check.cmake +++ b/Tests/GeneratorExpression/check.cmake @@ -38,5 +38,7 @@ check(test_strequal_no_yes "0") check(test_strequal_angle_r "1") check(test_strequal_comma "1") check(test_strequal_angle_r_comma "0") +check(test_strequal_both_empty "1") +check(test_strequal_one_empty "0") check(test_angle_r ">") check(test_comma ",") diff --git a/Tests/RunCMake/GeneratorExpression/BadNOT-stderr.txt b/Tests/RunCMake/GeneratorExpression/BadNOT-stderr.txt index 32169c5..e5e628c 100644 --- a/Tests/RunCMake/GeneratorExpression/BadNOT-stderr.txt +++ b/Tests/RunCMake/GeneratorExpression/BadNOT-stderr.txt @@ -20,7 +20,7 @@ CMake Error at BadNOT.cmake:1 \(add_custom_target\): \$ - \$ parameter must resolve to exactly one '0' or '1' value. + \$ expression requires exactly one parameter. Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) + diff --git a/Tests/RunCMake/GeneratorExpression/BadStrEqual-result.txt b/Tests/RunCMake/GeneratorExpression/BadStrEqual-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/BadStrEqual-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/GeneratorExpression/BadStrEqual-stderr.txt b/Tests/RunCMake/GeneratorExpression/BadStrEqual-stderr.txt new file mode 100644 index 0000000..dd0d931 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/BadStrEqual-stderr.txt @@ -0,0 +1,38 @@ +CMake Error at BadStrEqual.cmake:1 \(add_custom_target\): + Error evaluating generator expression: + + \$ + + \$ expression requires 2 comma separated parameters, but got 0 + instead. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) ++CMake Error at BadStrEqual.cmake:1 \(add_custom_target\): + Error evaluating generator expression: + + \$ + + \$ expression requires 2 comma separated parameters, but got 1 + instead. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) ++ +CMake Error at BadStrEqual.cmake:1 \(add_custom_target\): + Error evaluating generator expression: + + \$ + + \$ expression requires 2 comma separated parameters, but got 3 + instead. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) ++ +CMake Error at BadStrEqual.cmake:1 \(add_custom_target\): + Error evaluating generator expression: + + \$ + + \$ expression requires 2 comma separated parameters, but got 3 + instead. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\)$ diff --git a/Tests/RunCMake/GeneratorExpression/BadStrEqual.cmake b/Tests/RunCMake/GeneratorExpression/BadStrEqual.cmake new file mode 100644 index 0000000..56eb458 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/BadStrEqual.cmake @@ -0,0 +1,6 @@ +add_custom_target(check ALL COMMAND check + $ + $ + $ + $ + VERBATIM) diff --git a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake index ed18f25..18a47ae 100644 --- a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake +++ b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake @@ -4,3 +4,4 @@ run_cmake(BadCONFIG) run_cmake(BadOR) run_cmake(BadAND) run_cmake(BadNOT) +run_cmake(BadStrEqual) -- cgit v0.12 From 8b3b88abd82a36daf541dfa7094f978e0be08efc Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 4 Oct 2012 00:31:24 +0200 Subject: GenEx: Validate target and property names. They must be non-empty, and match a restrictive regexp. --- Source/cmGeneratorExpressionEvaluator.cxx | 47 +++++++++++++++++++++- .../BadInvalidName1-result.txt | 1 + .../BadInvalidName1-stderr.txt | 6 +++ .../BadInvalidName1.cmake | 7 ++++ .../BadInvalidName2-result.txt | 1 + .../BadInvalidName2-stderr.txt | 6 +++ .../BadInvalidName2.cmake | 7 ++++ .../BadInvalidName3-result.txt | 1 + .../BadInvalidName3-stderr.txt | 6 +++ .../BadInvalidName3.cmake | 7 ++++ .../BadInvalidName4-result.txt | 1 + .../BadInvalidName4-stderr.txt | 6 +++ .../BadInvalidName4.cmake | 9 +++++ .../BadInvalidName5-result.txt | 1 + .../BadInvalidName5-stderr.txt | 7 ++++ .../BadInvalidName5.cmake | 7 ++++ .../BadInvalidName6-result.txt | 1 + .../BadInvalidName6-stderr.txt | 6 +++ .../BadInvalidName6.cmake | 7 ++++ .../BadInvalidName7-result.txt | 1 + .../BadInvalidName7-stderr.txt | 6 +++ .../BadInvalidName7.cmake | 9 +++++ .../BadInvalidName8-result.txt | 1 + .../BadInvalidName8-stderr.txt | 6 +++ .../BadInvalidName8.cmake | 7 ++++ .../RunCMakeTest.cmake | 8 ++++ 26 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-result.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-stderr.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1.cmake create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-result.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-stderr.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2.cmake create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-result.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-stderr.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3.cmake create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-result.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-stderr.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4.cmake create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-result.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-stderr.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5.cmake create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-result.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-stderr.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6.cmake create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-result.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-stderr.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7.cmake create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-result.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-stderr.txt create mode 100644 Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8.cmake diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 80cffe9..12809f4 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -274,11 +274,42 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode "$ expression requires one or two parameters"); return std::string(); } + cmsys::RegularExpression nameValidator; + nameValidator.compile("^[A-Za-z0-9_.-]+$"); + cmGeneratorTarget* target = context->Target; std::string propertyName = *parameters.begin(); if (parameters.size() == 2) { + if (parameters.begin()->empty() && parameters.at(1).empty()) + { + reportError(context, content->GetOriginalExpression(), + "$ expression requires a non-empty " + "target name and property name."); + return std::string(); + } + if (parameters.begin()->empty()) + { + reportError(context, content->GetOriginalExpression(), + "$ expression requires a non-empty " + "target name."); + return std::string(); + } + std::string targetName = parameters.front(); + propertyName = parameters.at(1); + if (!nameValidator.find(targetName.c_str())) + { + if (!nameValidator.find(propertyName.c_str())) + { + ::reportError(context, content->GetOriginalExpression(), + "Target name and property name not supported."); + return std::string(); + } + ::reportError(context, content->GetOriginalExpression(), + "Target name not supported."); + return std::string(); + } target = context->Makefile->FindGeneratorTargetToUse( targetName.c_str()); @@ -291,7 +322,21 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode reportError(context, content->GetOriginalExpression(), e.str()); return std::string(); } - propertyName = parameters.at(1); + } + + if (propertyName.empty()) + { + reportError(context, content->GetOriginalExpression(), + "$ expression requires a non-empty property " + "name."); + return std::string(); + } + + if (!nameValidator.find(propertyName.c_str())) + { + ::reportError(context, content->GetOriginalExpression(), + "Property name not supported."); + return std::string(); } cmGeneratorExpressionDAGChecker dagChecker(context->Backtrace, diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-result.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-stderr.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-stderr.txt new file mode 100644 index 0000000..3287d19 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-stderr.txt @@ -0,0 +1,6 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + Target name not supported. diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1.cmake b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1.cmake new file mode 100644 index 0000000..d5f661d --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1.cmake @@ -0,0 +1,7 @@ + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp" + "int main(int, char **) { return 0; }\n") + +add_executable(TargetPropertyGeneratorExpressions + "${CMAKE_CURRENT_BINARY_DIR}/main.cpp") +include_directories("$") diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-result.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-stderr.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-stderr.txt new file mode 100644 index 0000000..e527e22 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-stderr.txt @@ -0,0 +1,6 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + Target name and property name not supported.$ diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2.cmake b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2.cmake new file mode 100644 index 0000000..6e4c1d0 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2.cmake @@ -0,0 +1,7 @@ + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp" + "int main(int, char **) { return 0; }\n") + +add_executable(TargetPropertyGeneratorExpressions + "${CMAKE_CURRENT_BINARY_DIR}/main.cpp") +include_directories("$") diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-result.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-stderr.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-stderr.txt new file mode 100644 index 0000000..517debb --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-stderr.txt @@ -0,0 +1,6 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + Property name not supported.$ diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3.cmake b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3.cmake new file mode 100644 index 0000000..3f75aa3 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3.cmake @@ -0,0 +1,7 @@ + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp" + "int main(int, char **) { return 0; }\n") + +add_executable(TargetPropertyGeneratorExpressions + "${CMAKE_CURRENT_BINARY_DIR}/main.cpp") +include_directories("$") diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-result.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-stderr.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-stderr.txt new file mode 100644 index 0000000..eab6fb6 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-stderr.txt @@ -0,0 +1,6 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + Property name not supported.$ diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4.cmake b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4.cmake new file mode 100644 index 0000000..b616c31 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4.cmake @@ -0,0 +1,9 @@ + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp" + "int main(int, char **) { return 0; }\n") + +add_executable(foo "${CMAKE_CURRENT_BINARY_DIR}/main.cpp") + +add_executable(TargetPropertyGeneratorExpressions + "${CMAKE_CURRENT_BINARY_DIR}/main.cpp") +include_directories("$") diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-result.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-stderr.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-stderr.txt new file mode 100644 index 0000000..e2b4fc6 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-stderr.txt @@ -0,0 +1,7 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + \$ expression requires a non-empty target name and + property name. diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5.cmake b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5.cmake new file mode 100644 index 0000000..11cb6fa --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5.cmake @@ -0,0 +1,7 @@ + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp" + "int main(int, char **) { return 0; }\n") + +add_executable(TargetPropertyGeneratorExpressions + "${CMAKE_CURRENT_BINARY_DIR}/main.cpp") +include_directories("$") diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-result.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-stderr.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-stderr.txt new file mode 100644 index 0000000..e94f52f --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-stderr.txt @@ -0,0 +1,6 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + \$ expression requires a non-empty target name. diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6.cmake b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6.cmake new file mode 100644 index 0000000..bf868a5 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6.cmake @@ -0,0 +1,7 @@ + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp" + "int main(int, char **) { return 0; }\n") + +add_executable(TargetPropertyGeneratorExpressions + "${CMAKE_CURRENT_BINARY_DIR}/main.cpp") +include_directories("$") diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-result.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-stderr.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-stderr.txt new file mode 100644 index 0000000..2548215 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-stderr.txt @@ -0,0 +1,6 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + \$ expression requires a non-empty property name. diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7.cmake b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7.cmake new file mode 100644 index 0000000..36d1a79 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7.cmake @@ -0,0 +1,9 @@ + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp" + "int main(int, char **) { return 0; }\n") + +add_executable(foo "${CMAKE_CURRENT_BINARY_DIR}/main.cpp") + +add_executable(TargetPropertyGeneratorExpressions + "${CMAKE_CURRENT_BINARY_DIR}/main.cpp") +include_directories("$") diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-result.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-stderr.txt b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-stderr.txt new file mode 100644 index 0000000..2a98f6f --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-stderr.txt @@ -0,0 +1,6 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + \$ expression requires a non-empty property name. diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8.cmake b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8.cmake new file mode 100644 index 0000000..f059288 --- /dev/null +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8.cmake @@ -0,0 +1,7 @@ + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp" + "int main(int, char **) { return 0; }\n") + +add_executable(TargetPropertyGeneratorExpressions + "${CMAKE_CURRENT_BINARY_DIR}/main.cpp") +include_directories("$") diff --git a/Tests/RunCMake/TargetPropertyGeneratorExpressions/RunCMakeTest.cmake b/Tests/RunCMake/TargetPropertyGeneratorExpressions/RunCMakeTest.cmake index e2abd56..0ee3238 100644 --- a/Tests/RunCMake/TargetPropertyGeneratorExpressions/RunCMakeTest.cmake +++ b/Tests/RunCMake/TargetPropertyGeneratorExpressions/RunCMakeTest.cmake @@ -7,3 +7,11 @@ run_cmake(BadSelfReference4) run_cmake(BadSelfReference5) run_cmake(BadSelfReference6) run_cmake(BadNonTarget) +run_cmake(BadInvalidName1) +run_cmake(BadInvalidName2) +run_cmake(BadInvalidName3) +run_cmake(BadInvalidName4) +run_cmake(BadInvalidName5) +run_cmake(BadInvalidName6) +run_cmake(BadInvalidName7) +run_cmake(BadInvalidName8) -- cgit v0.12 From 354face4fa234adfe6f056dc9d3039fc135ab4ef Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 4 Oct 2012 00:36:23 +0200 Subject: GenEx: Ensure that the empty CONFIGURATION can be used conditionally. The CONFIGURATION can not be manipulated at unit testing time, so this is not unit tested further. --- Source/cmGeneratorExpressionEvaluator.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 12809f4..93895b3 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -237,11 +237,6 @@ static const struct ConfigurationTestNode : public cmGeneratorExpressionNode const GeneratorExpressionContent *content, cmGeneratorExpressionDAGChecker *) const { - if (!context->Config) - { - return std::string(); - } - cmsys::RegularExpression configValidator; configValidator.compile("^[A-Za-z0-9_]*$"); if (!configValidator.find(parameters.begin()->c_str())) @@ -250,6 +245,11 @@ static const struct ConfigurationTestNode : public cmGeneratorExpressionNode "Expression syntax not recognized."); return std::string(); } + if (!context->Config) + { + return parameters.front().empty() ? "1" : "0"; + } + return *parameters.begin() == context->Config ? "1" : "0"; } } configurationTestNode; -- cgit v0.12 From d729e8b74ccdf14d809a1b7f9260a5a1d225c2bc Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 4 Oct 2012 10:24:32 +0200 Subject: GenEx: Add test for $ with empty parameter. --- Tests/GeneratorExpression/CMakeLists.txt | 1 + Tests/GeneratorExpression/check.cmake | 1 + 2 files changed, 2 insertions(+) diff --git a/Tests/GeneratorExpression/CMakeLists.txt b/Tests/GeneratorExpression/CMakeLists.txt index 6494107..41639ac 100644 --- a/Tests/GeneratorExpression/CMakeLists.txt +++ b/Tests/GeneratorExpression/CMakeLists.txt @@ -30,6 +30,7 @@ add_custom_target(check ALL -Dtest_bool_off=$ -Dtest_bool_no=$ -Dtest_bool_n=$ + -Dtest_bool_empty=$ -Dtest_strequal_yes_yes=$ -Dtest_strequal_yes_yes_cs=$ -Dtest_strequal_yes_no=$ diff --git a/Tests/GeneratorExpression/check.cmake b/Tests/GeneratorExpression/check.cmake index 7192470..fd1e2ab 100644 --- a/Tests/GeneratorExpression/check.cmake +++ b/Tests/GeneratorExpression/check.cmake @@ -31,6 +31,7 @@ check(test_bool_on "1") check(test_bool_off "0") check(test_bool_no "0") check(test_bool_n "0") +check(test_bool_empty "0") check(test_strequal_yes_yes "1") check(test_strequal_yes_yes_cs "0") check(test_strequal_yes_no "0") -- cgit v0.12 From 78e54b99fed1bd4c899360c9df779205ce6b29ba Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 4 Oct 2012 10:27:34 +0200 Subject: GenEx: Add tests for "0" and "1" expressions with literal commas. --- Tests/GeneratorExpression/CMakeLists.txt | 2 ++ Tests/GeneratorExpression/check.cmake | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Tests/GeneratorExpression/CMakeLists.txt b/Tests/GeneratorExpression/CMakeLists.txt index 41639ac..8bc4f32 100644 --- a/Tests/GeneratorExpression/CMakeLists.txt +++ b/Tests/GeneratorExpression/CMakeLists.txt @@ -4,7 +4,9 @@ project(GeneratorExpression NONE) add_custom_target(check ALL COMMAND ${CMAKE_COMMAND} -Dtest_0=$<0:nothing> + -Dtest_0_with_comma=$<0:-Wl,--no-undefined> -Dtest_1=$<1:content> + -Dtest_1_with_comma=$<1:-Wl,--no-undefined> -Dconfig=$ -Dtest_and_0=$ -Dtest_and_0_0=$ diff --git a/Tests/GeneratorExpression/check.cmake b/Tests/GeneratorExpression/check.cmake index fd1e2ab..ec1f130 100644 --- a/Tests/GeneratorExpression/check.cmake +++ b/Tests/GeneratorExpression/check.cmake @@ -6,7 +6,9 @@ endmacro() message(STATUS "config=[${config}]") check(test_0 "") +check(test_0_with_comma "") check(test_1 "content") +check(test_1_with_comma "-Wl,--no-undefined") check(test_and_0 "0") check(test_and_0_0 "0") check(test_and_0_1 "0") -- cgit v0.12 From 7aa99270fa77a13e8e710adc0098385403d6cf7a Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 4 Oct 2012 11:21:05 +0200 Subject: GenEx: Don't use std::vector::at(int). It might not exist with GCC 2.9. --- Source/cmGeneratorExpressionEvaluator.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 93895b3..92e2052 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -173,7 +173,7 @@ static const struct StrEqualNode : public cmGeneratorExpressionNode const GeneratorExpressionContent *, cmGeneratorExpressionDAGChecker *) const { - return *parameters.begin() == parameters.at(1) ? "1" : "0"; + return *parameters.begin() == parameters[1] ? "1" : "0"; } } strEqualNode; @@ -281,7 +281,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode std::string propertyName = *parameters.begin(); if (parameters.size() == 2) { - if (parameters.begin()->empty() && parameters.at(1).empty()) + if (parameters.begin()->empty() && parameters[1].empty()) { reportError(context, content->GetOriginalExpression(), "$ expression requires a non-empty " @@ -297,7 +297,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode } std::string targetName = parameters.front(); - propertyName = parameters.at(1); + propertyName = parameters[1]; if (!nameValidator.find(targetName.c_str())) { if (!nameValidator.find(propertyName.c_str())) -- cgit v0.12