From d307ba788ad3ca6580813e6ac69bb86bab5f0229 Mon Sep 17 00:00:00 2001 From: Iikka Eklund Date: Mon, 25 Oct 2021 11:32:34 +0300 Subject: [PATCH] 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 (cherry picked from commit 95cc652e1afe7a6edd17cd251fc8ba1eb639eb4f) Reviewed-by: Qt Cherry-pick Bot --- conanfile.py | 85 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 30 deletions(-) diff --git a/conanfile.py b/conanfile.py index e43dd209833..9331c8beb40 100644 --- a/conanfile.py +++ b/conanfile.py @@ -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)