[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

@@ -0,0 +1,29 @@
sources:
"1.15.8":
url: "https://nexus.avroid.tech/repository/all-raw-proxy-dbus_freedesktop_org/releases/dbus/dbus-1.15.8.tar.xz"
sha256: "84fc597e6ec82f05dc18a7d12c17046f95bad7be99fc03c15bc254c4701ed204"
"1.15.6":
url: "https://nexus.avroid.tech/repository/all-raw-proxy-dbus_freedesktop_org/releases/dbus/dbus-1.15.6.tar.xz"
sha256: "f97f5845f9c4a5a1fb3df67dfa9e16b5a3fd545d348d6dc850cb7ccc9942bd8c"
"1.15.2":
url: "https://nexus.avroid.tech/repository/all-raw-proxy-dbus_freedesktop_org/releases/dbus/dbus-1.15.2.tar.xz"
sha256: "7e640803084af59f5e477b7ded11fd888b5380910a895c51ca3aedd63c0626ca"
"1.15.0":
url: "https://nexus.avroid.tech/repository/all-raw-proxy-dbus_freedesktop_org/releases/dbus/dbus-1.15.0.tar.xz"
sha256: "5073c8cb9ad20226647bb38f4965182b762a6e1f595ccdc8e59411014bfd640a"
patches:
"1.15.8":
- patch_file: "patches/0001-meson-Use-check_header-to-confirm-headers-work.patch"
patch_type: "portability"
patch_description: "Fix build with Visual Studio 2022"
patch_source: "https://gitlab.freedesktop.org/dbus/dbus/-/merge_requests/454"
"1.15.2":
- patch_file: "patches/0003-meson-monotonic-clock-check.patch"
patch_type: "portability"
patch_description: "Fix detection of necessary monotonic clock functions in pthread"
patch_source: "https://gitlab.freedesktop.org/dbus/dbus/-/merge_requests/352"
"1.15.0":
- patch_file: "patches/0003-meson-monotonic-clock-check.patch"
patch_type: "portability"
patch_description: "Fix detection of necessary monotonic clock functions in pthread"
patch_source: "https://gitlab.freedesktop.org/dbus/dbus/-/merge_requests/352"

View File

@@ -0,0 +1,224 @@
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.apple import fix_apple_shared_install_name, is_apple_os
from conan.tools.env import VirtualBuildEnv
from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rename, replace_in_file, rm, rmdir, save
from conan.tools.gnu import PkgConfigDeps
from conan.tools.layout import basic_layout
from conan.tools.meson import Meson, MesonToolchain
from conan.tools.scm import Version
import os
import textwrap
required_conan_version = ">=1.64.0 <2 || >=2.2.0"
class DbusConan(ConanFile):
name = "dbus"
# license is AFL-2.1 OR GPL-2.0-or-later with several other compatible licenses for smaller sections of code
license = "(AFL-2.1 OR GPL-2.0-or-later) AND DocumentRef-COPYING"
url = "https://github.com/conan-io/conan-center-index"
homepage = "https://www.freedesktop.org/wiki/Software/dbus"
description = "D-Bus is a simple system for interprocess communication and coordination."
topics = "bus", "interprocess", "message"
package_type = "library"
settings = "os", "arch", "compiler", "build_type"
short_paths = True
options = {
"shared": [True, False],
"fPIC": [True, False],
"dbus_user": [None, "ANY"],
"message_bus": [True, False],
"system_socket": [None, "ANY"],
"system_pid_file": [None, "ANY"],
"with_x11": [True, False],
"with_systemd": [True, False],
"with_selinux": [True, False],
"session_socket_dir": [None, "ANY"],
}
default_options = {
"shared": False,
"fPIC": True,
"dbus_user": "messagebus",
"message_bus": False,
"system_socket": None,
"system_pid_file": None,
"with_x11": False,
"with_systemd": False,
"with_selinux": False,
"session_socket_dir": "/tmp",
}
@property
def _has_message_bus_option(self):
return Version(self.version) > "1.15.2"
def export_sources(self):
export_conandata_patches(self)
def config_options(self):
if self.settings.os not in ["Linux", "FreeBSD"]:
del self.options.with_systemd
del self.options.with_x11
del self.options.with_selinux
if self.settings.os == "Windows":
del self.options.fPIC
if not self._has_message_bus_option:
self.options.rm_safe("message_bus")
def configure(self):
self.settings.rm_safe("compiler.cppstd")
self.settings.rm_safe("compiler.libcxx")
if self.options.shared:
self.options.rm_safe("fPIC")
if not self.options.get_safe("message_bus"):
self.options.rm_safe("dbus_user")
def layout(self):
basic_layout(self, src_folder="src")
def requirements(self):
self.requires("expat/[>=2.6.2 <3]")
if self.options.get_safe("with_systemd"):
self.requires("libsystemd/253.6")
if self.options.get_safe("with_selinux"):
self.requires("libselinux/3.6")
if self.options.get_safe("with_x11"):
# X11 is only linked into an executable and should not be propagated as a library dependency.
# It should still be provided in a VirtualRunEnv context, though,
# but Conan as of v2.2 does not yet provide a fine-grained enough control over this.
self.requires("xorg/system", visible=False)
def package_id(self):
# The dbus_user option only effects the installation of dbus during the package method.
# Otherwise, it only appears in the system.conf file in the package.
self.info.options.rm_safe("dbus_user")
def validate(self):
if self.settings.compiler == "gcc" and Version(self.settings.compiler.version) < 7:
raise ConanInvalidConfiguration(f"{self.ref} requires at least gcc 7.")
def build_requirements(self):
self.tool_requires("meson/[>=1.4.0]")
if not self.conf.get("tools.gnu:pkg_config",check_type=str):
self.tool_requires("pkgconf/[>=2.1.0]")
def source(self):
get(self, **self.conan_data["sources"][self.version], strip_root=True)
def generate(self):
env = VirtualBuildEnv(self)
env.generate()
tc = MesonToolchain(self)
tc.project_options["asserts"] = not is_apple_os(self)
tc.project_options["checks"] = False
tc.project_options["datadir"] = os.path.join("res", "share")
tc.project_options["sysconfdir"] = os.path.join("res", "etc")
tc.project_options["doxygen_docs"] = "disabled"
tc.project_options["ducktype_docs"] = "disabled"
tc.project_options["qt_help"] = "disabled"
tc.project_options["modular_tests"] = "disabled"
tc.project_options["selinux"] = "enabled" if self.options.get_safe("with_selinux") else "disabled"
if self.options.session_socket_dir:
tc.project_options["session_socket_dir"] = str(self.options.session_socket_dir)
tc.project_options["systemd"] = "enabled" if self.options.get_safe("with_systemd") else "disabled"
if self.options.get_safe("with_systemd"):
tc.project_options["systemd_system_unitdir"] = "/res/lib/systemd/system"
tc.project_options["systemd_user_unitdir"] = "/res/usr/lib/systemd/system"
if self._has_message_bus_option:
tc.project_options["message_bus"] = bool(self.options.message_bus)
if self.options.get_safe("dbus_user"):
tc.project_options["dbus_user"] = str(self.options.dbus_user)
if self.options.system_pid_file:
tc.project_options["system_pid_file"] = str(self.options.system_pid_file)
if self.options.system_socket:
tc.project_options["system_socket"] = str(self.options.system_socket)
if is_apple_os(self):
tc.project_options["launchd_agent_dir"] = os.path.join("res", "LaunchAgents")
tc.project_options["x11_autolaunch"] = "enabled" if self.options.get_safe("with_x11") else "disabled"
tc.project_options["xml_docs"] = "disabled"
tc.generate()
deps = PkgConfigDeps(self)
deps.generate()
def _patch_sources(self):
apply_conandata_patches(self)
replace_in_file(self, os.path.join(self.source_folder, "meson.build"),
"subdir('test')", "# subdir('test')")
def build(self):
self._patch_sources()
meson = Meson(self)
meson.configure()
meson.build()
def package(self):
copy(self, "COPYING", self.source_folder, os.path.join(self.package_folder, "licenses"))
copy(self, "*", os.path.join(self.source_folder, "LICENSES"), os.path.join(self.package_folder, "licenses"))
meson = Meson(self)
meson.install()
rm(self, "*.pdb", os.path.join(self.package_folder, "bin"))
rmdir(self, os.path.join(self.package_folder, "res", "share", "doc"))
rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
fix_apple_shared_install_name(self)
if self.settings.os == "Windows" and not self.options.shared:
rename(self, os.path.join(self.package_folder, "lib", "libdbus-1.a"), os.path.join(self.package_folder, "lib", "dbus-1.lib"))
# TODO: to remove in conan v2 once cmake_find_package_* generators removed
self._create_cmake_module_alias_targets(
os.path.join(self.package_folder, self._module_file_rel_path),
{"dbus-1": "dbus-1::dbus-1"}
)
def _create_cmake_module_alias_targets(self, module_file, targets):
content = ""
for alias, aliased in targets.items():
content += textwrap.dedent(f"""\
if(TARGET {aliased} AND NOT TARGET {alias})
add_library({alias} INTERFACE IMPORTED)
set_property(TARGET {alias} PROPERTY INTERFACE_LINK_LIBRARIES {aliased})
endif()
""")
save(self, module_file, content)
@property
def _module_file_rel_path(self):
return os.path.join("lib", "cmake", f"conan-official-{self.name}-targets.cmake")
def package_info(self):
self.cpp_info.set_property("cmake_file_name", "DBus1")
self.cpp_info.set_property("cmake_target_name", "dbus-1")
self.cpp_info.set_property("pkg_config_name", "dbus-1")
self.cpp_info.includedirs.extend([
os.path.join("include", "dbus-1.0"),
os.path.join("lib", "dbus-1.0", "include"),
])
self.cpp_info.resdirs = ["res"]
self.cpp_info.libs = ["dbus-1"]
if self.settings.os == "Linux":
self.cpp_info.system_libs.append("rt")
if self.settings.os == "Windows":
self.cpp_info.system_libs.extend(["iphlpapi", "ws2_32"])
else:
self.cpp_info.system_libs.append("pthread")
if not self.options.shared:
self.cpp_info.defines.append("DBUS_STATIC_BUILD")
self.cpp_info.requires.append("expat::expat")
if self.options.get_safe("with_systemd"):
self.cpp_info.requires.append("libsystemd::libsystemd")
if self.options.get_safe("with_selinux"):
self.cpp_info.requires.append("libselinux::selinux")
# TODO: to remove in conan v2 once cmake_find_package_* & pkg_config generators removed
self.cpp_info.filenames["cmake_find_package"] = "DBus1"
self.cpp_info.filenames["cmake_find_package_multi"] = "DBus1"
self.cpp_info.names["cmake_find_package"] = "dbus-1"
self.cpp_info.names["cmake_find_package_multi"] = "dbus-1"
self.cpp_info.build_modules["cmake_find_package"] = [self._module_file_rel_path]
self.cpp_info.build_modules["cmake_find_package_multi"] = [self._module_file_rel_path]
self.cpp_info.names["pkg_config"] = "dbus-1"

View File

@@ -0,0 +1,46 @@
From e52ccaf7c3abf9d0adccfd001c1417ce08a7f335 Mon Sep 17 00:00:00 2001
From: Thomas Sondergaard <Thomas.Sondergaard@mi.medical.canon>
Date: Thu, 4 Jan 2024 17:45:46 +0100
Subject: [PATCH] meson: Use check_header to confirm headers work
instead of using has_header use check_header to confirm the header
works. This is necessary to get the meson build to work with Visual
Studio 2022. It has <stdatomic.h> but it does not actually work when
compiling a C program. A minimal C program that include <stdatomic.h>
fails with the following errors:
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(36): error C2061: syntax error: identifier 'atomic_bool'
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(36): error C2059: syntax error: ';'
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(37): error C2061: syntax error: identifier 'atomic_char'
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(37): error C2059: syntax error: ';'
...
...
check_header is consistent with CMake's
check_include_file(stdatomic.h HAVE_STDATOMIC_H)
which is why the CMake-based build of dbus works with Visual Studio
2022, while the meson build doesn't.
Fixes #494
---
meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/meson.build b/meson.build
index 17b2a837..19b41cd9 100644
--- a/meson.build
+++ b/meson.build
@@ -705,7 +705,7 @@ check_headers = [
foreach header : check_headers
macro = 'HAVE_' + header.underscorify().to_upper()
- config.set(macro, cc.has_header(header, args: compile_args_c) ? 1 : false)
+ config.set(macro, cc.check_header(header, args: compile_args_c) ? 1 : false)
endforeach
execinfo = cc.find_library('execinfo', required: false)
--
2.43.0.windows.1

View File

@@ -0,0 +1,15 @@
diff --git a/meson.build b/meson.build
index 3b5b182c..4e400a52 100644
--- a/meson.build
+++ b/meson.build
@@ -328,7 +328,9 @@ data_config.set('top_builddir', meson.project_build_root())
threads = dependency('threads')
config.set(
'HAVE_MONOTONIC_CLOCK',
- cc.has_header_symbol('pthread.h', 'CLOCK_MONOTONIC', args: compile_args_c),
+ cc.has_header_symbol('pthread.h', 'CLOCK_MONOTONIC', args: compile_args_c)
+ and cc.has_header_symbol('pthread.h', 'pthread_condattr_setclock', args: compile_args_c)
+ and cc.has_header_symbol('time.h', 'clock_getres', args: compile_args_c),
)
glib = dependency(

View File

@@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 3.1)
project(test_package LANGUAGES C)
find_package(DBus1 REQUIRED CONFIG)
add_executable(${PROJECT_NAME} test_package.c)
target_link_libraries(${PROJECT_NAME} PRIVATE dbus-1)

View File

@@ -0,0 +1,27 @@
from conan import ConanFile
from conan.tools.build import can_run
from conan.tools.cmake import CMake, cmake_layout
import os
class TestPackageConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = "CMakeToolchain", "CMakeDeps", "VirtualRunEnv"
test_type = "explicit"
def layout(self):
cmake_layout(self)
def requirements(self):
self.requires(self.tested_reference_str, run=True)
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def test(self):
if can_run(self):
self.run("dbus-monitor --help", env="conanrun")
bin_path = os.path.join(self.cpp.build.bindirs[0], "test_package")
self.run(bin_path, env="conanrun")

View File

@@ -0,0 +1,13 @@
#include <stdio.h>
#include <dbus/dbus.h>
int main() {
int major_version = 0;
int minor_version = 0;
int micro_version = 0;
dbus_get_version(&major_version, &minor_version, &micro_version);
printf("D-Bus version: v%i.%i.%i\n", major_version, minor_version, micro_version);
return 0;
}

9
recipes/dbus/config.yml Normal file
View File

@@ -0,0 +1,9 @@
versions:
"1.15.8":
folder: all
"1.15.6":
folder: all
"1.15.2":
folder: all
"1.15.0":
folder: all

View File

@@ -26,7 +26,7 @@ class MesonConan(ConanFile):
# if self.conf.get("tools.meson.mesontoolchain:backend", default="ninja", check_type=str) == "ninja":
# # Meson requires >=1.8.2 as of 1.5
# # https://github.com/mesonbuild/meson/blob/b6b634ad33e5ca9ad4a9d6139dba4244847cc0e8/mesonbuild/backend/ninjabackend.py#L625
# self.requires("ninja/[>=1.10.2 <2]")
# self.requires("ninja/[>=1.10.2 <2]")
def package_id(self):
self.info.clear()

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):

View File

@@ -1 +0,0 @@
. "/home/aleksandr.vodyanov/Documents/Avroid/Conan/conan_recipes.git/recipes/xkeyboard-config/all/test_package/build-release/conan/conanbuildenv-release-x86_64.sh"

View File

@@ -1,18 +0,0 @@
script_folder="/home/aleksandr.vodyanov/Documents/Avroid/Conan/conan_recipes.git/recipes/xkeyboard-config/all/test_package/build-release/conan"
echo "echo Restoring environment" > "$script_folder/deactivate_conanbuildenv-release-x86_64.sh"
for v in CXX CC CONAN_V2_MODE
do
is_defined="true"
value=$(printenv $v) || is_defined="" || true
if [ -n "$value" ] || [ -n "$is_defined" ]
then
echo export "$v='$value'" >> "$script_folder/deactivate_conanbuildenv-release-x86_64.sh"
else
echo unset $v >> "$script_folder/deactivate_conanbuildenv-release-x86_64.sh"
fi
done
export CXX="x86_64-linux-gnu-g++-12"
export CC="x86_64-linux-gnu-gcc-12"
export CONAN_V2_MODE="true"

View File

@@ -1 +0,0 @@
. "/home/aleksandr.vodyanov/Documents/Avroid/Conan/conan_recipes.git/recipes/xkeyboard-config/all/test_package/build-release/conan/conanrunenv-release-x86_64.sh"

View File

@@ -1,14 +0,0 @@
script_folder="/home/aleksandr.vodyanov/Documents/Avroid/Conan/conan_recipes.git/recipes/xkeyboard-config/all/test_package/build-release/conan"
echo "echo Restoring environment" > "$script_folder/deactivate_conanrunenv-release-x86_64.sh"
for v in
do
is_defined="true"
value=$(printenv $v) || is_defined="" || true
if [ -n "$value" ] || [ -n "$is_defined" ]
then
echo export "$v='$value'" >> "$script_folder/deactivate_conanrunenv-release-x86_64.sh"
else
echo unset $v >> "$script_folder/deactivate_conanrunenv-release-x86_64.sh"
fi
done

View File

@@ -1 +0,0 @@
. "/home/aleksandr.vodyanov/Documents/Avroid/Conan/conan_recipes.git/recipes/xkeyboard-config/all/test_package/build-release/conan/deactivate_conanbuildenv-release-x86_64.sh"

View File

@@ -1,4 +0,0 @@
echo Restoring environment
unset CXX
unset CC
unset CONAN_V2_MODE

View File

@@ -1 +0,0 @@
. "/home/aleksandr.vodyanov/Documents/Avroid/Conan/conan_recipes.git/recipes/xkeyboard-config/all/test_package/build-release/conan/deactivate_conanrunenv-release-x86_64.sh"

View File

@@ -1,8 +0,0 @@
prefix=/home/aleksandr.vodyanov/.conan2/p/b/xkeybfb432262e432a/p
bindir=${prefix}/bin
xkb_base=/usr/share/X11/xkb
datadir=/usr/share
Name: xkeyboard-config
Description: Conan package: xkeyboard-config
Version: system