CMake: Use cmake_language(DEFER) when available for scope finalizers
If CMake version is 3.19 or greater, use cmake_language(DEFER CALL) for Qt internal scope finalizers, instead of the homegrown implementation. Apart from not depending on the hacky homegrown solution, it significantly improves the readability of --trace-redirect logs. Pick-to: 6.0 Task-number: QTBUG-77377 Change-Id: I5ce374bb313865662c536826e86052bc762438b9 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
parent
89b49e5231
commit
69d9b2b6fd
@ -494,5 +494,8 @@ if(ANDROID)
|
|||||||
include(QtAndroidHelpers)
|
include(QtAndroidHelpers)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# This sets up the scope finalizer mechanism.
|
# This sets up the poor man's scope finalizer mechanism.
|
||||||
variable_watch(CMAKE_CURRENT_LIST_DIR qt_watch_current_list_dir)
|
# For newer CMake versions, we use cmake_language(DEFER CALL) instead.
|
||||||
|
if(CMAKE_VERSION VERSION_LESS "3.19.0")
|
||||||
|
variable_watch(CMAKE_CURRENT_LIST_DIR qt_watch_current_list_dir)
|
||||||
|
endif()
|
||||||
|
@ -1,24 +1,38 @@
|
|||||||
# Add a finalizer function for the current CMake list file.
|
# Add a finalizer function for the current CMake list file.
|
||||||
|
# It will be processed just before leaving the current source directory scope.
|
||||||
#
|
#
|
||||||
|
# When using CMake 3.18 or lower:
|
||||||
# You may add up to nine arguments that are passed to the finalizer.
|
# You may add up to nine arguments that are passed to the finalizer.
|
||||||
# A finalizer that is registered with qt_add_list_file_finalizer(foo bar baz)
|
# A finalizer that is registered with qt_add_list_file_finalizer(foo bar baz)
|
||||||
# will be called with nine arguments: foo(bar baz IGNORE IGNORE IGNORE...),
|
# will be called with nine arguments: foo(bar baz IGNORE IGNORE IGNORE...),
|
||||||
# because CMake's handling of empty list elements is a cruel joke.
|
# because CMake's handling of empty list elements is a cruel joke.
|
||||||
#
|
|
||||||
# For CMake < 3.18 the function qt_watch_current_list_dir must know about the finalizer.
|
# For CMake < 3.18 the function qt_watch_current_list_dir must know about the finalizer.
|
||||||
|
#
|
||||||
|
# When using CMake 3.19 or higher, no more INGORE parameters are passed. Instead we
|
||||||
|
# use cmake_language(DEFER CALL) and pass arguments as usual.
|
||||||
|
# qt_watch_current_list_dir also doesn't need to know about the finalizer
|
||||||
function(qt_add_list_file_finalizer func)
|
function(qt_add_list_file_finalizer func)
|
||||||
set_property(GLOBAL APPEND
|
set(use_cmake_defer_call TRUE)
|
||||||
PROPERTY QT_LIST_FILE_FINALIZER_FILES "${CMAKE_CURRENT_LIST_FILE}")
|
if(CMAKE_VERSION VERSION_LESS "3.19.0")
|
||||||
set_property(GLOBAL APPEND
|
set(use_cmake_defer_call FALSE)
|
||||||
PROPERTY QT_LIST_FILE_FINALIZER_FUNCS ${func})
|
endif()
|
||||||
foreach(i RANGE 1 9)
|
|
||||||
set(arg "${ARGV${i}}")
|
if(use_cmake_defer_call)
|
||||||
if(i GREATER_EQUAL ARGC OR "${arg}" STREQUAL "")
|
cmake_language(EVAL CODE "cmake_language(DEFER CALL \"${func}\" ${ARGN}) ")
|
||||||
set(arg "IGNORE")
|
else()
|
||||||
endif()
|
|
||||||
set_property(GLOBAL APPEND
|
set_property(GLOBAL APPEND
|
||||||
PROPERTY QT_LIST_FILE_FINALIZER_ARGV${i} "${arg}")
|
PROPERTY QT_LIST_FILE_FINALIZER_FILES "${CMAKE_CURRENT_LIST_FILE}")
|
||||||
endforeach()
|
set_property(GLOBAL APPEND
|
||||||
|
PROPERTY QT_LIST_FILE_FINALIZER_FUNCS ${func})
|
||||||
|
foreach(i RANGE 1 9)
|
||||||
|
set(arg "${ARGV${i}}")
|
||||||
|
if(i GREATER_EQUAL ARGC OR "${arg}" STREQUAL "")
|
||||||
|
set(arg "IGNORE")
|
||||||
|
endif()
|
||||||
|
set_property(GLOBAL APPEND
|
||||||
|
PROPERTY QT_LIST_FILE_FINALIZER_ARGV${i} "${arg}")
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Watcher function for the variable CMAKE_CURRENT_LIST_DIR.
|
# Watcher function for the variable CMAKE_CURRENT_LIST_DIR.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user