mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-07 22:59:56 -05:00
Merge topic 'block-management'
44a2f3f332Add new flow-control commands for variables and policies scopes management604993248fcmMakefile::VariablePushPop: helper class to manage variable scopes3d94ee0e03cmMakefile::RaiseScope: Add support for cmValue argument553da0685fcmFunctionBlocker: Add handling of close block without parameters.02c067dee5cm::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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
cmake_minimum_required(VERSION 3.3...3.25)
|
||||
project(${RunCMake_TEST} NONE)
|
||||
include(${RunCMake_TEST}.cmake)
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -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\)
|
||||
@@ -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\)
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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\)
|
||||
@@ -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\)
|
||||
@@ -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}...")
|
||||
|
||||
Reference in New Issue
Block a user