mirror of
https://github.com/qt/qtmqtt.git
synced 2026-10-25 16:16:26 +00:00
Conan: Inherit recipe class from QtLeafModule for common functionality
The qt-conan-common package implements a base class for Qt leaf module recipes. The build steps in leaf modules are mostly identical so it makes sense to put those in the base class. Dependencies are read by the base class from the 'dependencies.yaml' which is the same file the CI system uses. Pick-to: 6.2 Task-number: QTBUG-94866 Change-Id: I0e581eec9e547961712e6d704f2c818688ab2b8e Reviewed-by: Toni Saario <toni.saario@qt.io>
This commit is contained in:
parent
7e595a0d13
commit
251cb395cd
@ -1 +1,2 @@
|
||||
set(QT_REPO_MODULE_VERSION "6.2.0")
|
||||
set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1")
|
||||
|
||||
119
conanfile.py
119
conanfile.py
@ -26,111 +26,34 @@
|
||||
##
|
||||
#############################################################################
|
||||
|
||||
from conans import ConanFile, tools, CMake
|
||||
import os
|
||||
from conans import ConanFile
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class QtConanError(Exception):
|
||||
pass
|
||||
def _parse_qt_version_by_key(key: str) -> str:
|
||||
with open(Path(__file__).parent.resolve() / ".cmake.conf") as f:
|
||||
m = re.search(fr'{key} .*"(.*)"', f.read())
|
||||
return m.group(1) if m else ""
|
||||
|
||||
|
||||
class QtMQTT(ConanFile):
|
||||
def _get_qt_minor_version() -> str:
|
||||
return ".".join(_parse_qt_version_by_key("QT_REPO_MODULE_VERSION").split(".")[:2])
|
||||
|
||||
|
||||
class QtMqtt(ConanFile):
|
||||
name = "qtmqtt"
|
||||
version = "6.2.0"
|
||||
license = "GPL-3.0+, Commercial Qt License Agreement"
|
||||
author = "The Qt Company <https://www.qt.io/contact-us>"
|
||||
url = "https://code.qt.io/cgit/qt/qtmqtt.git"
|
||||
description = "Qt MQTT is a machine-to-machine (M2M) protocol utilizing the publish-and-subscribe paradigm."
|
||||
topics = ("qt", "qt6", "MQTT", "M2M")
|
||||
settings = "os", "compiler", "build_type", "arch"
|
||||
options = {"shared": [True, False, "default"],
|
||||
"qt6": "ANY"} # this is needed to model unique package_id for the Add-on build per used Qt6 version
|
||||
default_options = {"shared": "default", # default: Use the value of the Qt build
|
||||
"qt6": None}
|
||||
description = (
|
||||
"Qt MQTT is a machine-to-machine (M2M) protocol utilizing the "
|
||||
"publish-and-subscribe paradigm."
|
||||
)
|
||||
topics = "qt", "qt6", "MQTT", "M2M"
|
||||
settings = "os", "compiler", "arch", "build_type"
|
||||
# for referencing the version number and prerelease tag and dependencies info
|
||||
exports = ".cmake.conf", "dependencies.yaml"
|
||||
exports_sources = "*", "!conan*.*"
|
||||
# use commit ID as the RREV (recipe revision) if this is exported from .git repository
|
||||
revision_mode = "scm" if Path(Path(__file__).parent.resolve() / ".git").exists() else "hash"
|
||||
|
||||
def source(self):
|
||||
# sources are installed next to recipe, no need to clone etc. sources here
|
||||
pass
|
||||
|
||||
def _get_cmake_prefix_path(self):
|
||||
# 'QTDIR' provided as env variable in profile file which is part of the Qt essential binary
|
||||
# package(s). Installed under .conan/profiles
|
||||
cmake_prefix_path = os.environ.get("QTDIR")
|
||||
if not cmake_prefix_path:
|
||||
raise QtConanError("'QTDIR' not defined! The 'QTDIR' needs to point to Qt installation directory.")
|
||||
print(f"CMAKE_PREFIX_PATH for '{self.name}/{self.version}' build is: {cmake_prefix_path}")
|
||||
return cmake_prefix_path
|
||||
|
||||
def _read_env(self, key):
|
||||
value = os.environ.get(key)
|
||||
if not value:
|
||||
raise QtConanError(f"{self.settings.os} build specified but '{key}' was not defined?")
|
||||
return value
|
||||
|
||||
def _get_qtcmake(self):
|
||||
qt_install_path = self._get_cmake_prefix_path()
|
||||
ext = ".bat" if tools.os_info.is_windows else ""
|
||||
qtcmake = os.path.abspath(os.path.join(qt_install_path, "bin", "qt-cmake" + ext))
|
||||
if not os.path.exists(qtcmake):
|
||||
raise QtConanError(f"Unable to locate {qtcmake} from 'QTDIR': {qt_install_path}")
|
||||
return qtcmake
|
||||
|
||||
def _get_cmake_tool(self):
|
||||
cmake = CMake(self, cmake_program=self._get_qtcmake())
|
||||
cmake.verbose = True
|
||||
|
||||
# Qt modules need to be 'installed'.
|
||||
# We need to direct the 'make install' to some directory under Conan cache,
|
||||
# place it under the current build directory which is also under the Conan cache.
|
||||
# Note, the actual 'make install' is called in "package()".
|
||||
install_dir = os.path.join(os.getcwd(), "_install_tmp")
|
||||
cmake.definitions["CMAKE_INSTALL_PREFIX"] = install_dir
|
||||
|
||||
# Use the value of the Qt build
|
||||
if self.options.shared.value == "default":
|
||||
del cmake.definitions["BUILD_SHARED_LIBS"]
|
||||
|
||||
cmake_toolchain_file = os.environ.get("CMAKE_TOOLCHAIN_FILE")
|
||||
if cmake_toolchain_file:
|
||||
cmake.definitions["CMAKE_TOOLCHAIN_FILE"] = cmake_toolchain_file
|
||||
|
||||
if self.settings.os == "Android":
|
||||
cmake.definitions["ANDROID_SDK_ROOT"] = self._read_env('ANDROID_SDK_ROOT')
|
||||
cmake.definitions["ANDROID_NDK_ROOT"] = self._read_env('ANDROID_NDK_ROOT')
|
||||
|
||||
if self.settings.os == "iOS":
|
||||
# Instead of Conan's auto-added 'Darwin', explicitly pass 'iOS'.
|
||||
cmake.definitions["CMAKE_SYSTEM_NAME"] = "iOS"
|
||||
|
||||
# Remove the explicit sysroot, let CMake detect the sysroots, to ensure
|
||||
# that multi-arch builds work.
|
||||
del cmake.definitions["CMAKE_OSX_SYSROOT"]
|
||||
|
||||
# Remove the conan provided architecture, instead rely on the architectures set
|
||||
# by the Qt toolchain file, which with official Qt packages most likely means
|
||||
# multi-arch iOS.
|
||||
del cmake.definitions["CMAKE_OSX_ARCHITECTURES"]
|
||||
|
||||
return cmake
|
||||
|
||||
def build(self):
|
||||
cmake = self._get_cmake_tool()
|
||||
self.run('%s "%s" %s' % (self._get_qtcmake(), self.source_folder, cmake.command_line))
|
||||
self.run('cmake --build . %s' % cmake.build_config)
|
||||
|
||||
def package(self):
|
||||
install_dir = os.path.join(os.getcwd(), "_install_tmp") # see 'CMAKE_INSTALL_PREFIX' above
|
||||
self.run('cmake --build . --target install')
|
||||
self.copy("*", src=install_dir, dst=".")
|
||||
|
||||
def package_info(self):
|
||||
self.cpp_info.libs = ["Qt6Mqtt"] # used for the actual library filename, Ordered list with the library names
|
||||
|
||||
def deploy(self):
|
||||
self.copy("*") # copy from current package
|
||||
self.copy_deps("*") # copy from dependencies
|
||||
|
||||
python_requires = f"qt-conan-common/{_get_qt_minor_version()}@qt/everywhere"
|
||||
python_requires_extend = "qt-conan-common.QtLeafModule"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user