Merge topic 'block-management'

44a2f3f332 Add new flow-control commands for variables and policies scopes management
604993248f cmMakefile::VariablePushPop: helper class to manage variable scopes
3d94ee0e03 cmMakefile::RaiseScope: Add support for cmValue argument
553da0685f cmFunctionBlocker: Add handling of close block without parameters.
02c067dee5 cm::enum_set: fix various bugs

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: John Ericson <git@johnericson.me>
Merge-request: !7575
This commit is contained in:
Brad King
2022-08-23 12:00:57 +00:00
committed by Kitware Robot
72 changed files with 814 additions and 21 deletions
+9
View File
@@ -191,6 +191,15 @@ void testEdition()
++failed;
}
}
{
cm::enum_set<Test> testSet1;
cm::enum_set<Test> testSet2{ Test::A, Test::C, Test::B };
testSet1 = { Test::A, Test::C, Test::B };
if (testSet1.size() != 3 || testSet1 != testSet2) {
++failed;
}
}
}
}
+1
View File
@@ -456,6 +456,7 @@ add_RunCMake_test(find_path)
add_RunCMake_test(find_program -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME})
add_RunCMake_test(foreach)
add_RunCMake_test(function)
add_RunCMake_test(block)
add_RunCMake_test(get_filename_component)
add_RunCMake_test(get_property)
add_RunCMake_test(if)
+3
View File
@@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 3.3...3.25)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)
+1
View File
@@ -0,0 +1 @@
1
+4
View File
@@ -0,0 +1,4 @@
CMake Error at EndAlone.cmake:[0-9]+ \(endblock\):
Flow control statements are not properly nested.
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
+1
View File
@@ -0,0 +1 @@
endblock()
@@ -0,0 +1 @@
1
@@ -0,0 +1,4 @@
CMake Error at EndAloneWithArgument.cmake:[0-9]+ \(endblock\):
Flow control statements are not properly nested.
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
@@ -0,0 +1 @@
endblock(WRONG_ARG)
@@ -0,0 +1 @@
1
@@ -0,0 +1,4 @@
CMake Error at EndMissing.cmake:[0-9]+ \(block\):
Flow control statements are not properly nested.
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
+1
View File
@@ -0,0 +1 @@
block()
@@ -0,0 +1,9 @@
CMake Warning \(dev\) in EndWithArgument.cmake:
A logical block closing on the line
.+/Tests/RunCMake/block/EndWithArgument.cmake:[0-9]+ \(endblock\)
has unexpected arguments.
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.
@@ -0,0 +1,2 @@
block()
endblock(END_ARG)
@@ -0,0 +1 @@
1
@@ -0,0 +1,4 @@
CMake Error at InvalidArgument.cmake:[0-9]+ \(block\):
block PROPAGATE cannot be specified without a new scope for VARIABLES
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
@@ -0,0 +1,2 @@
block(SCOPE_FOR POLICIES PROPAGATE VAR1)
endblock()
@@ -0,0 +1 @@
1
@@ -0,0 +1,4 @@
CMake Error at InvalidNesting1.cmake:[0-9]+ \(else\):
Flow control statements are not properly nested.
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
@@ -0,0 +1,6 @@
if (TRUE)
block()
else()
endblock()
endif()
@@ -0,0 +1 @@
1
@@ -0,0 +1,4 @@
CMake Error at InvalidNesting2.cmake:[0-9]+ \(endblock\):
Flow control statements are not properly nested.
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
@@ -0,0 +1,6 @@
block()
if (TRUE)
elseif(FALSE)
endblock()
endif()
@@ -0,0 +1 @@
1
@@ -0,0 +1,4 @@
CMake Error at InvalidNesting3.cmake:[0-9]+ \(endwhile\):
Flow control statements are not properly nested.
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
@@ -0,0 +1,5 @@
while(TRUE)
block()
endwhile()
endblock()
@@ -0,0 +1 @@
1
@@ -0,0 +1,4 @@
CMake Error at InvalidNesting4.cmake:[0-9]+ \(endblock\):
Flow control statements are not properly nested.
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
@@ -0,0 +1,5 @@
block()
foreach(item IN ITEMS A B)
endblock()
endforeach()
@@ -0,0 +1 @@
1
@@ -0,0 +1,4 @@
CMake Error at InvalidNesting5.cmake:[0-9]+ \(endfunction\):
Flow control statements are not properly nested.
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
@@ -0,0 +1,5 @@
function(FUNC)
block()
endfunction()
endblock()
@@ -0,0 +1 @@
1
@@ -0,0 +1,4 @@
CMake Error at InvalidNesting6.cmake:[0-9]+ \(endblock\):
Flow control statements are not properly nested.
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
@@ -0,0 +1,5 @@
block()
macro(FUNC)
endblock()
endmacro()
@@ -0,0 +1 @@
1
@@ -0,0 +1,7 @@
CMake Error at MissingArgument.cmake:[0-9]+ \(block\):
Error after keyword "SCOPE_FOR":
missing required value
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
@@ -0,0 +1,2 @@
block(SCOPE_FOR)
endblock()
+22
View File
@@ -0,0 +1,22 @@
include(RunCMake)
run_cmake(WrongArgument)
run_cmake(InvalidArgument)
run_cmake(MissingArgument)
run_cmake(WrongScope)
run_cmake(EndMissing)
run_cmake(EndWithArgument)
run_cmake(EndAlone)
run_cmake(EndAloneWithArgument)
run_cmake(InvalidNesting1)
run_cmake(InvalidNesting2)
run_cmake(InvalidNesting3)
run_cmake(InvalidNesting4)
run_cmake(InvalidNesting5)
run_cmake(InvalidNesting6)
run_cmake(Scope)
run_cmake(Scope-VARIABLES)
run_cmake(Scope-POLICIES)
run_cmake(Workflows)
+30
View File
@@ -0,0 +1,30 @@
set(VAR1 "OUTER1")
set(VAR2 "OUTER2")
cmake_policy(SET CMP0139 NEW)
# create a block with a new scope for policies
block(SCOPE_FOR POLICIES)
set(VAR1 "INNER1")
unset(VAR2)
set(VAR3 "INNER3")
cmake_policy(SET CMP0139 OLD)
endblock()
# check final values for variables
if(NOT DEFINED VAR1 OR NOT VAR1 STREQUAL "INNER1")
message(SEND_ERROR "block/endblock: VAR1 has unexpected value: ${VAR1}")
endif()
if(DEFINED VAR2)
message(SEND_ERROR "block/endblock: VAR2 is unexpectedly defined: ${VAR2}")
endif()
if(NOT DEFINED VAR3 OR NOT VAR3 STREQUAL "INNER3")
message(SEND_ERROR "block/endblock: VAR3 has unexpected value: ${VAR3}")
endif()
cmake_policy(GET CMP0139 CMP0139_STATUS)
if(NOT CMP0139_STATUS STREQUAL "NEW")
message(SEND_ERROR "block/endblock: CMP0139 has unexpected value: ${CMP0139_STATUS}")
endif()
@@ -0,0 +1,52 @@
set(VAR1 "OUTER1")
set(VAR2 "OUTER2")
set(VAR3 "OUTER3")
set(VAR4 "OUTER4")
set(VAR5 "OUTER5")
set(VAR6 "CACHE6" CACHE STRING "")
set(VAR6 "OUTER6")
cmake_policy(SET CMP0139 NEW)
# create a block with a new scope for variables
block(SCOPE_FOR VARIABLES PROPAGATE VAR3 VAR4 VAR5 VAR6 VAR7)
set(VAR1 "INNER1")
set(VAR2 "INNER2" PARENT_SCOPE)
set(VAR3 "INNER3")
unset(VAR4)
unset(VAR6)
set(VAR7 "INNER7")
cmake_policy(SET CMP0139 OLD)
endblock()
# check final values for variables
if(NOT DEFINED VAR1 OR NOT VAR1 STREQUAL "OUTER1")
message(SEND_ERROR "block/endblock: VAR1 has unexpected value: ${VAR1}")
endif()
if(NOT DEFINED VAR2 OR NOT VAR2 STREQUAL "INNER2")
message(SEND_ERROR "block/endblock: VAR2 has unexpected value: ${VAR2}")
endif()
if(NOT DEFINED VAR3 OR NOT VAR3 STREQUAL "INNER3")
message(SEND_ERROR "block/endblock: VAR3 has unexpected value: ${VAR3}")
endif()
if(DEFINED VAR4)
message(SEND_ERROR "block/endblock: VAR4 is unexpectedly defined: ${VAR4}")
endif()
if(NOT DEFINED VAR5 OR NOT VAR5 STREQUAL "OUTER5")
message(SEND_ERROR "block/endblock: VAR5 has unexpected value: ${VAR5}")
endif()
unset(VAR6 CACHE)
if (DEFINED VAR6)
message(SEND_ERROR "block/endblock: VAR6 is unexpectedly defined: ${VAR6}")
endif()
if(NOT DEFINED VAR7 OR NOT VAR7 STREQUAL "INNER7")
message(SEND_ERROR "block/endblock: VAR7 has unexpected value: ${VAR7}")
endif()
cmake_policy(GET CMP0139 CMP0139_STATUS)
if(NOT CMP0139_STATUS STREQUAL "OLD")
message(SEND_ERROR "block/endblock: CMP0139 has unexpected value: ${CMP0139_STATUS}")
endif()
+52
View File
@@ -0,0 +1,52 @@
set(VAR1 "OUTER1")
set(VAR2 "OUTER2")
set(VAR3 "OUTER3")
set(VAR4 "OUTER4")
set(VAR5 "OUTER5")
set(VAR6 "CACHE6" CACHE STRING "")
set(VAR6 "OUTER6")
cmake_policy(SET CMP0139 NEW)
# create a block with a new scope for variables and policies
block(PROPAGATE VAR3 VAR4 VAR5 VAR6 VAR7)
set(VAR1 "INNER1")
set(VAR2 "INNER2" PARENT_SCOPE)
set(VAR3 "INNER3")
unset(VAR4)
unset(VAR6)
set(VAR7 "INNER7")
cmake_policy(SET CMP0139 OLD)
endblock()
# check final values for variables
if(NOT DEFINED VAR1 OR NOT VAR1 STREQUAL "OUTER1")
message(SEND_ERROR "block/endblock: VAR1 has unexpected value: ${VAR1}")
endif()
if(NOT DEFINED VAR2 OR NOT VAR2 STREQUAL "INNER2")
message(SEND_ERROR "block/endblock: VAR2 has unexpected value: ${VAR2}")
endif()
if(NOT DEFINED VAR3 OR NOT VAR3 STREQUAL "INNER3")
message(SEND_ERROR "block/endblock: VAR3 has unexpected value: ${VAR3}")
endif()
if(DEFINED VAR4)
message(SEND_ERROR "block/endblock: VAR4 is unexpectedly defined: ${VAR4}")
endif()
if(NOT DEFINED VAR5 OR NOT VAR5 STREQUAL "OUTER5")
message(SEND_ERROR "block/endblock: VAR5 has unexpected value: ${VAR5}")
endif()
unset(VAR6 CACHE)
if (DEFINED VAR6)
message(SEND_ERROR "block/endblock: VAR6 is unexpectedly defined: ${VAR6}")
endif()
if(NOT DEFINED VAR7 OR NOT VAR7 STREQUAL "INNER7")
message(SEND_ERROR "block/endblock: VAR6 has unexpected value: ${VAR7}")
endif()
cmake_policy(GET CMP0139 CMP0139_STATUS)
if(NOT CMP0139_STATUS STREQUAL "NEW")
message(SEND_ERROR "block/endblock: CMP0139 has unexpected value: ${CMP0139_STATUS}")
endif()
+78
View File
@@ -0,0 +1,78 @@
set(VAR1 "OUTER1")
set(VAR2 "OUTER2")
set(VAR3 "OUTER3")
while (TRUE)
# create a block with a new scope for variables
block(SCOPE_FOR VARIABLES PROPAGATE VAR3)
set(VAR2 "INNER2" PARENT_SCOPE)
set(VAR3 "INNER3")
break()
endblock()
endwhile()
# check final values for variables
if(NOT DEFINED VAR1 OR NOT VAR1 STREQUAL "OUTER1")
message(SEND_ERROR "block/endblock: VAR1 has unexpected value: ${VAR1}")
endif()
if(NOT DEFINED VAR2 OR NOT VAR2 STREQUAL "INNER2")
message(SEND_ERROR "block/endblock: VAR2 has unexpected value: ${VAR2}")
endif()
if(NOT DEFINED VAR3 OR NOT VAR3 STREQUAL "INNER3")
message(SEND_ERROR "block/endblock: VAR3 has unexpected value: ${VAR3}")
endif()
set(VAR1 "OUTER1")
set(VAR2 "OUTER2")
set(VAR3 "OUTER3")
function (OUTER)
# create a block with a new scope for variables
block(SCOPE_FOR VARIABLES PROPAGATE VAR3)
set(VAR2 "INNER2" PARENT_SCOPE)
set(VAR3 "INNER3")
return()
endblock()
set(VAR1 "INNER1" PARENT_SCOPE)
endfunction()
outer()
# check final values for variables
if(NOT DEFINED VAR1 OR NOT VAR1 STREQUAL "OUTER1")
message(SEND_ERROR "block/endblock: VAR1 has unexpected value: ${VAR1}")
endif()
if(NOT DEFINED VAR2 OR NOT VAR2 STREQUAL "OUTER2")
message(SEND_ERROR "block/endblock: VAR2 has unexpected value: ${VAR2}")
endif()
if(NOT DEFINED VAR3 OR NOT VAR3 STREQUAL "OUTER3")
message(SEND_ERROR "block/endblock: VAR3 has unexpected value: ${VAR3}")
endif()
set(VAR1 "OUTER1")
set(VAR2 "OUTER2")
set(VAR3 "OUTER3")
foreach (id IN ITEMS 1 2 3)
# create a block with a new scope for variables
block(SCOPE_FOR VARIABLES PROPAGATE VAR${id})
set(VAR${id} "INNER${id}")
continue()
set(VAR${id} "BAD${id}")
endblock()
endforeach()
# check final values for variables
if(NOT DEFINED VAR1 OR NOT VAR1 STREQUAL "INNER1")
message(SEND_ERROR "block/endblock: VAR1 has unexpected value: ${VAR1}")
endif()
if(NOT DEFINED VAR2 OR NOT VAR2 STREQUAL "INNER2")
message(SEND_ERROR "block/endblock: VAR2 has unexpected value: ${VAR2}")
endif()
if(NOT DEFINED VAR3 OR NOT VAR3 STREQUAL "INNER3")
message(SEND_ERROR "block/endblock: VAR3 has unexpected value: ${VAR3}")
endif()
@@ -0,0 +1 @@
1
@@ -0,0 +1,4 @@
CMake Error at WrongArgument.cmake:[0-9]+ \(block\):
block called with unsupported argument "WRONG_ARG"
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
+2
View File
@@ -0,0 +1,2 @@
block(WRONG_ARG)
endblock()
@@ -0,0 +1 @@
1
@@ -0,0 +1,4 @@
CMake Error at WrongScope.cmake:[0-9]+ \(block\):
block SCOPE_FOR unsupported scope "WRONG_SCOPE"
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
+2
View File
@@ -0,0 +1,2 @@
block(SCOPE_FOR WRONG_SCOPE)
endblock()
@@ -8,6 +8,7 @@ foreach(command IN ITEMS
"if" "elseif" "else" "endif"
"while" "endwhile"
"foreach" "endforeach"
"block" "endblock"
)
message(STATUS "Running call_invalid_command for ${command}...")
run_cmake_with_options(call_invalid_command -Dcommand=${command})
@@ -42,6 +43,7 @@ foreach(command IN ITEMS
"if" "elseif" "else" "endif"
"while" "endwhile"
"foreach" "endforeach"
"block" "endblock"
"return"
)
message(STATUS "Running defer_call_invalid_command for ${command}...")