summaryrefslogtreecommitdiff
path: root/xmake/scripts/base/makefile.lua
blob: 754131fa422424fd72e8dbb883db59ff35b01354 (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
132
133
134
135
136
137
138
139
--!The Automatic Crmakefiles-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) 2009 - 2015, ruki All rights reserved.
--
-- @author      ruki
-- @file        makefile.lua
--

-- define module: makefile
local makefile = makefile or {}

-- load modules
local io        = require("base/io")
local os        = require("base/os")
local utils     = require("base/utils")
local config    = require("base/config")
local project   = require("base/project")

-- make the given target to the makefile
function makefile._make_target(file, name, target)

    -- check
    assert(file and name and target)

    -- make head
    file:write(string.format("%s:", name))

    -- make dependence for target
    if target.deps then
        local deps = utils.wrap(target.deps)
        for _, dep in ipairs(deps) do
            file:write(" " .. dep)
        end
    end

    -- make dependence end
    file:write("\n")

    -- make body
    file:write(string.format("\techo \"%s\"\n", name))

    -- make end
    file:write("\n")

    -- ok
    return true
end

-- make all targets to the makefile
function makefile._make_targets(file)

    -- check 
    assert(file and project and project._CONFIGS)

    -- get all project targets
    local targets = project._CONFIGS._TARGET
    if not targets then
        -- error
        utils.error("not found target in this project!")
        return false
    end

    -- make all first
    local all = ""
    for name, _ in pairs(targets) do
        -- append the target name to all
        all = all .. " " .. name
    end
    file:write(string.format("all: %s\n\n", all))

    -- make it for all targets
    for name, target in pairs(targets) do
        -- make target
        if not makefile._make_target(file, name, target) then
            -- error
            utils.error("failed to make target %s to makefile!", name)
            return false
        end

        -- append the target name to all
        all = all .. " " .. name
    end
   
    -- ok
    return true
end

-- make makefile in the build directory
function makefile.make()

    -- the configs
    local configs = config._CONFIGS
    assert(configs and configs.buildir)

    -- make the build directory
    if not os.isdir(configs.buildir) then
        assert(os.mkdir(configs.buildir))
    end

    -- open the makefile 
    local path = configs.buildir .. "/makefile"
    local file = io.open(path, "w")
    if not file then
        -- error
        utils.error("open %s failed!", path)
        return false
    end

    -- make all targets to the makefile
    if not makefile._make_targets(file) then
        -- error 
        utils.error("save %s failed!", path)
        file:close()
        return false
    end

    -- close the makefile
    file:close()

    -- ok
    return true
end

-- return module: makefile
return makefile