Add -write-options-for-conan configure argument

Passing this configure argument will generate a JSON file that contains
information about configure options and features.

This file is used by Qt's conan recipes.

Fixes: QTBUG-92082
Change-Id: I2057ec8cbdb0a1ea198d7eeacb45f65bfa862d8a
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Joerg Bornemann 2021-04-14 15:18:28 +02:00 committed by Iikka Eklund
parent e5686b35f0
commit 3886db82c6

View File

@ -28,10 +28,10 @@ endmacro()
if("${MODULE_ROOT}" STREQUAL "")
# If MODULE_ROOT is not set, assume that we want to build qtbase or top-level.
get_filename_component(MODULE_ROOT ".." ABSOLUTE BASE_DIR "${CMAKE_CURRENT_LIST_DIR}")
set(auto_detect_generator TRUE)
set(qtbase_or_top_level_build TRUE)
else()
file(TO_CMAKE_PATH "${MODULE_ROOT}" MODULE_ROOT)
set(auto_detect_generator FALSE)
set(qtbase_or_top_level_build FALSE)
endif()
set(configure_filename "configure.cmake")
set(commandline_filename "qt_cmdline.cmake")
@ -57,7 +57,9 @@ list(TRANSFORM configure_args STRIP)
list(TRANSFORM configure_args REPLACE "\\\\" "\\\\\\\\")
unset(generator)
set(auto_detect_compiler TRUE)
set(auto_detect_generator ${qtbase_or_top_level_build})
unset(device_options)
unset(options_json_file)
set_property(GLOBAL PROPERTY UNHANDLED_ARGS "")
while(NOT "${configure_args}" STREQUAL "")
list(POP_FRONT configure_args arg)
@ -69,6 +71,8 @@ while(NOT "${configure_args}" STREQUAL "")
set(auto_detect_compiler FALSE)
elseif(arg STREQUAL "-list-features")
set(list_features TRUE)
elseif(arg STREQUAL "-write-options-for-conan")
list(POP_FRONT configure_args options_json_file)
elseif(arg STREQUAL "-skip")
list(POP_FRONT configure_args qtrepo)
push("-DBUILD_${qtrepo}=OFF")
@ -151,6 +155,7 @@ defstub(qt_set01)
# Define functions/macros that are called in qt_cmdline.cmake files
####################################################################################################
unset(commandline_known_options)
unset(commandline_custom_handlers)
set(commandline_nr_of_prefixes 0)
set(commandline_nr_of_assignments 0)
@ -169,6 +174,7 @@ function(qt_commandline_option name)
set(multiValueArgs VALUES MAPPING)
cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(commandline_known_options "${commandline_known_options};${name}" PARENT_SCOPE)
set(commandline_option_${name} "${arg_TYPE}" PARENT_SCOPE)
if(NOT "${arg_NAME}" STREQUAL "")
set(commandline_option_${name}_variable "${arg_NAME}" PARENT_SCOPE)
@ -453,6 +459,76 @@ if(list_features)
return()
endif()
function(write_options_json_file)
if(qtbase_or_top_level_build)
# Add options that are handled directly by this script.
qt_commandline_option(qt-host-path TYPE string)
qt_commandline_option(no-guess-compiler TYPE void)
endif()
set(indent " ")
set(content
"{"
"${indent}\"options\": {")
string(APPEND indent " ")
list(LENGTH commandline_known_options commandline_known_options_length)
set(i 1)
foreach(opt ${commandline_known_options})
list(APPEND content "${indent}\"${opt}\": {")
string(APPEND indent " ")
list(APPEND content "${indent}\"type\": \"${commandline_option_${opt}}\",")
if(NOT "${commandline_option_${opt}_values}" STREQUAL "")
set(values "${commandline_option_${opt}_values}")
list(TRANSFORM values PREPEND "\"")
list(TRANSFORM values APPEND "\"")
list(JOIN values ", " values)
list(APPEND content "${indent}\"values\": [${values}]")
elseif(NOT "${commandline_option_${opt}_mapping}" STREQUAL "")
list(LENGTH commandline_option_${opt}_mapping last)
math(EXPR last "${last} - 1")
set(values "")
list(APPEND content "${indent}\"values\": [")
foreach(k RANGE 0 "${last}" 2)
list(GET commandline_option_${opt}_mapping ${k} value)
list(APPEND values ${value})
endforeach()
list(TRANSFORM values PREPEND "\"")
list(TRANSFORM values APPEND "\"")
list(JOIN values ", " values)
list(APPEND content
"${indent} ${values}"
"${indent}]")
else()
list(APPEND content "${indent}\"values\": []")
endif()
string(SUBSTRING "${indent}" 4 -1 indent)
math(EXPR i "${i} + 1")
if(i LESS commandline_known_options_length)
list(APPEND content "${indent}},")
else()
list(APPEND content "${indent}}")
endif()
endforeach()
string(SUBSTRING "${indent}" 4 -1 indent)
set(features ${commandline_known_features})
list(TRANSFORM features PREPEND "\"")
list(TRANSFORM features APPEND "\"")
list(JOIN features ", " features)
list(APPEND content
"${indent}},"
"${indent}\"features\": [${features}]"
"}")
string(REPLACE ";" "\n" content "${content}")
file(WRITE "${options_json_file}" "${content}")
endfunction()
if(options_json_file)
write_options_json_file()
return()
endif()
while(1)
qtConfHasNextCommandlineArg(has_next)
if(NOT has_next)