ENH: change raise_scope signature to be safer for returned varuables
This commit is contained in:
parent
c61a3b6fe9
commit
ac4c2f675a
|
@ -2846,9 +2846,12 @@ void cmMakefile::PopScope()
|
|||
this->DefinitionStack.pop_back();
|
||||
}
|
||||
|
||||
void cmMakefile::RaiseScope(const char *var)
|
||||
void cmMakefile::RaiseScope(const char *var, const char *varDef)
|
||||
{
|
||||
const char *varDef = this->GetDefinition(var);
|
||||
if (!var || !strlen(var))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// multiple scopes in this directory?
|
||||
if (this->DefinitionStack.size() > 1)
|
||||
|
|
|
@ -740,7 +740,7 @@ public:
|
|||
// push and pop variable scopes
|
||||
void PushScope();
|
||||
void PopScope();
|
||||
void RaiseScope(const char *var);
|
||||
void RaiseScope(const char *var, const char *value);
|
||||
|
||||
protected:
|
||||
// add link libraries and directories to the target
|
||||
|
|
|
@ -20,10 +20,20 @@
|
|||
bool cmRaiseScopeCommand
|
||||
::InitialPass(std::vector<std::string> const& args)
|
||||
{
|
||||
unsigned int i =0;
|
||||
for(; i < args.size(); ++i)
|
||||
if (args.size() < 1)
|
||||
{
|
||||
this->Makefile->RaiseScope(args[i].c_str());
|
||||
this->SetError("called with incorrect number of arguments, "
|
||||
"raise scope must have at least one argument");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (args.size() == 1)
|
||||
{
|
||||
this->Makefile->RaiseScope(args[0].c_str(), 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->Makefile->RaiseScope(args[0].c_str(), args[1].c_str());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -61,12 +61,13 @@ public:
|
|||
virtual const char* GetFullDocumentation()
|
||||
{
|
||||
return
|
||||
" raise_scope(VAR VAR2 VAR...)\n"
|
||||
"Pushes the current state of a variable into the scope above the "
|
||||
" raise_scope(VAR [VALUE])\n"
|
||||
"Sets the value of a variable in the scope above the "
|
||||
"current scope. Each new directory or function creates a new scope. "
|
||||
"This command will push the current state of a variable into the "
|
||||
"This command will set the value of a variable into the "
|
||||
"parent directory or calling function (whichever is applicable to "
|
||||
"the case at hand)";
|
||||
"the case at hand) If VALUE is not specified then the variable is "
|
||||
"removed from the parent scope.";
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -44,16 +44,37 @@ FUNCTION(test_argn_function argument)
|
|||
ENDFUNCTION(test_argn_function)
|
||||
Test_Argn_Function(ignored 3)
|
||||
|
||||
# test argument naming and raise scope
|
||||
function(track_find_variable cache_variable is_changed)
|
||||
raise_scope("${is_changed}" changed)
|
||||
endfunction(track_find_variable)
|
||||
track_find_variable(testvar is_changed)
|
||||
if ("${is_changed}" STREQUAL changed)
|
||||
pass("same argument name test")
|
||||
else ("${is_changed}" STREQUAL changed)
|
||||
pass("same argument name test")
|
||||
endif ("${is_changed}" STREQUAL changed)
|
||||
|
||||
include("Util.cmake")
|
||||
tester()
|
||||
if (tester_res STREQUAL "${CMAKE_CURRENT_LIST_FILE}")
|
||||
pass("CMAKE_CURRENT_LIST_FILE test")
|
||||
else (tester_res STREQUAL "${CMAKE_CURRENT_LIST_FILE}")
|
||||
pass("CMAKE_CURRENT_LIST_FILE test")
|
||||
endif (tester_res STREQUAL "${CMAKE_CURRENT_LIST_FILE}")
|
||||
|
||||
|
||||
|
||||
# test recursion and return via raise_scope
|
||||
function (factorial argument result)
|
||||
if (argument LESS 2)
|
||||
set (${result} 1)
|
||||
set (lresult 1)
|
||||
else (argument LESS 2)
|
||||
math (EXPR temp "${argument} - 1")
|
||||
factorial (${temp} tresult)
|
||||
math (EXPR ${result} "${argument}*${tresult}")
|
||||
math (EXPR lresult "${argument}*${tresult}")
|
||||
endif (argument LESS 2)
|
||||
raise_scope (${result})
|
||||
raise_scope ("${result}" "${lresult}")
|
||||
endfunction (factorial)
|
||||
|
||||
factorial (5 fresult)
|
||||
|
@ -67,8 +88,7 @@ endif (fresult EQUAL 120)
|
|||
|
||||
# case test
|
||||
FUNCTION(strange_function m)
|
||||
SET(${m} strange_function)
|
||||
RAISE_SCOPE(${m})
|
||||
RAISE_SCOPE("${m}" strange_function)
|
||||
ENDFUNCTION(strange_function m)
|
||||
STRANGE_FUNCTION(var)
|
||||
set(second_var "second_var")
|
||||
|
@ -85,8 +105,7 @@ ENDFUNCTION(ADD_EXECUTABLE)
|
|||
|
||||
# var undef case
|
||||
FUNCTION(undef_var m)
|
||||
SET(${m})
|
||||
RAISE_SCOPE(${m})
|
||||
RAISE_SCOPE("${m}")
|
||||
ENDFUNCTION(undef_var)
|
||||
SET(FUNCTION_UNDEFINED 1)
|
||||
undef_var(FUNCTION_UNDEFINED)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
SET(SUBDIR_DEFINED 1)
|
||||
SET(SUBDIR_UNDEFINED)
|
||||
RAISE_SCOPE(SUBDIR_DEFINED SUBDIR_UNDEFINED)
|
||||
RAISE_SCOPE(SUBDIR_DEFINED ${SUBDIR_DEFINED})
|
||||
RAISE_SCOPE(SUBDIR_UNDEFINED ${SUBDIR_UNDEFINED})
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
function(tester)
|
||||
set (tester_res "${CMAKE_CURRENT_LIST_FILE}")
|
||||
raise_scope(tester_res)
|
||||
endfunction(tester)
|
Loading…
Reference in New Issue