summaryrefslogtreecommitdiffstats
path: root/conans/test/functional/toolchains/cmake/test_cmake_toolchain_win_clang.py
blob: 797d7e03dd4e0f3f19f4fcbb303f8f841acafb4b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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
from conans.util.files import save


@pytest.fixture
def client():
    c = TestClient()
    save(c.cache.new_config_path, "tools.env.virtualenv:auto_use=True")
    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("""
        import os
        from conans import ConanFile
        from conan.tools.cmake import CMake
        from conan.tools.layout import cmake_layout
        class Pkg(ConanFile):
            settings = "os", "compiler", "build_type", "arch"
            exports_sources = "*"
            generators = "CMakeToolchain"

            def layout(self):
                cmake_layout(self)

            def build(self):
                cmake = CMake(self)
                cmake.configure()
                cmake.build()
                cmd = os.path.join(self.cpp.build.bindirs[0], "my_app")
                self.run(cmd, env=["conanrunenv"])
        """)
    c.save({"conanfile.py": conanfile,
            "clang": clang_profile,
            "src/CMakeLists.txt": gen_cmakelists(appname="my_app", appsources=["main.cpp"]),
            "src/main.cpp": gen_function_cpp(name="main")})
    return c


@pytest.mark.tool_cmake
@pytest.mark.tool_mingw64
@pytest.mark.tool_clang(version="12")
@pytest.mark.skipif(platform.system() != "Windows", reason="requires Win")
def test_clang(client):
    client.run("create . pkg/0.1@ -pr=clang")
    # clang compilations in Windows will use MinGW Makefiles by default
    assert 'cmake -G "MinGW Makefiles"' in client.out
    assert "main __clang_major__12" 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


@pytest.mark.tool_cmake
@pytest.mark.tool_clang(version="12")
@pytest.mark.skipif(platform.system() != "Windows", reason="requires Win")
def test_clang_cmake_ninja(client):
    client.run("create . pkg/0.1@ -pr=clang -c tools.cmake.cmaketoolchain:generator=Ninja")
    assert 'cmake -G "Ninja"' in client.out
    assert "main __clang_major__12" 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


@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