From 261c248254faf2fc09d71f456f018b7f8bc9a7f1 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 8 Oct 2013 08:37:47 -0400 Subject: [PATCH] unset: Add PARENT_SCOPE option Add an unset() command option to remove a variable from the calling scope, just like the set() command's PARENT_SCOPE option. Teach the Unset test to cover such cases. --- Source/cmUnsetCommand.cxx | 8 +++++++- Source/cmUnsetCommand.h | 5 ++++- Tests/Unset/CMakeLists.txt | 27 +++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/Source/cmUnsetCommand.cxx b/Source/cmUnsetCommand.cxx index 5c0cfaa03..84f3029a2 100644 --- a/Source/cmUnsetCommand.cxx +++ b/Source/cmUnsetCommand.cxx @@ -49,7 +49,13 @@ bool cmUnsetCommand::InitialPass(std::vector const& args, this->Makefile->RemoveCacheDefinition(variable); return true; } - // ERROR: second argument isn't CACHE + // unset(VAR PARENT_SCOPE) + else if ((args.size() == 2) && (args[1] == "PARENT_SCOPE")) + { + this->Makefile->RaiseScope(variable, 0); + return true; + } + // ERROR: second argument isn't CACHE or PARENT_SCOPE else { this->SetError("called with an invalid second argument"); diff --git a/Source/cmUnsetCommand.h b/Source/cmUnsetCommand.h index 9cf95d98d..a477f19bc 100644 --- a/Source/cmUnsetCommand.h +++ b/Source/cmUnsetCommand.h @@ -61,10 +61,13 @@ public: virtual const char* GetFullDocumentation() const { return - " unset( [CACHE])\n" + " unset( [CACHE | PARENT_SCOPE])\n" "Removes the specified variable causing it to become undefined. " "If CACHE is present then the variable is removed from the cache " "instead of the current scope.\n" + "If PARENT_SCOPE is present then the variable is removed from the " + "scope above the current scope. See the same option in the set() " + "command for further details.\n" " can be an environment variable such as:\n" " unset(ENV{LD_LIBRARY_PATH})\n" "in which case the variable will be removed from the current " diff --git a/Tests/Unset/CMakeLists.txt b/Tests/Unset/CMakeLists.txt index 781da3fa6..07aa68e7a 100644 --- a/Tests/Unset/CMakeLists.txt +++ b/Tests/Unset/CMakeLists.txt @@ -51,5 +51,32 @@ if(DEFINED BAR) message(FATAL_ERROR "BAR still defined") endif() +# Test unset(... PARENT_SCOPE) +function(unset_zots) + if(NOT DEFINED ZOT1) + message(FATAL_ERROR "ZOT1 is not defined inside function") + endif() + if(NOT DEFINED ZOT2) + message(FATAL_ERROR "ZOT2 is not defined inside function") + endif() + unset(ZOT1) + unset(ZOT2 PARENT_SCOPE) + if(DEFINED ZOT1) + message(FATAL_ERROR "ZOT1 is defined inside function after unset") + endif() + if(NOT DEFINED ZOT2) + message(FATAL_ERROR + "ZOT2 is not defined inside function after unset(... PARENT_SCOPE)") + endif() +endfunction() +set(ZOT1 1) +set(ZOT2 2) +unset_zots() +if(NOT DEFINED ZOT1) + message(FATAL_ERROR "ZOT1 is not still defined after function") +endif() +if(DEFINED ZOT2) + message(FATAL_ERROR "ZOT2 is still defined after function unset PARENT_SCOPE") +endif() add_executable(Unset unset.c)