summaryrefslogtreecommitdiff
path: root/xmake/plugins/lua/xmake.lua
blob: e264ba14d5dfce9d742ab27ec95452804bd41552 (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
140
141
--!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
--

-- define task
task("lua")

    -- set category
    set_category("plugin")

    -- on run
    on_run(function ()
           
        -- imports
        import("core.base.option")
        import("core.sandbox.module")
        import("core.sandbox.sandbox")

        -- list all lua scripts?
        if option.get("list") then
            print("scripts:")
            local files = os.match(path.join(os.scriptdir(), "scripts/*.lua"))
            for _, file in ipairs(files) do
                print("    " .. path.basename(file))
            end
            return
        end

        -- run command?
        local script = option.get("script")
        if option.get("command") and script then
            local tmpfile = os.tmpfile() .. ".lua"
            io.writefile(tmpfile, "function main(...)\n" .. script .. "\nend")
            script = tmpfile
        end

        -- get script
        if script then

            local args = option.get("arguments") or {}
            args.n = #args
            for i, value in ipairs(args) do
                if value:startswith('@') then
                    local v, err = string.deserialize(value:sub(2))
                    if err then
                        -- for strings that failed to deserialize, regaed it as a normal string, just show a warning message
                        utils.warning(err)
                    else
                        args[i] = v
                    end
                end
            end

            -- import and run script
            if path.extension(script) == ".lua" and os.isfile(script) then

                -- run the given lua script file (xmake lua /tmp/script.lua)
                vprint("running given lua script file: %s", path.relative(script))
                import(path.basename(script), {rootdir = path.directory(script), anonymous = true})(table.unpack(args, 1, args.n))

            elseif os.isfile(path.join(os.scriptdir(), "scripts", script .. ".lua")) then

                -- run builtin lua script (xmake lua echo "hello xmake")
                vprint("running builtin lua script: %s", script)
                import("scripts." .. script, {anonymous = true})(table.unpack(args, 1, args.n))
            else

                -- attempt to find the builtin module
                local object = nil
                for _, name in ipairs(script:split("%.")) do
                    object = object and object[name] or module.get(name)
                    if not object then
                        break
                    end
                end
                local result = nil
                if object then
                    -- run builtin modules (xmake lua core.xxx.xxx)
                    vprint("running builtin module: %s", script)
                    result = table.pack(object(table.unpack(args, 1, args.n)))
                else
                    -- run imported modules (xmake lua core.xxx.xxx)
                    vprint("running imported module: %s", script)
                    result = table.pack(import(script, {anonymous = true})(table.unpack(args, 1, args.n)))
                end
                if result and result.n ~= 0 then utils.dump(unpack(result, 1, result.n)) end
            end
        else
            -- enter interactive mode
            sandbox.interactive()
        end
    end)

    -- set menu
    set_menu {
                -- usage
                usage = "xmake lua|l [options] [script] [arguments]"

                -- description
            ,   description = "Run the lua script."

                -- xmake l
            ,   shortname = 'l'

                -- options
            ,   options = 
                {

                    {'l', "list",       "k",  nil,          "List all scripts."                              }
                ,   {'c', "command",    "k",  nil,          "Run script as command"                          }
                ,   {nil, "script",     "v",  nil,          "Run the given lua script name, file or module and enter interactive mode if no given script.",
                                                            "e.g.",
                                                            "    - xmake lua (enter interactive mode)",
                                                            "    - xmake lua /tmp/script.lua",
                                                            "    - xmake lua echo 'hello xmake'",
                                                            "    - xmake lua core.xxx.xxx",
                                                            "    - xmake lua -c 'print(...)' hello xmake!"   }
                ,   {nil, "arguments",  "vs", nil,          "The script arguments, use '@' to enable deserializing.",
                                                            "e.g.",
                                                            "    - xmake lua lib.detect.find_tool tar @{version=true}" }
                }
            }