Merge branch 'parent-scope-tests' into variable-pull-failure

* parent-scope-tests:
  test: add a test for PARENT_SCOPE with multiple scopes
  test: add test for PARENT_SCOPE behavior

Conflicts:
	Tests/RunCMake/set/RunCMakeTest.cmake
This commit is contained in:
Ben Boeckel 2014-10-24 13:00:28 -04:00 committed by Brad King
commit d1b62185d6
5 changed files with 266 additions and 0 deletions

View File

@ -0,0 +1,3 @@
^before PARENT_SCOPE blah=value2
after PARENT_SCOPE blah=value2
in parent scope, blah=value2$

View File

@ -0,0 +1,13 @@
cmake_minimum_required(VERSION 3.0)
project(Minimal NONE)
function(test_set)
set(blah "value2")
message("before PARENT_SCOPE blah=${blah}")
set(blah ${blah} PARENT_SCOPE)
message("after PARENT_SCOPE blah=${blah}")
endfunction()
set(blah value1)
test_set()
message("in parent scope, blah=${blah}")

View File

@ -0,0 +1,144 @@
----------
variable values at top before calls:
top_implicit_inner_set: -->top<--
top_implicit_inner_unset: <undefined>
top_explicit_inner_set: -->top<--
top_explicit_inner_unset: <undefined>
top_explicit_inner_tounset: -->top<--
top_implicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_tounset: -->top<--
outer_implicit_inner_set: <undefined>
outer_implicit_inner_unset: <undefined>
outer_explicit_inner_set: <undefined>
outer_explicit_inner_unset: <undefined>
outer_explicit_inner_tounset: <undefined>
----------
----------
variable values at outer start:
top_implicit_inner_set: -->top<--
top_implicit_inner_unset: <undefined>
top_explicit_inner_set: -->top<--
top_explicit_inner_unset: <undefined>
top_explicit_inner_tounset: -->top<--
top_implicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_tounset: -->top<--
outer_implicit_inner_set: <undefined>
outer_implicit_inner_unset: <undefined>
outer_explicit_inner_set: <undefined>
outer_explicit_inner_unset: <undefined>
outer_explicit_inner_tounset: <undefined>
----------
----------
variable values at outer before inner:
top_implicit_inner_set: -->top<--
top_implicit_inner_unset: <undefined>
top_explicit_inner_set: -->top<--
top_explicit_inner_unset: <undefined>
top_explicit_inner_tounset: -->top<--
top_implicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_tounset: -->top<--
outer_implicit_inner_set: -->outer<--
outer_implicit_inner_unset: <undefined>
outer_explicit_inner_set: -->outer<--
outer_explicit_inner_unset: <undefined>
outer_explicit_inner_tounset: -->outer<--
----------
----------
variable values at inner start:
top_implicit_inner_set: -->top<--
top_implicit_inner_unset: <undefined>
top_explicit_inner_set: -->top<--
top_explicit_inner_unset: <undefined>
top_explicit_inner_tounset: -->top<--
top_implicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_tounset: -->top<--
outer_implicit_inner_set: -->outer<--
outer_implicit_inner_unset: <undefined>
outer_explicit_inner_set: -->outer<--
outer_explicit_inner_unset: <undefined>
outer_explicit_inner_tounset: -->outer<--
----------
----------
variable values at inner end:
top_implicit_inner_set: -->top<--
top_implicit_inner_unset: <undefined>
top_explicit_inner_set: -->top<--
top_explicit_inner_unset: <undefined>
top_explicit_inner_tounset: -->top<--
top_implicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_tounset: -->top<--
outer_implicit_inner_set: -->outer<--
outer_implicit_inner_unset: <undefined>
outer_explicit_inner_set: -->outer<--
outer_explicit_inner_unset: <undefined>
outer_explicit_inner_tounset: -->outer<--
----------
----------
variable values at outer after inner:
top_implicit_inner_set: -->top<--
top_implicit_inner_unset: <undefined>
top_explicit_inner_set: -->inner<--
top_explicit_inner_unset: -->inner<--
top_explicit_inner_tounset: <undefined>
top_implicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_tounset: -->top<--
outer_implicit_inner_set: -->outer<--
outer_implicit_inner_unset: <undefined>
outer_explicit_inner_set: -->inner<--
outer_explicit_inner_unset: -->inner<--
outer_explicit_inner_tounset: <undefined>
----------
----------
variable values at outer end:
top_implicit_inner_set: -->top<--
top_implicit_inner_unset: <undefined>
top_explicit_inner_set: -->inner<--
top_explicit_inner_unset: -->inner<--
top_explicit_inner_tounset: <undefined>
top_implicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_set: -->top<--
top_explicit_outer_unset: <undefined>
top_explicit_outer_tounset: -->top<--
outer_implicit_inner_set: -->outer<--
outer_implicit_inner_unset: <undefined>
outer_explicit_inner_set: -->inner<--
outer_explicit_inner_unset: -->inner<--
outer_explicit_inner_tounset: <undefined>
----------
----------
variable values at top after calls:
top_implicit_inner_set: -->top<--
top_implicit_inner_unset: <undefined>
top_explicit_inner_set: -->outer<--
top_explicit_inner_unset: -->outer<--
top_explicit_inner_tounset: <undefined>
top_implicit_outer_set: -->top<--
top_explicit_outer_unset: -->outer<--
top_explicit_outer_set: -->outer<--
top_explicit_outer_unset: -->outer<--
top_explicit_outer_tounset: <undefined>
outer_implicit_inner_set: <undefined>
outer_implicit_inner_unset: <undefined>
outer_explicit_inner_set: <undefined>
outer_explicit_inner_unset: <undefined>
outer_explicit_inner_tounset: <undefined>
----------

