2018-10-24 13:20:27 +00:00
function ( qt_feature_module_begin )
2018-12-11 15:02:39 +00:00
qt_parse_all_arguments ( arg "qt_feature_module_begin"
2018-10-24 13:20:27 +00:00
" " " L I B R A R Y ; P R I V A T E _ F I L E ; P U B L I C _ F I L E " " P U B L I C _ D E P E N D E N C I E S ; P R I V A T E _ D E P E N D E N C I E S " $ { A R G N } )
2018-12-11 15:02:39 +00:00
if ( "${arg_LIBRARY}" STREQUAL "" )
2018-10-24 13:20:27 +00:00
message ( FATAL_ERROR "qt_feature_begin_module needs a LIBRARY name!" )
endif ( )
2018-12-11 15:02:39 +00:00
if ( "${arg_PUBLIC_FILE}" STREQUAL "" )
2018-10-24 13:20:27 +00:00
message ( FATAL_ERROR "qt_feature_begin_module needs a PUBLIC_FILE name!" )
endif ( )
2018-12-11 15:02:39 +00:00
if ( "${arg_PRIVATE_FILE}" STREQUAL "" )
2018-10-24 13:20:27 +00:00
message ( FATAL_ERROR "qt_feature_begin_module needs a PRIVATE_FILE name!" )
endif ( )
2018-12-11 15:02:39 +00:00
set ( __QtFeature_library "${arg_LIBRARY}" PARENT_SCOPE )
2018-10-24 13:20:27 +00:00
set ( __QtFeature_private_features "" PARENT_SCOPE )
set ( __QtFeature_public_features "" PARENT_SCOPE )
2018-12-11 15:02:39 +00:00
set ( __QtFeature_private_file "${arg_PRIVATE_FILE}" PARENT_SCOPE )
set ( __QtFeature_public_file "${arg_PUBLIC_FILE}" PARENT_SCOPE )
2018-10-24 13:20:27 +00:00
set ( __QtFeature_private_extra "" PARENT_SCOPE )
set ( __QtFeature_public_extra "" PARENT_SCOPE )
endfunction ( )
2018-12-11 15:02:39 +00:00
function ( qt_feature feature )
qt_parse_all_arguments ( arg "qt_feature"
2018-10-24 13:20:27 +00:00
" P R I V A T E ; P U B L I C "
" L A B E L ; P U R P O S E ; S E C T I O N ; " " A U T O D E T E C T ; C O N D I T I O N ; E N A B L E ; D I S A B L E ; E M I T _ I F " $ { A R G N } )
2018-12-11 15:02:39 +00:00
set ( _QT_FEATURE_DEFINITION_ ${ feature } ${ ARGN } PARENT_SCOPE )
2018-10-25 12:28:06 +00:00
2018-10-25 11:16:42 +00:00
# Register feature for future use:
2018-12-11 15:02:39 +00:00
if ( arg_PUBLIC )
list ( APPEND __QtFeature_public_features "${feature}" )
2018-10-24 13:20:27 +00:00
endif ( )
2018-12-11 15:02:39 +00:00
if ( arg_PRIVATE )
list ( APPEND __QtFeature_private_features "${feature}" )
2018-10-24 13:20:27 +00:00
endif ( )
2018-10-25 11:16:42 +00:00
2018-10-24 13:20:27 +00:00
set ( __QtFeature_public_features ${ __QtFeature_public_features } PARENT_SCOPE )
set ( __QtFeature_private_features ${ __QtFeature_private_features } PARENT_SCOPE )
endfunction ( )
function ( qt_evaluate_to_boolean expressionVar )
if ( ${ ${expressionVar } } )
set ( ${ expressionVar } ON PARENT_SCOPE )
else ( )
set ( ${ expressionVar } OFF PARENT_SCOPE )
endif ( )
endfunction ( )
function ( qt_evaluate_config_expression resultVar )
set ( result "" )
set ( nestingLevel 0 )
set ( skipNext OFF )
set ( expression "${ARGN}" )
list ( LENGTH expression length )
math ( EXPR length "${length}-1" )
foreach ( memberIdx RANGE ${ length } )
if ( ${ skipNext } )
set ( skipNext OFF )
continue ( )
endif ( )
list ( GET expression ${ memberIdx } member )
if ( "${member}" STREQUAL "(" )
if ( ${ nestingLevel } GREATER 0 )
list ( APPEND result ${ member } )
endif ( )
math ( EXPR nestingLevel "${nestingLevel} + 1" )
continue ( )
elseif ( "${member}" STREQUAL ")" )
math ( EXPR nestingLevel "${nestingLevel} - 1" )
if ( nestingLevel LESS 0 )
break ( )
endif ( )
if ( ${ nestingLevel } EQUAL 0 )
qt_evaluate_config_expression ( result ${ result } )
else ( )
list ( APPEND result ${ member } )
endif ( )
continue ( )
elseif ( ${ nestingLevel } GREATER 0 )
list ( APPEND result ${ member } )
continue ( )
elseif ( "${member}" STREQUAL "NOT" )
list ( APPEND result ${ member } )
continue ( )
elseif ( "${member}" STREQUAL "AND" )
qt_evaluate_to_boolean ( result )
if ( NOT ${ result } )
break ( )
endif ( )
set ( result "" )
elseif ( "${member}" STREQUAL "OR" )
qt_evaluate_to_boolean ( result )
if ( ${ result } )
break ( )
endif ( )
set ( result "" )
elseif ( "${member}" STREQUAL "STREQUAL" AND memberIdx LESS ${ length } )
# Unfortunately the semantics for STREQUAL in if() are broken when the
# RHS is an empty string and the parameters to if are coming through a variable.
2018-10-25 11:16:42 +00:00
# So we expect people to write the empty string with single quotes and then we
2018-10-24 13:20:27 +00:00
# do the comparison manually here.
list ( LENGTH result lhsIndex )
math ( EXPR lhsIndex "${lhsIndex}-1" )
list ( GET result ${ lhsIndex } lhs )
list ( REMOVE_AT result ${ lhsIndex } )
set ( lhs "${${lhs}}" )
math ( EXPR rhsIndex "${memberIdx}+1" )
set ( skipNext ON )
list ( GET expression ${ rhsIndex } rhs )
# We can't pass through an empty string with double quotes through various
# stages of substitution, so instead it is represented using single quotes
# and resolve here.
string ( REGEX REPLACE "'(.*)'" "\\1" rhs "${rhs}" )
string ( COMPARE EQUAL "${lhs}" "${rhs}" stringCompareResult )
list ( APPEND result ${ stringCompareResult } )
else ( )
string ( FIND "${member}" "QT_FEATURE_" idx )
if ( idx EQUAL 0 )
# Remove the QT_FEATURE_ prefix
string ( SUBSTRING "${member}" 11 -1 feature )
qt_evaluate_feature ( ${ feature } )
endif ( )
list ( APPEND result ${ member } )
endif ( )
endforeach ( )
if ( "${result}" STREQUAL "" )
set ( result ON )
else ( )
qt_evaluate_to_boolean ( result )
endif ( )
set ( ${ resultVar } ${ result } PARENT_SCOPE )
endfunction ( )
2018-10-26 09:49:58 +00:00
function ( qt_feature_set_cache_value resultVar feature emit_if calculated label )
if ( DEFINED "FEATURE_${feature}" )
# Must set up the cache
if ( NOT ( emit_if ) )
message ( FATAL_ERROR "Sanity check failed: FEATURE_${feature} that was not emitted was found in the CMakeCache." )
endif ( )
# Revisit value:
set ( cache "${FEATURE_${feature}}" )
if ( ( cache STREQUAL "ON" ) OR ( cache STREQUAL "OFF" ) )
set ( result "${cache}" )
else ( )
message ( FATAL_ERROR "Sanity check failed: FEATURE_${feature} has invalid value \" ${ cache } \"!")
endif ( )
# Fix-up user-provided values
set ( "FEATURE_${feature}" "${cache}" CACHE BOOL "${label}" )
else ( )
# Initial setup:
if ( emit_if )
set ( "FEATURE_${feature}" "${calculated}" CACHE BOOL "${label}" )
2018-11-14 13:24:34 +00:00
set ( result "${calculated}" )
else ( )
set ( result OFF )
2018-10-26 09:49:58 +00:00
endif ( )
endif ( )
set ( "${resultVar}" "${result}" PARENT_SCOPE )
endfunction ( )
2018-11-14 13:24:34 +00:00
macro ( qt_feature_set_value feature cache emit_if condition label )
2018-10-26 09:49:58 +00:00
set ( result "${cache}" )
if ( NOT ( condition ) AND ( cache ) )
message ( SEND_ERROR "Feature \" ${ feature } \": Forcing to \"${cache}\" breaks its condition. " )
endif ( )
2019-01-14 10:35:53 +00:00
if ( DEFINED "QT_FEATURE_${feature}" )
message ( FATAL_ERROR "Feature ${feature} is already defined when evaluating configure.cmake features for ${target}." )
endif ( )
set ( QT_FEATURE_ ${ feature } "${result}" CACHE INTERNAL "Qt feature: ${feature}" )
2018-10-26 09:49:58 +00:00
endmacro ( )
2018-12-11 15:02:39 +00:00
function ( qt_evaluate_feature feature )
2018-10-24 13:20:27 +00:00
# If the feature was set explicitly by the user to be on or off, in the cache, then
# there's nothing for us to do.
2018-12-11 15:02:39 +00:00
if ( DEFINED "QT_FEATURE_${feature}" )
2018-10-24 13:20:27 +00:00
return ( )
endif ( )
2018-12-11 15:02:39 +00:00
if ( NOT DEFINED _QT_FEATURE_DEFINITION_ ${ feature } )
2018-11-02 10:42:58 +00:00
qt_debug_print_variables ( DEDUP MATCH "^QT_FEATURE" )
2018-12-11 15:02:39 +00:00
message ( FATAL_ERROR "Attempting to evaluate feature ${feature} but its definition is missing. Either the feature does not exist or a dependency to the module that defines it is missing" )
2018-10-24 13:20:27 +00:00
endif ( )
2018-12-11 15:02:39 +00:00
cmake_parse_arguments ( arg
2018-10-24 13:20:27 +00:00
" P R I V A T E ; P U B L I C "
2018-12-11 15:02:39 +00:00
" L A B E L ; P U R P O S E ; S E C T I O N ; " " A U T O D E T E C T ; C O N D I T I O N ; E N A B L E ; D I S A B L E ; E M I T _ I F " $ { _ Q T _ F E A T U R E _ D E F I N I T I O N _ $ { f e a t u r e } } )
2018-10-24 13:20:27 +00:00
2018-12-11 15:02:39 +00:00
if ( DEFINED QT_FEATURE_ ${ feature } )
2018-10-24 13:20:27 +00:00
return ( )
endif ( )
2018-12-11 15:02:39 +00:00
if ( "${arg_ENABLE}" STREQUAL "" )
set ( arg_ENABLE OFF )
2018-10-24 13:20:27 +00:00
endif ( )
2018-12-11 15:02:39 +00:00
if ( "${arg_DISABLE}" STREQUAL "" )
set ( arg_DISABLE OFF )
2018-10-24 13:20:27 +00:00
endif ( )
2018-12-11 15:02:39 +00:00
if ( "${arg_AUTODETECT}" STREQUAL "" )
set ( arg_AUTODETECT ON )
2018-10-24 13:20:27 +00:00
endif ( )
2018-12-11 15:02:39 +00:00
if ( "${arg_CONDITION}" STREQUAL "" )
2018-10-25 12:28:06 +00:00
set ( condition ON )
else ( )
2018-12-11 15:02:39 +00:00
qt_evaluate_config_expression ( condition ${ arg_CONDITION } )
2018-10-24 13:20:27 +00:00
endif ( )
2018-12-11 15:02:39 +00:00
if ( ${ arg_DISABLE } )
2018-10-24 13:20:27 +00:00
set ( result OFF )
2018-12-11 15:02:39 +00:00
elseif ( ( ${ arg_ENABLE } ) OR ( ${ arg_AUTODETECT } ) )
2018-10-25 12:28:06 +00:00
set ( result ${ condition } )
2018-10-24 13:20:27 +00:00
else ( )
# feature not auto-detected and not explicitly enabled
set ( result OFF )
endif ( )
2018-12-11 15:02:39 +00:00
if ( "${arg_EMIT_IF}" STREQUAL "" )
2018-10-25 12:28:06 +00:00
set ( emit_if ON )
else ( )
2018-12-11 15:02:39 +00:00
qt_evaluate_config_expression ( emit_if ${ arg_EMIT_IF } )
2018-10-25 11:16:42 +00:00
endif ( )
2018-10-26 09:49:58 +00:00
if ( NOT ( condition ) AND ( calculated ) )
2018-12-11 15:02:39 +00:00
message ( FATAL_ERROR "Sanity check failed: Feature ${feature} is enabled but condition does not hold true." )
2018-10-25 11:16:42 +00:00
endif ( )
2018-10-25 12:28:06 +00:00
2018-12-11 15:02:39 +00:00
qt_feature_set_cache_value ( cache "${feature}" "${emit_if}" "${result}" "${arg_LABEL}" )
qt_feature_set_value ( "${feature}" "${cache}" "${emit_if}" "${condition}" "${arg_LABEL}" )
2018-10-24 13:20:27 +00:00
endfunction ( )
2018-12-11 15:02:39 +00:00
function ( qt_feature_definition feature name )
qt_parse_all_arguments ( arg "qt_feature_definition" "NEGATE" "VALUE" "" ${ ARGN } )
2018-10-24 13:20:27 +00:00
# Generate code:
2018-12-11 15:02:39 +00:00
set ( expected 1 )
if ( arg_NEGATE )
set ( expected -1 )
2018-10-24 13:20:27 +00:00
endif ( )
2018-12-11 15:02:39 +00:00
set ( msg "\n#if defined(QT_FEATURE_${feature}) && QT_FEATURE_${feature} == ${expected}\n" )
if ( arg_VALUE )
string ( APPEND msg "# define ${name} ${arg_VALUE}\n" )
2018-10-24 13:20:27 +00:00
else ( )
2018-12-11 15:02:39 +00:00
string ( APPEND msg "# define ${name}\n" )
2018-10-24 13:20:27 +00:00
endif ( )
2018-12-11 15:02:39 +00:00
string ( APPEND msg "#endif\n" )
2018-10-24 13:20:27 +00:00
# Store for later use:
2018-12-11 15:02:39 +00:00
list ( FIND __QtFeature_public_features "${feature}" public_index )
if ( public_index GREATER -1 )
string ( APPEND __QtFeature_public_extra "${msg}" )
2018-10-24 13:20:27 +00:00
endif ( )
2018-12-11 15:02:39 +00:00
list ( FIND __QtFeature_private_features "${feature}" private_index )
if ( private_index GREATER -1 )
string ( APPEND __QtFeature_private_extra "${msg}" )
2018-10-24 13:20:27 +00:00
endif ( )
set ( __QtFeature_public_extra ${ __QtFeature_public_extra } PARENT_SCOPE )
set ( __QtFeature_private_extra ${ __QtFeature_private_extra } PARENT_SCOPE )
endfunction ( )
2018-12-11 15:02:39 +00:00
function ( qt_extra_definition name value )
qt_parse_all_arguments ( arg "qt_extra_definition" "PUBLIC;PRIVATE" "" "" ${ ARGN } )
2018-10-24 13:20:27 +00:00
2018-12-11 15:02:39 +00:00
if ( arg_PUBLIC )
string ( APPEND __QtFeature_public_extra "\n#define ${name} ${value}\n" )
elseif ( arg_PRIVATE )
string ( APPEND __QtFeature_private_extra "\n#define ${name} ${value}\n" )
2018-10-24 13:20:27 +00:00
endif ( )
set ( __QtFeature_public_extra ${ __QtFeature_public_extra } PARENT_SCOPE )
set ( __QtFeature_private_extra ${ __QtFeature_private_extra } PARENT_SCOPE )
endfunction ( )
2018-12-11 15:02:39 +00:00
function ( qt_internal_generate_feature_line line feature )
if ( QT_FEATURE_ ${ feature } STREQUAL "ON" )
set ( line "#define QT_FEATURE_${feature} 1\n\n" PARENT_SCOPE )
elseif ( QT_FEATURE_ ${ feature } STREQUAL "OFF" )
set ( line "#define QT_FEATURE_${feature} -1\n\n" PARENT_SCOPE )
elseif ( QT_FEATURE_ ${ feature } STREQUAL "UNSET" )
set ( line "#define QT_FEATURE_${feature} 0\n\n" PARENT_SCOPE )
2018-10-24 13:20:27 +00:00
else ( )
2018-12-11 15:02:39 +00:00
message ( FATAL_ERROR "${feature} has unexpected value \" ${ QT_FEATURE_${feature } }\ "!" )
2018-10-24 13:20:27 +00:00
endif ( )
endfunction ( )
2018-12-11 15:02:39 +00:00
function ( qt_internal_feature_write_file file features extra )
message ( "Generating file ${file}." )
set ( contents "" )
foreach ( it ${ features } )
qt_internal_generate_feature_line ( line "${it}" )
string ( APPEND contents "${line}" )
2018-10-24 13:20:27 +00:00
endforeach ( )
2018-12-11 15:02:39 +00:00
string ( APPEND contents "${extra}" )
2018-10-24 13:20:27 +00:00
2018-12-11 15:02:39 +00:00
file ( GENERATE OUTPUT "${file}" CONTENT "${contents}" )
2018-10-24 13:20:27 +00:00
endfunction ( )
function ( qt_feature_module_end target )
set ( all_features ${ __QtFeature_public_features } ${ __QtFeature_private_features } )
list ( REMOVE_DUPLICATES all_features )
foreach ( feature ${ all_features } )
qt_evaluate_feature ( ${ feature } )
endforeach ( )
set ( enabled_public_features "" )
set ( disabled_public_features "" )
set ( enabled_private_features "" )
set ( disabled_private_features "" )
foreach ( feature ${ __QtFeature_public_features } )
if ( QT_FEATURE_ ${ feature } )
list ( APPEND enabled_public_features ${ feature } )
else ( )
list ( APPEND disabled_public_features ${ feature } )
endif ( )
endforeach ( )
foreach ( feature ${ __QtFeature_private_features } )
if ( QT_FEATURE_ ${ feature } )
list ( APPEND enabled_private_features ${ feature } )
else ( )
list ( APPEND disabled_private_features ${ feature } )
endif ( )
endforeach ( )
foreach ( feature ${ all_features } )
2018-11-02 10:42:58 +00:00
unset ( _QT_FEATURE_DEFINITION_ ${ feature } PARENT_SCOPE )
2018-10-24 13:20:27 +00:00
endforeach ( )
2018-12-11 15:02:39 +00:00
qt_internal_feature_write_file ( "${CMAKE_CURRENT_BINARY_DIR}/${__QtFeature_private_file}"
2018-10-24 13:20:27 +00:00
" $ { _ _ Q t F e a t u r e _ p r i v a t e _ f e a t u r e s } " " $ { _ _ Q t F e a t u r e _ p r i v a t e _ e x t r a } "
)
qt_generate_forwarding_headers ( "${__QtFeature_library}" SOURCE "${__QtFeature_private_file}" PRIVATE )
2018-12-11 15:02:39 +00:00
qt_internal_feature_write_file ( "${CMAKE_CURRENT_BINARY_DIR}/${__QtFeature_public_file}"
2018-10-24 13:20:27 +00:00
" $ { _ _ Q t F e a t u r e _ p u b l i c _ f e a t u r e s } " " $ { _ _ Q t F e a t u r e _ p u b l i c _ e x t r a } "
)
qt_generate_forwarding_headers ( "${__QtFeature_library}" SOURCE "${__QtFeature_public_file}" )
get_target_property ( targetType "${target}" TYPE )
if ( "${targetType}" STREQUAL "INTERFACE_LIBRARY" )
set ( propertyPrefix "INTERFACE_" )
else ( )
set ( propertyPrefix "" )
set_target_properties ( "${target}" PROPERTIES EXPORT_PROPERTIES "QT_ENABLED_PUBLIC_FEATURES;QT_DISABLED_PUBLIC_FEATURES;QT_ENABLED_PRIVATE_FEATURES;QT_DISABLED_PRIVATE_FEATURES" )
endif ( )
foreach ( visibility public private )
string ( TOUPPER "${visibility}" capitalVisibility )
foreach ( state enabled disabled )
string ( TOUPPER "${state}" capitalState )
set_property ( TARGET "${target}" PROPERTY ${ propertyPrefix } QT_ ${ capitalState } _ ${ capitalVisibility } _FEATURES "${${state}_${visibility}_features}" )
endforeach ( )
endforeach ( )
unset ( __QtFeature_library PARENT_SCOPE )
unset ( __QtFeature_private_features PARENT_SCOPE )
unset ( __QtFeature_public_features PARENT_SCOPE )
unset ( __QtFeature_private_file PARENT_SCOPE )
unset ( __QtFeature_public_file PARENT_SCOPE )
unset ( __QtFeature_private_extra PARENT_SCOPE )
unset ( __QtFeature_public_extra PARENT_SCOPE )
endfunction ( )
function ( qt_config_compile_test name )
2019-02-08 16:04:20 +00:00
cmake_parse_arguments ( arg "" "LABEL" "LIBRARIES;CODE" ${ ARGN } )
2018-10-24 13:20:27 +00:00
2019-02-08 16:04:20 +00:00
set ( _save_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}" )
set ( CMAKE_REQUIRED_LIBRARIES "${arg_LIBRARIES}" )
check_cxx_source_compiles ( "${arg_UNPARSED_ARGUMENTS} ${arg_CODE}" HAVE_ ${ name } )
set ( CMAKE_REQUIRED_LIBRARIES "${_save_CMAKE_REQUIRED_LIBRARIES}" )
2018-12-11 15:02:39 +00:00
set ( TEST_ ${ name } "${HAVE_${name}}" CACHE INTERNAL "${arg_LABEL}" )
2018-10-24 13:20:27 +00:00
endfunction ( )
function ( qt_config_compile_test_x86simd extension label )
string ( TOUPPER ${ extension } extension_uppercase )
2019-02-10 23:20:34 +00:00
if ( DEFINED TEST_X86SIMD_ ${ extension } )
return ( )
endif ( )
2018-10-24 13:20:27 +00:00
try_compile ( TEST_X86SIMD_ ${ extension } "${CMAKE_CURRENT_BINARY_DIR}"
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c o n f i g . t e s t s / x 8 6 _ s i m d / m a i n . c p p "
C O M P I L E _ D E F I N I T I O N S - D Q T _ C O M P I L E R _ S U P P O R T S _ $ { e x t e n s i o n _ u p p e r c a s e }
O U T P U T _ V A R I A B L E f o o
)
set ( TEST_subarch_ ${ extension } "${TEST_X86SIMD_${extension}}" CACHE INTERNAL "${label}" )
endfunction ( )
2019-01-14 10:35:53 +00:00
function ( qt_make_features_available target )
2019-02-12 09:02:15 +00:00
if ( NOT "${target}" MATCHES "^${QT_CMAKE_EXPORT_NAMESPACE}::[a-zA-z][a-zA-Z0-9_]*$" )
message ( FATAL_ERROR "${target} does not match ${QT_CMAKE_EXPORT_NAMESPACE}::[a-zA-z][a-zA-Z0-9_]*. INVALID NAME." )
2019-01-14 10:35:53 +00:00
endif ( )
if ( NOT TARGET ${ target } )
message ( FATAL_ERROR "${target} not found." )
endif ( )
2019-01-10 09:50:38 +00:00
2019-01-14 10:35:53 +00:00
get_target_property ( target_type "${target}" TYPE )
if ( "${target_type}" STREQUAL "INTERFACE_LIBRARY" )
set ( property_prefix "INTERFACE_" )
else ( )
set ( property_prefix "" )
endif ( )
foreach ( visibility IN ITEMS PUBLIC PRIVATE )
set ( value ON )
foreach ( state IN ITEMS ENABLED DISABLED )
get_target_property ( features "${target}" ${ property_prefix } QT_ ${ state } _ ${ visibility } _FEATURES )
if ( "${features}" STREQUAL "features-NOTFOUND" )
2019-01-14 10:01:06 +00:00
continue ( )
endif ( )
2019-01-14 10:35:53 +00:00
foreach ( feature IN ITEMS ${ features } )
2019-02-11 09:55:07 +00:00
if ( DEFINED "QT_FEATURE_${feature}" AND NOT "${QT_FEATURE_${feature}}" STREQUAL "${value}" )
message ( FATAL_ERROR "Feature ${feature} is already defined and has a different value when importing features from ${target}." )
2018-10-24 13:20:27 +00:00
endif ( )
2019-02-10 21:34:42 +00:00
set ( QT_FEATURE_ ${ feature } "${value}" CACHE INTERNAL "Qt feature: ${feature} (from target ${target})" )
2018-10-24 13:20:27 +00:00
endforeach ( )
2019-01-14 10:35:53 +00:00
set ( value OFF )
2018-10-24 13:20:27 +00:00
endforeach ( )
endforeach ( )
endfunction ( )