1
0
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:
Iikka Eklund 2021-06-29 17:54:52 +03:00
parent 7e595a0d13
commit 251cb395cd
2 changed files with 22 additions and 98 deletions

View File

@ -1 +1,2 @@
set(QT_REPO_MODULE_VERSION "6.2.0")
set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1")

View File

@ -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"