Repository: conan-io/conan
Pull request #18097 (2025-04-08 12:08:45)

adding build_args for conan graph build-order with editables
Changelog: Fix: Allow ``conan graph build-order`` to output ``build_args`` for "editable" packages.
Docs: Omit

Close https://github.com/conan-io/conan/issues/18096



Patch:
diff --git a/conan/api/output.py b/conan/api/output.py
index 6989abc07..cf291ec98 100644
--- a/conan/api/output.py
+++ b/conan/api/output.py
@@ -207,9 +207,9 @@ class ConanOutput:
             self._write_message(msg, fg=Color.BLUE)
         return self
 
-    def debug(self, msg):
+    def debug(self, msg, fg=Color.MAGENTA, bg=None):
         if self._conan_output_level <= LEVEL_DEBUG:
-            self._write_message(msg, fg=Color.MAGENTA)
+            self._write_message(msg, fg=fg, bg=bg)
         return self
 
     def verbose(self, msg, fg=None, bg=None):
diff --git a/conan/cli/printers/graph.py b/conan/cli/printers/graph.py
index e0bd79e16..84c671f4a 100644
--- a/conan/cli/printers/graph.py
+++ b/conan/cli/printers/graph.py
@@ -1,4 +1,4 @@
-from conan.api.output import ConanOutput, Color, LEVEL_VERBOSE
+from conan.api.output import ConanOutput, Color, LEVEL_VERBOSE, LEVEL_DEBUG
 from conans.client.graph.graph import BINARY_INVALID, BINARY_MISSING, RECIPE_CONSUMER, \
     RECIPE_VIRTUAL, CONTEXT_BUILD, BINARY_SKIP, \
     BINARY_PLATFORM, BINARY_BUILD
@@ -115,13 +115,14 @@ def print_graph_packages(graph):
     for node in graph.nodes:
         if node.recipe in (RECIPE_CONSUMER, RECIPE_VIRTUAL):
             continue
+        node_info = node.conanfile.info
         if node.context == CONTEXT_BUILD:
-            existing = build_requires.setdefault(node.pref, [node.binary, node.binary_remote])
+            existing = build_requires.setdefault(node.pref, [node.binary, node.binary_remote, node_info])
         else:
             if node.test:
-                existing = test_requires.setdefault(node.pref, [node.binary, node.binary_remote])
+                existing = test_requires.setdefault(node.pref, [node.binary, node.binary_remote, node_info])
             else:
-                existing = requires.setdefault(node.pref, [node.binary, node.binary_remote])
+                existing = requires.setdefault(node.pref, [node.binary, node.binary_remote, node_info])
         # TO avoid showing as "skip" something that is used in other node of the graph
         if existing[0] == BINARY_SKIP:
             existing[0] = node.binary
@@ -130,7 +131,7 @@ def print_graph_packages(graph):
         if not reqs_to_print:
             return
         output.info(title, Color.BRIGHT_YELLOW)
-        for pref, (status, remote) in sorted(reqs_to_print.items(), key=repr):
+        for pref, (status, remote, info) in sorted(reqs_to_print.items(), key=repr):
             name = pref.repr_notime() if status != BINARY_PLATFORM else str(pref.ref)
             msg = f"{tab}{name} - "
             if status == BINARY_SKIP:
@@ -148,6 +149,10 @@ def print_graph_packages(graph):
                 if remote:
                     msg += f" ({remote.name})"
                 output.info(msg, Color.BRIGHT_CYAN)
+            if output.level_allowed(LEVEL_DEBUG):
+                compact_dumps = info.summarize_compact()
+                for line in compact_dumps:
+                    output.debug(f"{tab}{tab}{line}", Color.BRIGHT_GREEN)
 
     _format_requires("Requirements", requires)
     _format_requires("Test requirements", test_requires)
diff --git a/conan/internal/model/info.py b/conan/internal/model/info.py
index 2319ba777..2cadf1e8d 100644
--- a/conan/internal/model/info.py
+++ b/conan/internal/model/info.py
@@ -432,6 +432,18 @@ class ConanInfo:
         result.append("")  # Append endline so file ends with LF
         return '\n'.join(result)
 
+    def summarize_compact(self):
+        result = []
+        serialized = self.serialize()
+
+        for key, values in serialized.items():
+            if isinstance(values, dict):
+                result.append(f"{key}: " + " ".join(f"{k}={v}" for k, v in values.items()))
+            elif isinstance(values, type([])):
+                result.append(f"{key}: {' '.join(values)}")
+
+        return result
+
     def dump_diff(self, compatible):
         self_dump = self.dumps()
         compatible_dump = compatible.dumps()
diff --git a/conan/tools/apple/apple.py b/conan/tools/apple/apple.py
index 4b0271891..535464990 100644
--- a/conan/tools/apple/apple.py
+++ b/conan/tools/apple/apple.py
@@ -328,3 +328,28 @@ def fix_apple_shared_install_name(conanfile):
     # there is nothing to do.
     if substitutions:
         _fix_executables(conanfile, substitutions)
