blob: 4e423001a9a9a37f1a0d49664e963c2bf0048236 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from conan import ConanFile, conan_version
from conan.errors import ConanInvalidConfiguration
from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain
from conan.tools.scm import Version
from conan.tools.files import copy
import os
required_conan_version = ">=1.32.0"
class CelixConan(ConanFile):
name = "celix"
version = "3.0.0"
homepage = "https://celix.apache.org"
url = "https://github.com/apache/celix.git"
topics = ("conan", "celix", "osgi", "embedded", "linux", "C/C++")
exports_sources = ("CMakeLists.txt", "bundles*", "cmake*", "!cmake-build*", "examples*", "libs*", "misc*",
"LICENSE", "!examples/conan_test_package*")
generators = "CMakeDeps", "VirtualRunEnv"
settings = "os", "arch", "compiler", "build_type"
license = " Apache-2.0"
description = "Apache Celix is an implementation of the OSGi specification adapted to C and C++ (C++14). " \
"It is a framework to develop (dynamic) modular software applications " \
"using component and/or service-oriented programming."
_celix_defaults = {
"enable_testing": False,
"enable_code_coverage": False,
"enable_address_sanitizer": False,
"enable_undefined_sanitizer": False,
"enable_thread_sanitizer": False,
"install_find_modules": False,
"build_all": False,
"build_http_admin": False,
"build_log_service": False,
"build_log_helper": False,
"build_log_service_api": False,
"build_syslog_writer": False,
"build_cxx_remote_service_admin": False,
"build_cxx_rsa_integration": False,
"build_remote_service_admin": False,
"build_rsa_remote_service_admin_dfi": False,
"build_rsa_discovery_common": False,
"build_rsa_discovery_configured": False,
"build_rsa_discovery_etcd": False,
"build_rsa_remote_service_admin_shm_v2": False,
"build_rsa_json_rpc": False,
"build_rsa_discovery_zeroconf": False,
"build_shell": False,
"build_shell_api": False,
"build_remote_shell": False,
"build_shell_tui": False,
"build_shell_wui": False,
"build_components_ready_check": False,
"build_examples": False,
"build_celix_etcdlib": False,
"build_launcher": False,
"build_promises": False,
"build_pushstreams": False,
"build_experimental": False,
"build_celix_dfi": False,
"build_framework": False,
"build_rcm": False,
"build_utils": False,
"build_event_admin": False,
"build_event_admin_examples": False,
"celix_cxx14": True,
"celix_cxx17": True,
"celix_install_deprecated_api": False,
"celix_use_compression_for_bundle_zips": True,
"enable_cmake_warning_tests": False,
"enable_testing_on_ci": False,
"framework_curlinit": True,
"enable_ccache": False,
"enable_deprecated_warnings": False,
}
options = {
"celix_err_buffer_size": ["ANY"],
"celix_utils_max_strlen": ["ANY"],
"celix_properties_optimization_string_buffer_size": ["ANY"],
"celix_properties_optimization_entries_buffer_size": ["ANY"],
}
default_options = {
"celix_err_buffer_size": "512",
"celix_utils_max_strlen": "1073741824",
"celix_properties_optimization_string_buffer_size": "128",
"celix_properties_optimization_entries_buffer_size": "16",
}
for comp in _celix_defaults.keys():
options[comp] = [True, False]
del comp
_cmake = None
def validate_config_option_is_positive_number(self, option):
try:
val = int(self.options.get_safe(option))
if val <= 0:
raise ValueError
except ValueError:
raise ConanInvalidConfiguration("{} must be a positive number".format(option))
def validate(self):
if self.settings.os != "Linux" and self.settings.os != "Macos":
raise ConanInvalidConfiguration("Celix is only supported for Linux/Macos")
if self.options.build_rsa_remote_service_admin_shm_v2 and self.settings.os != "Linux":
raise ConanInvalidConfiguration("Celix build_rsa_remote_service_admin_shm_v2 is only supported for Linux")
if self.options.build_rsa_discovery_zeroconf and self.settings.os != "Linux":
raise ConanInvalidConfiguration("Celix build_rsa_discovery_zeroconf is only supported for Linux")
self.validate_config_option_is_positive_number("celix_err_buffer_size")
self.validate_config_option_is_positive_number("celix_utils_max_strlen")
self.validate_config_option_is_positive_number("celix_properties_optimization_string_buffer_size")
self.validate_config_option_is_positive_number("celix_properties_optimization_entries_buffer_size")
def package_id(self):
del self.info.options.build_all
# the followings are not installed
del self.info.options.build_cxx_rsa_integration
del self.info.options.build_examples
del self.info.options.build_event_admin_examples
del self.info.options.enable_cmake_warning_tests
del self.info.options.enable_testing_on_ci
del self.info.options.enable_ccache
del self.info.options.enable_deprecated_warnings
def build_requirements(self):
if self.options.enable_testing:
self.test_requires("gtest/1.10.0")
if self.options.enable_ccache:
self.build_requires("ccache/4.7.4")
def configure(self):
# copy options to options, fill in defaults if not set
options = {}
for opt in self._celix_defaults.keys():
options[opt] = self.options.get_safe(opt).value
if options[opt] is None:
options[opt] = self._celix_defaults[opt]
if options["build_all"]:
for opt in options.keys():
if opt.startswith('build_'):
options[opt] = True
if self.settings.os != "Linux":
options["build_rsa_remote_service_admin_shm_v2"] = False
options["build_rsa_discovery_zeroconf"] = False
if options["enable_code_coverage"]:
options["enable_testing"] = True
if options["build_examples"]:
options["build_shell_tui"] = True
options["build_shell_wui"] = True
options["build_log_service"] = True
options["build_syslog_writer"] = True
if options["build_cxx_rsa_integration"]:
options["build_cxx_remote_service_admin"] = True
options["build_pushstreams"] = True
options["build_promises"] = True
options["build_log_helper"] = True
options["build_shell"] = True
options["build_shell_tui"] = True
options["build_shell_api"] = True
if options["build_cxx_remote_service_admin"]:
options["build_framework"] = True
options["build_log_helper"] = True
options["celix_cxx17"] = True
if options["build_rsa_discovery_etcd"]:
options["build_celix_etcdlib"] = True
options["build_rsa_discovery_common"] = True
if options["build_rsa_discovery_configured"]:
options["build_rsa_discovery_common"] = True
if options["build_rsa_discovery_common"] or options["build_rsa_discovery_zeroconf"] \
or options["build_rsa_remote_service_admin_dfi"] or options["build_rsa_json_rpc"] \
or options["build_rsa_remote_service_admin_shm_v2"]:
options["build_remote_service_admin"] = True
if options["build_remote_service_admin"]:
options["build_framework"] = True
options["build_log_helper"] = True
options["build_celix_dfi"] = True
options["celix_install_deprecated_api"] = True
if options["build_event_admin_examples"]:
options["build_event_admin"] = True
options["build_log_service"] = True
options["build_shell_tui"] = True
options["build_launcher"] = True
if options["build_event_admin"]:
options["build_framework"] = True
options["build_log_helper"] = True
if options["build_remote_shell"]:
options["build_shell"] = True
if options["build_shell_wui"]:
options["build_shell"] = True
options["build_http_admin"] = True
if options["build_shell_tui"]:
options["build_shell"] = True
if options["build_shell"]:
options["build_shell_api"] = True
options["build_log_helper"] = True
options["build_framework"] = True
if options["build_http_admin"]:
options["build_framework"] = True
if options["build_syslog_writer"]:
options["build_log_service"] = True
if options["build_log_service"]:
options["build_log_service_api"] = True
options["build_shell_api"] = True
options["build_framework"] = True
options["build_log_helper"] = True
if options["build_shell_api"]:
options["build_utils"] = True
if options["build_log_helper"]:
options["build_log_service_api"] = True
options["build_framework"] = True
if options["build_log_service_api"]:
options["build_utils"] = True
if options["celix_install_deprecated_api"]:
options["build_framework"] = True
if options["build_components_ready_check"]:
options["build_framework"] = True
if options["build_rcm"]:
options["build_utils"] = True
if options["build_launcher"]:
options["build_framework"] = True
if options["build_celix_dfi"]:
options["build_utils"] = True
if options["build_framework"]:
options["build_utils"] = True
if options["build_pushstreams"]:
options["build_promises"] = True
if options["build_promises"]:
options["celix_cxx17"] = True
if options["celix_cxx17"]:
options["celix_cxx14"] = True
for opt in self._celix_defaults.keys():
setattr(self.options, opt, options[opt])
del options
# Conan 2 does not support set dependency option in requirements()
# https://github.com/conan-io/conan/issues/14528#issuecomment-1685344080
if self.options.build_utils:
self.options['libzip'].shared = True
if self.options.build_framework:
self.options['util-linux-libuuid'].shared = True
if ((self.options.build_framework and self.options.framework_curlinit)
or self.options.build_celix_etcdlib
or self.options.build_rsa_discovery_common or self.options.build_rsa_remote_service_admin_dfi
or self.options.build_launcher):
self.options['libcurl'].shared = True
self.options['openssl'].shared = True
if self.options.enable_testing:
self.options['gtest'].shared = True
if (self.options.build_rsa_discovery_common
or (self.options.build_rsa_remote_service_admin_dfi and self.options.enable_testing)):
self.options['libxml2'].shared = True
if self.options.build_http_admin or self.options.build_rsa_discovery_common \
or self.options.build_rsa_remote_service_admin_dfi:
self.options['civetweb'].shared = True
self.options['openssl'].shared = True
if self.options.build_celix_dfi:
self.options['libffi'].shared = True
if self.options.build_utils or self.options.build_celix_dfi or self.options.build_celix_etcdlib:
self.options['jansson'].shared = True
def requirements(self):
if self.options.build_utils:
self.requires("libzip/[>=1.7.3 <2.0.0]")
if self.options.build_framework:
self.requires("util-linux-libuuid/[>=2.39 <3.0.0]")
if ((self.options.build_framework and self.options.framework_curlinit)
or self.options.build_celix_etcdlib
or self.options.build_rsa_discovery_common or self.options.build_rsa_remote_service_admin_dfi
or self.options.build_launcher):
self.requires("libcurl/[>=8.4.0 <9.0.0]")
if (self.options.build_rsa_discovery_common
or (self.options.build_rsa_remote_service_admin_dfi and self.options.enable_testing)):
self.requires("libxml2/[>=2.9.9 <3.0.0]")
if self.options.build_cxx_remote_service_admin:
self.requires("rapidjson/[>=1.1.0 <2.0.0]")
if self.options.build_http_admin or self.options.build_rsa_discovery_common \
or self.options.build_rsa_remote_service_admin_dfi:
self.requires("civetweb/1.16")
if self.options.build_celix_dfi:
self.requires("libffi/[>=3.2.1 <4.0.0]")
if self.options.build_utils or self.options.build_celix_dfi or self.options.build_celix_etcdlib:
self.requires("jansson/[>=2.12 <3.0.0]")
if self.options.build_rsa_discovery_zeroconf:
# TODO: To be replaced with mdnsresponder/1790.80.10, resolve some problems of mdnsresponder
# https://github.com/conan-io/conan-center-index/pull/16254
self.requires("mdnsresponder/1310.140.1")
# 'libzip/1.10.1' requires 'zlib/1.2.13' while 'libcurl/7.64.1' requires 'zlib/1.2.12'
self.requires("zlib/1.2.13", override=True)
self.validate()
def generate(self):
tc = CMakeToolchain(self)
for opt in self._celix_defaults.keys():
tc.cache_variables[opt.upper()] = self.options.get_safe(opt)
if self.options.enable_testing:
lst = [x.ref.name for x in self.requires.values()]
if "mdnsresponder" in lst:
tc.cache_variables["BUILD_ERROR_INJECTOR_MDNSRESPONDER"] = "ON"
if "jansson" in lst:
tc.cache_variables["BUILD_ERROR_INJECTOR_JANSSON"] = "ON"
tc.cache_variables["CELIX_ERR_BUFFER_SIZE"] = str(self.options.celix_err_buffer_size)
# tc.cache_variables["CMAKE_PROJECT_Celix_INCLUDE"] = os.path.join(self.build_folder, "conan_paths.cmake")
# the following is workaround for https://github.com/conan-io/conan/issues/7192
if self.settings.os == "Linux":
tc.cache_variables["CMAKE_EXE_LINKER_FLAGS"] = "-Wl,--unresolved-symbols=ignore-in-shared-libs"
elif self.settings.os == "Macos":
tc.cache_variables["CMAKE_EXE_LINKER_FLAGS"] = "-Wl,-undefined -Wl,dynamic_lookup"
v = Version(self.version)
tc.cache_variables["CELIX_MAJOR"] = str(v.major.value)
tc.cache_variables["CELIX_MINOR"] = str(v.minor.value)
tc.cache_variables["CELIX_MICRO"] = str(v.patch.value)
tc.generate()
def _configure_cmake(self):
if self._cmake:
return self._cmake
self._cmake = CMake(self)
self._cmake.configure()
return self._cmake
def build(self):
# self._patch_sources()
cmake = self._configure_cmake()
cmake.build()
def package(self):
copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
cmake = self._configure_cmake()
cmake.install()
def package_info(self):
# enable imports() of conanfile.py to collect bundles from the local cache using @bindirs
# check https://docs.conan.io/en/latest/reference/conanfile/methods.html#imports
self.cpp_info.bindirs = ["bin", os.path.join("share", self.name, "bundles")]
self.cpp_info.build_modules["cmake"].append(os.path.join("lib", "cmake", "Celix", "CelixConfig.cmake"))
self.cpp_info.build_modules["cmake_find_package"].append(os.path.join("lib", "cmake",
"Celix", "CelixConfig.cmake"))
self.cpp_info.set_property("cmake_build_modules", [os.path.join("lib", "cmake", "Celix", "CelixConfig.cmake")])