[DO-981] fix qt package info (!17)

Co-authored-by: aleksandr.vodyanov <aleksandr.vodyanov@avroid.tech>
Reviewed-on: https://git.avroid.tech/Conan/conan_build/pulls/17
This commit is contained in:
Aleksandr Vodyanov
2025-02-25 14:03:04 +03:00
parent a82e89a1bc
commit d0bb8ff38d
18 changed files with 421 additions and 663 deletions

View File

@@ -502,7 +502,7 @@ class QtConan(ConanFile):
def source(self):
get(self, **self.conan_data["sources"][self.version],
strip_root=True, destination="qt5")
strip_root=True, destination="qt5")
apply_conandata_patches(self)
for f in ["renderer", os.path.join("renderer", "core"), os.path.join("renderer", "platform")]:
@@ -902,8 +902,8 @@ Prefix = ..""")
if not self.options.get_safe(module):
rmdir(self, os.path.join(self.package_folder, "licenses", module))
rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
for mask in ["Find*.cmake", "*Config.cmake", "*-config.cmake"]:
rm(self, mask, self.package_folder, recursive=True)
#for mask in ["Find*.cmake", "*Config.cmake", "*-config.cmake"]:
# rm(self, mask, self.package_folder, recursive=True)
rm(self, "*.la*", os.path.join(self.package_folder, "lib"), recursive=True)
rm(self, "*.pdb*", os.path.join(self.package_folder, "lib"), recursive=True)
rm(self, "*.pdb", os.path.join(self.package_folder, "bin"), recursive=True)
@@ -913,103 +913,14 @@ Prefix = ..""")
for fl in glob.glob(os.path.join(self.package_folder, "lib", "*Qt5Bootstrap*")):
os.remove(fl)
for m in os.listdir(os.path.join(self.package_folder, "lib", "cmake")):
module = os.path.join(self.package_folder, "lib", "cmake", m, f"{m}Macros.cmake")
if not os.path.isfile(module):
rmdir(self, os.path.join(self.package_folder, "lib", "cmake", m))
#for m in os.listdir(os.path.join(self.package_folder, "lib", "cmake")):
# module = os.path.join(self.package_folder, "lib", "cmake", m, f"{m}Macros.cmake")
# if not os.path.isfile(module):
# rmdir(self, os.path.join(self.package_folder, "lib", "cmake", m))
extension = ""
if self._settings_build.os == "Windows":
extension = ".exe"
v = Version(self.version)
filecontents = textwrap.dedent(f"""\
set(QT_CMAKE_EXPORT_NAMESPACE Qt5)
set(QT_VERSION_MAJOR {v.major})
set(QT_VERSION_MINOR {v.minor})
set(QT_VERSION_PATCH {v.patch})
""")
targets = {}
targets["Core"] = ["moc", "rcc", "qmake"]
targets["DBus"] = ["qdbuscpp2xml", "qdbusxml2cpp"]
if self.options.widgets:
targets["Widgets"] = ["uic"]
if self.options.qttools:
targets["Tools"] = ["qhelpgenerator", "qcollectiongenerator", "qdoc", "qtattributionsscanner"]
targets[""] = ["lconvert", "lrelease", "lupdate"]
if self.options.qtremoteobjects:
targets["RemoteObjects"] = ["repc"]
if self.options.qtscxml:
targets["Scxml"] = ["qscxmlc"]
for namespace, targets in targets.items():
for target in targets:
filecontents += textwrap.dedent("""\
if(NOT TARGET ${{QT_CMAKE_EXPORT_NAMESPACE}}::{target})
add_executable(${{QT_CMAKE_EXPORT_NAMESPACE}}::{target} IMPORTED)
set_target_properties(${{QT_CMAKE_EXPORT_NAMESPACE}}::{target} PROPERTIES IMPORTED_LOCATION ${{CMAKE_CURRENT_LIST_DIR}}/../../../bin/{target}{ext})
set(Qt5{namespace}_{uppercase_target}_EXECUTABLE ${{QT_CMAKE_EXPORT_NAMESPACE}}::{target})
endif()
""".format(target=target, ext=extension, namespace=namespace, uppercase_target=target.upper()))
if self.settings.os == "Windows":
filecontents += textwrap.dedent("""\
set(Qt5Core_QTMAIN_LIBRARIES Qt5::WinMain)
if (NOT Qt5_NO_LINK_QTMAIN)
set(_isExe $<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>)
set(_isWin32 $<BOOL:$<TARGET_PROPERTY:WIN32_EXECUTABLE>>)
set(_isNotExcluded $<NOT:$<BOOL:$<TARGET_PROPERTY:Qt5_NO_LINK_QTMAIN>>>)
set(_isPolicyNEW $<TARGET_POLICY:CMP0020>)
set_property(TARGET Qt5::Core APPEND PROPERTY
INTERFACE_LINK_LIBRARIES
$<$<AND:${_isExe},${_isWin32},${_isNotExcluded},${_isPolicyNEW}>:Qt5::WinMain>
)
unset(_isExe)
unset(_isWin32)
unset(_isNotExcluded)
unset(_isPolicyNEW)
endif()
""")
filecontents += textwrap.dedent(f"""\
if(NOT DEFINED QT_DEFAULT_MAJOR_VERSION)
set(QT_DEFAULT_MAJOR_VERSION {v.major})
endif()
""")
filecontents += 'set(CMAKE_AUTOMOC_MACRO_NAMES "Q_OBJECT" "Q_GADGET" "Q_GADGET_EXPORT" "Q_NAMESPACE" "Q_NAMESPACE_EXPORT")\n'
save(self, os.path.join(self.package_folder, self._cmake_core_extras_file), filecontents)
def _create_private_module(module, dependencies=[]):
if "Core" not in dependencies:
dependencies.append("Core")
dependencies_string = ';'.join(f'Qt5::{dependency}' for dependency in dependencies)
contents = textwrap.dedent("""\
if(NOT TARGET Qt5::{0}Private)
add_library(Qt5::{0}Private INTERFACE IMPORTED)
set_target_properties(Qt5::{0}Private PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${{CMAKE_CURRENT_LIST_DIR}}/../../../include/Qt{0}/{1};${{CMAKE_CURRENT_LIST_DIR}}/../../../include/Qt{0}/{1}/Qt{0}"
INTERFACE_LINK_LIBRARIES "{2}"
)
add_library(Qt::{0}Private INTERFACE IMPORTED)
set_target_properties(Qt::{0}Private PROPERTIES
INTERFACE_LINK_LIBRARIES "Qt5::{0}Private"
_qt_is_versionless_target "TRUE"
)
endif()""".format(module, self.version, dependencies_string))
save(self, os.path.join(self.package_folder, self._cmake_qt5_private_file(module)), contents)
_create_private_module("Core")
if self.options.gui:
_create_private_module("Gui", ["CorePrivate", "Gui"])
if self.options.widgets:
_create_private_module("Widgets", ["CorePrivate", "Gui", "GuiPrivate"])
if self.options.qtdeclarative:
_create_private_module("Qml", ["CorePrivate", "Qml"])
if self.options.gui:
_create_private_module("Quick", ["CorePrivate", "GuiPrivate", "QmlPrivate", "Quick"])
def package_info(self):
self.cpp_info.set_property("cmake_file_name", "Qt5")
@@ -1017,561 +928,86 @@ Prefix = ..""")
self.cpp_info.names["cmake_find_package"] = "Qt5"
self.cpp_info.names["cmake_find_package_multi"] = "Qt5"
self.cpp_info.builddirs = [os.path.join(self.package_folder, "lib", "cmake", "Qt5")]
build_modules = {}
def _add_build_module(component, module):
if component not in build_modules:
build_modules[component] = []
build_modules[component].append(module)
self.cpp_info.components[component].build_modules["cmake_find_package"].append(module)
self.cpp_info.components[component].build_modules["cmake_find_package_multi"].append(module)
libsuffix = ""
if self.settings.os == "Android":
libsuffix = f"_{android_abi(self)}"
if not self.options.multiconfiguration:
if self.settings.build_type == "Debug":
if self.settings.os == "Windows" and is_msvc(self):
libsuffix = "d"
elif is_apple_os(self):
libsuffix = "_debug"
def _get_corrected_reqs(requires):
reqs = []
for r in requires:
if "::" in r:
corrected_req = r
else:
corrected_req = f"qt{r}"
assert corrected_req in self.cpp_info.components, f"{corrected_req} required but not yet present in self.cpp_info.components"
reqs.append(corrected_req)
return reqs
def _create_module(module, requires=[], has_include_dir=True):
componentname = f"qt{module}"
assert componentname not in self.cpp_info.components, f"Module {module} already present in self.cpp_info.components"
self.cpp_info.components[componentname].set_property("cmake_target_name", f"Qt5::{module}")
self.cpp_info.components[componentname].set_property("pkg_config_name", f"Qt5{module}")
self.cpp_info.components[componentname].names["cmake_find_package"] = module
self.cpp_info.components[componentname].names["cmake_find_package_multi"] = module
if module.endswith("Private"):
libname = module[:-7]
else:
libname = module
self.cpp_info.components[componentname].libs = [f"Qt5{libname}{libsuffix}"]
if has_include_dir:
self.cpp_info.components[componentname].includedirs = ["include", os.path.join("include", f"Qt{module}")]
define = module.upper()
if define == "TEST":
define = "TESTLIB"
elif define == "XCBQPA":
define = "XCB_QPA_LIB"
elif define.endswith("SUPPORT"):
define = define.replace("SUPPORT", "_SUPPORT")
self.cpp_info.components[componentname].defines = [f"QT_{define}_LIB"]
if module != "Core" and "Core" not in requires:
requires.append("Core")
self.cpp_info.components[componentname].requires = _get_corrected_reqs(requires)
def _create_plugin(pluginname, libname, plugintype, requires):
componentname = f"qt{pluginname}"
assert componentname not in self.cpp_info.components, f"Plugin {pluginname} already present in self.cpp_info.components"
self.cpp_info.components[componentname].set_property("cmake_target_name", f"Qt5::{pluginname}")
self.cpp_info.components[componentname].names["cmake_find_package"] = pluginname
self.cpp_info.components[componentname].names["cmake_find_package_multi"] = pluginname
if not self.options.shared:
self.cpp_info.components[componentname].libs = [libname + libsuffix]
self.cpp_info.components[componentname].libdirs = [os.path.join("plugins", plugintype)]
self.cpp_info.components[componentname].includedirs = []
if "Core" not in requires:
requires.append("Core")
self.cpp_info.components[componentname].requires = _get_corrected_reqs(requires)
core_reqs = ["zlib::zlib"]
self.cpp_info.requires = ["zlib::zlib"]
if self.options.with_pcre2:
core_reqs.append("pcre2::pcre2")
self.cpp_info.requires.append("pcre2::pcre2")
if self.options.with_doubleconversion:
core_reqs.append("double-conversion::double-conversion")
self.cpp_info.requires.append("double-conversion::double-conversion")
if self.options.get_safe("with_icu", False):
core_reqs.append("icu::icu")
self.cpp_info.requires.append("icu::icu")
if self.options.with_zstd:
core_reqs.append("zstd::zstd")
self.cpp_info.requires.append("zstd::zstd")
if self.options.with_glib:
core_reqs.append("glib::glib-2.0")
_create_module("Core", core_reqs)
pkg_config_vars = [
"host_bins=${prefix}/bin",
"exec_prefix=${prefix}",
]
self.cpp_info.components["qtCore"].set_property("pkg_config_custom_content", "\n".join(pkg_config_vars))
if self.settings.os == "Windows":
module = "WinMain"
componentname = f"qt{module}"
self.cpp_info.components[componentname].set_property("cmake_target_name", f"Qt5::{module}")
self.cpp_info.components[componentname].names["cmake_find_package"] = module
self.cpp_info.components[componentname].names["cmake_find_package_multi"] = module
self.cpp_info.components[componentname].libs = [f"qtmain{libsuffix}"]
self.cpp_info.components[componentname].includedirs = []
self.cpp_info.components[componentname].defines = []
self.cpp_info.requires.append("glib::glib-2.0")
if self.options.with_dbus:
_create_module("DBus", ["dbus::dbus"])
self.cpp_info.requires.append("dbus::dbus")
if self.options.gui:
gui_reqs = []
if self.options.with_dbus:
gui_reqs.append("DBus")
if self.options.with_freetype:
gui_reqs.append("freetype::freetype")
self.cpp_info.requires.append("freetype::freetype")
if self.options.with_libpng:
gui_reqs.append("libpng::libpng")
self.cpp_info.requires.append("libpng::libpng")
if self.options.get_safe("with_fontconfig", False):
gui_reqs.append("fontconfig::fontconfig")
self.cpp_info.requires.append("fontconfig::fontconfig")
if self.settings.os in ["Linux", "FreeBSD"]:
if self.options.qtwayland or self.options.get_safe("with_x11", False):
gui_reqs.append("xkbcommon::xkbcommon")
self.cpp_info.requires.append("xkbcommon::xkbcommon")
if self.options.get_safe("with_x11", False):
gui_reqs.append("xorg::xorg")
self.cpp_info.requires.append("xorg::xorg")
if self.options.get_safe("opengl", "no") != "no":
gui_reqs.append("opengl::opengl")
self.cpp_info.requires.append("opengl::opengl")
if self.options.get_safe("with_vulkan", False):
gui_reqs.append("vulkan-loader::vulkan-loader")
self.cpp_info.requires.append("vulkan-loader::vulkan-loader")
if is_apple_os(self):
gui_reqs.append("moltenvk::moltenvk")
self.cpp_info.requires.append("moltenvk::moltenvk")
if self.options.with_harfbuzz:
gui_reqs.append("harfbuzz::harfbuzz")
self.cpp_info.requires.append("harfbuzz::harfbuzz")
if self.options.with_libjpeg == "libjpeg-turbo":
gui_reqs.append("libjpeg-turbo::libjpeg-turbo")
self.cpp_info.requires.append("libjpeg-turbo::libjpeg-turbo")
if self.options.with_libjpeg == "libjpeg":
gui_reqs.append("libjpeg::libjpeg")
self.cpp_info.requires.append("libjpeg::libjpeg")
if self.options.with_md4c:
gui_reqs.append("md4c::md4c")
_create_module("Gui", gui_reqs)
_add_build_module("qtGui", self._cmake_qt5_private_file("Gui"))
event_dispatcher_reqs = ["Core", "Gui"]
self.cpp_info.requires.append("md4c::md4c")
if self.options.with_glib:
event_dispatcher_reqs.append("glib::glib")
_create_module("EventDispatcherSupport", event_dispatcher_reqs)
_create_module("FontDatabaseSupport", ["Core", "Gui"])
if self.settings.os == "Windows":
self.cpp_info.components["qtFontDatabaseSupport"].system_libs.extend(["advapi32", "ole32", "user32", "gdi32"])
elif is_apple_os(self):
self.cpp_info.components["qtFontDatabaseSupport"].frameworks.extend(["CoreFoundation", "CoreGraphics", "CoreText","Foundation"])
self.cpp_info.components["qtFontDatabaseSupport"].frameworks.append("AppKit" if self.settings.os == "Macos" else "UIKit")
self.cpp_info.requires.append("glib::glib")
if self.options.get_safe("with_fontconfig"):
self.cpp_info.components["qtFontDatabaseSupport"].requires.append("fontconfig::fontconfig")
self.cpp_info.requires.append("fontconfig::fontconfig")
if self.options.get_safe("with_freetype"):
self.cpp_info.components["qtFontDatabaseSupport"].requires.append("freetype::freetype")
_create_module("ThemeSupport", ["Core", "Gui"])
_create_module("AccessibilitySupport", ["Core", "Gui"])
if self.options.get_safe("with_vulkan"):
_create_module("VulkanSupport", ["Core", "Gui"])
if self.options.widgets:
_create_module("Widgets", ["Gui"])
_add_build_module("qtWidgets", self._cmake_qt5_private_file("Widgets"))
if self.settings.os not in ["iOS", "watchOS", "tvOS"]:
_create_module("PrintSupport", ["Gui", "Widgets"])
if self.settings.os == "Macos" and not self.options.shared:
self.cpp_info.components["qtPrintSupport"].system_libs.append("cups")
if is_apple_os(self):
_create_module("ClipboardSupport", ["Core", "Gui"])
self.cpp_info.components["qtClipboardSupport"].frameworks = ["ImageIO"]
if self.settings.os == "Macos":
self.cpp_info.components["qtClipboardSupport"].frameworks.append("AppKit")
_create_module("GraphicsSupport", ["Core", "Gui"])
if self.settings.os in ["Android", "Emscripten"]:
_create_module("EglSupport", ["Core", "Gui"])
if self.settings.os == "Windows":
windows_reqs = ["Core", "Gui"]
windows_reqs.extend(["EventDispatcherSupport", "FontDatabaseSupport", "ThemeSupport", "AccessibilitySupport"])
_create_module("WindowsUIAutomationSupport", ["Core", "Gui"])
windows_reqs.append("WindowsUIAutomationSupport")
if self.options.get_safe("with_vulkan"):
windows_reqs.append("VulkanSupport")
_create_plugin("QWindowsIntegrationPlugin", "qwindows", "platforms", windows_reqs)
_create_plugin("QWindowsVistaStylePlugin", "qwindowsvistastyle", "styles", windows_reqs)
self.cpp_info.components["qtQWindowsIntegrationPlugin"].system_libs = ["advapi32", "dwmapi", "gdi32", "imm32",
"ole32", "oleaut32", "shell32", "shlwapi", "user32", "winmm", "winspool", "wtsapi32"]
elif self.settings.os == "Android":
android_reqs = ["Core", "Gui", "EventDispatcherSupport", "AccessibilitySupport", "FontDatabaseSupport", "EglSupport"]
if self.options.get_safe("with_vulkan"):
android_reqs.append("VulkanSupport")
_create_plugin("QAndroidIntegrationPlugin", "qtforandroid", "platforms", android_reqs)
self.cpp_info.components["qtQAndroidIntegrationPlugin"].system_libs = ["android", "jnigraphics"]
elif self.settings.os == "Macos":
cocoa_reqs = ["Core", "Gui", "ClipboardSupport", "ThemeSupport", "FontDatabaseSupport", "GraphicsSupport", "AccessibilitySupport"]
if self.options.get_safe("with_vulkan"):
cocoa_reqs.append("VulkanSupport")
if self.options.widgets:
cocoa_reqs.append("PrintSupport")
_create_plugin("QCocoaIntegrationPlugin", "qcocoa", "platforms", cocoa_reqs)
_create_plugin("QMacStylePlugin", "qmacstyle", "styles", cocoa_reqs)
self.cpp_info.components["QCocoaIntegrationPlugin"].frameworks = ["AppKit", "Carbon", "CoreServices", "CoreVideo",
"IOKit", "IOSurface", "Metal", "QuartzCore"]
elif self.settings.os in ["iOS", "tvOS"]:
_create_plugin("QIOSIntegrationPlugin", "qios", "platforms", ["ClipboardSupport", "FontDatabaseSupport", "GraphicsSupport"])
self.cpp_info.components["QIOSIntegrationPlugin"].frameworks = ["AudioToolbox", "Foundation", "Metal",
"MobileCoreServices", "OpenGLES", "QuartzCore", "UIKit"]
elif self.settings.os == "watchOS":
_create_plugin("QMinimalIntegrationPlugin", "qminimal", "platforms", ["EventDispatcherSupport", "FontDatabaseSupport"])
elif self.settings.os == "Emscripten":
_create_plugin("QWasmIntegrationPlugin", "qwasm", "platforms", ["Core", "Gui", "EventDispatcherSupport", "FontDatabaseSupport", "EglSupport"])
elif self.settings.os in ["Linux", "FreeBSD"]:
service_support_reqs = ["Core", "Gui"]
if self.options.with_dbus:
service_support_reqs.append("DBus")
_create_module("ServiceSupport", service_support_reqs)
_create_module("EdidSupport")
self.cpp_info.requires.append("freetype::freetype")
if self.settings.os in ["Linux", "FreeBSD"]:
self.cpp_info.requires.append("xkbcommon::libxkbcommon-x11")
if self.options.get_safe("with_x11", False):
_create_module("XkbCommonSupport", ["Core", "Gui", "xkbcommon::libxkbcommon-x11"])
xcb_qpa_reqs = ["Core", "Gui", "ServiceSupport", "ThemeSupport", "FontDatabaseSupport", "EdidSupport", "XkbCommonSupport", "xorg::xorg"]
elif self.options.qtwayland:
_create_module("XkbCommonSupport", ["Core", "Gui", "xkbcommon::libxkbcommon"])
self.cpp_info.requires.append("xorg::xorg")
if self.options.with_dbus and self.options.with_atspi:
_create_module("LinuxAccessibilitySupport", ["Core", "DBus", "Gui", "AccessibilitySupport", "at-spi2-core::at-spi2-core"])
xcb_qpa_reqs.append("LinuxAccessibilitySupport")
if self.options.get_safe("with_vulkan"):
xcb_qpa_reqs.append("VulkanSupport")
if self.options.get_safe("with_x11", False):
_create_module("XcbQpa", xcb_qpa_reqs, has_include_dir=False)
_create_plugin("QXcbIntegrationPlugin", "qxcb", "platforms", ["Core", "Gui", "XcbQpa"])
self.cpp_info.requires.append("at-spi2-core::at-spi2-core")
if self.options.with_sqlite3:
_create_plugin("QSQLiteDriverPlugin", "qsqlite", "sqldrivers", ["sqlite3::sqlite3"])
self.cpp_info.requires.append("sqlite3::sqlite3")
if self.options.with_pq:
_create_plugin("QPSQLDriverPlugin", "qsqlpsql", "sqldrivers", ["libpq::libpq"])
self.cpp_info.requires.append("libpq::libpq")
if self.options.get_safe("with_mysql", False):
_create_plugin("QMySQLDriverPlugin", "qsqlmysql", "sqldrivers", ["libmysqlclient::libmysqlclient"])
self.cpp_info.requires.append("libmysqlclient::libmysqlclient")
if self.options.with_odbc:
if self.settings.os != "Windows":
_create_plugin("QODBCDriverPlugin", "qsqlodbc", "sqldrivers", ["odbc::odbc"])
networkReqs = []
self.cpp_info.requires.append("odbc::odbc")
if self.options.openssl:
networkReqs.append("openssl::openssl")
self.cpp_info.requires.append("openssl::openssl")
if self.settings.os in ['Linux', 'FreeBSD'] and self.options.with_gssapi:
networkReqs.append("krb5::krb5-gssapi")
_create_module("Network", networkReqs)
_create_module("Sql")
_create_module("Test")
if self.options.get_safe("opengl", "no") != "no" and self.options.gui:
_create_module("OpenGL", ["Gui"])
if self.options.widgets and self.options.get_safe("opengl", "no") != "no":
_create_module("OpenGLExtensions", ["Gui"])
_create_module("Concurrent")
_create_module("Xml")
if self.options.qtdeclarative:
_create_module("Qml", ["Network"])
_add_build_module("qtQml", self._cmake_qt5_private_file("Qml"))
_create_module("QmlModels", ["Qml"])
self.cpp_info.components["qtQmlImportScanner"].set_property("cmake_target_name", "Qt5::QmlImportScanner")
self.cpp_info.components["qtQmlImportScanner"].names["cmake_find_package"] = "QmlImportScanner" # this is an alias for Qml and there to integrate with existing consumers
self.cpp_info.components["qtQmlImportScanner"].names["cmake_find_package_multi"] = "QmlImportScanner"
self.cpp_info.components["qtQmlImportScanner"].requires = _get_corrected_reqs(["Qml"])
if self.options.gui:
_create_module("Quick", ["Gui", "Qml", "QmlModels"])
_add_build_module("qtQuick", self._cmake_qt5_private_file("Quick"))
if self.options.widgets:
_create_module("QuickWidgets", ["Gui", "Qml", "Quick", "Widgets"])
_create_module("QuickShapes", ["Gui", "Qml", "Quick"])
_create_module("QmlWorkerScript", ["Qml"])
_create_module("QuickTest", ["Test"])
if self.options.qttools and self.options.gui and self.options.widgets:
self.cpp_info.components["qtLinguistTools"].set_property("cmake_target_name", "Qt5::LinguistTools")
self.cpp_info.components["qtLinguistTools"].names["cmake_find_package"] = "LinguistTools"
self.cpp_info.components["qtLinguistTools"].names["cmake_find_package_multi"] = "LinguistTools"
_create_module("UiPlugin", ["Gui", "Widgets"])
self.cpp_info.components["qtUiPlugin"].libs = [] # this is a collection of abstract classes, so this is header-only
self.cpp_info.components["qtUiPlugin"].libdirs = []
_create_module("UiTools", ["UiPlugin", "Gui", "Widgets"])
if not cross_building(self):
_create_module("Designer", ["Gui", "UiPlugin", "Widgets", "Xml"])
_create_module("Help", ["Gui", "Sql", "Widgets"])
if self.options.qtquick3d and self.options.gui:
_create_module("Quick3DUtils", ["Gui"])
_create_module("Quick3DRender", ["Quick3DUtils", "Quick"])
_create_module("Quick3DAssetImport", ["Gui", "Qml", "Quick3DRender", "Quick3DUtils"])
_create_module("Quick3DRuntimeRender", ["Quick3DRender", "Quick3DAssetImport", "Quick3DUtils"])
_create_module("Quick3D", ["Gui", "Qml", "Quick", "Quick3DRuntimeRender"])
if self.options.qtquickcontrols2 and self.options.gui:
_create_module("QuickControls2", ["Gui", "Quick"])
_create_module("QuickTemplates2", ["Gui", "Quick"])
if self.options.qtsvg and self.options.gui:
_create_module("Svg", ["Gui"])
_create_plugin("QSvgIconPlugin", "qsvgicon", "iconengines", [])
_create_plugin("QSvgPlugin", "qsvg", "imageformats", [])
if self.options.qtwayland and self.options.gui:
_create_module("WaylandClient", ["Gui", "wayland::wayland-client"])
_create_module("WaylandCompositor", ["Gui", "wayland::wayland-server"])
if self.options.qtlocation:
_create_module("Positioning")
_create_module("Location", ["Gui", "Quick"])
_create_plugin("QGeoServiceProviderFactoryMapbox", "qtgeoservices_mapbox", "geoservices", [])
_create_plugin("QGeoServiceProviderFactoryMapboxGL", "qtgeoservices_mapboxgl", "geoservices", [])
_create_plugin("GeoServiceProviderFactoryEsri", "qtgeoservices_esri", "geoservices", [])
_create_plugin("QGeoServiceProviderFactoryItemsOverlay", "qtgeoservices_itemsoverlay", "geoservices", [])
_create_plugin("QGeoServiceProviderFactoryNokia", "qtgeoservices_nokia", "geoservices", [])
_create_plugin("QGeoServiceProviderFactoryOsm", "qtgeoservices_osm", "geoservices", [])
_create_plugin("QGeoPositionInfoSourceFactoryGeoclue", "qtposition_geoclue", "position", [])
_create_plugin("QGeoPositionInfoSourceFactoryGeoclue2", "qtposition_geoclue2", "position", [])
_create_plugin("QGeoPositionInfoSourceFactoryPoll", "qtposition_positionpoll", "position", [])
_create_plugin("QGeoPositionInfoSourceFactorySerialNmea", "qtposition_serialnmea", "position", [])
if self.options.qtwebchannel:
_create_module("WebChannel", ["Qml"])
if self.options.qtwebengine:
webenginereqs = ["Gui", "Quick", "WebChannel", "Positioning"]
if self.settings.os in ["Linux", "FreeBSD"]:
webenginereqs.extend(["expat::expat", "opus::libopus", "xorg-proto::xorg-proto", "libxshmfence::libxshmfence", \
"nss::nss", "libdrm::libdrm", "egl::egl"])
_create_module("WebEngineCore", webenginereqs)
if self.settings.os != "Windows":
self.cpp_info.components["WebEngineCore"].system_libs.append("resolv")
_create_module("WebEngine", ["WebEngineCore"])
_create_module("WebEngineWidgets", ["WebEngineCore", "Quick", "PrintSupport", "Widgets", "Gui", "Network"])
if self.options.qtserialport:
_create_module("SerialPort")
if self.options.qtserialbus:
_create_module("SerialBus", ["SerialPort"] if self.options.get_safe("qtserialport") else [])
_create_plugin("PassThruCanBusPlugin", "qtpassthrucanbus", "canbus", [])
_create_plugin("PeakCanBusPlugin", "qtpeakcanbus", "canbus", [])
_create_plugin("SocketCanBusPlugin", "qtsocketcanbus", "canbus", [])
_create_plugin("TinyCanBusPlugin", "qttinycanbus", "canbus", [])
_create_plugin("VirtualCanBusPlugin", "qtvirtualcanbus", "canbus", [])
if self.options.qtsensors:
_create_module("Sensors")
_create_plugin("genericSensorPlugin", "qtsensors_generic", "sensors", [])
_create_plugin("IIOSensorProxySensorPlugin", "qtsensors_iio-sensor-proxy", "sensors", [])
if self.settings.os == "Linux":
_create_plugin("LinuxSensorPlugin", "qtsensors_linuxsys", "sensors", [])
_create_plugin("QtSensorGesturePlugin", "qtsensorgestures_plugin", "sensorgestures", [])
_create_plugin("QShakeSensorGesturePlugin", "qtsensorgestures_shakeplugin", "sensorgestures", [])
if self.options.qtscxml:
_create_module("Scxml", ["Qml"])
if self.options.qtpurchasing:
_create_module("Purchasing")
if self.options.qtcharts:
_create_module("Charts", ["Gui", "Widgets"])
if self.options.qtgamepad:
_create_module("Gamepad", ["Gui"])
if self.settings.os == "Linux":
_create_plugin("QEvdevGamepadBackendPlugin", "evdevgamepad", "gamepads", [])
if self.settings.os == "Macos":
_create_plugin("QDarwinGamepadBackendPlugin", "darwingamepad", "gamepads", [])
if self.settings.os =="Windows":
_create_plugin("QXInputGamepadBackendPlugin", "xinputgamepad", "gamepads", [])
if self.options.qt3d:
_create_module("3DCore", ["Gui", "Network"])
_create_module("3DRender", ["3DCore"])
_create_plugin("DefaultGeometryLoaderPlugin", "defaultgeometryloader", "geometryloaders", [])
_create_plugin("GLTFGeometryLoaderPlugin", "gltfgeometryloader", "geometryloaders", [])
_create_plugin("GLTFSceneExportPlugin", "gltfsceneexport", "sceneparsers", [])
_create_plugin("GLTFSceneImportPlugin", "gltfsceneimport", "sceneparsers", [])
_create_plugin("OpenGLRendererPlugin", "openglrenderer", "renderers", [])
_create_plugin("Scene2DPlugin", "scene2d", "renderplugins", [])
_create_module("3DAnimation", ["3DRender", "3DCore", "Gui"])
_create_module("3DInput", ["3DCore", "Gui"] + (["Gamepad"] if self.options.qtgamepad else []))
_create_module("3DLogic", ["3DCore", "Gui"])
_create_module("3DExtras", ["3DRender", "3DInput", "3DLogic", "3DCore", "Gui"])
_create_module("3DQuick", ["3DCore", "Quick", "Gui", "Qml"])
_create_module("3DQuickAnimation", ["3DAnimation", "3DRender", "3DQuick", "3DCore", "Gui", "Qml"])
_create_module("3DQuickExtras", ["3DExtras", "3DInput", "3DQuick", "3DRender", "3DLogic", "3DCore", "Gui", "Qml"])
_create_module("3DQuickInput", ["3DInput", "3DQuick", "3DCore", "Gui", "Qml"])
_create_module("3DQuickRender", ["3DRender", "3DQuick", "3DCore", "Gui", "Qml"])
_create_module("3DQuickScene2D", ["3DRender", "3DQuick", "3DCore", "Gui", "Qml"])
self.cpp_info.requires.append("krb5::krb5-gssapi")
if self.options.qtmultimedia:
multimedia_reqs = ["Network", "Gui"]
if self.options.get_safe("with_libalsa", False):
multimedia_reqs.append("libalsa::libalsa")
self.cpp_info.requires.append("libalsa::libalsa")
if self.options.with_openal:
multimedia_reqs.append("openal-soft::openal-soft")
self.cpp_info.requires.append("openal-soft::openal-soft")
if self.options.get_safe("with_pulseaudio", False):
multimedia_reqs.append("pulseaudio::pulse")
_create_module("Multimedia", multimedia_reqs)
_create_module("MultimediaWidgets", ["Multimedia", "Widgets", "Gui"])
if self.options.qtdeclarative and self.options.gui:
_create_module("MultimediaQuick", ["Multimedia", "Quick"])
_create_plugin("QM3uPlaylistPlugin", "qtmultimedia_m3u", "playlistformats", [])
if self.options.with_gstreamer:
_create_module("MultimediaGstTools", ["Multimedia", "MultimediaWidgets", "Gui", "gst-plugins-base::gst-plugins-base"])
_create_plugin("QGstreamerAudioDecoderServicePlugin", "gstaudiodecoder", "mediaservice", [])
_create_plugin("QGstreamerCaptureServicePlugin", "gstmediacapture", "mediaservice", [])
_create_plugin("QGstreamerPlayerServicePlugin", "gstmediaplayer", "mediaservice", [])
if self.settings.os == "Linux":
if self.options.with_gstreamer:
_create_plugin("CameraBinServicePlugin", "gstcamerabin", "mediaservice", [])
if self.options.get_safe("with_libalsa", False):
_create_plugin("QAlsaPlugin", "qtaudio_alsa", "audio", [])
if self.settings.os == "Windows":
_create_plugin("AudioCaptureServicePlugin", "qtmedia_audioengine", "mediaservice", [])
_create_plugin("DSServicePlugin", "dsengine", "mediaservice", [])
_create_plugin("QWindowsAudioPlugin", "qtaudio_windows", "audio", [])
if self.settings.os == "Macos":
_create_plugin("AudioCaptureServicePlugin", "qtmedia_audioengine", "mediaservice", [])
_create_plugin("AVFMediaPlayerServicePlugin", "qavfmediaplayer", "mediaservice", [])
_create_plugin("AVFServicePlugin", "qavfcamera", "mediaservice", [])
_create_plugin("CoreAudioPlugin", "qtaudio_coreaudio", "audio", [])
if self.options.qtwebsockets:
_create_module("WebSockets", ["Network"])
if self.options.qtconnectivity:
_create_module("Bluetooth", ["Network"])
_create_module("Nfc", [])
if self.options.qtdatavis3d:
_create_module("DataVisualization", ["Gui"])
if self.options.qtnetworkauth:
_create_module("NetworkAuth", ["Network"])
if self.settings.os != "Windows":
self.cpp_info.components["qtCore"].cxxflags.append("-fPIC")
if self.options.get_safe("qtx11extras"):
_create_module("X11Extras")
if self.options.qtremoteobjects:
_create_module("RemoteObjects")
if self.options.get_safe("qtwinextras"):
_create_module("WinExtras")
if self.options.get_safe("qtmacextras"):
_create_module("MacExtras")
if self.options.qtxmlpatterns:
_create_module("XmlPatterns", ["Network"])
if self.options.get_safe("qtactiveqt"):
_create_module("AxBase", ["Gui", "Widgets"])
self.cpp_info.components["qtAxBase"].includedirs = ["include", os.path.join("include", "ActiveQt")]
self.cpp_info.components["qtAxBase"].system_libs.extend(["ole32", "oleaut32", "user32", "gdi32", "advapi32"])
if self.settings.compiler == "gcc":
self.cpp_info.components["qtAxBase"].system_libs.append("uuid")
_create_module("AxContainer", ["Core", "Gui", "Widgets", "AxBase"])
self.cpp_info.components["qtAxContainer"].includedirs = [os.path.join("include", "ActiveQt")]
_create_module("AxServer", ["Core", "Gui", "Widgets", "AxBase"])
self.cpp_info.components["qtAxServer"].includedirs = [os.path.join("include", "ActiveQt")]
self.cpp_info.components["qtAxServer"].system_libs.append("shell32")
if self.options.qtscript:
_create_module("Script")
if self.options.widgets:
_create_module("ScriptTools", ["Gui", "Widgets", "Script"])
if self.options.qtandroidextras:
_create_module("AndroidExtras")
if self.options.qtwebview:
_create_module("WebView", ["Gui", "Quick"])
if self.options.qtvirtualkeyboard:
_create_module("VirtualKeyboard", ["Qml", "Quick", "Gui"])
if self.options.qtspeech:
_create_module("TextToSpeech")
if not self.options.shared:
if self.settings.os == "Windows":
self.cpp_info.components["qtCore"].system_libs.append("version") # qtcore requires "GetFileVersionInfoW" and "VerQueryValueW" which are in "Version.lib" library
self.cpp_info.components["qtCore"].system_libs.append("winmm") # qtcore requires "__imp_timeSetEvent" which is in "Winmm.lib" library
self.cpp_info.components["qtCore"].system_libs.append("netapi32") # qtcore requires "NetApiBufferFree" which is in "Netapi32.lib" library
self.cpp_info.components["qtCore"].system_libs.append("userenv") # qtcore requires "__imp_GetUserProfileDirectoryW " which is in "UserEnv.Lib" library
self.cpp_info.components["qtCore"].system_libs.append("ws2_32") # qtcore requires "WSAStartup " which is in "Ws2_32.Lib" library
self.cpp_info.components["qtNetwork"].system_libs.append("dnsapi") # qtnetwork from qtbase requires "DnsFree" which is in "Dnsapi.lib" library
self.cpp_info.components["qtNetwork"].system_libs.append("iphlpapi")
if self.options.widgets:
self.cpp_info.components["qtWidgets"].system_libs.append("uxtheme")
self.cpp_info.components["qtWidgets"].system_libs.append("dwmapi")
if self.options.get_safe("qtwinextras"):
self.cpp_info.components["qtWinExtras"].system_libs.append("dwmapi") # qtwinextras requires "DwmGetColorizationColor" which is in "dwmapi.lib" library
if is_apple_os(self):
self.cpp_info.components["qtCore"].frameworks.append("CoreServices" if self.settings.os == "Macos" else "MobileCoreServices")
self.cpp_info.components["qtNetwork"].frameworks.append("SystemConfiguration")
if self.options.with_gssapi:
self.cpp_info.components["qtNetwork"].frameworks.append("GSS")
if not self.options.openssl: # with SecureTransport
self.cpp_info.components["qtNetwork"].frameworks.append("Security")
if self.settings.os == "Macos" or (self.settings.os == "iOS" and Version(self.settings.compiler.version) >= "14.0"):
self.cpp_info.components["qtCore"].frameworks.append("IOKit") # qtcore requires "_IORegistryEntryCreateCFProperty", "_IOServiceGetMatchingService" and much more which are in "IOKit" framework
if self.settings.os == "Macos":
self.cpp_info.components["qtCore"].frameworks.append("Cocoa") # qtcore requires "_OBJC_CLASS_$_NSApplication" and more, which are in "Cocoa" framework
self.cpp_info.components["qtCore"].frameworks.append("Security") # qtcore requires "_SecRequirementCreateWithString" and more, which are in "Security" framework
self.cpp_info.components["qtCore"].builddirs.append(os.path.join("bin"))
_add_build_module("qtCore", self._cmake_core_extras_file)
_add_build_module("qtCore", self._cmake_qt5_private_file("Core"))
for m in os.listdir(os.path.join("lib", "cmake")):
module = os.path.join("lib", "cmake", m, f"{m}Macros.cmake")
component_name = m.replace("Qt5", "qt")
if os.path.isfile(module):
_add_build_module(component_name, module)
self.cpp_info.components[component_name].builddirs.append(os.path.join("lib", "cmake", m))
qt5core_config_extras_mkspec_dir_cmake = load(self,
os.path.join("lib", "cmake", "Qt5Core", "Qt5CoreConfigExtrasMkspecDir.cmake"))
mkspecs_dir_begin = qt5core_config_extras_mkspec_dir_cmake.find("mkspecs/")
mkspecs_dir_end = qt5core_config_extras_mkspec_dir_cmake.find("\"", mkspecs_dir_begin)
mkspecs_path = qt5core_config_extras_mkspec_dir_cmake[mkspecs_dir_begin:mkspecs_dir_end]
assert os.path.exists(mkspecs_path)
self.cpp_info.components["qtCore"].includedirs.append(mkspecs_path)
objects_dirs = glob.glob(os.path.join(self.package_folder, "lib", "objects-*/"))
for object_dir in objects_dirs:
for m in os.listdir(object_dir):
component = "qt" + m[:m.find("_")]
if component not in self.cpp_info.components:
continue
submodules_dir = os.path.join(object_dir, m)
for sub_dir in os.listdir(submodules_dir):
submodule_dir = os.path.join(submodules_dir, sub_dir)
obj_files = [os.path.join(submodule_dir, file) for file in os.listdir(submodule_dir)]
self.cpp_info.components[component].exelinkflags.extend(obj_files)
self.cpp_info.components[component].sharedlinkflags.extend(obj_files)
build_modules_list = []
def _add_build_modules_for_component(component):
for req in self.cpp_info.components[component].requires:
if "::" in req: # not a qt component
continue
_add_build_modules_for_component(req)
build_modules_list.extend(build_modules.pop(component, []))
for c in self.cpp_info.components:
_add_build_modules_for_component(c)
self.cpp_info.set_property("cmake_build_modules", build_modules_list)
self.cpp_info.requires.append("pulseaudio::pulse")
self.cpp_info.requires.append("libalsa::libalsa")
if self.options.qtwebengine:
if self.settings.os in ["Linux", "FreeBSD"]:
self.cpp_info.extend(["expat::expat", "opus::libopus", "xorg-proto::xorg-proto", "libxshmfence::libxshmfence", \
"nss::nss", "libdrm::libdrm", "egl::egl"])
if self.options.qtwayland and self.options.gui:
self.cpp_info.requires.extend(["wayland::wayland-client", "wayland:wayland-server"])
@staticmethod
def _remove_duplicate(l):