summaryrefslogtreecommitdiff
path: root/xmake/modules/package/tools/xmake.lua
blob: 7875973582d21b85ec16921808cf21db7e0826be (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
104
105
--!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        xmake.lua
--

-- imports
import("core.base.option")

-- get configs
function _get_configs(package, configs)
    local configs  = configs or {}
    local cflags   = table.join(table.wrap(package:config("cflags")),   get_config("cflags"))
    local cxflags  = table.join(table.wrap(package:config("cxflags")),  get_config("cxflags"))
    local cxxflags = table.join(table.wrap(package:config("cxxflags")), get_config("cxxflags"))
    local asflags  = table.join(table.wrap(package:config("asflags")),  get_config("asflags"))
    local ldflags  = table.join(table.wrap(package:config("ldflags")),  get_config("ldflags"))
    if package:is_plat("windows") then
        local vs_runtime = package:config("vs_runtime")
        if vs_runtime then
            local vs_runtime_cxflags = "/" .. vs_runtime .. (package:debug() and "d" or "")
            table.insert(cxflags, vs_runtime_cxflags)
        end
    end
    table.insert(configs, "--mode=" .. (package:debug() and "debug" or "release"))
    if cflags then
        table.insert(configs, "--cflags=" .. os.args(table.concat(cflags, ' ')))
    end
    if cxflags then
        table.insert(configs, "--cxflags=" .. os.args(table.concat(cxflags, ' ')))
    end
    if cxxflags then
        table.insert(configs, "--cxxflags=" .. os.args(table.concat(cxxflags, ' ')))
    end
    if asflags then
        table.insert(configs, "--asflags=" .. os.args(table.concat(asflags, ' ')))
    end
    if ldflags then
        table.insert(configs, "--ldflags=" .. os.args(table.concat(ldflags, ' ')))
    end
    return configs
end

-- init arguments and inherit some global options from the parent xmake
function _init_argv(...)
    local argv = {...}
    for _, name in ipairs({"diagnosis", "verbose", "quiet", "yes", "confirm", "root"}) do
        local value = option.get(name) 
        if type(value) == "boolean" then
            table.insert(argv, "--" .. name)
        elseif value ~= nil then
            table.insert(argv, "--" .. name .. "=" .. value)
        end
    end
    return argv
end

-- install package
function install(package, configs)

    -- inherit builtin configs
    local argv = _init_argv("f", "-y", "-c")
    local names   = {"plat", "arch", "ndk", "ndk_sdkver", "vs", "mingw", "sdk", "bin", "cross", "ld", "sh", "ar", "cc", "cxx", "mm", "mxx"}
    for _, name in ipairs(names) do
        local value = get_config(name)
        if value ~= nil then
            table.insert(argv, "--" .. name .. "=" .. tostring(value))
        end
    end

    -- pass configurations
    for name, value in pairs(_get_configs(package, configs)) do
        value = tostring(value):trim()
        if type(name) == "number" then
            if value ~= "" then
                table.insert(argv, value)
            end
        else
            table.insert(argv, "--" .. name .. "=" .. value)
        end
    end
    os.vrunv("xmake", argv)

    -- do build
    argv = _init_argv()
    os.vrunv("xmake", argv)

    -- do install
    argv = _init_argv("install", "-y", "-o", package:installdir())
    os.vrunv("xmake", argv)
end