diff options
author | Alexandru Croitor <alexandru.croitor@qt.io> | 2020-02-24 15:06:30 +0100 |
---|---|---|
committer | Alexandru Croitor <alexandru.croitor@qt.io> | 2020-02-25 15:43:16 +0100 |
commit | 173079819d6dc57145bbbcc03c0d93726c2176fc (patch) | |
tree | ac9f7dc01b9b9d9a6bff7a2523d78480173779b5 /cmake/QtFeature.cmake | |
parent | 331b153be5c58287179e5d6192a9314dbb4085ef (diff) |
CMake: Allow evaluating features before a module is processed
Introduce an internal qt_feature_evaluate_features() function
which takes a list of configure.cmake paths, and evaluates the
features declared in those files, thus setting a bunch of cache
variables.
This is required to implement the equivalent of what qtbase/src.pro
does, which includes the feature .pri files to decide whether
bundled 3rd party libraries need to be built.
Change-Id: I5552f488671c001eb3f204245b905ab981017a9f
Reviewed-by: Leander Beernaert <leander.beernaert@qt.io>
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'cmake/QtFeature.cmake')
-rw-r--r-- | cmake/QtFeature.cmake | 53 |
1 files changed, 36 insertions, 17 deletions
diff --git a/cmake/QtFeature.cmake b/cmake/QtFeature.cmake index db12c9f0bb..bb77ca6ffa 100644 --- a/cmake/QtFeature.cmake +++ b/cmake/QtFeature.cmake @@ -1,15 +1,19 @@ function(qt_feature_module_begin) qt_parse_all_arguments(arg "qt_feature_module_begin" - "NO_MODULE" "LIBRARY;PRIVATE_FILE;PUBLIC_FILE" "PUBLIC_DEPENDENCIES;PRIVATE_DEPENDENCIES" ${ARGN}) + "NO_MODULE;ONLY_EVALUATE_FEATURES" + "LIBRARY;PRIVATE_FILE;PUBLIC_FILE" "PUBLIC_DEPENDENCIES;PRIVATE_DEPENDENCIES" ${ARGN}) - if ("${arg_LIBRARY}" STREQUAL "" AND (NOT ${arg_NO_MODULE})) - message(FATAL_ERROR "qt_feature_begin_module needs a LIBRARY name! (or specify NO_MODULE)") - endif() - if ("${arg_PUBLIC_FILE}" STREQUAL "") - message(FATAL_ERROR "qt_feature_begin_module needs a PUBLIC_FILE name!") - endif() - if ("${arg_PRIVATE_FILE}" STREQUAL "") - message(FATAL_ERROR "qt_feature_begin_module needs a PRIVATE_FILE name!") + if(NOT arg_ONLY_EVALUATE_FEATURES) + if ("${arg_LIBRARY}" STREQUAL "" AND (NOT ${arg_NO_MODULE})) + message(FATAL_ERROR + "qt_feature_begin_module needs a LIBRARY name! (or specify NO_MODULE)") + endif() + if ("${arg_PUBLIC_FILE}" STREQUAL "") + message(FATAL_ERROR "qt_feature_begin_module needs a PUBLIC_FILE name!") + endif() + if ("${arg_PRIVATE_FILE}" STREQUAL "") + message(FATAL_ERROR "qt_feature_begin_module needs a PRIVATE_FILE name!") + endif() endif() set(__QtFeature_library "${arg_LIBRARY}" PARENT_SCOPE) @@ -412,8 +416,21 @@ function(qt_internal_feature_write_file file features extra) file(GENERATE OUTPUT "${file}" CONTENT "${contents}") endfunction() +# Helper function which evaluates features from a given list of configure.cmake paths +# and creates the feature cache entries. +# Should not be used directly, unless features need to be available in a directory scope before the +# associated module evaluates the features. +# E.g. qtbase/src.pro needs access to Core features before src/corelib/CMakeLists.txt is parsed. +function(qt_feature_evaluate_features list_of_paths) + qt_feature_module_begin(ONLY_EVALUATE_FEATURES) + foreach(path ${list_of_paths}) + include("${path}") + endforeach() + qt_feature_module_end(ONLY_EVALUATE_FEATURES) +endfunction() + function(qt_feature_module_end) - set(flags) + set(flags ONLY_EVALUATE_FEATURES) set(options OUT_VAR_PREFIX) set(multiopts) cmake_parse_arguments(arg "${flags}" "${options}" "${multiopts}" ${ARGN}) @@ -475,13 +492,15 @@ function(qt_feature_module_end) unset(_QT_FEATURE_DEFINITION_${feature} PARENT_SCOPE) endforeach() - qt_internal_feature_write_file("${CMAKE_CURRENT_BINARY_DIR}/${__QtFeature_private_file}" - "${__QtFeature_private_features}" "${__QtFeature_private_extra}" - ) + if(NOT arg_ONLY_EVALUATE_FEATURES) + qt_internal_feature_write_file("${CMAKE_CURRENT_BINARY_DIR}/${__QtFeature_private_file}" + "${__QtFeature_private_features}" "${__QtFeature_private_extra}" + ) - qt_internal_feature_write_file("${CMAKE_CURRENT_BINARY_DIR}/${__QtFeature_public_file}" - "${__QtFeature_public_features}" "${__QtFeature_public_extra}" - ) + qt_internal_feature_write_file("${CMAKE_CURRENT_BINARY_DIR}/${__QtFeature_public_file}" + "${__QtFeature_public_features}" "${__QtFeature_public_extra}" + ) + endif() # Extra header injections which have to have forwarding headers created by # qt_install_injections. @@ -499,7 +518,7 @@ function(qt_feature_module_end) set(${arg_OUT_VAR_PREFIX}extra_library_injections ${injections} PARENT_SCOPE) endif() - if (NOT ("${target}" STREQUAL "NO_MODULE")) + if (NOT ("${target}" STREQUAL "NO_MODULE") AND NOT arg_ONLY_EVALUATE_FEATURES) get_target_property(targetType "${target}" TYPE) if("${targetType}" STREQUAL "INTERFACE_LIBRARY") set(propertyPrefix "INTERFACE_") |