diff --git a/conan/tools/meson/toolchain.py b/conan/tools/meson/toolchain.py index 67713d76920..d00f29145d6 100644 --- a/conan/tools/meson/toolchain.py +++ b/conan/tools/meson/toolchain.py @@ -245,6 +245,11 @@ def __init__(self, conanfile, backend=None, native=False): default_comp = "cl" default_comp_cpp = "cl" + # Read configuration for sys_root property (honoring existing conf) + self._sys_root = self._conanfile_conf.get("tools.build:sysroot", check_type=str) + if self._sys_root: + self.properties["sys_root"] = self._sys_root + # Read configuration for compilers compilers_by_conf = self._conanfile_conf.get("tools.build:compiler_executables", default={}, check_type=dict) @@ -404,10 +409,11 @@ def _get_extra_flags(self): linker_scripts = self._conanfile_conf.get("tools.build:linker_scripts", default=[], check_type=list) linker_script_flags = ['-T"' + linker_script + '"' for linker_script in linker_scripts] defines = [f"-D{d}" for d in self._conanfile.conf.get("tools.build:defines", default=[], check_type=list)] + sys_root = [f"--sysroot={self._sys_root}"] if self._sys_root else [""] return { - "cxxflags": cxxflags, - "cflags": cflags, - "ldflags": sharedlinkflags + exelinkflags + linker_script_flags, + "cxxflags": cxxflags + sys_root, + "cflags": cflags + sys_root, + "ldflags": sharedlinkflags + exelinkflags + linker_script_flags + sys_root, "defines": defines } diff --git a/test/functional/toolchains/meson/test_meson.py b/test/functional/toolchains/meson/test_meson.py index a24f7960058..8298c17b910 100644 --- a/test/functional/toolchains/meson/test_meson.py +++ b/test/functional/toolchains/meson/test_meson.py @@ -6,10 +6,10 @@ import pytest -from conans.model.recipe_ref import RecipeReference from conan.test.assets.sources import gen_function_cpp, gen_function_h -from test.functional.toolchains.meson._base import TestMesonBase from conan.test.utils.tools import TestClient +from conans.model.recipe_ref import RecipeReference +from test.functional.toolchains.meson._base import TestMesonBase class MesonToolchainTest(TestMesonBase): diff --git a/test/integration/toolchains/meson/test_mesontoolchain.py b/test/integration/toolchains/meson/test_mesontoolchain.py index b7a2742f774..602b4bb9a43 100644 --- a/test/integration/toolchains/meson/test_mesontoolchain.py +++ b/test/integration/toolchains/meson/test_mesontoolchain.py @@ -1,13 +1,14 @@ import os import platform +import re import textwrap import pytest from conan.test.assets.genconanfile import GenConanfile +from conan.test.utils.tools import TestClient from conan.tools.files import load from conan.tools.meson import MesonToolchain -from conan.test.utils.tools import TestClient def test_apple_meson_keep_user_custom_flags(): @@ -534,3 +535,51 @@ def test_compiler_path_with_spaces(): conan_meson_native = client.load("conan_meson_native.ini") assert "c = 'c compiler path with spaces'" in conan_meson_native assert "cpp = 'cpp compiler path with spaces'" in conan_meson_native + + +def test_meson_sysroot_app(): + """Testing when users pass tools.build:sysroot on the profile with Meson + + The generated conan_meson_cross.ini needs to contain both sys_root property to fill the + PKG_CONFIG_PATH and the compiler flags with --sysroot. + + When cross-building, Meson needs both compiler_executables in the config, otherwise it will fail + when running setup. + """ + sysroot = "/my/new/sysroot/path" + client = TestClient() + profile = textwrap.dedent(f""" + [settings] + os = Macos + arch = armv8 + compiler = apple-clang + compiler.version = 13.0 + compiler.libcxx = libc++ + + [conf] + tools.build:sysroot={sysroot} + tools.build:verbosity=verbose + tools.compilation:verbosity=verbose + tools.apple:sdk_path=/my/sdk/path + """) + profile_build = textwrap.dedent(f""" + [settings] + os = Macos + arch = x86_64 + compiler = apple-clang + compiler.version = 13.0 + compiler.libcxx = libc++ + """) + client.save({"conanfile.py": GenConanfile(name="hello", version="0.1") + .with_settings("os", "arch", "compiler", "build_type") + .with_generator("MesonToolchain"), + "build": profile_build, + "host": profile}) + client.run("install . -pr:h host -pr:b build") + # Check the meson configuration file + conan_meson = client.load(os.path.join(client.current_folder, "conan_meson_cross.ini")) + assert f"sys_root = '{sysroot}'\n" in conan_meson + assert re.search(r"c_args =.+--sysroot={}.+".format(sysroot), conan_meson) + assert re.search(r"c_link_args =.+--sysroot={}.+".format(sysroot), conan_meson) + assert re.search(r"cpp_args =.+--sysroot={}.+".format(sysroot), conan_meson) + assert re.search(r"cpp_link_args =.+--sysroot={}.+".format(sysroot), conan_meson)