summaryrefslogtreecommitdiff
path: root/xmake/modules/private/platform/check_vstudio.lua
blob: 6657e43ea78ae15089dcc1bd7a922b1674da765a (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
103
--!A cross-platform build utility based on Lua
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
--     http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
-- 
-- Copyright (C) 2015-2020, TBOOX Open Source Group.
--
-- @author      ruki
-- @file        check_vstudio.lua
--

-- imports
import("core.base.option")
import("detect.sdks.find_vstudio")
import("lib.detect.find_tool")
import("core.platform.environment")

-- attempt to check vs environment
function _check_vsenv(config)

    -- have been checked?
    local vs = config.get("vs")
    if vs and config.get("__vcvarsall") then
        return vs
    end

    -- find vstudio
    local vstudio = find_vstudio({vcvars_ver = config.get("vs_toolset"), sdkver = config.get("vs_sdkver")})
    if vstudio then

        -- make order vsver
        local vsvers = {}
        for vsver, _ in pairs(vstudio) do
            if not vs or vs ~= vsver then
                table.insert(vsvers, vsver)
            end
        end
        table.sort(vsvers, function (a, b) return tonumber(a) > tonumber(b) end)
        if vs then
            table.insert(vsvers, 1, vs)
        end

        -- get vcvarsall
        for _, vsver in ipairs(vsvers) do
            local vcvarsall = (vstudio[vsver] or {}).vcvarsall or {}
            local vsenv = vcvarsall[config.get("arch") or ""]
            if vsenv and vsenv.path and vsenv.include and vsenv.lib then

                -- save vsenv
                config.set("__vcvarsall", vcvarsall)

                -- check compiler
                environment.enter("toolchains")
                local program = nil
                local tool = find_tool("cl.exe", {force = true})
                if tool then
                    program = tool.program
                end
                environment.leave("toolchains")

                -- ok?
                if program then
                    return vsver
                end
            end
        end
    end
end

-- check the visual studio
function main(config, opt)

    -- attempt to check the given vs version first
    local vs = _check_vsenv(config)
    if vs then

        -- save it
        config.set("vs", vs, {readonly = true, force = true})

        -- trace
        cprint("checking for the Microsoft Visual Studio (%s) version ... ${color.success}%s", config.get("arch"), vs)
    else
        -- failed
        cprint("checking for the Microsoft Visual Studio (%s) version ... ${color.nothing}${text.nothing}", config.get("arch"))
        if not (opt and opt.try) then
            print("please run:")
            print("    - xmake config --vs=xxx [--vs_toolset=xxx]")
            print("or  - xmake global --vs=xxx")
            raise()
        end
    end
end