3.29.0-rc1: cmake_language(EXIT) does not work inside control flow
!8228 (merged) added cmake_language(EXIT code)
BUG: cmake_language(EXIT code)
statement does not terminate the script as specified in the
docs when the command is mixed in with other CMake script logic like if()
.
This unexpected behavior occurs with CMake 3.29.0-rc1 and nightly e.g.3.29.20240212
unexpected mixed with if()
Example file "exit.cmake":
cmake_minimum_required(VERSION 3.29)
message(STATUS "CMake ${CMAKE_VERSION}")
option(hi "")
if(hi)
message(STATUS "true")
cmake_language(EXIT 77)
else()
message(STATUS "false")
cmake_language(EXIT 75)
endif()
cmake_language(EXIT 76)
$ cmake -Dhi=true -P exit.cmake || echo $?
-- CMake 3.29.20240212-g063469e
-- true
76
$ cmake -Dhi=no -P exit.cmake || echo $?
-- CMake 3.29.20240212-g063469e
-- false
76
cmake -P exit.cmake --trace || echo $?
Put cmake in trace mode.
exit.cmake(1): cmake_minimum_required(VERSION 3.29 )
exit.cmake(3): message(STATUS CMake ${CMAKE_VERSION} )
-- CMake 3.29.20240212-g063469e
exit.cmake(5): option(hi )
exit.cmake(7): if(hi )
exit.cmake(10): else()
exit.cmake(11): message(STATUS false )
-- false
exit.cmake(12): cmake_language(EXIT 75 )
exit.cmake(15): cmake_language(EXIT 76 )
76
unexpected mixed with block()
cmake_minimum_required(VERSION 3.29)
block()
cmake_language(EXIT 77)
endblock()
cmake_language(EXIT 76)
$ cmake -P block.cmake || echo $?
76
unexpected foreach()
while.cmake:
cmake_minimum_required(VERSION 3.29)
foreach(i RANGE 3)
cmake_language(EXIT ${i})
message(STATUS "Should have already exited code ${i}")
endforeach()
message(FATAL_ERROR "Should have already exited")
$ cmake -P while.cmake --trace
Put cmake in trace mode.
while.cmake(1): cmake_minimum_required(VERSION 3.29 )
while.cmake(3): foreach(i RANGE 3 )
while.cmake(5): cmake_language(EXIT ${i} )
while.cmake(7): message(STATUS Should have already exited code ${i} )
-- Should have already exited code 0
while.cmake(7): message(STATUS Should have already exited code ${i} )
-- Should have already exited code 1
while.cmake(5): cmake_language(EXIT ${i} )
while.cmake(7): message(STATUS Should have already exited code ${i} )
-- Should have already exited code 2
while.cmake(5): cmake_language(EXIT ${i} )
while.cmake(7): message(STATUS Should have already exited code ${i} )
-- Should have already exited code 3
while.cmake(11): message(FATAL_ERROR Should have already exited )
CMake Error at while.cmake:11 (message):
Should have already exited
foreach() with SEND_ERROR
This also behaves unexpected
cmake_minimum_required(VERSION 3.29)
foreach(i RANGE 3)
cmake_language(EXIT ${i})
message(SEND_ERROR "Should have already exited code ${i}")
endforeach()
cmake -P while.cmake --trace
Put cmake in trace mode.
while.cmake(1): cmake_minimum_required(VERSION 3.29 )
while.cmake(3): foreach(i RANGE 3 )
while.cmake(5): cmake_language(EXIT ${i} )
while.cmake(7): message(SEND_ERROR Should have already exited code ${i} )
CMake Error at while.cmake:7 (message):
Should have already exited code 0
while.cmake(5): cmake_language(EXIT ${i} )
while.cmake(7): message(SEND_ERROR Should have already exited code ${i} )
CMake Error at while.cmake:7 (message):
Should have already exited code 1
while.cmake(5): cmake_language(EXIT ${i} )
while.cmake(7): message(SEND_ERROR Should have already exited code ${i} )
CMake Error at while.cmake:7 (message):
Should have already exited code 2
while.cmake(5): cmake_language(EXIT ${i} )
while.cmake(7): message(SEND_ERROR Should have already exited code ${i} )
CMake Error at while.cmake:7 (message):
Should have already exited code 3
$ echo $?
1
additional test
The CMake self-test code does work as expected--there must be some unexpected behavior when cmake_language(EXIT code)
is mixed with other CMake script logic (like if()).
cmake_language(EXIT 7)
message(FATAL_ERROR "The include()-d script with EXIT 7 doesn't work")
$ cmake -P fatal.cmake || echo $?
7
Edited by scivision