Conan: Fix build_type usage in the build recipe

Currently e.g. -debug-and-release builds are "broken" as it only
produces release binaries on Windows. There are other inconsistencies
also how the recipe deals with various release and debug related options
and how those map the Conan's 'build_type'.

Change-Id: I47fa4c1592eefa1b5a1f144691ee33675753e5fb
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
(cherry picked from commit 95cc652e1afe7a6edd17cd251fc8ba1eb639eb4f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Iikka Eklund 2021-10-25 11:32:34 +03:00 committed by Qt Cherry-pick Bot
parent 2def195b60
commit d307ba788a

View File

@ -394,41 +394,66 @@ class QtBase(ConanFile):
if not value or value == "None":
setattr(self.options, option_name, option_value)
default_all_os_options = [
"release",
"shared",
"gui",
"widgets",
"accessibility",
"system_proxies",
"ico",
]
for item in default_all_os_options:
def _set_build_type(build_type: str) -> None:
if self.settings.build_type != build_type:
msg = (
"The build_type '{0}' changed to '{1}'. Please check your Settings and "
"Options. The used Qt options enforce '{2}' as a build_type. ".format(
self.settings.build_type, build_type, build_type
)
)
raise QtConanError(msg)
self.settings.build_type = build_type
def _check_mutually_exclusive_options(options: Dict[str, str]) -> None:
if list(options.values()).count("yes") > 1:
raise QtConanError(
"These Qt options are mutually exclusive: {0}"
". Choose only one of them and try again.".format(list(options.keys()))
)
default_options = ["shared", "gui", "widgets", "accessibility", "system_proxies", "ico"]
if self.settings.os == "Macos":
default_options.append("framework")
for item in default_options:
_set_default_if_not_set(item, "yes")
if self.settings.os == "Windows":
self.options.debug_and_release = "yes"
elif self.settings.os == "Linux":
pass
elif self.settings.os == "Macos":
self.options.debug_and_release = "yes"
self.options.framework = "yes"
release = self.options.get_safe("release", default="no")
debug = self.options.get_safe("debug", default="no")
debug_and_release = self.options.get_safe("debug_and_release", default="no")
force_debug_info = self.options.get_safe("force_debug_info", default="no")
optimize_size = self.options.get_safe("optimize_size", default="no")
if self.options.get_safe("debug_and_release", default="no") == "yes":
# these options are mutually exclusive options so do a sanity check
_check_mutually_exclusive_options(
{"release": release, "debug": debug, "debug_and_release": debug_and_release}
)
# Prioritize Qt's configure options over Settings.build_type
if debug_and_release == "yes":
# Qt build system will build both debug and release binaries
del self.settings.build_type
# Map Conan build_type to Qt configure(.bat) options
if self.settings.get_safe("build_type", default="None") == "Release":
if force_debug_info == "yes":
_set_build_type("RelWithDebInfo")
else:
_set_build_type("Release")
elif release == "yes":
_check_mutually_exclusive_options(
{"force_debug_info": force_debug_info, "optimize_size": optimize_size}
)
if force_debug_info == "yes":
_set_build_type("RelWithDebInfo")
elif optimize_size == "yes":
_set_build_type("MinSizeRel")
else:
_set_build_type("Release")
elif debug == "yes":
_set_build_type("Debug")
else:
# set default that mirror the configure(.bat) default values
self.options.release = "yes"
self.options.debug = "no"
elif self.settings.get_safe("build_type", default="None") == "Debug":
self.options.release = "no"
self.options.debug = "yes"
elif self.settings.get_safe("build_type", default="None") == "MinSizeRel":
self.options.optimize_size = "yes"
elif self.settings.get_safe("build_type", default="None") == "RelWithDebInfo":
self.options.force_debug_info = "yes"
_set_build_type("Release")
def build(self):
self.python_requires["qt-conan-common"].module.build_env_wrap(self, _build_qtbase)