summaryrefslogtreecommitdiffstats
path: root/conanfile.py
diff options
context:
space:
mode:
authorIikka Eklund <iikka.eklund@qt.io>2021-10-25 11:32:34 +0300
committerIikka Eklund <iikka.eklund@qt.io>2021-11-04 00:12:15 +0300
commit95cc652e1afe7a6edd17cd251fc8ba1eb639eb4f (patch)
tree08aeed0a525741fc76aca30f81493c0b40da0cb9 /conanfile.py
parent63acb0d9fee6b5d985cd424d2e6283484db057ee (diff)
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'. Pick-to: 6.2 6.2.1 Change-Id: I47fa4c1592eefa1b5a1f144691ee33675753e5fb Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'conanfile.py')
-rw-r--r--conanfile.py85
1 files changed, 55 insertions, 30 deletions
diff --git a/conanfile.py b/conanfile.py
index e43dd20983..9331c8beb4 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":
- # Qt build system will build both debug and release binaries
- del self.settings.build_type
+ # 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}
+ )
- # Map Conan build_type to Qt configure(.bat) options
- if self.settings.get_safe("build_type", default="None") == "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
+ 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)