summaryrefslogtreecommitdiff
path: root/xmake/actions/install/main.lua
blob: 34e4f15eb9636a8b7ca3e327c278f66a0a9c703b (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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
--!The Automatic Cross-platform Build Tool
-- 
-- XMake is free software; you can redistribute it and/or modify
-- it under the terms of the GNU Lesser General Public License as published by
-- the Free Software Foundation; either version 2.1 of the License, or
-- (at your option) any later version.
-- 
-- XMake is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU Lesser General Public License for more details.
-- 
-- You should have received a copy of the GNU Lesser General Public License
-- along with XMake; 
-- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a>
-- 
-- Copyright (C) 2015 - 2016, ruki All rights reserved.
--
-- @author      ruki
-- @file        main.lua
--

-- imports
import("core.base.option")
import("core.project.task")
import("core.project.config")
import("core.project.global")
import("core.project.project")
import("core.platform.platform")

-- install package 
function _install_package(target)

    -- make the package directory first if not exists
    os.mkdir("$(packagedir)")

    -- copy the package to the output directory
    os.cp(format("$(buildir)/%s.pkg", target:name()), "$(packagedir)") 
end

-- install target 
function _install_target(target)

    -- get kind
    local kind = target:get("kind")

    -- get script 
    local scripts =
    {
        binary = _install_package
    ,   static = _install_package
    ,   shared = _install_package
    }

    -- check
    assert(scripts[kind], "this target(%s) with kind(%s) can not be installd!", target:name(), kind)

    -- install it
    scripts[kind](target) 
end

-- install the given target 
function _install(target)

    -- enter project directory
    os.cd(project.directory())

    -- the target scripts
    local scripts =
    {
        target:get("install_before")
    ,   target:get("install") or _install_target
    ,   target:get("install_after")
    }

    -- install the target scripts
    for i = 1, 3 do
        local script = scripts[i]
        if script ~= nil then
            script(target)
        end
    end

    -- leave project directory
    os.cd("-")
end

-- install the given target and deps
function _install_target_and_deps(target)

    -- this target have been finished?
    if _g.finished[target:name()] then
        return 
    end

    -- install for all dependent targets
    for _, depname in ipairs(target:get("deps")) do
        _install_target_and_deps(project.target(depname)) 
    end

    -- install target
    _install_target(target)

    -- finished
    _g.finished[target:name()] = true
end

-- main
function main()

    -- get the target name
    local targetname = option.get("target")

    -- init finished states
    _g.finished = {}

    -- package it first
    task.run("package", {target = targetname})

    -- install all?
    if targetname == "all" then
        for _, target in pairs(project.targets()) do
            _install_target_and_deps(target)
        end
    else
        _install_target_and_deps(project.target(targetname))
    end

    -- trace
    print("install ok!")
end