+
+
+def apple_extra_flags(conanfile):
+    if not is_apple_os(conanfile):
+        return []
+    enable_bitcode = conanfile.conf.get("tools.apple:enable_bitcode", check_type=bool)
+    enable_arc = conanfile.conf.get("tools.apple:enable_arc", check_type=bool)
+    enable_visibility = conanfile.conf.get("tools.apple:enable_visibility", check_type=bool)
+    is_debug = conanfile.settings.get_safe('build_type') == "Debug"
+
+    flags = []
+    if enable_bitcode:
+        if is_debug:
+            flags.append("-fembed-bitcode-marker")
+        else:
+            flags.append("-fembed-bitcode")
+    if enable_arc:
+        flags.append("-fobjc-arc")
+    if enable_arc is False:
+        flags.append("-fno-objc-arc")
+    if enable_visibility:
+        flags.append("-fvisibility=default")
+    if enable_visibility is False:
+        flags.extend(["-fvisibility=hidden", "-fvisibility-inlines-hidden"])
+    return flags
diff --git a/conan/tools/cmake/cmakedeps2/target_configuration.py b/conan/tools/cmake/cmakedeps2/target_configuration.py
index 4e483d257..c72a13653 100644
--- a/conan/tools/cmake/cmakedeps2/target_configuration.py
+++ b/conan/tools/cmake/cmakedeps2/target_configuration.py
@@ -80,7 +80,7 @@ class TargetConfigurationTemplate2:
                         assert required_pkg == required_comp
                         comp = None
                         default_target = f"{dep.ref.name}::{dep.ref.name}"  # replace_requires
-                        link = pkg_type is not PackageType.SHARED 
+                        link = pkg_type is not PackageType.SHARED
                     else:
                         comp = required_comp
                         default_target = f"{required_pkg}::{required_comp}"
@@ -364,6 +364,8 @@ class TargetConfigurationTemplate2:
         set_property(TARGET {{lib}} APPEND PROPERTY IMPORTED_CONFIGURATIONS {{config}})
         set_target_properties({{lib}} PROPERTIES IMPORTED_LOCATION_{{config}}
                               "{{lib_info["location"]}}")
