diff --git a/recipes/boost/all/conanfile.py b/recipes/boost/all/conanfile.py index 98ad17a63842e..c8a4541c68048 100644 --- a/recipes/boost/all/conanfile.py +++ b/recipes/boost/all/conanfile.py @@ -21,7 +21,7 @@ import sys import yaml -required_conan_version = ">=1.53.0" +required_conan_version = ">=2.2" # When adding (or removing) an option, also add this option to the list in # `rebuild-dependencies.yml` and re-run that script. @@ -71,7 +71,7 @@ class BoostConan(ConanFile): homepage = "https://www.boost.org" license = "BSL-1.0" topics = ("libraries", "cpp") - + package_type = "library" settings = "os", "arch", "compiler", "build_type" options = { "shared": [True, False], @@ -97,10 +97,9 @@ class BoostConan(ConanFile): "lzma": [True, False], "zstd": [True, False], "segmented_stacks": [True, False], - "debug_level": list(range(0, 14)), + "debug_level": list(range(0, 14)) + ["deprecated"], "pch": [True, False], "extra_b2_flags": [None, "ANY"], # custom b2 flags - "i18n_backend": ["iconv", "icu", None, "deprecated"], "i18n_backend_iconv": ["libc", "libiconv", "off"], "i18n_backend_icu": [True, False], "visibility": ["global", "protected", "hidden"], @@ -136,10 +135,9 @@ class BoostConan(ConanFile): "lzma": False, "zstd": False, "segmented_stacks": False, - "debug_level": 0, + "debug_level": "deprecated", # deprecated, use Conan conf tools.build:verbosity "pch": True, "extra_b2_flags": None, - "i18n_backend": "deprecated", "i18n_backend_iconv": "libc", "i18n_backend_icu": False, "visibility": "hidden", @@ -152,7 +150,6 @@ class BoostConan(ConanFile): default_options.update({f"without_{_name}": False for _name in CONFIGURE_OPTIONS}) default_options.update({f"without_{_name}": True for _name in ("graph_parallel", "mpi", "python")}) - short_paths = True no_copy_source = True _cached_dependencies = None @@ -372,10 +369,6 @@ def _all_super_modules(self, name): def _bcp_dir(self): return "custom-boost" - @property - def _settings_build(self): - return getattr(self, "settings_build", self.settings) - @property def _is_clang_cl(self): return self.settings.os == "Windows" and self.settings.compiler == "clang" @@ -634,17 +627,6 @@ def configure(self): elif self.options.shared: self.options.rm_safe("fPIC") - if self.options.i18n_backend != "deprecated": - self.output.warning("i18n_backend option is deprecated, do not use anymore.") - if self.options.i18n_backend == "iconv": - self.options.i18n_backend_iconv = "libiconv" - self.options.i18n_backend_icu = False - if self.options.i18n_backend == "icu": - self.options.i18n_backend_iconv = "off" - self.options.i18n_backend_icu = True - if self.options.i18n_backend == "None": - self.options.i18n_backend_iconv = "off" - self.options.i18n_backend_icu = False if self.options.without_locale: self.options.rm_safe("i18n_backend_iconv") self.options.rm_safe("i18n_backend_icu") @@ -665,11 +647,6 @@ def configure(self): if self.options.without_fiber: self.options.rm_safe("numa") - # Use verbosity from [conf] if specified - verbosity = self.conf.get("tools.build:verbosity", default="quiet") - if verbosity == "verbose" and int(self.options.debug_level) < 2: - self.options.debug_level.value = 2 - def layout(self): basic_layout(self, src_folder="src") @@ -771,6 +748,9 @@ def validate(self): if Version(self.version) == "1.86.0" and is_msvc(self) and self.options.get_safe("shared") and self.options.get_safe("without_process", None) == False: raise ConanInvalidConfiguration(f"{self.ref} Boost.Process will fail to be consumed as shared library on MSVC. See https://github.com/boostorg/process/issues/408.") + if str(self.options.debug_level) != "deprecated": + self.output.warning("The option debug_level is deprecated. Use Conan conf tools.build:verbosity instead.") + def _with_dependency(self, dependency): """ Return true when dependency is required according to the dependencies-x.y.z.yml file @@ -827,8 +807,6 @@ def requirements(self): self.requires("libiconv/1.17") def package_id(self): - del self.info.options.i18n_backend - if self.info.options.header_only: self.info.clear() else: @@ -987,7 +965,7 @@ def _python_includes(self): if os.path.isfile(python_h): self.output.info(f"found Python.h: {python_h}") return candidate.replace("\\", "/") - raise Exception("couldn't locate Python.h - make sure you have installed python development files") + raise ConanException("Could not locate Python.h - make sure you have installed python development files.") @property def _python_library_dir(self): @@ -1004,7 +982,7 @@ def _python_library_dir(self): if libdir and multiarch and masd and not libdir.endswith(masd): if masd.startswith(os.sep): masd = masd[len(os.sep):] - self.output.warning(f"Python libdir candidate thingy: {libdir}") + self.output.info(f"Python libdir candidate thingy: {libdir}") libdir = os.path.join(libdir, masd) if not libdir: @@ -1049,7 +1027,7 @@ def _clean(self): ] for d in clean_dirs: if os.path.isdir(d): - self.output.warning(f"removing '{d}'") + self.output.info(f"removing '{d}'") shutil.rmtree(d) @property @@ -1069,12 +1047,18 @@ def _use_bcp(self): def _boost_build_dir(self): return os.path.join(self.source_folder, "tools", "build") + @property + def _debug_flag(self): + verbosity = self.conf.get("tools.build:verbosity", default="quiet", check_type=str) + debug_level = {"quiet": 0, "verbose": 2}.get(verbosity) + return f"-d{debug_level}" + def _build_bcp(self): folder = os.path.join(self.source_folder, "tools", "bcp") with chdir(self, folder): command = f"{self._b2_exe} -j{build_jobs(self)} --abbreviate-paths toolset={self._toolset}" - command += f" -d{self.options.debug_level}" - self.output.warning(command) + command += f" {self._debug_flag}" + self.output.info(command) self.run(command) def _run_bcp(self): @@ -1092,55 +1076,41 @@ def _run_bcp(self): libraries.add(d) libraries = " ".join(libraries) command = f"{self._bcp_exe} {namespace} {alias} {boostdir} {libraries} {self._bcp_dir}" - self.output.warning(command) + self.output.info(command) self.run(command) - def build(self): + def _patch_sources(self): stacktrace_jamfile = os.path.join(self.source_folder, "libs", "stacktrace", "build", "Jamfile.v2") - if cross_building(self, skip_x64_x86=True): - # When cross building, do not attempt to run the test-executable (assume they work) - replace_in_file(self, stacktrace_jamfile, "$(>) > $(<)", "echo \"\" > $(<)", strict=False) if self._with_stacktrace_backtrace and self.settings.os != "Windows" and not cross_building(self): # When libbacktrace is shared, give extra help to the test-executable linker_var = "DYLD_LIBRARY_PATH" if self.settings.os == "Macos" else "LD_LIBRARY_PATH" libbacktrace_libdir = self.dependencies["libbacktrace"].cpp_info.aggregated_components().libdirs[0] patched_run_rule = f"{linker_var}={libbacktrace_libdir} $(>) > $(<)" - replace_in_file(self, stacktrace_jamfile, "$(>) > $(<)", patched_run_rule, strict=False) + replace_in_file(self, stacktrace_jamfile, "$(>) > $(<)", patched_run_rule) if self.dependencies["libbacktrace"].options.shared: - replace_in_file(self, stacktrace_jamfile, "static", "shared", strict=False) + replace_in_file(self, stacktrace_jamfile, "static", "shared") - # Older clang releases require a thread_local variable to be initialized by a constant value - replace_in_file(self, os.path.join(self.source_folder, "boost", "stacktrace", "detail", "libbacktrace_impls.hpp"), - "/* thread_local */", "thread_local", strict=False) - replace_in_file(self, os.path.join(self.source_folder, "boost", "stacktrace", "detail", "libbacktrace_impls.hpp"), - "/* static __thread */", "static __thread", strict=False) if self.settings.compiler == "apple-clang" or (self.settings.compiler == "clang" and Version(self.settings.compiler.version) < 6): replace_in_file(self, os.path.join(self.source_folder, "boost", "stacktrace", "detail", "libbacktrace_impls.hpp"), "thread_local", "/* thread_local */") replace_in_file(self, os.path.join(self.source_folder, "boost", "stacktrace", "detail", "libbacktrace_impls.hpp"), - "static __thread", "/* static __thread */") - replace_in_file(self, os.path.join(self.source_folder, "tools", "build", "src", "tools", "gcc.jam"), - "local generic-os = [ set.difference $(all-os) : aix darwin vxworks solaris osf hpux ] ;", - "local generic-os = [ set.difference $(all-os) : aix darwin vxworks solaris osf hpux iphone appletv ] ;", - strict=False) - replace_in_file(self, os.path.join(self.source_folder, "tools", "build", "src", "tools", "gcc.jam"), - "local no-threading = android beos haiku sgi darwin vxworks ;", - "local no-threading = android beos haiku sgi darwin vxworks iphone appletv ;", - strict=False) + "static __thread", "/* static __thread */") replace_in_file(self, os.path.join(self.source_folder, "libs", "fiber", "build", "Jamfile.v2"), " @numa", " shared:.//boost_fiber : @numa", - strict=False) - if self.settings.os == "Android": + ) + if self.settings.os == "Android" and Version(self.version) < "1.83.0": # force versionless soname from boostorg/boost#206 # this can be applied to all versions and it's easier with a replace replace_in_file(self, os.path.join(self.source_folder, "boostcpp.jam"), "! [ $(property-set).get ] in windows cygwin darwin aix &&", "! [ $(property-set).get ] in windows cygwin darwin aix android &&", - strict=False) + ) + def build(self): + self._patch_sources() if self.options.header_only: - self.output.warning("Header only package, skipping build") + self.output.info("Header only package, skipping build") return self._clean() @@ -1157,7 +1127,7 @@ def build(self): # -d2 is to print more debug info and avoid travis timing out without output sources = os.path.join(self.source_folder, self._bcp_dir) if self._use_bcp else self.source_folder full_command += f' --debug-configuration --build-dir="{self.build_folder}"' - self.output.warning(full_command) + self.output.info(full_command) # If sending a user-specified toolset to B2, setting the vcvars # interferes with the compiler selection. @@ -1241,14 +1211,8 @@ def _gnu_cxx11_abi(self): _GLIBCXX_USE_CXX11_ABI= . Returns None if C++ library cannot be determined. """ - try: - if str(self.settings.compiler.libcxx) == "libstdc++": - return "0" - if str(self.settings.compiler.libcxx) == "libstdc++11": - return "1" - except ConanException: - pass - return None + libcxx = self.settings.get_safe("compiler.libcxx", default=None) + return {"libstdc++11": 1, "libstdc++": 0}.get(libcxx, None) @property def _build_flags(self): @@ -1451,7 +1415,7 @@ def add_defines(library): f"--prefix={self.package_folder}", f"-j{build_jobs(self)}", "--abbreviate-paths", - f"-d{self.options.debug_level}", + self._debug_flag, ]) return flags @@ -1515,7 +1479,7 @@ def _cxx(self): return "" def _create_user_config_jam(self, folder): - self.output.warning("Patching user-config.jam") + self.output.info("Patching user-config.jam") def create_library_config(deps_name, name): aggregated_cpp_info = self.dependencies[deps_name].cpp_info.aggregated_components() @@ -1607,7 +1571,7 @@ def create_library_config(deps_name, name): contents += " ;" - self.output.warning(contents) + self.output.info(contents) filename = f"{folder}/user-config.jam" save(self, filename, contents) @@ -1655,10 +1619,8 @@ def _toolset_tag(self): # clang | 12 | Macos | clang-darwin12 | # gcc | 11 | Linux | gcc8 | # gcc | 8 | Windows | mgw8 | - # Visual Studio | 17 | Windows | vc142 | depends on compiler.toolset compiler = { "apple-clang": "", - "Visual Studio": "vc", "msvc": "vc", }.get(str(self.settings.compiler), str(self.settings.compiler)) if (self.settings.compiler, self.settings.os) == ("gcc", "Windows"): @@ -1735,13 +1697,7 @@ def _option_to_conan_requirement(name): }.get(name, name) def package_info(self): - self.env_info.BOOST_ROOT = self.package_folder - self.cpp_info.set_property("cmake_file_name", "Boost") - self.cpp_info.filenames["cmake_find_package"] = "Boost" - self.cpp_info.filenames["cmake_find_package_multi"] = "Boost" - self.cpp_info.names["cmake_find_package"] = "Boost" - self.cpp_info.names["cmake_find_package_multi"] = "Boost" # - Use 'headers' component for all includes + defines # - Use '_libboost' component to attach extra system_libs, ... @@ -1749,9 +1705,6 @@ def package_info(self): self.cpp_info.components["headers"].libs = [] self.cpp_info.components["headers"].libdirs = [] self.cpp_info.components["headers"].set_property("cmake_target_name", "Boost::headers") - self.cpp_info.components["headers"].names["cmake_find_package"] = "headers" - self.cpp_info.components["headers"].names["cmake_find_package_multi"] = "headers" - self.cpp_info.components["headers"].names["pkg_config"] = "boost" if self.options.system_no_deprecated: self.cpp_info.components["headers"].defines.append("BOOST_SYSTEM_NO_DEPRECATED") @@ -1792,8 +1745,6 @@ def package_info(self): # Boost::boost is an alias of Boost::headers self.cpp_info.components["_boost_cmake"].requires = ["headers"] self.cpp_info.components["_boost_cmake"].set_property("cmake_target_name", "Boost::boost") - self.cpp_info.components["_boost_cmake"].names["cmake_find_package"] = "boost" - self.cpp_info.components["_boost_cmake"].names["cmake_find_package_multi"] = "boost" if self.options.header_only: self.cpp_info.components["_boost_cmake"].libdirs = [] @@ -1802,9 +1753,6 @@ def package_info(self): self.cpp_info.components["diagnostic_definitions"].libs = [] self.cpp_info.components["diagnostic_definitions"].set_property("cmake_target_name", "Boost::diagnostic_definitions") - self.cpp_info.components["diagnostic_definitions"].names["cmake_find_package"] = "diagnostic_definitions" - self.cpp_info.components["diagnostic_definitions"].names["cmake_find_package_multi"] = "diagnostic_definitions" - self.cpp_info.components["diagnostic_definitions"].names["pkg_config"] = "boost_diagnostic_definitions" # FIXME: disable on pkg_config # I would assume headers also need the define BOOST_LIB_DIAGNOSTIC, as a header can trigger an autolink, # and this definition triggers a print out of the library selected. See notes below on autolink and headers. self.cpp_info.components["headers"].requires.append("diagnostic_definitions") @@ -1813,9 +1761,6 @@ def package_info(self): self.cpp_info.components["disable_autolinking"].libs = [] self.cpp_info.components["disable_autolinking"].set_property("cmake_target_name", "Boost::disable_autolinking") - self.cpp_info.components["disable_autolinking"].names["cmake_find_package"] = "disable_autolinking" - self.cpp_info.components["disable_autolinking"].names["cmake_find_package_multi"] = "disable_autolinking" - self.cpp_info.components["disable_autolinking"].names["pkg_config"] = "boost_disable_autolinking" # FIXME: disable on pkg_config # Even headers needs to know the flags for disabling autolinking ... # magic_autolink is an option in the recipe, so if a consumer wants this version of boost, @@ -1851,9 +1796,6 @@ def package_info(self): self.cpp_info.components["dynamic_linking"].libs = [] self.cpp_info.components["dynamic_linking"].set_property("cmake_target_name", "Boost::dynamic_linking") - self.cpp_info.components["dynamic_linking"].names["cmake_find_package"] = "dynamic_linking" - self.cpp_info.components["dynamic_linking"].names["cmake_find_package_multi"] = "dynamic_linking" - self.cpp_info.components["dynamic_linking"].names["pkg_config"] = "boost_dynamic_linking" # FIXME: disable on pkg_config # A library that only links to Boost::headers can be linked into another library that links a Boost::library, # so for this reasons, the header-only library should know the BOOST_ALL_DYN_LINK definition as it will likely # change some important part of the boost code and cause linking errors downstream. @@ -1978,9 +1920,6 @@ def filter_transform_module_libraries(names): self.cpp_info.components[module].requires = self._dependencies["dependencies"][module] + ["_libboost"] self.cpp_info.components[module].set_property("cmake_target_name", "Boost::" + module) - self.cpp_info.components[module].names["cmake_find_package"] = module - self.cpp_info.components[module].names["cmake_find_package_multi"] = module - self.cpp_info.components[module].names["pkg_config"] = f"boost_{module}" # extract list of names of direct host dependencies to check for dependencies # of components that exist in other packages @@ -2089,6 +2028,4 @@ def filter_transform_module_libraries(names): (self.settings.compiler == "gcc" and Version(self.settings.compiler.version) == "10"): self.cpp_info.components["cobalt"].cxxflags.append("-fcoroutines") - #TODO: remove in the future, user_info deprecated in conan2, but kept for compatibility while recipe is cross-compatible. - self.user_info.stacktrace_addr2line_available = self._stacktrace_addr2line_available self.conf_info.define("user.boost:stacktrace_addr2line_available", self._stacktrace_addr2line_available)