From 6fe5c4afc0a8363927ecd48bea4cc822894f97db Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 18 Sep 2013 13:05:05 -0400 Subject: cmTestGenerator: Separate test properties for each configuration Move property generation from GenerateScriptConfigs to separate copies in GenerateOldStyle and GenerateScriptForConfig. This causes the per-config tests generated for the add_test(NAME) signature to each get their own test properties. This will allow us to later change the property values based on the test configuration. While at it, generate lower-case CMake code (e.g. set_tests_properties). Inspired-by: Ben Boeckel --- Source/cmTestGenerator.cxx | 55 +++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/Source/cmTestGenerator.cxx b/Source/cmTestGenerator.cxx index 42f511e..3167362 100644 --- a/Source/cmTestGenerator.cxx +++ b/Source/cmTestGenerator.cxx @@ -39,29 +39,8 @@ cmTestGenerator void cmTestGenerator::GenerateScriptConfigs(std::ostream& os, Indent const& indent) { - // First create the tests. + // Create the tests. this->cmScriptGenerator::GenerateScriptConfigs(os, indent); - - // Now generate the test properties. - if(this->TestGenerated) - { - cmTest* test = this->Test; - cmMakefile* mf = test->GetMakefile(); - cmLocalGenerator* lg = mf->GetLocalGenerator(); - std::ostream& fout = os; - cmPropertyMap::const_iterator pit; - cmPropertyMap* mpit = &test->GetProperties(); - if ( mpit->size() ) - { - fout << "SET_TESTS_PROPERTIES(" << test->GetName() << " PROPERTIES "; - for ( pit = mpit->begin(); pit != mpit->end(); ++ pit ) - { - fout << " " << pit->first - << " " << lg->EscapeForCMake(pit->second.GetValue()); - } - fout << ")" << std::endl; - } - } } //---------------------------------------------------------------------------- @@ -127,6 +106,21 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os, // Finish the test command. os << ")\n"; + + // Output properties for the test. + cmPropertyMap& pm = this->Test->GetProperties(); + if(!pm.empty()) + { + os << indent << "set_tests_properties(" << this->Test->GetName() + << " PROPERTIES "; + for(cmPropertyMap::const_iterator i = pm.begin(); + i != pm.end(); ++i) + { + os << " " << i->first + << " " << lg->EscapeForCMake(i->second.GetValue()); + } + os << ")" << std::endl; + } } //---------------------------------------------------------------------------- @@ -181,4 +175,21 @@ void cmTestGenerator::GenerateOldStyle(std::ostream& fout, fout << "\""; } fout << ")" << std::endl; + + // Output properties for the test. + cmMakefile* mf = this->Test->GetMakefile(); + cmLocalGenerator* lg = mf->GetLocalGenerator(); + cmPropertyMap& pm = this->Test->GetProperties(); + if(!pm.empty()) + { + fout << indent << "set_tests_properties(" << this->Test->GetName() + << " PROPERTIES "; + for(cmPropertyMap::const_iterator i = pm.begin(); + i != pm.end(); ++i) + { + fout << " " << i->first + << " " << lg->EscapeForCMake(i->second.GetValue()); + } + fout << ")" << std::endl; + } } -- cgit v0.12 From d331292c121269ccfceee302a0f9bbb960b9f02d Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Wed, 7 Aug 2013 17:07:30 -0400 Subject: cmTestGenerator: Evaluate generator expressions in test properties This is useful for cases like: add_test(NAME mytest COMMAND mydriver $) set_tests_properties(mytest PROPERTIES REQUIRED_FILES "$" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$" ) In this example we require the actual test executable to exist to run the test in addition to the test driver at argv[0]. Also the $ expression improves over \${CTEST_CONFIGURATION_TYPE} because the latter is not normalized for case-sensitive filesystems. --- Source/cmSetTestsPropertiesCommand.h | 3 ++- Source/cmTestGenerator.cxx | 3 ++- Tests/CMakeLists.txt | 1 + Tests/GeneratorExpression/CMakeLists.txt | 32 +++++++++++++++++++++++++++++- Tests/GeneratorExpression/echo.c | 8 ++++++++ Tests/GeneratorExpression/pwd.c | 34 ++++++++++++++++++++++++++++++++ 6 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 Tests/GeneratorExpression/echo.c create mode 100644 Tests/GeneratorExpression/pwd.c diff --git a/Source/cmSetTestsPropertiesCommand.h b/Source/cmSetTestsPropertiesCommand.h index 3a59218..f2f2611 100644 --- a/Source/cmSetTestsPropertiesCommand.h +++ b/Source/cmSetTestsPropertiesCommand.h @@ -51,7 +51,8 @@ public: " set_tests_properties(test1 [test2...] PROPERTIES prop1 value1 prop2" " value2)\n" "Set a property for the tests. If the property is not found, CMake " - "will report an error. The properties include:\n" + "will report an error. Generator expressions will be expanded the same " + "as supported by the test's add_test call. The properties include:\n" "WILL_FAIL: If set to true, this will invert the pass/fail flag of the" " test.\n" "PASS_REGULAR_EXPRESSION: If set, the test output will be checked " diff --git a/Source/cmTestGenerator.cxx b/Source/cmTestGenerator.cxx index 3167362..e5984a8 100644 --- a/Source/cmTestGenerator.cxx +++ b/Source/cmTestGenerator.cxx @@ -117,7 +117,8 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os, i != pm.end(); ++i) { os << " " << i->first - << " " << lg->EscapeForCMake(i->second.GetValue()); + << " " << lg->EscapeForCMake( + ge.Parse(i->second.GetValue())->Evaluate(mf, config)); } os << ")" << std::endl; } diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 9c3ed59..a5ad58c 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -604,6 +604,7 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/ ${build_generator_args} --build-project GeneratorExpression --build-options -DCMAKE_BUILD_TYPE=\${CTEST_CONFIGURATION_TYPE} + --test-command ${CMAKE_CTEST_COMMAND} -C \${CTEST_CONFIGURATION_TYPE} -V ) list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/GeneratorExpression") diff --git a/Tests/GeneratorExpression/CMakeLists.txt b/Tests/GeneratorExpression/CMakeLists.txt index 4d8d7ed..89d8780 100644 --- a/Tests/GeneratorExpression/CMakeLists.txt +++ b/Tests/GeneratorExpression/CMakeLists.txt @@ -1,5 +1,7 @@ cmake_minimum_required (VERSION 2.8.8) -project(GeneratorExpression CXX) +project(GeneratorExpression) + +include(CTest) # This test is split into multiple parts as needed to avoid NMake command # length limits. @@ -190,3 +192,31 @@ add_custom_target(check-part3 ALL COMMAND ${CMAKE_COMMAND} -E echo "check done (part 3 of 3)" VERBATIM ) + +#----------------------------------------------------------------------------- +# Cover test properties with generator expressions. +add_executable(echo echo.c) +add_executable(pwd pwd.c) + +add_test(NAME echo-configuration COMMAND echo $) +set_property(TEST echo-configuration PROPERTY + PASS_REGULAR_EXPRESSION "^$\n$") + +add_test(NAME echo-target-file COMMAND echo $) +set_property(TEST echo-target-file PROPERTY + PASS_REGULAR_EXPRESSION "/echo${CMAKE_EXECUTABLE_SUFFIX}\n$") +set_property(TEST echo-target-file PROPERTY + REQUIRED_FILES "$") + +add_test(NAME working-dir-arg + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/WorkingDirectory/$" + COMMAND pwd) +set_property(TEST working-dir-arg PROPERTY + PASS_REGULAR_EXPRESSION "WorkingDirectory/$\n$") +foreach(c ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE}) + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/WorkingDirectory/${c}") +endforeach() + +add_test(echo-old-style echo "\$") +set_property(TEST echo-old-style PROPERTY + PASS_REGULAR_EXPRESSION "^\\$\n$") diff --git a/Tests/GeneratorExpression/echo.c b/Tests/GeneratorExpression/echo.c new file mode 100644 index 0000000..06b0844 --- /dev/null +++ b/Tests/GeneratorExpression/echo.c @@ -0,0 +1,8 @@ +#include +#include + +int main(int argc, char* argv[]) +{ + printf("%s\n", argv[1]); + return EXIT_SUCCESS; +} diff --git a/Tests/GeneratorExpression/pwd.c b/Tests/GeneratorExpression/pwd.c new file mode 100644 index 0000000..054b1af --- /dev/null +++ b/Tests/GeneratorExpression/pwd.c @@ -0,0 +1,34 @@ +#include +#include +#include + +#ifdef _WIN32 +#include +#define getcurdir _getcwd +#else +#include +#define getcurdir getcwd +#endif + +int main(int argc, char* argv[]) +{ +#define BUFSZ 20000 + char buf[BUFSZ + 1]; +#ifdef _WIN32 + char *pos; +#endif + getcurdir(buf, BUFSZ); +#ifdef _WIN32 + pos = buf; + while (*pos) + { + if (*pos == '\\') + { + *pos = '/'; + } + ++pos; + } +#endif + printf("%s\n", buf); + return EXIT_SUCCESS; +} -- cgit v0.12 From 6a47c37ccf7049d5ac3fa6224def8d17ee82c7f5 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Wed, 7 Aug 2013 18:08:54 -0400 Subject: add_test: Mention generator expressions in old-style add_test docs The old-style add_test() call does not support generator expressions at all. This also applies to the properties for the test, but it is not mentioned at all. --- Source/cmAddTestCommand.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/cmAddTestCommand.h b/Source/cmAddTestCommand.h index ec7fda3..ce98aaa 100644 --- a/Source/cmAddTestCommand.h +++ b/Source/cmAddTestCommand.h @@ -66,7 +66,8 @@ public: "built by this project or an arbitrary executable on the " "system (like tclsh). The test will be run with the current working " "directory set to the CMakeList.txt files corresponding directory " - "in the binary tree.\n" + "in the binary tree. Tests added using this signature do not support " + "generator expressions.\n" "\n" " add_test(NAME [CONFIGURATIONS [Debug|Release|...]]\n" " [WORKING_DIRECTORY dir]\n" -- cgit v0.12