+        {% elif lib_info.get("type") == "INTERFACE" %}
+        set_property(TARGET {{lib}} APPEND PROPERTY IMPORTED_CONFIGURATIONS {{config}})
         {% endif %}
         {% if lib_info.get("link_location") %}
         set_target_properties({{lib}} PROPERTIES IMPORTED_IMPLIB_{{config}}
diff --git a/conan/tools/gnu/autotoolstoolchain.py b/conan/tools/gnu/autotoolstoolchain.py
index e2daf568f..89c395ed1 100644
--- a/conan/tools/gnu/autotoolstoolchain.py
+++ b/conan/tools/gnu/autotoolstoolchain.py
@@ -3,7 +3,7 @@ import os
 from conan.errors import ConanException
 from conan.internal import check_duplicated_generator
 from conan.internal.internal_tools import raise_on_universal_arch
-from conan.tools.apple.apple import is_apple_os, resolve_apple_flags
+from conan.tools.apple.apple import is_apple_os, resolve_apple_flags, apple_extra_flags
 from conan.tools.build import cmd_args_to_string, save_toolchain_args
 from conan.tools.build.cross_building import cross_building
 from conan.tools.build.flags import architecture_flag, build_type_flags, cppstd_flag, \
@@ -84,9 +84,9 @@ class AutotoolsToolchain:
         sysroot = sysroot.replace("\\", "/") if sysroot is not None else None
         self.sysroot_flag = "--sysroot {}".format(sysroot) if sysroot else None
 
-        self.configure_args = self._default_configure_shared_flags() + \
-                              self._default_configure_install_flags() + \
-                              self._get_triplets()
+        self.configure_args = (self._default_configure_shared_flags() +
+                               self._default_configure_install_flags() +
+                               self._get_triplets())
         self.autoreconf_args = self._default_autoreconf_flags()
         self.make_args = []
         # Apple stuff
@@ -101,6 +101,7 @@ class AutotoolsToolchain:
         # -isysroot makes all includes for your library relative to the build directory
         self.apple_isysroot_flag = isysroot_flag
         self.apple_min_version_flag = min_flag
+        self.apple_extra_flags = apple_extra_flags(self._conanfile)
 
     def _resolve_android_cross_compilation(self):
         # Issue related: https://github.com/conan-io/conan/issues/13443
@@ -188,6 +189,7 @@ class AutotoolsToolchain:
         ret = [self.libcxx, self.cppstd, self.arch_flag, fpic, self.msvc_runtime_flag,
                self.sysroot_flag]
         apple_flags = [self.apple_isysroot_flag, self.apple_arch_flag, self.apple_min_version_flag]
+        apple_flags += self.apple_extra_flags
         conf_flags = self._conanfile.conf.get("tools.build:cxxflags", default=[], check_type=list)
         vs_flag = self._add_msvc_flags(self.extra_cxxflags)
         ret = ret + self.build_type_flags + apple_flags + self.extra_cxxflags + vs_flag + conf_flags
@@ -198,6 +200,7 @@ class AutotoolsToolchain:
         fpic = "-fPIC" if self.fpic else None
         ret = [self.cstd, self.arch_flag, fpic, self.msvc_runtime_flag, self.sysroot_flag]
         apple_flags = [self.apple_isysroot_flag, self.apple_arch_flag, self.apple_min_version_flag]
+        apple_flags += self.apple_extra_flags
         conf_flags = self._conanfile.conf.get("tools.build:cflags", default=[], check_type=list)
         vs_flag = self._add_msvc_flags(self.extra_cflags)
         ret = ret + self.build_type_flags + apple_flags + self.extra_cflags + vs_flag + conf_flags
@@ -207,6 +210,7 @@ class AutotoolsToolchain:
     def ldflags(self):
         ret = [self.arch_flag, self.sysroot_flag]
         apple_flags = [self.apple_isysroot_flag, self.apple_arch_flag, self.apple_min_version_flag]
+        apple_flags += self.apple_extra_flags
         conf_flags = self._conanfile.conf.get("tools.build:sharedlinkflags", default=[],
                                               check_type=list)
         conf_flags.extend(self._conanfile.conf.get("tools.build:exelinkflags", default=[],
diff --git a/conan/tools/gnu/gnutoolchain.py b/conan/tools/gnu/gnutoolchain.py
index 1b22240e8..c5245e1e5 100644
--- a/conan/tools/gnu/gnutoolchain.py
+++ b/conan/tools/gnu/gnutoolchain.py
@@ -2,7 +2,7 @@ import os
 
 from conan.internal import check_duplicated_generator
 from conan.internal.internal_tools import raise_on_universal_arch
-from conan.tools.apple.apple import is_apple_os, resolve_apple_flags
+from conan.tools.apple.apple import is_apple_os, resolve_apple_flags, apple_extra_flags
 from conan.tools.build import cmd_args_to_string, save_toolchain_args
 from conan.tools.build.cross_building import cross_building
 from conan.tools.build.flags import architecture_flag, build_type_flags, cppstd_flag, \
@@ -104,6 +104,7 @@ class GnuToolchain:
         # -isysroot makes all includes for your library relative to the build directory
         self.apple_isysroot_flag = isysroot_flag
         self.apple_min_version_flag = min_flag
+        self.apple_extra_flags = apple_extra_flags(conanfile)
         # Default initial environment flags
         self._initialize_default_extra_env()
 
@@ -245,6 +246,7 @@ class GnuToolchain:
         ret = [self.libcxx, self.cppstd, self.arch_flag, fpic, self.msvc_runtime_flag,
                self.sysroot_flag]
         apple_flags = [self.apple_isysroot_flag, self.apple_arch_flag, self.apple_min_version_flag]
+        apple_flags += self.apple_extra_flags
         conf_flags = self._conanfile.conf.get("tools.build:cxxflags", default=[], check_type=list)
         vs_flag = self._add_msvc_flags(self.extra_cxxflags)
         ret = ret + self.build_type_flags + apple_flags + self.extra_cxxflags + vs_flag + conf_flags
@@ -255,6 +257,7 @@ class GnuToolchain:
         fpic = "-fPIC" if self.fpic else None
         ret = [self.arch_flag, fpic, self.msvc_runtime_flag, self.sysroot_flag]
         apple_flags = [self.apple_isysroot_flag, self.apple_arch_flag, self.apple_min_version_flag]
+        apple_flags += self.apple_extra_flags
         conf_flags = self._conanfile.conf.get("tools.build:cflags", default=[], check_type=list)
         vs_flag = self._add_msvc_flags(self.extra_cflags)
         ret = ret + self.build_type_flags + apple_flags + self.extra_cflags + vs_flag + conf_flags
@@ -264,6 +267,7 @@ class GnuToolchain:
     def ldflags(self):
         ret = [self.arch_flag, self.sysroot_flag]
         apple_flags = [self.apple_isysroot_flag, self.apple_arch_flag, self.apple_min_version_flag]
+        apple_flags += self.apple_extra_flags
         conf_flags = self._conanfile.conf.get("tools.build:sharedlinkflags", default=[],
                                               check_type=list)
         conf_flags.extend(self._conanfile.conf.get("tools.build:exelinkflags", default=[],
diff --git a/conan/tools/meson/toolchain.py b/conan/tools/meson/toolchain.py
index 88bbc9b73..d923d066d 100644
--- a/conan/tools/meson/toolchain.py
+++ b/conan/tools/meson/toolchain.py
@@ -7,7 +7,7 @@ from conan.errors import ConanException
 from conan.internal import check_duplicated_generator
 from conan.internal.internal_tools import raise_on_universal_arch
 from conan.tools.apple.apple import is_apple_os, apple_min_version_flag, \
-    resolve_apple_flags
+    resolve_apple_flags, apple_extra_flags
 from conan.tools.build.cross_building import cross_building
 from conan.tools.build.flags import libcxx_flags, architecture_flag
 from conan.tools.env import VirtualBuildEnv
@@ -338,6 +338,8 @@ class MesonToolchain:
         self.apple_isysroot_flag = []
         #: Apple minimum binary version flag as a list, e.g., ``["-mios-version-min", "10.8"]``
         self.apple_min_version_flag = []
+        #: Apple bitcode, visibility and arc flags
+        self.apple_extra_flags = apple_extra_flags(self._conanfile)
         #: Defines the Meson ``objc`` variable. Defaulted to ``None``, if if any Apple OS ``clang``
         self.objc = None
         #: Defines the Meson ``objcpp`` variable. Defaulted to ``None``, if if any Apple OS ``clang++``
@@ -443,6 +445,10 @@ class MesonToolchain:
         defines = self._conanfile_conf.get("tools.build:defines", default=[], check_type=list)
         sys_root = [f"--sysroot={self._sys_root}"] if self._sys_root else [""]
         ld = sharedlinkflags + exelinkflags + linker_script_flags + sys_root + self.extra_ldflags
+        # Apple extra flags from confs (visibilty, bitcode, arc)
+        cxxflags += self.apple_extra_flags
+        cflags += self.apple_extra_flags
+        ld += self.apple_extra_flags
         return {
             "cxxflags": [self.arch_flag] + cxxflags + sys_root + self.extra_cxxflags,
             "cflags": [self.arch_flag] + cflags + sys_root + self.extra_cflags,
diff --git a/conans/client/graph/install_graph.py b/conans/client/graph/install_graph.py
index 4a0fdaf9e..b68dec9f2 100644
--- a/conans/client/graph/install_graph.py
+++ b/conans/client/graph/install_graph.py
@@ -66,7 +66,7 @@ class _InstallPackageReference:
         self.nodes.append(node)
 
     def _build_args(self):
-        if self.binary != BINARY_BUILD:
+        if self.binary not in (BINARY_BUILD, BINARY_EDITABLE_BUILD):
             return None
         cmd = f"--requires={self.ref}" if self.context == "host" else f"--tool-requires={self.ref}"
         compatible = "compatible:" if self.info and self.info.get("compatibility_delta") else ""
@@ -290,7 +290,7 @@ class _InstallConfiguration:
                     self.depends.append(dep.dst.pref)
 
     def _build_args(self):
-        if self.binary != BINARY_BUILD:
+        if self.binary not in (BINARY_BUILD, BINARY_EDITABLE_BUILD):
             return None
         cmd = f"--requires={self.ref}" if self.context == "host" else f"--tool-requires={self.ref}"
         compatible = "compatible:" if self.info and self.info.get("compatibility_delta") else ""
diff --git a/conans/client/installer.py b/conans/client/installer.py
index d661ac53c..51197962e 100644
--- a/conans/client/installer.py
+++ b/conans/client/installer.py
@@ -2,7 +2,7 @@ import os
 import shutil
 from multiprocessing.pool import ThreadPool
 
-from conan.api.output import ConanOutput
+from conan.api.output import ConanOutput, Color
 from conan.internal.methods import run_build_method, run_package_method
 from conan.internal.api.install.generators import write_generators
 from conans.client.graph.graph import BINARY_BUILD, BINARY_CACHE, BINARY_DOWNLOAD, BINARY_EDITABLE, \
@@ -309,6 +309,9 @@ class BinaryInstaller:
             ConanOutput(scope=str(pref.ref))\
                 .highlight("Building from source")\
                 .info(f"Package {pref}")
+            compact_dumps = package.nodes[0].conanfile.info.summarize_compact()
+            for line in compact_dumps:
+                ConanOutput(scope=str(pref.ref)).info(line, fg=Color.BRIGHT_GREEN)
             package_layout = self._cache.create_build_pkg_layout(pref)
             self._handle_node_build(package, package_layout)
             # Just in case it was recomputed
diff --git a/conans/model/package_ref.py b/conans/model/package_ref.py
index 0669fc435..55fe086f3 100644
--- a/conans/model/package_ref.py
+++ b/conans/model/package_ref.py
@@ -17,7 +17,8 @@ class PkgReference(_PkgReference):
 
     def __init__(self, *args, **kwargs):
         if PkgReference.usage_counter == 0:
-            ConanOutput().warning(_msg.format("from conans.model.package_ref import PkgReference"))
+            ConanOutput().warning(_msg.format("from conans.model.package_ref import PkgReference"),
+                                  warn_tag="deprecated")
         PkgReference.usage_counter += 1
         super(PkgReference, self).__init__(*args, **kwargs)
 


Test patch:
diff --git a/test/functional/toolchains/cmake/cmakedeps2/test_cmakeconfigdeps_new.py b/test/functional/toolchains/cmake/cmakedeps2/test_cmakeconfigdeps_new.py
index 27a7184cb..11a5be4bc 100644
--- a/test/functional/toolchains/cmake/cmakedeps2/test_cmakeconfigdeps_new.py
+++ b/test/functional/toolchains/cmake/cmakedeps2/test_cmakeconfigdeps_new.py
@@ -1108,7 +1108,7 @@ class TestProtobuf:
         assert "protobuf: Release!" in c.out
 
 
-@pytest.mark.tool("cmake", "3.23")
+@pytest.mark.tool("cmake", "3.27")
 class TestConfigs:
     @pytest.mark.skipif(platform.system() != "Windows", reason="Only MSVC multi-conf")
     def test_multi_config(self, matrix_client):
@@ -1137,9 +1137,9 @@ class TestConfigs:
 
         # With modern CMake > 3.26 not necessary set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release)
         cmake = textwrap.dedent("""
-            cmake_minimum_required(VERSION 3.15)
+            cmake_minimum_required(VERSION 3.27)
             project(app CXX)
-            set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release)
+            # set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release)
             find_package(matrix CONFIG REQUIRED)
 
             add_executable(app src/app.cpp src/main.cpp)
@@ -1155,6 +1155,41 @@ class TestConfigs:
         assert "matrix/1.0: Hello World Release!" in c.out
         assert "app/0.1: Hello World Debug!" in c.out
 
+    def test_cross_config_components(self, matrix_client_components):
+        # Release dependencies, but compiling app in Debug
+        c = matrix_client_components
+        c.run("new cmake_exe -d name=app -d version=0.1 -d requires=matrix/1.0")
+        app_cpp = textwrap.dedent("""
+            #include "app.h"
+            #include "module.h"
+            void app(){
+               module();
+            }""")
+        c.save({"src/app.cpp": app_cpp,
+                "src/main.cpp": gen_function_cpp(name="main", includes=["app"], calls=["app"])})
+
+        c.run(f"install . -s &:build_type=Debug -c tools.cmake.cmakedeps:new={new_value}")
+        # With modern CMake > 3.26 not necessary set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release)
+        cmake = textwrap.dedent("""
+            cmake_minimum_required(VERSION 3.27)
+            project(app CXX)
+            # set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release)
+            find_package(matrix CONFIG REQUIRED)
+
+            add_executable(app src/app.cpp src/main.cpp)
+            target_link_libraries(app PRIVATE matrix::matrix)
+            """)
+        c.save({"CMakeLists.txt": cmake})
+
+        preset = "conan-default" if platform.system() == "Windows" else "conan-debug"
+        c.run_command(f"cmake --preset {preset}")
+        c.run_command("cmake --build --preset conan-debug")
+
+        c.run_command(os.path.join("build", "Debug", "app"))
+        assert "main: Debug!" in c.out
+        assert "module: Release!" in c.out
+        assert "vector: Release!" in c.out
+
     @pytest.mark.skipif(platform.system() == "Windows", reason="This doesn't work in MSVC")
     def test_cross_config_implicit(self, matrix_client):
         # Release dependencies, but compiling app in Debug, without specifying it
@@ -1164,9 +1199,9 @@ class TestConfigs:
 
         # With modern CMake > 3.26 not necessary set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release)
         cmake = textwrap.dedent("""
-            cmake_minimum_required(VERSION 3.15)
+            cmake_minimum_required(VERSION 3.27)
             project(app CXX)
-            set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release)
+            # set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release)
             find_package(matrix CONFIG REQUIRED)
 
             add_executable(app src/app.cpp src/main.cpp)
diff --git a/test/integration/command/create_test.py b/test/integration/command/create_test.py
index 81d75486d..798230c7b 100644
--- a/test/integration/command/create_test.py
+++ b/test/integration/command/create_test.py
@@ -160,7 +160,7 @@ def test_create_package_requires():
     client.save({"conanfile.py": conanfile,
                  "test_package/conanfile.py": test_conanfile})
 
-    client.run("create . --name=pkg --version=0.1 --user=lasote --channel=testing")
+    client.run("create . --name=pkg --version=0.1 --user=lasote --channel=testing -vv")
 
     assert "pkg/0.1@lasote/testing (test package): build() " \
            "Requires: other/1.0@user/channel" in client.out
@@ -170,6 +170,10 @@ def test_create_package_requires():
     assert "pkg/0.1@lasote/testing (test package): build() cpp_info dep: dep" in client.out
     assert "pkg/0.1@lasote/testing (test package): build() cpp_info dep: pkg" in client.out
 
+    # Check that the additional info shows up when creating pkg
+    # Graph info, package creation, and test package graph info
+    assert client.out.count("requires: dep/0.1@user/channel") == 3
+
 
 def test_package_folder_build_error():
     """
diff --git a/test/integration/command/info/test_info_build_order.py b/test/integration/command/info/test_info_build_order.py
index a9605cea5..4a39b80e6 100644
--- a/test/integration/command/info/test_info_build_order.py
+++ b/test/integration/command/info/test_info_build_order.py
@@ -804,9 +804,8 @@ def test_multi_configuration_profile_args():
 
 def test_build_order_space_in_options():
     tc = TestClient(light=True)
-    tc.save({"dep/conanfile.py": GenConanfile("dep", "1.0")
-                .with_option("flags", ["ANY", None])
-                .with_option("extras", ["ANY", None]),
+    tc.save({"dep/conanfile.py": GenConanfile("dep", "1.0").with_option("flags", ["ANY", None])
+                                                           .with_option("extras", ["ANY", None]),
              "conanfile.txt": textwrap.dedent("""
              [requires]
              dep/1.0
@@ -879,3 +878,25 @@ def test_build_order_build_context_compatible():
                                 "bar/1.0": ["5e4ffcc1ff33697a4ee96f66f0d2228ec458f25c", "Build"]})
         c.assert_listed_binary({"foo/1.0": ["4e2ae338231ae18d0d43b9e119404d2b2c416758", "Build"]},
                                build=True)
+
+
+def test_info_build_order_editable():
+    c = TestClient()
+    c.save({"dep/conanfile.py": GenConanfile("dep", "0.1"),
+            "pkg/conanfile.py": GenConanfile("pkg", "0.1").with_requires("dep/0.1"),
+            "consumer/conanfile.txt": "[requires]\npkg/0.1"})
+    c.run("editable add dep")
+    c.run("export pkg")
+    
+    c.run("graph build-order consumer --build=missing --build=editable -f=json --order-by=recipe")
+    bo_json = json.loads(c.stdout)
+    pkg = bo_json["order"][0][0]["packages"][0][0]
+    assert pkg["binary"] == "EditableBuild"
+    assert pkg["build_args"] == "--requires=dep/0.1 --build=dep/0.1"
+
+    c.run("graph build-order consumer --build=missing --build=editable -f=json "
+          "--order-by=configuration")
+    bo_json = json.loads(c.stdout)
+    pkg = bo_json["order"][0][0]
+    assert pkg["binary"] == "EditableBuild"
+    assert pkg["build_args"] == "--requires=dep/0.1 --build=dep/0.1"
diff --git a/test/integration/command/test_profile.py b/test/integration/command/test_profile.py
index b71bbd6ac..a926b7629 100644
--- a/test/integration/command/test_profile.py
+++ b/test/integration/command/test_profile.py
@@ -2,7 +2,11 @@ import json
 import os
 import textwrap
 
+import pytest
+
+from conan.test.assets.genconanfile import GenConanfile
 from conan.test.utils.tools import TestClient
+from conans.util.files import save
 
 
 def test_profile_path():
@@ -151,3 +155,18 @@ def test_profile_show_json():
     # Check that tool_requires are properly serialized in json format
     # https://github.com/conan-io/conan/issues/15183
     assert profile["build"]["tool_requires"] == {'mytool/*': ["mytool/1.0"]}
+
+
+@pytest.mark.parametrize("new_global", [None, 0, 1, True, False, ""])
+def test_settings_serialize(new_global):
+    tc = TestClient(light=True)
+    settings_user = "new_global: [null, 0, 1, True, False, '']"
+    tc.save_home({"settings_user.yml": settings_user})
+    tc.save({"conanfile.py": GenConanfile("foo", "1.0").with_settings("new_global")})
+
+    s = f"-s new_global={new_global}" if new_global is not None else ""
+    tc.run(f"create . {s}")
+    if new_global is None:
+        assert "settings: new_global=" not in tc.out
+    else:
+        assert f"settings: new_global={new_global}" in tc.out
diff --git a/test/integration/conanfile/test_deprecated.py b/test/integration/conanfile/test_deprecated.py
index 128cc5362..d6a2b466c 100644
--- a/test/integration/conanfile/test_deprecated.py
+++ b/test/integration/conanfile/test_deprecated.py
@@ -1,5 +1,7 @@
 import textwrap
 
+import pytest
+
 from conan.test.utils.tools import TestClient, GenConanfile
 
 
@@ -63,3 +65,18 @@ class TestDeprecated:
 
         tc.run("graph info . --version=2.0")
         assert "deprecated: None" in tc.out
+
+class TestDeprecatedIncludesMessages:
+    @pytest.mark.parametrize("import_stm,way", [
+        ["from conans.model.package_ref import PkgReference", "PkgReference()"],
+        ["from conans.model.package_ref import PkgReference", "PkgReference.loads('foo/1.0:123')"],
+        ["from conans.model.recipe_ref import RecipeReference", "RecipeReference()"],
+        ["from conans.model.recipe_ref import RecipeReference", "RecipeReference.loads('foo/1.0@user/channel')"]
+    ])
+    def test_deprecated_package_ref_include(self, import_stm, way):
+        t = TestClient(light=True)
+        t.save({"conanfile.py": GenConanfile("pkg", "0.1")
+               .with_import(import_stm)
+                .with_package_id(f"ref = {way}")})
+        t.run("create conanfile.py")
+        assert f"Private '{import_stm}'" in t.out
diff --git a/test/integration/graph/test_subgraph_reports.py b/test/integration/graph/test_subgraph_reports.py
index 597fb6386..b01ecfe23 100644
--- a/test/integration/graph/test_subgraph_reports.py
+++ b/test/integration/graph/test_subgraph_reports.py
@@ -4,7 +4,7 @@ import textwrap
 
 from conan.test.assets.genconanfile import GenConanfile
 from conan.test.utils.tools import TestClient
-from conans.model.recipe_ref import RecipeReference
+from conan.api.model import RecipeReference
 from conans.util.files import load
 
 
diff --git a/test/integration/package_id/test_config_package_id.py b/test/integration/package_id/test_config_package_id.py
index e3a27714b..af3b7fbf7 100644
--- a/test/integration/package_id/test_config_package_id.py
+++ b/test/integration/package_id/test_config_package_id.py
@@ -20,6 +20,7 @@ def test_config_package_id(config_version, mode, result):
     save(c.paths.global_conf_path, f"core.package_id:config_mode={mode}")
     c.save({"conanfile.py": GenConanfile("pkg", "0.1")})
     c.run("create .")
+    assert f"config_version: {result}" in c.out
     c.run("list pkg/0.1:* --format=json")
     info = json.loads(c.stdout)
     rrev = info["Local Cache"]["pkg/0.1"]["revisions"]["485dad6cb11e2fa99d9afbe44a57a164"]
@@ -39,3 +40,16 @@ def test_error_config_package_id():
     c.run("create .", assert_error=True)
     assert "ERROR: core.package_id:config_mode defined, " \
            "but error while loading 'config_version.json'" in c.out
+
+@pytest.mark.parametrize("config_version, mode, result", [
+    ("myconfig/1.2.3#rev1:pid1#prev1", "minor_mode", "myconfig/1.2.Z"),
+    ("myconfig/1.2.3#rev1:pid1#prev1", "patch_mode", "myconfig/1.2.3"),
+])
+def test_config_package_id_clear(config_version, mode, result):
+    c = TestClient(light=True)
+    config_version = json.dumps({"config_version": [config_version]})
+    save(c.paths.config_version_path, config_version)
+    save(c.paths.global_conf_path, f"core.package_id:config_mode={mode}")
+    c.save({"conanfile.py": GenConanfile("pkg", "0.1").with_package_id("self.info.clear()")})
+    c.run("create .")
+    assert f"config_version: {result}" not in c.out
diff --git a/test/integration/toolchains/gnu/test_gnutoolchain.py b/test/integration/toolchains/gnu/test_gnutoolchain.py
index e47e30e05..789df2e15 100644
--- a/test/integration/toolchains/gnu/test_gnutoolchain.py
+++ b/test/integration/toolchains/gnu/test_gnutoolchain.py
@@ -456,3 +456,49 @@ def test_conf_build_does_not_exist():
     tc = c.load("conangnutoolchain.sh")
     assert 'export CC_FOR_BUILD="x86_64-linux-gnu-gcc"' in tc
     assert 'export CXX_FOR_BUILD="x86_64-linux-gnu-g++"' in tc
+
+
+@pytest.mark.parametrize("toolchain", ["GnuToolchain", "AutotoolsToolchain"])
+def test_conf_extra_apple_flags(toolchain):
+    host = textwrap.dedent("""
+    [settings]
+    arch=x86_64
+    os=Macos
+    [conf]
+    tools.apple:enable_bitcode = True
+    tools.apple:enable_arc = True
+    tools.apple:enable_visibility = True
+    """)
+
+    c = TestClient()
+    c.save({"conanfile.txt": f"[generators]\n{toolchain}",
+            "host": host})
+    c.run("install . -pr:a host")
+    f = "conanautotoolstoolchain.sh" if toolchain == "AutotoolsToolchain" else "conangnutoolchain.sh"
+    tc = c.load(f)
+    assert 'export CXXFLAGS="$CXXFLAGS -fembed-bitcode -fobjc-arc -fvisibility=default"' in tc
+    assert 'export CFLAGS="$CFLAGS -fembed-bitcode -fobjc-arc -fvisibility=default"' in tc
+    assert 'export LDFLAGS="$LDFLAGS -fembed-bitcode -fobjc-arc -fvisibility=default"' in tc
+
+    c.run("install . -pr:a host -s build_type=Debug")
+    tc = c.load(f)
+    assert 'export CXXFLAGS="$CXXFLAGS -fembed-bitcode-marker -fobjc-arc -fvisibility=default"' in tc
+    assert 'export CFLAGS="$CFLAGS -fembed-bitcode-marker -fobjc-arc -fvisibility=default"' in tc
+    assert 'export LDFLAGS="$LDFLAGS -fembed-bitcode-marker -fobjc-arc -fvisibility=default"' in tc
+
+    host = textwrap.dedent("""
+        [settings]
+        arch=x86_64
+        os=Macos
+        [conf]
+        tools.apple:enable_bitcode = False
+        tools.apple:enable_arc = False
+        tools.apple:enable_visibility = False
+        """)
+
+    c.save({"host": host})
+    c.run("install . -pr:a host")
+    tc = c.load(f)
+    assert 'CXXFLAGS="$CXXFLAGS -fno-objc-arc -fvisibility=hidden -fvisibility-inlines-hidden"' in tc
+    assert 'CFLAGS="$CFLAGS -fno-objc-arc -fvisibility=hidden -fvisibility-inlines-hidden"' in tc
+    assert 'LDFLAGS="$LDFLAGS -fno-objc-arc -fvisibility=hidden -fvisibility-inlines-hidden"' in tc
diff --git a/test/integration/toolchains/meson/test_mesontoolchain.py b/test/integration/toolchains/meson/test_mesontoolchain.py
index 06df19bd6..3b5411212 100644
--- a/test/integration/toolchains/meson/test_mesontoolchain.py
+++ b/test/integration/toolchains/meson/test_mesontoolchain.py
@@ -746,3 +746,51 @@ def test_cross_x86_64_to_x86():
     cross = c.load(MesonToolchain.cross_filename)
     assert "cpu = 'x86_64'" in cross  # This is the build machine
     assert "cpu = 'x86'" in cross  # This is the host machine
+
+
+def test_conf_extra_apple_flags():
+    host = textwrap.dedent("""
+    [settings]
+    arch=x86_64
+    os=Macos
+    compiler=apple-clang
+    compiler.version=14.0
+    [conf]
+    tools.apple:enable_bitcode = True
+    tools.apple:enable_arc = True
+    tools.apple:enable_visibility = True
+    """)
+
+    c = TestClient()
+    c.save({"conanfile.txt": f"[generators]\nMesonToolchain",
+            "host": host})
+    c.run("install . -pr:a host")
+    f = "conan_meson_native.ini"
+    tc = c.load(f)
+    for flags in ["c_args", "cpp_args", "c_link_args", "cpp_link_args"]:
+        assert f"{flags} = ['-m64', '-fembed-bitcode', '-fobjc-arc', '-fvisibility=default']" in tc
+
+    c.run("install . -pr:a host -s build_type=Debug")
+    tc = c.load(f)
+    for flags in ["c_args", "cpp_args", "c_link_args", "cpp_link_args"]:
+        assert f"{flags} = ['-m64', '-fembed-bitcode-marker'," \
+               " '-fobjc-arc', '-fvisibility=default']" in tc
+
+    host = textwrap.dedent("""
+        [settings]
+        arch=x86_64
+        os=Macos
+        compiler=apple-clang
+        compiler.version=14.0
+        [conf]
+        tools.apple:enable_bitcode = False
+        tools.apple:enable_arc = False
+        tools.apple:enable_visibility = False
+        """)
+
+    c.save({"host": host})
+    c.run("install . -pr:a host")
+    tc = c.load(f)
+    for flags in ["c_args", "cpp_args", "c_link_args", "cpp_link_args"]:
+        assert f"{flags} = ['-m64', '-fno-objc-arc', '-fvisibility=hidden', " \
+               "'-fvisibility-inlines-hidden']" in tc
diff --git a/test/unittests/util/xz_test.py b/test/unittests/util/xz_test.py
index 707293410..f6fd540b2 100644
--- a/test/unittests/util/xz_test.py
+++ b/test/unittests/util/xz_test.py
@@ -20,3 +20,16 @@ def test_unzip_can_xz():
     content = load(os.path.join(dest_folder, "a_file.txt"))
     assert content == "my content!"
 
+
+def test_unzip_can_gz():
+    tmp_dir = temp_folder()
+    file_path = os.path.join(tmp_dir, "a_file.txt")
+    save(file_path, "my content!")
+    gz = os.path.join(tmp_dir, "sample.tar.gz")
+    with tarfile.open(gz, "w:gz") as tar:
+        tar.add(file_path, "a_file.txt")
+
+    dest_folder = temp_folder()
+    unzip(ConanFileMock(), gz, dest_folder)
+    content = load(os.path.join(dest_folder, "a_file.txt"))
+    assert content == "my content!"