summaryrefslogtreecommitdiffstats
path: root/Tests/RunCMake/set/ParentPullingRecursive.cmake
diff options
context:
space:
mode:
authorBen Boeckel <ben.boeckel@kitware.com>2014-10-24 17:00:28 (GMT)
committerBrad King <brad.king@kitware.com>2014-10-24 17:34:30 (GMT)
commitd1b62185d6b66b27a3ef31b79d4cff1c5126793e (patch)
tree185253b09d268bb4b815b9d6b61a03777cfb538a /Tests/RunCMake/set/ParentPullingRecursive.cmake
parent5f414cefb6524d26329484b296004e3c2d97ec4f (diff)
parente0c0b1ace50f77f2a76dcc7020e3a4251bc6bf96 (diff)
downloadCMake-d1b62185d6b66b27a3ef31b79d4cff1c5126793e.zip
CMake-d1b62185d6b66b27a3ef31b79d4cff1c5126793e.tar.gz
CMake-d1b62185d6b66b27a3ef31b79d4cff1c5126793e.tar.bz2
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
Diffstat (limited to 'Tests/RunCMake/set/ParentPullingRecursive.cmake')
-rw-r--r--Tests/RunCMake/set/ParentPullingRecursive.cmake104
1 files changed, 104 insertions, 0 deletions
diff --git a/Tests/RunCMake/set/ParentPullingRecursive.cmake b/Tests/RunCMake/set/ParentPullingRecursive.cmake
new file mode 100644
index 0000000..a3e29f5
--- /dev/null
+++ b/Tests/RunCMake/set/ParentPullingRecursive.cmake
@@ -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")