View File

@ -0,0 +1,104 @@
cmake_minimum_required(VERSION 3.0)
project(Minimal NONE)
function(report where)
message("----------")
message("variable values at ${where}:")
foreach(var IN ITEMS
top_implicit_inner_set top_implicit_inner_unset
top_explicit_inner_set top_explicit_inner_unset top_explicit_inner_tounset
top_implicit_outer_set top_explicit_outer_unset
top_explicit_outer_set top_explicit_outer_unset top_explicit_outer_tounset
outer_implicit_inner_set outer_implicit_inner_unset
outer_explicit_inner_set outer_explicit_inner_unset outer_explicit_inner_tounset)
if(DEFINED ${var})
message("${var}: -->${${var}}<--")
else()
message("${var}: <undefined>")
endif()
endforeach()
message("----------")
endfunction()
macro(set_values upscope downscope value)
# Pull the value in implicitly.
set(dummy ${${upscope}_implicit_${downscope}_set})
set(dummy ${${upscope}_implicit_${downscope}_unset})
# Pull it down explicitly.
set(${upscope}_explicit_${downscope}_set "${value}" PARENT_SCOPE)
set(${upscope}_explicit_${downscope}_unset "${value}" PARENT_SCOPE)
set(${upscope}_explicit_${downscope}_tounset PARENT_SCOPE)
endmacro()
function(inner)
report("inner start")
set_values(top inner inner)
set_values(outer inner inner)
report("inner end")
endfunction()
function(outer)
report("outer start")
set_values(top outer outer)
# Set values for inner to manipulate.
set(outer_implicit_inner_set outer)
set(outer_implicit_inner_unset)
set(outer_explicit_inner_set outer)
set(outer_explicit_inner_unset)
set(outer_explicit_inner_tounset outer)
report("outer before inner")
inner()
report("outer after inner")
# Do what inner does so that we can test the values that inner should have
# pulled through to here.
set_values(top inner outer)
report("outer end")
endfunction()
# variable name is:
#
# <upscope>_<pulltype>_<downscope>_<settype>
#
# where the value is the name of the scope it was set in. The scopes available
# are "top", "outer", and "inner". The pull type may either be "implicit" or
# "explicit" based on whether the pull is due to a variable dereference or a
# PARENT_SCOPE setting. The settype is "set" where both scopes set a value,
# "unset" where upscope unsets it and downscope sets it, and "tounset" where
# upscope sets it and downscope unsets it.
#
# We test the following combinations:
#
# - outer overriding top's values;
# - inner overriding top's values;
# - inner overriding outer's values; and
# - outer overriding inner's values in top after inner has run.
# Set values for inner to manipulate.
set(top_implicit_inner_set top)
set(top_implicit_inner_unset)
set(top_explicit_inner_set top)
set(top_explicit_inner_unset)
set(top_explicit_inner_tounset top)
# Set values for outer to manipulate.
set(top_implicit_outer_set top)
set(top_implicit_outer_unset)
set(top_explicit_outer_set top)
set(top_explicit_outer_unset)
set(top_explicit_outer_tounset top)
report("top before calls")
outer()
report("top after calls")

View File

@ -1,3 +1,5 @@
include(RunCMake)
run_cmake(ParentScope)
run_cmake(ParentPulling)
run_cmake(ParentPullingRecursive)