From ec5f4775cc611cf4de142b9c298bae980a985aff Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 24 Aug 2021 12:26:03 +0200 Subject: [PATCH 01/18] wip --- conans/test/conftest.py | 8 +++- .../cmake/test_cmake_toolchain_win_clang.py | 47 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 conans/test/functional/toolchains/cmake/test_cmake_toolchain_win_clang.py diff --git a/conans/test/conftest.py b/conans/test/conftest.py index 739bd4efd1a..c29c1e92760 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -14,7 +14,8 @@ 'mingw32': 'default', 'mingw64': 'default', 'ninja': '1.10.2', - 'bazel': 'default' + 'bazel': 'default', + 'clang': "12" } tools_locations = { @@ -22,6 +23,11 @@ 'cygwin': {'Windows': {'default': os.getenv('CONAN_CYGWIN_PATH', 'C:/cygwin64/bin')}}, 'mingw32': {'Windows': {'default': os.getenv('CONAN_MINGW32_PATH', 'C:/msys64/mingw32/bin')}}, 'mingw64': {'Windows': {'default': os.getenv('CONAN_MINGW64_PATH', 'C:/msys64/mingw64/bin')}}, + 'clang': { + 'Windows': { + '12': 'C:/ws/LLVM/LLVM12/bin', + } + }, 'cmake': { 'Windows': { '3.15': 'C:/cmake/cmake-3.15.7-win64-x64/bin', diff --git a/conans/test/functional/toolchains/cmake/test_cmake_toolchain_win_clang.py b/conans/test/functional/toolchains/cmake/test_cmake_toolchain_win_clang.py new file mode 100644 index 00000000000..9680574b822 --- /dev/null +++ b/conans/test/functional/toolchains/cmake/test_cmake_toolchain_win_clang.py @@ -0,0 +1,47 @@ +import platform +import textwrap + +import pytest + +from conans.test.assets.cmake import gen_cmakelists +from conans.test.assets.sources import gen_function_cpp +from conans.test.utils.tools import TestClient + + +@pytest.mark.tool_clang(version="12") +@pytest.mark.skipif(platform.system() != "Windows", reason="requires Win") +def test_clang(): + c = TestClient() + clang_profile = textwrap.dedent(""" + [settings] + os=Windows + arch=x86_64 + build_type=Release + compiler=clang + compiler.version=12 + + [buildenv] + CC=clang + CXX=clang + RC=clang + """) + conanfile = textwrap.dedent(""" + from conans import ConanFile + from conan.tools.cmake import CMake + class Pkg(ConanFile): + settings = "os", "compiler", "build_type", "arch" + exports_sources = "*" + generators = "CMakeToolchain", "VirtualBuildEnv" + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + """) + c.save({"conanfile.py": conanfile, + "clang": clang_profile, + "CMakeLists.txt": gen_cmakelists(appname="my_app", appsources=["main.cpp"]), + "main.cpp": gen_function_cpp(name="main")}) + c.run("create . pkg/0.1@ -pr=clang") + print(c.out) + From 1be9a2ffb50bc8440c19baa5f02236183e292afd Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 24 Aug 2021 13:57:16 +0200 Subject: [PATCH 02/18] improving test conf --- conans/test/conftest.py | 157 +++++++----------- .../functional/build_helpers/meson_test.py | 2 +- 2 files changed, 60 insertions(+), 99 deletions(-) diff --git a/conans/test/conftest.py b/conans/test/conftest.py index 739bd4efd1a..d8bd1435768 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -5,7 +5,6 @@ import pytest from conans.client.tools import vswhere, which -from conans.errors import ConanException tools_default_version = { 'cmake': '3.15', @@ -54,74 +53,47 @@ 'mingw64': {'Windows': {'MSYSTEM': 'MINGW64'}} } -tools_available = [ - 'cmake', - 'gcc', 'clang', 'visual_studio', 'xcode', - 'msys2', 'cygwin', 'mingw32', 'mingw64', - 'autotools', 'pkg_config', 'premake', 'meson', 'ninja', - 'bazel', - 'file', - 'git', 'svn', - 'compiler', - 'conan', # Search the tool_conan test that needs conan itself -] - -if not which("cmake"): - tools_available.remove("cmake") - -if not which("gcc"): - tools_available.remove("gcc") -if not which("clang"): - tools_available.remove("clang") -try: - if not vswhere(): - tools_available.remove("visual_studio") -except ConanException: - tools_available.remove("visual_studio") - -if not any([x for x in ("gcc", "clang", "visual_studio") if x in tools_available]): - tools_available.remove("compiler") - -if not which("xcodebuild"): - tools_available.remove("xcode") - -if not which("file"): - tools_available.remove("file") - -if not which("git"): - tools_available.remove("git") -if not which("svn"): - tools_available.remove("svn") - -if not which("autoconf") or not which("automake"): - tools_available.remove("autotools") -if not which("meson"): - tools_available.remove("meson") -if not which("pkg-config"): - tools_available.remove("pkg_config") -if not which("premake"): - tools_available.remove("premake") -if not which("conan"): - tools_available.remove("conan") - - -def _get_tool_path(locations, name, version, tool_platform): - path = None - try: - path = locations[name][tool_platform][version] - except KeyError as exc: - if version in str(exc): - raise ConanException(exc) - return path - - -def _get_tool_environment(environments, name, tool_platform): - env = None - try: - env = environments[name][tool_platform] - except KeyError: - pass - return env + +_cached_tools = {} + + +def _get_tool(name, version): + cached = _cached_tools.setdefault(name, {}).get(version) + if cached is None: + tool_platform = platform.system() + version = version or tools_default_version.get(name) + tool_path = tool_env = None + if version is not None: # Must be found in locations + try: + tool_path = tools_locations[name][tool_platform][version] + except KeyError: + _cached_tools[name][version] = False + return False + try: + tool_env = tools_environments[name][tool_platform] + except KeyError: + pass + + cached = tool_path, tool_env + + # Check this particular tool is installed + if name == "visual_studio": + if not vswhere(): # TODO: Missing version detection + cached = False + else: # which based detection + old_environ = None + if tool_path is not None: + old_environ = dict(os.environ) + os.environ["PATH"] = tool_path + os.pathsep + os.environ["PATH"] + if not which(name): # TODO: This which doesn't detect version either + cached = False + if old_environ is not None: + os.environ.clear() + os.environ.update(old_environ) + + _cached_tools[name][version] = cached + + return cached @pytest.fixture(autouse=True) @@ -131,43 +103,32 @@ def add_tool(request): for mark in request.node.iter_markers(): if mark.name.startswith("tool_"): tool_name = mark.name[5:] - version = mark.kwargs.get('version', None) or tools_default_version.get(tool_name) - if version: - try: - tool_path = _get_tool_path(tools_locations, tool_name, version, platform.system()) - if tool_path: - tools_paths.append(tool_path) - except ConanException: - pytest.fail("Required {} version: '{}' is not available".format(tool_name, version)) - - tool_env = _get_tool_environment(tools_environments, tool_name, platform.system()) + if tool_name == "compiler": + tool_name = {"Windows": "visual_studio", + "Linux": "gcc", + "Darwin": "clang"}.get(platform.system()) + tool_version = mark.kwargs.get('version') + tool_found = _get_tool(tool_name, tool_version) + if tool_found is False: + version_msg = "Any" if tool_version is None else tool_version + pytest.fail("Required '{}' tool version '{}' is not available".format(tool_name, + version_msg)) + + tool_path, tool_env = tool_found + if tool_path: + tools_paths.append(tool_path) if tool_env: tools_env_vars.update(tool_env) - # To fix random failures in CI because of this: https://issues.jenkins.io/browse/JENKINS-9104 - if "visual_studio" in mark.name: - tools_env_vars.update({'_MSPDBSRV_ENDPOINT_': str(uuid.uuid4())}) + # Fix random failures CI because of this: https://issues.jenkins.io/browse/JENKINS-9104 + if tool_name == "visual_studio": + tools_env_vars['_MSPDBSRV_ENDPOINT_'] = str(uuid.uuid4()) if tools_paths or tools_env_vars: - tools_paths.append(os.environ["PATH"]) - temp_env = {'PATH': os.pathsep.join(tools_paths)} old_environ = dict(os.environ) - os.environ.update(temp_env) + tools_env_vars['PATH'] = os.pathsep.join(tools_paths + [os.environ["PATH"]]) os.environ.update(tools_env_vars) yield os.environ.clear() os.environ.update(old_environ) else: yield - - -def tool_check(mark): - tool_name = mark.name[5:] - if tool_name not in tools_available: - pytest.fail("Required tool: '{}' is not available".format(tool_name)) - - -def pytest_runtest_setup(item): - # Every mark is a required tool, some specify a version - for mark in item.iter_markers(): - if mark.name.startswith("tool_"): - tool_check(mark) diff --git a/conans/test/functional/build_helpers/meson_test.py b/conans/test/functional/build_helpers/meson_test.py index 3161c218dd5..78ad243208d 100644 --- a/conans/test/functional/build_helpers/meson_test.py +++ b/conans/test/functional/build_helpers/meson_test.py @@ -9,7 +9,7 @@ class MesonTest(unittest.TestCase): @pytest.mark.skipif(platform.system() != "Windows", reason="Needs windows for vcvars") - @pytest.mark.visual_studio + @pytest.mark.tool_visual_studio def test_vcvars_priority(self): # https://github.com/conan-io/conan/issues/5999 client = TestClient() From 686a13a759e8fbf13d802c79315f28e7106d3ccb Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 24 Aug 2021 14:12:35 +0200 Subject: [PATCH 03/18] fixing some tests --- conans/test/conftest.py | 4 ++++ .../functional/generators/cmake_find_package_multi_test.py | 2 +- .../cmake/cmakedeps/test_cmakedeps_build_modules.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/conans/test/conftest.py b/conans/test/conftest.py index d8bd1435768..cd46409a196 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -107,6 +107,10 @@ def add_tool(request): tool_name = {"Windows": "visual_studio", "Linux": "gcc", "Darwin": "clang"}.get(platform.system()) + elif tool_name == "pkg_config": + tool_name = "pkg-config" + elif tool_name == "autotools": + tool_name = "automake" tool_version = mark.kwargs.get('version') tool_found = _get_tool(tool_name, tool_version) if tool_found is False: diff --git a/conans/test/functional/generators/cmake_find_package_multi_test.py b/conans/test/functional/generators/cmake_find_package_multi_test.py index 35a30c8c8d6..c3893cc7b79 100644 --- a/conans/test/functional/generators/cmake_find_package_multi_test.py +++ b/conans/test/functional/generators/cmake_find_package_multi_test.py @@ -548,7 +548,7 @@ def test_multi_generator_windows(self): t.run_command('cmake --build . --config Release') # Compiles and links. @pytest.mark.skipif(platform.system() != "Darwin", reason="Requires Macos") - @pytest.mark.tool_xcode + @pytest.mark.tool_xcodebuild @pytest.mark.tool_cmake(version="3.19") def test_multi_generator_macos(self): t = self.t diff --git a/conans/test/functional/toolchains/cmake/cmakedeps/test_cmakedeps_build_modules.py b/conans/test/functional/toolchains/cmake/cmakedeps/test_cmakedeps_build_modules.py index 7983cfead88..e0b3379e77f 100644 --- a/conans/test/functional/toolchains/cmake/cmakedeps/test_cmakedeps_build_modules.py +++ b/conans/test/functional/toolchains/cmake/cmakedeps/test_cmakedeps_build_modules.py @@ -259,7 +259,7 @@ def test_multi_generator_windows(self): t.run_command('cmake --build . --config Release') # Compiles and links. @pytest.mark.skipif(platform.system() != "Darwin", reason="Requires Macos") - @pytest.mark.tool_xcode + @pytest.mark.tool_xcodebuild @pytest.mark.tool_cmake(version="3.19") def test_multi_generator_macos(self): t = self.t From abd3ef4f96bdf95321793f51ca68bdb1bc64bf67 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 24 Aug 2021 19:31:07 +0200 Subject: [PATCH 04/18] wip --- conans/test/.gitignore | 1 + conans/test/conftest.py | 148 ++++++++++++------ .../toolchains/google/test_bazel.py | 5 - conans/test/functional/tools_versions_test.py | 4 +- 4 files changed, 99 insertions(+), 59 deletions(-) create mode 100644 conans/test/.gitignore diff --git a/conans/test/.gitignore b/conans/test/.gitignore new file mode 100644 index 00000000000..9dfb3a6ac96 --- /dev/null +++ b/conans/test/.gitignore @@ -0,0 +1 @@ +conftest_user.py diff --git a/conans/test/conftest.py b/conans/test/conftest.py index cd46409a196..e028bdc7b3c 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -6,48 +6,72 @@ from conans.client.tools import vswhere, which -tools_default_version = { - 'cmake': '3.15', - 'msys2': 'default', - 'cygwin': 'default', - 'mingw32': 'default', - 'mingw64': 'default', - 'ninja': '1.10.2', - 'bazel': 'default' -} - tools_locations = { - 'msys2': {'Windows': {'default': os.getenv('CONAN_MSYS2_PATH', 'C:/msys64/usr/bin')}}, - 'cygwin': {'Windows': {'default': os.getenv('CONAN_CYGWIN_PATH', 'C:/cygwin64/bin')}}, - 'mingw32': {'Windows': {'default': os.getenv('CONAN_MINGW32_PATH', 'C:/msys64/mingw32/bin')}}, - 'mingw64': {'Windows': {'default': os.getenv('CONAN_MINGW64_PATH', 'C:/msys64/mingw64/bin')}}, + 'visual_studio': {"default": "17", + "17": None}, + 'gcc': {"default": "system", + "system": None}, 'cmake': { - 'Windows': { - '3.15': 'C:/cmake/cmake-3.15.7-win64-x64/bin', - '3.16': 'C:/cmake/cmake-3.16.9-win64-x64/bin', - '3.17': 'C:/cmake/cmake-3.17.5-win64-x64/bin', - '3.19': 'C:/cmake/cmake-3.19.7-win64-x64/bin' + "default": "3.15", + "3.15": { + "path": {'Windows': 'C:/cmake/cmake-3.15.7-win64-x64/bin', + 'Darwin': '/Users/jenkins/cmake/cmake-3.15.7/bin', + 'Linux': '/usr/share/cmake-3.15.7/bin'} + }, + "3.16": { + "path": {'Windows': 'C:/cmake/cmake-3.16.9-win64-x64/bin', + 'Darwin': '/Users/jenkins/cmake/cmake-3.16.9/bin', + 'Linux': '/usr/share/cmake-3.16.9/bin'} }, - 'Darwin': { - '3.15': '/Users/jenkins/cmake/cmake-3.15.7/bin', - '3.16': '/Users/jenkins/cmake/cmake-3.16.9/bin', - '3.17': '/Users/jenkins/cmake/cmake-3.17.5/bin', - '3.19': '/Users/jenkins/cmake/cmake-3.19.7/bin' + "3.17": { + "path": {'Windows': 'C:/cmake/cmake-3.17.5-win64-x64/bin', + 'Darwin': '/Users/jenkins/cmake/cmake-3.17.5/bin', + 'Linux': '/usr/share/cmake-3.17.5/bin'} }, - 'Linux': { - '3.15': '/usr/share/cmake-3.15.7/bin', - '3.16': '/usr/share/cmake-3.16.9/bin', - '3.17': '/usr/share/cmake-3.17.5/bin', - '3.19': '/usr/share/cmake-3.19.7/bin' + "3.19": { + "path": {'Windows': 'C:/cmake/cmake-3.19.7-win64-x64/bin', + 'Darwin': '/Users/jenkins/cmake/cmake-3.19.7/bin', + 'Linux': '/usr/share/cmake-3.19.7/bin'} } }, - 'ninja': {'Windows': {'1.10.2': 'C:/Tools/ninja/1.10.2'}}, - 'bazel': { - 'Darwin': {'default': '/Users/jenkins/bin'}, - 'Windows': {'default': 'C:/bazel/bin'}, + 'ninja': { + "default": "1.10.2", + "1.10.2": { + "path": {'Windows': 'C:/Tools/ninja/1.10.2'} + } + }, + 'mingw32': { + "default": "system", + "system": {"path": {'Windows': 'C:/msys64/mingw32/bin'}}, + }, + 'mingw64': { + "default": "system", + "system": {"path": {'Windows': 'C:/msys64/mingw64/bin'}}, + }, + 'msys2': {'Windows': {'default': os.getenv('CONAN_MSYS2_PATH', 'C:/msys64/usr/bin')}}, + 'cygwin': {'Windows': {'default': os.getenv('CONAN_CYGWIN_PATH', 'C:/cygwin64/bin')}}, + 'bazel': { + "default": "system", + "system": {"path": {'Windows': 'C:/bazel/bin', + "Darwin": '/Users/jenkins/bin'}}, } } +try: + from conans.test.conftest_user import tools_locations as user_tool_locations + + def update(d, u): + for k, v in u.items(): + if isinstance(v, dict): + d[k] = update(d.get(k, {}), v) + else: + d[k] = v + return d + + update(tools_locations, user_tool_locations) +except ImportError as e: + user_tool_locations = None + tools_environments = { 'mingw32': {'Windows': {'MSYSTEM': 'MINGW32'}}, 'mingw64': {'Windows': {'MSYSTEM': 'MINGW64'}} @@ -58,17 +82,28 @@ def _get_tool(name, version): + # None: not cached yet + # False = tool not available, legally skipped + # True = tool not available, test error + # (path, env) = tool available cached = _cached_tools.setdefault(name, {}).get(version) if cached is None: + tool = tools_locations[name] + if tool.get("disabled"): + _cached_tools[name][version] = False + return False + tool_platform = platform.system() - version = version or tools_default_version.get(name) - tool_path = tool_env = None - if version is not None: # Must be found in locations - try: - tool_path = tools_locations[name][tool_platform][version] - except KeyError: + version = version or tool["default"] + tool_version = tool[version] + if tool_version is not None: + if tool_version.get("disabled"): _cached_tools[name][version] = False return False + tool_path = tool_version.get("path", {}).get(tool_platform) + else: + tool_path = None + tool_env = None try: tool_env = tools_environments[name][tool_platform] except KeyError: @@ -79,14 +114,14 @@ def _get_tool(name, version): # Check this particular tool is installed if name == "visual_studio": if not vswhere(): # TODO: Missing version detection - cached = False + cached = True else: # which based detection old_environ = None if tool_path is not None: old_environ = dict(os.environ) os.environ["PATH"] = tool_path + os.pathsep + os.environ["PATH"] if not which(name): # TODO: This which doesn't detect version either - cached = False + cached = True if old_environ is not None: os.environ.clear() os.environ.update(old_environ) @@ -96,6 +131,18 @@ def _get_tool(name, version): return cached +def _tool_name_mapping(tool_name): + if tool_name == "compiler": + tool_name = {"Windows": "visual_studio", + "Linux": "gcc", + "Darwin": "clang"}.get(platform.system()) + elif tool_name == "pkg_config": + tool_name = "pkg-config" + elif tool_name == "autotools": + tool_name = "automake" + return tool_name + + @pytest.fixture(autouse=True) def add_tool(request): tools_paths = [] @@ -103,22 +150,19 @@ def add_tool(request): for mark in request.node.iter_markers(): if mark.name.startswith("tool_"): tool_name = mark.name[5:] - if tool_name == "compiler": - tool_name = {"Windows": "visual_studio", - "Linux": "gcc", - "Darwin": "clang"}.get(platform.system()) - elif tool_name == "pkg_config": - tool_name = "pkg-config" - elif tool_name == "autotools": - tool_name = "automake" + tool_name = _tool_name_mapping(tool_name) tool_version = mark.kwargs.get('version') - tool_found = _get_tool(tool_name, tool_version) - if tool_found is False: + result = _get_tool(tool_name, tool_version) + if result is True: version_msg = "Any" if tool_version is None else tool_version pytest.fail("Required '{}' tool version '{}' is not available".format(tool_name, version_msg)) + if result is False: + version_msg = "Any" if tool_version is None else tool_version + pytest.skip("Required '{}' tool version '{}' is not available".format(tool_name, + version_msg)) - tool_path, tool_env = tool_found + tool_path, tool_env = result if tool_path: tools_paths.append(tool_path) if tool_env: diff --git a/conans/test/functional/toolchains/google/test_bazel.py b/conans/test/functional/toolchains/google/test_bazel.py index d9ce31b2c8b..9df98f3e30b 100644 --- a/conans/test/functional/toolchains/google/test_bazel.py +++ b/conans/test/functional/toolchains/google/test_bazel.py @@ -7,15 +7,10 @@ import pytest from parameterized.parameterized import parameterized -from conans.model.ref import ConanFileReference, PackageReference -from conans.test.assets.cmake import gen_cmakelists from conans.test.assets.sources import gen_function_cpp, gen_function_h -from conans.test.functional.utils import check_vs_runtime, check_exe_run from conans.test.utils.tools import TestClient -from conans.util.files import save -@pytest.mark.toolchain @pytest.mark.tool_bazel class Base(unittest.TestCase): diff --git a/conans/test/functional/tools_versions_test.py b/conans/test/functional/tools_versions_test.py index e4f7369ee1f..c9e8cdee815 100644 --- a/conans/test/functional/tools_versions_test.py +++ b/conans/test/functional/tools_versions_test.py @@ -4,7 +4,7 @@ import pytest from conans.test.assets.sources import gen_function_cpp -from conans.test.conftest import tools_default_version +from conans.test.conftest import tools_locations from conans.test.utils.tools import TestClient @@ -14,7 +14,7 @@ class TestToolsCustomVersions: def test_default_cmake(self): client = TestClient() client.run_command('cmake --version') - default_cmake_version = tools_default_version.get("cmake") + default_cmake_version = tools_locations["cmake"]["default"] assert "cmake version {}".format(default_cmake_version) in client.out @pytest.mark.tool_cmake(version="3.16") From 6f7d31425e5cc5f08b9ccf578c4bb2bac84b9f88 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 24 Aug 2021 20:01:17 +0200 Subject: [PATCH 05/18] wip --- conans/test/conftest.py | 8 +++----- conans/test/functional/toolchains/meson/_base.py | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/conans/test/conftest.py b/conans/test/conftest.py index e028bdc7b3c..12bc4fbbc31 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -9,8 +9,6 @@ tools_locations = { 'visual_studio': {"default": "17", "17": None}, - 'gcc': {"default": "system", - "system": None}, 'cmake': { "default": "3.15", "3.15": { @@ -88,14 +86,14 @@ def _get_tool(name, version): # (path, env) = tool available cached = _cached_tools.setdefault(name, {}).get(version) if cached is None: - tool = tools_locations[name] + tool = tools_locations.get(name, {}) if tool.get("disabled"): _cached_tools[name][version] = False return False tool_platform = platform.system() - version = version or tool["default"] - tool_version = tool[version] + version = version or tool.get("default") + tool_version = tool.get(version) if tool_version is not None: if tool_version.get("disabled"): _cached_tools[name][version] = False diff --git a/conans/test/functional/toolchains/meson/_base.py b/conans/test/functional/toolchains/meson/_base.py index dc7eae35674..4870868aea0 100644 --- a/conans/test/functional/toolchains/meson/_base.py +++ b/conans/test/functional/toolchains/meson/_base.py @@ -21,7 +21,6 @@ def get_meson_version(): @pytest.mark.toolchain @pytest.mark.tool_meson -@pytest.mark.skipif(get_meson_version() < "0.56.0", reason="requires meson >= 0.56.0") class TestMesonBase(unittest.TestCase): def setUp(self): self.t = TestClient() From ae9e98a207f5557a866009007e8151ac533633d4 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 24 Aug 2021 20:13:13 +0200 Subject: [PATCH 06/18] docs --- conans/test/conftest.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/conans/test/conftest.py b/conans/test/conftest.py index 12bc4fbbc31..3c115287ca8 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -6,6 +6,33 @@ from conans.client.tools import vswhere, which +""" +To override these locations with your own in your dev machine: +1. Create a conftest_user.py just besides this conftest.py file +2. This file is .gitignored, it will not be committed +3. Override the tools_locations, you can completely disabled some tools, tests will be skipped +4. None values or empty dicts, without specifying the path, means the tool is already in the system + path + + +tools_locations = { + 'svn': {"disabled": True}, + 'cmake': { + "3.15": None, + "3.16": {"disabled": True}, + "3.17": {"disabled": True}, + "3.19": {"path": {"Windows": "C:/ws/cmake/cmake-3.19.7-win64-x64/bin"}}, + }, + 'ninja': { + "1.10.2": None + }, + 'bazel': { + "system": {"path": {'Windows': 'C:/ws/bazel/4.2.0'}}, + } +} +""" + + tools_locations = { 'visual_studio': {"default": "17", "17": None}, From cafa1815b0a90f1eef25729455aab42e3daf0858 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 24 Aug 2021 23:23:44 +0200 Subject: [PATCH 07/18] wip --- conans/test/conftest.py | 18 +++++++++++------- .../build_helpers/cmake_flags_test.py | 2 +- .../functional/generators/cmake_multi_test.py | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/conans/test/conftest.py b/conans/test/conftest.py index 3c115287ca8..35243b88fa9 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -36,6 +36,8 @@ tools_locations = { 'visual_studio': {"default": "17", "17": None}, + 'pkg_config': {"exe": "pkg-config"}, + 'autotools': {"exe": "autoconf"}, 'cmake': { "default": "3.15", "3.15": { @@ -67,11 +69,13 @@ }, 'mingw32': { "default": "system", - "system": {"path": {'Windows': 'C:/msys64/mingw32/bin'}}, + "exe": "mingw32-make", + "system": {"path": {'Windows': "TODO"}}, }, 'mingw64': { "default": "system", - "system": {"path": {'Windows': 'C:/msys64/mingw64/bin'}}, + "exe": "mingw32-make", + "system": {"path": {'Windows': "TODO"}}, }, 'msys2': {'Windows': {'default': os.getenv('CONAN_MSYS2_PATH', 'C:/msys64/usr/bin')}}, 'cygwin': {'Windows': {'default': os.getenv('CONAN_CYGWIN_PATH', 'C:/cygwin64/bin')}}, @@ -119,6 +123,7 @@ def _get_tool(name, version): return False tool_platform = platform.system() + exe = tool.get("exe", name) version = version or tool.get("default") tool_version = tool.get(version) if tool_version is not None: @@ -145,7 +150,7 @@ def _get_tool(name, version): if tool_path is not None: old_environ = dict(os.environ) os.environ["PATH"] = tool_path + os.pathsep + os.environ["PATH"] - if not which(name): # TODO: This which doesn't detect version either + if not which(exe): # TODO: This which doesn't detect version either cached = True if old_environ is not None: os.environ.clear() @@ -161,10 +166,6 @@ def _tool_name_mapping(tool_name): tool_name = {"Windows": "visual_studio", "Linux": "gcc", "Darwin": "clang"}.get(platform.system()) - elif tool_name == "pkg_config": - tool_name = "pkg-config" - elif tool_name == "autotools": - tool_name = "automake" return tool_name @@ -177,6 +178,9 @@ def add_tool(request): tool_name = mark.name[5:] tool_name = _tool_name_mapping(tool_name) tool_version = mark.kwargs.get('version') + tool_platform = mark.kwargs.get("platform") + if tool_platform is not None and tool_platform != platform.system(): + continue result = _get_tool(tool_name, tool_version) if result is True: version_msg = "Any" if tool_version is None else tool_version diff --git a/conans/test/functional/build_helpers/cmake_flags_test.py b/conans/test/functional/build_helpers/cmake_flags_test.py index 11200aa5f91..9323fe59f2f 100644 --- a/conans/test/functional/build_helpers/cmake_flags_test.py +++ b/conans/test/functional/build_helpers/cmake_flags_test.py @@ -378,7 +378,7 @@ def build(self): libpath = os.path.join(client.current_folder, "build", "lib", libname) self.assertTrue(os.path.exists(libpath)) - @pytest.mark.tool_mingw64 + @pytest.mark.tool_mingw64(platform="Windows") def test_standard_20_as_cxx_flag(self): # CMake (1-Jun-2018) do not support the 20 flag in CMAKE_CXX_STANDARD var conanfile = """ diff --git a/conans/test/functional/generators/cmake_multi_test.py b/conans/test/functional/generators/cmake_multi_test.py index 817f8c1d1f6..9e62ae93d1d 100644 --- a/conans/test/functional/generators/cmake_multi_test.py +++ b/conans/test/functional/generators/cmake_multi_test.py @@ -136,7 +136,7 @@ def package_files(name, deps=None): @pytest.mark.tool_cmake class CMakeMultiTest(unittest.TestCase): - @pytest.mark.tool_mingw64 + @pytest.mark.tool_mingw64(platform="Windows") def test_cmake_multi_find(self): client = TestClient() conanfile = """from conans import ConanFile, CMake From 20f71f40a8f330e3426d4ec78cb875383dcc5dc5 Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 25 Aug 2021 00:47:59 +0200 Subject: [PATCH 08/18] wip --- conans/test/conftest.py | 46 +++++++++++++------ .../build_helpers/cmake_flags_test.py | 2 +- .../functional/generators/cmake_multi_test.py | 2 +- .../test/functional/subsystems_build_test.py | 20 ++++---- 4 files changed, 45 insertions(+), 25 deletions(-) diff --git a/conans/test/conftest.py b/conans/test/conftest.py index 35243b88fa9..1ce17bb5c1d 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -34,6 +34,7 @@ tools_locations = { + "meson": {"disabled": True}, 'visual_studio': {"default": "17", "17": None}, 'pkg_config': {"exe": "pkg-config"}, @@ -67,18 +68,36 @@ "path": {'Windows': 'C:/Tools/ninja/1.10.2'} } }, - 'mingw32': { + 'mingw64': { + "platform": "Windows", "default": "system", "exe": "mingw32-make", "system": {"path": {'Windows': "TODO"}}, }, - 'mingw64': { + 'msys2': { + "platform": "Windows", "default": "system", - "exe": "mingw32-make", - "system": {"path": {'Windows': "TODO"}}, + "exe": "make", + "system": {"path": {'Windows': "C:/msys64/usr/bin"}}, + }, + 'msys2_mingw32': { + "platform": "Windows", + "default": "system", + "exe": "gcc", + "system": {"path": {'Windows': "C:/msys64/mingw32/bin"}}, + }, + 'msys2_mingw64': { + "platform": "Windows", + "default": "system", + "exe": "gcc", + "system": {"path": {'Windows': "C:/msys64/mingw64/bin"}}, + }, + 'cygwin': { + "platform": "Windows", + "default": "system", + "exe": "make", + "system": {"path": {'Windows': "C:/cygwin64/bin"}}, }, - 'msys2': {'Windows': {'default': os.getenv('CONAN_MSYS2_PATH', 'C:/msys64/usr/bin')}}, - 'cygwin': {'Windows': {'default': os.getenv('CONAN_CYGWIN_PATH', 'C:/cygwin64/bin')}}, 'bazel': { "default": "system", "system": {"path": {'Windows': 'C:/bazel/bin', @@ -102,8 +121,8 @@ def update(d, u): user_tool_locations = None tools_environments = { - 'mingw32': {'Windows': {'MSYSTEM': 'MINGW32'}}, - 'mingw64': {'Windows': {'MSYSTEM': 'MINGW64'}} + 'msys2_mingw32': {'Windows': {'MSYSTEM': 'MINGW32'}}, + 'msys2_mingw64': {'Windows': {'MSYSTEM': 'MINGW64'}} } @@ -123,6 +142,10 @@ def _get_tool(name, version): return False tool_platform = platform.system() + if tool.get("platform", tool_platform) != tool_platform: + _cached_tools[name][version] = None, None + return None, None + exe = tool.get("exe", name) version = version or tool.get("default") tool_version = tool.get(version) @@ -133,11 +156,11 @@ def _get_tool(name, version): tool_path = tool_version.get("path", {}).get(tool_platform) else: tool_path = None - tool_env = None + try: tool_env = tools_environments[name][tool_platform] except KeyError: - pass + tool_env = None cached = tool_path, tool_env @@ -178,9 +201,6 @@ def add_tool(request): tool_name = mark.name[5:] tool_name = _tool_name_mapping(tool_name) tool_version = mark.kwargs.get('version') - tool_platform = mark.kwargs.get("platform") - if tool_platform is not None and tool_platform != platform.system(): - continue result = _get_tool(tool_name, tool_version) if result is True: version_msg = "Any" if tool_version is None else tool_version diff --git a/conans/test/functional/build_helpers/cmake_flags_test.py b/conans/test/functional/build_helpers/cmake_flags_test.py index 9323fe59f2f..11200aa5f91 100644 --- a/conans/test/functional/build_helpers/cmake_flags_test.py +++ b/conans/test/functional/build_helpers/cmake_flags_test.py @@ -378,7 +378,7 @@ def build(self): libpath = os.path.join(client.current_folder, "build", "lib", libname) self.assertTrue(os.path.exists(libpath)) - @pytest.mark.tool_mingw64(platform="Windows") + @pytest.mark.tool_mingw64 def test_standard_20_as_cxx_flag(self): # CMake (1-Jun-2018) do not support the 20 flag in CMAKE_CXX_STANDARD var conanfile = """ diff --git a/conans/test/functional/generators/cmake_multi_test.py b/conans/test/functional/generators/cmake_multi_test.py index 9e62ae93d1d..817f8c1d1f6 100644 --- a/conans/test/functional/generators/cmake_multi_test.py +++ b/conans/test/functional/generators/cmake_multi_test.py @@ -136,7 +136,7 @@ def package_files(name, deps=None): @pytest.mark.tool_cmake class CMakeMultiTest(unittest.TestCase): - @pytest.mark.tool_mingw64(platform="Windows") + @pytest.mark.tool_mingw64 def test_cmake_multi_find(self): client = TestClient() conanfile = """from conans import ConanFile, CMake diff --git a/conans/test/functional/subsystems_build_test.py b/conans/test/functional/subsystems_build_test.py index d8c6ac4ee03..5a6684ac773 100644 --- a/conans/test/functional/subsystems_build_test.py +++ b/conans/test/functional/subsystems_build_test.py @@ -25,14 +25,14 @@ def test_cygwin_available(self): assert "CYGWIN" in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_mingw32 + @pytest.mark.tool_msys2_mingw32 def test_mingw32_available(self): client = TestClient() client.run_command('uname') assert "MINGW32_NT" in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_mingw64 + @pytest.mark.tool_msys2_mingw64 def test_mingw64_available(self): client = TestClient() client.run_command('uname') @@ -73,7 +73,7 @@ def test_msys(self): assert "__MSYS__" in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_mingw64 + @pytest.mark.tool_msys2_mingw64 def test_mingw64(self): """ 64-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) @@ -89,7 +89,7 @@ def test_mingw64(self): assert "__MSYS__" not in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_mingw32 + @pytest.mark.tool_msys2_mingw32 def test_mingw32(self): """ 32-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) @@ -165,7 +165,7 @@ def test_msys(self): assert "__MSYS__" in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_mingw64 + @pytest.mark.tool_msys2_mingw64 def test_mingw64(self): """ 64-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) @@ -181,7 +181,7 @@ def test_mingw64(self): assert "__MSYS__" not in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_mingw32 + @pytest.mark.tool_msys2_mingw32 def test_mingw32(self): """ 32-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) @@ -250,14 +250,14 @@ def test_msys(self): assert "__MSYS__" in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_mingw64 + @pytest.mark.tool_msys2_mingw64 def test_mingw64(self): """ 64-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) """ client = TestClient() # pacman -S mingw-w64-x86_64-gcc - self._build(client, generator="MinGW Makefiles") + self._build(client, generator="Unix Makefiles") check_exe_run(client.out, "main", "gcc", None, "Debug", "x86_64", None) @@ -266,14 +266,14 @@ def test_mingw64(self): assert "__MSYS__" not in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_mingw32 + @pytest.mark.tool_msys2_mingw32 def test_mingw32(self): """ 32-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) """ client = TestClient() # pacman -S mingw-w64-i686-gcc - self._build(client, generator="MinGW Makefiles") + self._build(client, generator="Unix Makefiles") check_exe_run(client.out, "main", "gcc", None, "Debug", "x86", None) From cb98d71e9219da67a81fe22d9cac8e36f37eae98 Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 25 Aug 2021 12:27:30 +0200 Subject: [PATCH 09/18] wip --- conans/test/conftest.py | 28 ++++++++----------- .../functional/layout/test_editable_cmake.py | 3 +- .../test/functional/subsystems_build_test.py | 16 +++++------ .../functional/toolchains/cmake/test_ninja.py | 1 - 4 files changed, 21 insertions(+), 27 deletions(-) diff --git a/conans/test/conftest.py b/conans/test/conftest.py index 1ce17bb5c1d..cc14d5fa700 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -35,8 +35,8 @@ tools_locations = { "meson": {"disabled": True}, - 'visual_studio': {"default": "17", - "17": None}, + 'visual_studio': {"default": "15", + "15": None}, 'pkg_config': {"exe": "pkg-config"}, 'autotools': {"exe": "autoconf"}, 'cmake': { @@ -68,11 +68,17 @@ "path": {'Windows': 'C:/Tools/ninja/1.10.2'} } }, + 'mingw32': { + "platform": "Windows", + "default": "system", + "exe": "mingw32-make", + "system": {"path": {'Windows': "C:/msys64/mingw32/bin"}}, + }, 'mingw64': { "platform": "Windows", "default": "system", "exe": "mingw32-make", - "system": {"path": {'Windows': "TODO"}}, + "system": {"path": {'Windows': "C:/msys64/mingw64/bin"}}, }, 'msys2': { "platform": "Windows", @@ -80,18 +86,6 @@ "exe": "make", "system": {"path": {'Windows': "C:/msys64/usr/bin"}}, }, - 'msys2_mingw32': { - "platform": "Windows", - "default": "system", - "exe": "gcc", - "system": {"path": {'Windows': "C:/msys64/mingw32/bin"}}, - }, - 'msys2_mingw64': { - "platform": "Windows", - "default": "system", - "exe": "gcc", - "system": {"path": {'Windows': "C:/msys64/mingw64/bin"}}, - }, 'cygwin': { "platform": "Windows", "default": "system", @@ -121,8 +115,8 @@ def update(d, u): user_tool_locations = None tools_environments = { - 'msys2_mingw32': {'Windows': {'MSYSTEM': 'MINGW32'}}, - 'msys2_mingw64': {'Windows': {'MSYSTEM': 'MINGW64'}} + 'mingw32': {'Windows': {'MSYSTEM': 'MINGW32'}}, + 'mingw64': {'Windows': {'MSYSTEM': 'MINGW64'}} } diff --git a/conans/test/functional/layout/test_editable_cmake.py b/conans/test/functional/layout/test_editable_cmake.py index 1dc16f58830..4c2791c953b 100644 --- a/conans/test/functional/layout/test_editable_cmake.py +++ b/conans/test/functional/layout/test_editable_cmake.py @@ -66,6 +66,7 @@ def build_pkg(msg): @pytest.mark.skipif(platform.system() != "Windows", reason="Only windows") @pytest.mark.parametrize("generator", [None, "MinGW Makefiles"]) +@pytest.mark.tool_msys2 @pytest.mark.tool_mingw64 def test_editable_cmake_windows(generator): editable_cmake(generator) @@ -130,7 +131,7 @@ def run_pkg(msg): @pytest.mark.skipif(platform.system() != "Windows", reason="Only windows") -@pytest.mark.parametrize("generator", [None, "MinGW Makefiles"]) +@pytest.mark.parametrize("generator", [None, "Unix Makefiles"]) @pytest.mark.tool_mingw64 def test_editable_cmake_windows_exe(generator): editable_cmake_exe(generator) diff --git a/conans/test/functional/subsystems_build_test.py b/conans/test/functional/subsystems_build_test.py index 5a6684ac773..cda3005efc2 100644 --- a/conans/test/functional/subsystems_build_test.py +++ b/conans/test/functional/subsystems_build_test.py @@ -25,14 +25,14 @@ def test_cygwin_available(self): assert "CYGWIN" in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_msys2_mingw32 + @pytest.mark.tool_mingw32 def test_mingw32_available(self): client = TestClient() client.run_command('uname') assert "MINGW32_NT" in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_msys2_mingw64 + @pytest.mark.tool_mingw64 def test_mingw64_available(self): client = TestClient() client.run_command('uname') @@ -73,7 +73,7 @@ def test_msys(self): assert "__MSYS__" in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_msys2_mingw64 + @pytest.mark.tool_mingw64 def test_mingw64(self): """ 64-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) @@ -89,7 +89,7 @@ def test_mingw64(self): assert "__MSYS__" not in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_msys2_mingw32 + @pytest.mark.tool_mingw32 def test_mingw32(self): """ 32-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) @@ -165,7 +165,7 @@ def test_msys(self): assert "__MSYS__" in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_msys2_mingw64 + @pytest.mark.tool_mingw64 def test_mingw64(self): """ 64-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) @@ -181,7 +181,7 @@ def test_mingw64(self): assert "__MSYS__" not in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_msys2_mingw32 + @pytest.mark.tool_mingw32 def test_mingw32(self): """ 32-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) @@ -250,7 +250,7 @@ def test_msys(self): assert "__MSYS__" in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_msys2_mingw64 + @pytest.mark.tool_mingw64 def test_mingw64(self): """ 64-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) @@ -266,7 +266,7 @@ def test_mingw64(self): assert "__MSYS__" not in client.out @pytest.mark.tool_msys2 - @pytest.mark.tool_msys2_mingw32 + @pytest.mark.tool_mingw32 def test_mingw32(self): """ 32-bit GCC, binaries for generic Windows (no dependency on MSYS runtime) diff --git a/conans/test/functional/toolchains/cmake/test_ninja.py b/conans/test/functional/toolchains/cmake/test_ninja.py index f983bffd0d5..b0b241136db 100644 --- a/conans/test/functional/toolchains/cmake/test_ninja.py +++ b/conans/test/functional/toolchains/cmake/test_ninja.py @@ -155,7 +155,6 @@ def test_locally_build_msvc_toolset(client): @pytest.mark.skipif(platform.system() != "Windows", reason="Only windows") @pytest.mark.parametrize("build_type,shared", [("Release", False), ("Debug", True)]) @pytest.mark.tool_mingw64 -@pytest.mark.tool_compiler @pytest.mark.tool_ninja def test_locally_build_gcc(build_type, shared, client): # FIXME: Note the gcc version is still incorrect From cdae664ae13991de1d249973f611150ca6f3ba7f Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 25 Aug 2021 12:51:16 +0200 Subject: [PATCH 10/18] wip --- conans/test/functional/layout/test_editable_cmake.py | 3 +-- conans/test/functional/subsystems_build_test.py | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/conans/test/functional/layout/test_editable_cmake.py b/conans/test/functional/layout/test_editable_cmake.py index 4c2791c953b..1dc16f58830 100644 --- a/conans/test/functional/layout/test_editable_cmake.py +++ b/conans/test/functional/layout/test_editable_cmake.py @@ -66,7 +66,6 @@ def build_pkg(msg): @pytest.mark.skipif(platform.system() != "Windows", reason="Only windows") @pytest.mark.parametrize("generator", [None, "MinGW Makefiles"]) -@pytest.mark.tool_msys2 @pytest.mark.tool_mingw64 def test_editable_cmake_windows(generator): editable_cmake(generator) @@ -131,7 +130,7 @@ def run_pkg(msg): @pytest.mark.skipif(platform.system() != "Windows", reason="Only windows") -@pytest.mark.parametrize("generator", [None, "Unix Makefiles"]) +@pytest.mark.parametrize("generator", [None, "MinGW Makefiles"]) @pytest.mark.tool_mingw64 def test_editable_cmake_windows_exe(generator): editable_cmake_exe(generator) diff --git a/conans/test/functional/subsystems_build_test.py b/conans/test/functional/subsystems_build_test.py index cda3005efc2..d8c6ac4ee03 100644 --- a/conans/test/functional/subsystems_build_test.py +++ b/conans/test/functional/subsystems_build_test.py @@ -257,7 +257,7 @@ def test_mingw64(self): """ client = TestClient() # pacman -S mingw-w64-x86_64-gcc - self._build(client, generator="Unix Makefiles") + self._build(client, generator="MinGW Makefiles") check_exe_run(client.out, "main", "gcc", None, "Debug", "x86_64", None) @@ -273,7 +273,7 @@ def test_mingw32(self): """ client = TestClient() # pacman -S mingw-w64-i686-gcc - self._build(client, generator="Unix Makefiles") + self._build(client, generator="MinGW Makefiles") check_exe_run(client.out, "main", "gcc", None, "Debug", "x86", None) From aa5931e1715f865f85840f57980dac67bb9da083 Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 25 Aug 2021 13:07:06 +0200 Subject: [PATCH 11/18] fixing test --- .../functional/toolchains/gnu/autotools/test_win_bash.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conans/test/functional/toolchains/gnu/autotools/test_win_bash.py b/conans/test/functional/toolchains/gnu/autotools/test_win_bash.py index 2c5844d5b4b..df7df5ea4d9 100644 --- a/conans/test/functional/toolchains/gnu/autotools/test_win_bash.py +++ b/conans/test/functional/toolchains/gnu/autotools/test_win_bash.py @@ -11,11 +11,11 @@ from conans.util.files import save -@pytest.mark.skipif(platform.system() not in ["Windows"], reason="Requires Windows") -@pytest.mark.tool_msys2() +@pytest.mark.skipif(platform.system() != "Windows", reason="Requires Windows") +@pytest.mark.tool_msys2 def test_autotools_bash_complete(): client = TestClient(path_with_spaces=False) - bash_path = tools_locations["msys2"]["Windows"]["default"] + "/bash.exe" + bash_path = tools_locations["msys2"]["system"]["path"]["Windows"] + "/bash.exe" save(client.cache.new_config_path, textwrap.dedent(""" tools.microsoft.bash:subsystem=msys2 tools.microsoft.bash:path={} From 7c0dfd1bf2239b46c2d57d773f9ba78db93a6d25 Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 25 Aug 2021 13:40:38 +0200 Subject: [PATCH 12/18] remove unused markers --- conans/test/functional/toolchains/cmake/test_cmake.py | 4 ---- conans/test/functional/toolchains/intel/test_using_cmake.py | 1 - conans/test/functional/toolchains/intel/test_using_msbuild.py | 1 - conans/test/functional/toolchains/meson/_base.py | 1 - conans/test/functional/toolchains/meson/test_android.py | 1 - conans/test/functional/toolchains/meson/test_ios.py | 1 - .../functional/toolchains/meson/test_meson_build_require.py | 2 +- conans/test/functional/toolchains/test_basic.py | 1 - conans/test/functional/toolchains/test_txt_cmdline.py | 1 - 9 files changed, 1 insertion(+), 12 deletions(-) diff --git a/conans/test/functional/toolchains/cmake/test_cmake.py b/conans/test/functional/toolchains/cmake/test_cmake.py index a1211ec6743..346f10ec68a 100644 --- a/conans/test/functional/toolchains/cmake/test_cmake.py +++ b/conans/test/functional/toolchains/cmake/test_cmake.py @@ -15,7 +15,6 @@ from conans.util.files import save -@pytest.mark.toolchain @pytest.mark.tool_cmake class Base(unittest.TestCase): @@ -492,7 +491,6 @@ def build(self): check_exe_run(client.out, "main", "msvc", version, "Release", "x86_64", "14") -@pytest.mark.toolchain @pytest.mark.tool_cmake class CMakeInstallTest(unittest.TestCase): @@ -550,7 +548,6 @@ def package(self): self.assertTrue(os.path.exists(os.path.join(package_folder, "include", "header.h"))) -@pytest.mark.toolchain @pytest.mark.tool_cmake class CMakeOverrideCacheTest(unittest.TestCase): @@ -585,7 +582,6 @@ def build(self): self.assertIn("VALUE OF CONFIG STRING: my new value", client.out) -@pytest.mark.toolchain @pytest.mark.tool_cmake class TestCMakeFindPackagePreferConfig: diff --git a/conans/test/functional/toolchains/intel/test_using_cmake.py b/conans/test/functional/toolchains/intel/test_using_cmake.py index c8f4978eb2e..49d1db1620d 100644 --- a/conans/test/functional/toolchains/intel/test_using_cmake.py +++ b/conans/test/functional/toolchains/intel/test_using_cmake.py @@ -61,7 +61,6 @@ def package(self): """) -@pytest.mark.toolchain @pytest.mark.tool_cmake @pytest.mark.tool_icc @pytest.mark.xfail(reason="Intel compiler not installed yet on CI") diff --git a/conans/test/functional/toolchains/intel/test_using_msbuild.py b/conans/test/functional/toolchains/intel/test_using_msbuild.py index bdeb1035ec1..e602ea5cffa 100644 --- a/conans/test/functional/toolchains/intel/test_using_msbuild.py +++ b/conans/test/functional/toolchains/intel/test_using_msbuild.py @@ -28,7 +28,6 @@ def build(self): """) -@pytest.mark.toolchain @pytest.mark.tool_cmake @pytest.mark.tool_msbuild @pytest.mark.tool_icc diff --git a/conans/test/functional/toolchains/meson/_base.py b/conans/test/functional/toolchains/meson/_base.py index 4870868aea0..90712334b30 100644 --- a/conans/test/functional/toolchains/meson/_base.py +++ b/conans/test/functional/toolchains/meson/_base.py @@ -19,7 +19,6 @@ def get_meson_version(): return Version("0.0.0") -@pytest.mark.toolchain @pytest.mark.tool_meson class TestMesonBase(unittest.TestCase): def setUp(self): diff --git a/conans/test/functional/toolchains/meson/test_android.py b/conans/test/functional/toolchains/meson/test_android.py index 9b38188f8b2..357cc9d2472 100644 --- a/conans/test/functional/toolchains/meson/test_android.py +++ b/conans/test/functional/toolchains/meson/test_android.py @@ -12,7 +12,6 @@ from conans.test.utils.tools import TestClient -@pytest.mark.toolchain @pytest.mark.tool_meson @pytest.mark.skipif(get_meson_version() < "0.56.0", reason="requires meson >= 0.56.0") class AndroidToolchainMesonTestCase(unittest.TestCase): diff --git a/conans/test/functional/toolchains/meson/test_ios.py b/conans/test/functional/toolchains/meson/test_ios.py index ddc9ad34a29..52b3fc6396e 100644 --- a/conans/test/functional/toolchains/meson/test_ios.py +++ b/conans/test/functional/toolchains/meson/test_ios.py @@ -12,7 +12,6 @@ from conans.test.utils.tools import TestClient -@pytest.mark.toolchain @pytest.mark.tool_meson @pytest.mark.skipif(platform.system() != "Darwin", reason="requires Xcode") @pytest.mark.skipif(get_meson_version() < "0.56.0", reason="requires meson >= 0.56.0") diff --git a/conans/test/functional/toolchains/meson/test_meson_build_require.py b/conans/test/functional/toolchains/meson/test_meson_build_require.py index 4f73d8f83cc..82a670e3270 100644 --- a/conans/test/functional/toolchains/meson/test_meson_build_require.py +++ b/conans/test/functional/toolchains/meson/test_meson_build_require.py @@ -4,7 +4,7 @@ from conans.test.functional.toolchains.meson._base import get_meson_version from conans.test.utils.tools import TestClient -@pytest.mark.toolchain + @pytest.mark.tool_meson @pytest.mark.skipif(get_meson_version() < "0.56.0", reason="requires meson >= 0.56.0") def test_env_vars_from_build_require(): diff --git a/conans/test/functional/toolchains/test_basic.py b/conans/test/functional/toolchains/test_basic.py index ad2cf125e78..2919a84caf9 100644 --- a/conans/test/functional/toolchains/test_basic.py +++ b/conans/test/functional/toolchains/test_basic.py @@ -9,7 +9,6 @@ from conans.util.files import save -@pytest.mark.toolchain class BasicTest(unittest.TestCase): def test_basic(self): diff --git a/conans/test/functional/toolchains/test_txt_cmdline.py b/conans/test/functional/toolchains/test_txt_cmdline.py index a797a2ed0dc..fbef3529b89 100644 --- a/conans/test/functional/toolchains/test_txt_cmdline.py +++ b/conans/test/functional/toolchains/test_txt_cmdline.py @@ -7,7 +7,6 @@ from conans.test.utils.tools import TestClient -@pytest.mark.toolchain class TestTxtCommandLine(unittest.TestCase): def test_declarative(self): From 408aa63709f8ace9b17dddf2224580c8d5ae0f4f Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 25 Aug 2021 16:05:22 +0200 Subject: [PATCH 13/18] enable meson --- conans/test/conftest.py | 1 - 1 file changed, 1 deletion(-) diff --git a/conans/test/conftest.py b/conans/test/conftest.py index cc14d5fa700..a7bdaef60f7 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -34,7 +34,6 @@ tools_locations = { - "meson": {"disabled": True}, 'visual_studio': {"default": "15", "15": None}, 'pkg_config': {"exe": "pkg-config"}, From 695e22d814892701fd98a4d831ed14a67467747a Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 25 Aug 2021 16:22:34 +0200 Subject: [PATCH 14/18] removing meson version check --- conans/test/functional/toolchains/meson/_base.py | 9 --------- conans/test/functional/toolchains/meson/test_android.py | 2 -- conans/test/functional/toolchains/meson/test_ios.py | 2 -- .../toolchains/meson/test_meson_build_require.py | 2 -- 4 files changed, 15 deletions(-) diff --git a/conans/test/functional/toolchains/meson/_base.py b/conans/test/functional/toolchains/meson/_base.py index 90712334b30..9721594ca4a 100644 --- a/conans/test/functional/toolchains/meson/_base.py +++ b/conans/test/functional/toolchains/meson/_base.py @@ -9,15 +9,6 @@ from conans.util.files import decode_text from conans.util.runners import version_runner -def get_meson_version(): - try: - out = version_runner(["meson", "--version"]) - version_line = decode_text(out).split('\n', 1)[0] - version_str = version_line.rsplit(' ', 1)[-1] - return Version(version_str) - except Exception: - return Version("0.0.0") - @pytest.mark.tool_meson class TestMesonBase(unittest.TestCase): diff --git a/conans/test/functional/toolchains/meson/test_android.py b/conans/test/functional/toolchains/meson/test_android.py index 357cc9d2472..0a1565feff6 100644 --- a/conans/test/functional/toolchains/meson/test_android.py +++ b/conans/test/functional/toolchains/meson/test_android.py @@ -8,12 +8,10 @@ import pytest from conans.test.assets.sources import gen_function_cpp, gen_function_h -from conans.test.functional.toolchains.meson._base import get_meson_version from conans.test.utils.tools import TestClient @pytest.mark.tool_meson -@pytest.mark.skipif(get_meson_version() < "0.56.0", reason="requires meson >= 0.56.0") class AndroidToolchainMesonTestCase(unittest.TestCase): _conanfile_py = textwrap.dedent(""" diff --git a/conans/test/functional/toolchains/meson/test_ios.py b/conans/test/functional/toolchains/meson/test_ios.py index 52b3fc6396e..c4fb87fd251 100644 --- a/conans/test/functional/toolchains/meson/test_ios.py +++ b/conans/test/functional/toolchains/meson/test_ios.py @@ -8,13 +8,11 @@ from conans.client.tools.apple import XCRun, apple_deployment_target_flag, to_apple_arch from conans.test.assets.sources import gen_function_cpp, gen_function_h -from conans.test.functional.toolchains.meson._base import get_meson_version from conans.test.utils.tools import TestClient @pytest.mark.tool_meson @pytest.mark.skipif(platform.system() != "Darwin", reason="requires Xcode") -@pytest.mark.skipif(get_meson_version() < "0.56.0", reason="requires meson >= 0.56.0") class IOSMesonTestCase(unittest.TestCase): _conanfile_py = textwrap.dedent(""" diff --git a/conans/test/functional/toolchains/meson/test_meson_build_require.py b/conans/test/functional/toolchains/meson/test_meson_build_require.py index 82a670e3270..7ab3b47d374 100644 --- a/conans/test/functional/toolchains/meson/test_meson_build_require.py +++ b/conans/test/functional/toolchains/meson/test_meson_build_require.py @@ -1,12 +1,10 @@ import pytest from conans.test.assets.genconanfile import GenConanfile -from conans.test.functional.toolchains.meson._base import get_meson_version from conans.test.utils.tools import TestClient @pytest.mark.tool_meson -@pytest.mark.skipif(get_meson_version() < "0.56.0", reason="requires meson >= 0.56.0") def test_env_vars_from_build_require(): br = str(GenConanfile().with_name("hello_compiler").with_version("1.0").with_import("import os")) br += """ From af11ba71aab1fcc9018d95263f1e0d6e4addd841 Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 25 Aug 2021 19:16:59 +0200 Subject: [PATCH 15/18] test to see if we break something --- conans/test/conftest.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conans/test/conftest.py b/conans/test/conftest.py index a7bdaef60f7..4288c5c8a15 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -34,6 +34,7 @@ tools_locations = { + "meson": {"disabled": True}, 'visual_studio': {"default": "15", "15": None}, 'pkg_config': {"exe": "pkg-config"}, @@ -148,6 +149,9 @@ def _get_tool(name, version): return False tool_path = tool_version.get("path", {}).get(tool_platform) else: + if version is not None: # if the version is specified, it should be in the conf + _cached_tools[name][version] = True + return True tool_path = None try: From 96480319f96e79812a7bc6284ee8395f7db7bdf7 Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 25 Aug 2021 21:03:50 +0200 Subject: [PATCH 16/18] fix visual_studio tests --- conans/test/conftest.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conans/test/conftest.py b/conans/test/conftest.py index 4288c5c8a15..87264cc3607 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -11,20 +11,20 @@ 1. Create a conftest_user.py just besides this conftest.py file 2. This file is .gitignored, it will not be committed 3. Override the tools_locations, you can completely disabled some tools, tests will be skipped -4. None values or empty dicts, without specifying the path, means the tool is already in the system +4. Empty dicts, without specifying the path, means the tool is already in the system path tools_locations = { 'svn': {"disabled": True}, 'cmake': { - "3.15": None, + "3.15": {}, "3.16": {"disabled": True}, "3.17": {"disabled": True}, "3.19": {"path": {"Windows": "C:/ws/cmake/cmake-3.19.7-win64-x64/bin"}}, }, 'ninja': { - "1.10.2": None + "1.10.2": {} }, 'bazel': { "system": {"path": {'Windows': 'C:/ws/bazel/4.2.0'}}, @@ -36,7 +36,7 @@ tools_locations = { "meson": {"disabled": True}, 'visual_studio': {"default": "15", - "15": None}, + "15": {}}, 'pkg_config': {"exe": "pkg-config"}, 'autotools': {"exe": "autoconf"}, 'cmake': { From f23fdd831f03d51e8ea1f4b5652764d8b56c5f26 Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 25 Aug 2021 21:24:14 +0200 Subject: [PATCH 17/18] wip --- conan/tools/cmake/toolchain.py | 5 ++++ conans/test/conftest.py | 3 ++- .../cmake/test_cmake_toolchain_win_clang.py | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/conan/tools/cmake/toolchain.py b/conan/tools/cmake/toolchain.py index b1168ebc354..8b2fe565ef7 100644 --- a/conan/tools/cmake/toolchain.py +++ b/conan/tools/cmake/toolchain.py @@ -515,6 +515,11 @@ def _get_toolset(self, generator): return "version=14.{}".format(minor) else: return "v14{}".format(minor) + elif compiler == "clang": + if generator and "Visual" in generator: + if "Visual Studio 16" in generator: + return "ClangCL" + # TODO: Handle other cases return None def _get_generator_platform(self, generator): diff --git a/conans/test/conftest.py b/conans/test/conftest.py index 1d9618ce28e..46ec10c4b7c 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -37,7 +37,8 @@ "clang": {"disabled": True}, "meson": {"disabled": True}, 'visual_studio': {"default": "15", - "15": {}}, + "15": {}, + "16": {"disabled": True}}, 'pkg_config': {"exe": "pkg-config"}, 'autotools': {"exe": "autoconf"}, 'cmake': { diff --git a/conans/test/functional/toolchains/cmake/test_cmake_toolchain_win_clang.py b/conans/test/functional/toolchains/cmake/test_cmake_toolchain_win_clang.py index cf43e8054ce..797d7e03dd4 100644 --- a/conans/test/functional/toolchains/cmake/test_cmake_toolchain_win_clang.py +++ b/conans/test/functional/toolchains/cmake/test_cmake_toolchain_win_clang.py @@ -77,3 +77,26 @@ def test_clang_cmake_ninja(client): # Check this! Clang compiler in Windows is reporting MSC_VER and MSVC_LANG! assert "main _MSC_VER19" in client.out assert "main _MSVC_LANG2014" in client.out + + +@pytest.mark.tool_cmake +@pytest.mark.tool_visual_studio(version="16") # With Clang distributed in VS! +@pytest.mark.skipif(platform.system() != "Windows", reason="requires Win") +def test_clang_cmake_visual(client): + clang_profile = textwrap.dedent(""" + [settings] + os=Windows + arch=x86_64 + build_type=Release + compiler=clang + compiler.version=11 + """) + # TODO: Clang version is unused, it can change, still 11 from inside VS is used + client.save({"clang": clang_profile}) + client.run("create . pkg/0.1@ -pr=clang " + '-c tools.cmake.cmaketoolchain:generator="Visual Studio 16"') + assert 'cmake -G "Visual Studio 16"' in client.out + assert "main __clang_major__11" in client.out + # Check this! Clang compiler in Windows is reporting MSC_VER and MSVC_LANG! + assert "main _MSC_VER19" in client.out + assert "main _MSVC_LANG2014" in client.out From bc549a7293c368c55c18772c8960b318cdff1928 Mon Sep 17 00:00:00 2001 From: memsharded Date: Thu, 26 Aug 2021 16:37:18 +0200 Subject: [PATCH 18/18] wip --- conan/tools/cmake/toolchain.py | 3 ++- conans/test/conftest.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/conan/tools/cmake/toolchain.py b/conan/tools/cmake/toolchain.py index 8b2fe565ef7..580a86b29ac 100644 --- a/conan/tools/cmake/toolchain.py +++ b/conan/tools/cmake/toolchain.py @@ -519,7 +519,8 @@ def _get_toolset(self, generator): if generator and "Visual" in generator: if "Visual Studio 16" in generator: return "ClangCL" - # TODO: Handle other cases + else: + raise ConanException("CMakeToolchain compiler=clang only supported VS 16") return None def _get_generator_platform(self, generator): diff --git a/conans/test/conftest.py b/conans/test/conftest.py index 956022f0284..161a1973654 100644 --- a/conans/test/conftest.py +++ b/conans/test/conftest.py @@ -150,6 +150,7 @@ def _get_tool(name, version): version = version or tool.get("default") tool_version = tool.get(version) if tool_version is not None: + assert isinstance(tool_version, dict) if tool_version.get("disabled"): _cached_tools[name][version] = False return False