From 20afbd5e037a0ccfa55af8564ed8cd3ec2430540 Mon Sep 17 00:00:00 2001 From: "Daniele E. Domenichelli" Date: Wed, 13 Nov 2013 08:59:26 +0100 Subject: [PATCH 1/3] set: Handle value-less PARENT_SCOPE explicitly The code "set(VAR PARENT_SCOPE)" unsets VAR in the parent scope. Implement this case explicitly next to where "set(VAR)" is explicitly handled to unset VAR in the current scope. --- Source/cmSetCommand.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Source/cmSetCommand.cxx b/Source/cmSetCommand.cxx index 20f38be10..22b43832b 100644 --- a/Source/cmSetCommand.cxx +++ b/Source/cmSetCommand.cxx @@ -62,9 +62,17 @@ bool cmSetCommand this->Makefile->RemoveDefinition(args[0].c_str()); return true; } + // SET (VAR PARENT_SCOPE) // Removes the definition of VAR + // in the parent scope. + else if (args.size() == 2 && args[args.size()-1] == "PARENT_SCOPE") + { + this->Makefile->RaiseScope(variable, 0); + return true; + } // here are the remaining options // SET (VAR value ) + // SET (VAR value PARENT_SCOPE) // SET (VAR CACHE TYPE "doc String" [FORCE]) // SET (VAR value CACHE TYPE "doc string" [FORCE]) std::string value; // optional From bc280f1c8108809abed700c2fe039340bb9ae1c0 Mon Sep 17 00:00:00 2001 From: "Daniele E. Domenichelli" Date: Wed, 13 Nov 2013 09:02:56 +0100 Subject: [PATCH 2/3] set: Fix handling of empty value with PARENT_SCOPE Just as set(VAR "") sets VAR to an empty string in the current scope, the code set(VAR "" PARENT_SCOPE) is documented to set the variable to an empty string in the parent scope. Fix the implementation to make it so. --- Source/cmSetCommand.cxx | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Source/cmSetCommand.cxx b/Source/cmSetCommand.cxx index 22b43832b..bb193bf9f 100644 --- a/Source/cmSetCommand.cxx +++ b/Source/cmSetCommand.cxx @@ -122,15 +122,8 @@ bool cmSetCommand if (parentScope) { - if (value.empty()) - { - this->Makefile->RaiseScope(variable, 0); - } - else - { - this->Makefile->RaiseScope(variable, value.c_str()); - } - return true; + this->Makefile->RaiseScope(variable, value.c_str()); + return true; } From bf755c7c381d8d7d84578bf2dc4ac673aefa090a Mon Sep 17 00:00:00 2001 From: "Daniele E. Domenichelli" Date: Wed, 13 Nov 2013 09:18:18 +0100 Subject: [PATCH 3/3] set: Add unit tests for set/unset PARENT_SCOPE Create a RunCMake.set test to cover set() command cases, starting with PARENT_SCOPE. --- Tests/RunCMake/CMakeLists.txt | 1 + Tests/RunCMake/set/CMakeLists.txt | 3 ++ Tests/RunCMake/set/PARENT_SCOPE-result.txt | 1 + Tests/RunCMake/set/PARENT_SCOPE.cmake | 33 ++++++++++++++++++++++ Tests/RunCMake/set/RunCMakeTest.cmake | 3 ++ 5 files changed, 41 insertions(+) create mode 100644 Tests/RunCMake/set/CMakeLists.txt create mode 100644 Tests/RunCMake/set/PARENT_SCOPE-result.txt create mode 100644 Tests/RunCMake/set/PARENT_SCOPE.cmake create mode 100644 Tests/RunCMake/set/RunCMakeTest.cmake diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index bf3dcc143..bb1b90953 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -107,6 +107,7 @@ add_RunCMake_test(list) add_RunCMake_test(message) add_RunCMake_test(string) add_RunCMake_test(try_compile) +add_RunCMake_test(set) add_RunCMake_test(variable_watch) add_RunCMake_test(CMP0004) add_RunCMake_test(TargetPolicies) diff --git a/Tests/RunCMake/set/CMakeLists.txt b/Tests/RunCMake/set/CMakeLists.txt new file mode 100644 index 000000000..4b3de84d9 --- /dev/null +++ b/Tests/RunCMake/set/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8.12) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/set/PARENT_SCOPE-result.txt b/Tests/RunCMake/set/PARENT_SCOPE-result.txt new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/Tests/RunCMake/set/PARENT_SCOPE-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/set/PARENT_SCOPE.cmake b/Tests/RunCMake/set/PARENT_SCOPE.cmake new file mode 100644 index 000000000..9bd6bcace --- /dev/null +++ b/Tests/RunCMake/set/PARENT_SCOPE.cmake @@ -0,0 +1,33 @@ +set(FOO ) +set(BAR "bar") +set(BAZ "baz") +set(BOO "boo") + +function(_parent_scope) + set(FOO "foo" PARENT_SCOPE) + set(BAR "" PARENT_SCOPE) + set(BAZ PARENT_SCOPE) + unset(BOO PARENT_SCOPE) +endfunction() + +_parent_scope() + +if(NOT DEFINED FOO) + message(FATAL_ERROR "FOO not defined") +elseif(NOT "${FOO}" STREQUAL "foo") + message(FATAL_ERROR "FOO should be \"foo\", not \"${FOO}\"") +endif() + +if(NOT DEFINED BAR) + message(FATAL_ERROR "BAR not defined") +elseif(NOT "${BAR}" STREQUAL "") + message(FATAL_ERROR "BAR should be an empty string, not \"${BAR}\"") +endif() + +if(DEFINED BAZ) + message(FATAL_ERROR "BAZ defined") +endif() + +if(DEFINED BOO) + message(FATAL_ERROR "BOO defined") +endif() diff --git a/Tests/RunCMake/set/RunCMakeTest.cmake b/Tests/RunCMake/set/RunCMakeTest.cmake new file mode 100644 index 000000000..5d036e3b8 --- /dev/null +++ b/Tests/RunCMake/set/RunCMakeTest.cmake @@ -0,0 +1,3 @@ +include(RunCMake) + +run_cmake(PARENT_SCOPE)