summaryrefslogtreecommitdiff
path: root/xmake/core/_xmake_main.lua
blob: 28210680633af1b058b31d88b9bddcf3cc9ba041 (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
142
143
144
145
146
147
148
149
150
151
152
153
154
--!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-present, Xmake Open Source Community.
--
-- @author      ruki
-- @file        _xmake_main.lua
--

-- init namespace: xmake
xmake                   = xmake or {}
xmake._NAME             = _NAME or "xmake"
xmake._ARGV             = _ARGV
xmake._HOST             = _HOST
xmake._ARCH             = _ARCH
xmake._SUBHOST          = _SUBHOST
xmake._SUBARCH          = _SUBARCH
xmake._XMAKE_ARCH       = _XMAKE_ARCH
xmake._VERSION          = _VERSION
xmake._VERSION_SHORT    = _VERSION_SHORT
xmake._PROGRAM_DIR      = _PROGRAM_DIR
xmake._PROGRAM_FILE     = _PROGRAM_FILE
xmake._PROJECT_DIR      = _PROJECT_DIR
xmake._PROJECT_FILE     = "xmake.lua"
xmake._WORKING_DIR      = os.curdir()
xmake._FEATURES         = _FEATURES
xmake._LUAJIT           = _LUAJIT

-- In order to be compatible with updates from lower versions of engine core
-- @see https://github.com/xmake-io/xmake/issues/1694#issuecomment-925507210
if xmake._LUAJIT == nil then
    xmake._LUAJIT = true
end

-- has debugger?
if xmake._HAS_DEBUGGER == nil then
    if os.getenv("EMMYLUA_DEBUGGER") then
        xmake._HAS_DEBUGGER = true
    else
        xmake._HAS_DEBUGGER = false
    end
end

-- load the given lua file
function _loadfile_impl(filepath, mode, opt)

    -- init options
    opt = opt or {}

    -- init displaypath
    local binary = false
    local displaypath = opt.displaypath
    if displaypath == nil then
        displaypath = filepath
        if filepath:startswith(xmake._WORKING_DIR) then
            displaypath = path.translate("./" .. path.relative(filepath, xmake._WORKING_DIR))
        elseif filepath:startswith(xmake._PROGRAM_DIR) then
            binary = true -- read file by binary mode, will be faster
            displaypath = path.translate("@programdir/" .. path.relative(filepath, xmake._PROGRAM_DIR))
        elseif filepath:startswith(xmake._PROJECT_DIR) then
            local projectname = path.filename(xmake._PROJECT_DIR)
            displaypath = path.translate("@projectdir(" .. projectname .. ")/" .. path.relative(filepath, xmake._PROJECT_DIR))
        end
    end

    -- we use raw file path if debugger is enabled
    if xmake._HAS_DEBUGGER then
        displaypath = filepath
    end

    -- load script data from file
    local file, ferrors = io.file_open(filepath, binary and "rb" or "r")
    if not file then
        ferrors = string.format("file(%s): %s", filepath, ferrors or "open failed!")
        return nil, ferrors
    end

    local data, rerrors = io.file_read(file, "a")
    if not data then
        rerrors = string.format("file(%s): %s", filepath, rerrors or "read failed!")
        return nil, rerrors
    end
    io.file_close(file)

    -- do on_load()
    if opt.on_load then
        data = opt.on_load(data) or data
    end

    -- load script from string
    return load(data, "@" .. displaypath, mode)
end

-- init loadfile
--
-- @param filepath      the lua file path
-- @param mode          the load mode, e.g 't', 'b' or 'bt' (default)
-- @param opt           the arguments option, e.g. {displaypath = "", nocache = true}
--
local _loadcache = {}
function loadfile(filepath, mode, opt)

    -- init options
    opt = opt or {}

    -- get absolute path
    filepath = path.absolute(filepath)

    -- attempt to load script from cache first
    local mtime = nil
    local cache = (not opt.nocache) and _loadcache[filepath] or nil
    if cache and cache.script then
        mtime = os.mtime(filepath)
        if mtime > 0 and cache.mtime == mtime then
            return cache.script, nil
        end
    end

    -- load file
    local script, errors = _loadfile_impl(filepath, mode, opt)
    if script then
        _loadcache[filepath] = {script = script, mtime = mtime or os.mtime(filepath)}
    end
    return script, errors
end

-- init package path, package.searchers for lua5.4
table.insert(package.loaders or package.searchers, 2, function(v)
    local filepath = xmake._PROGRAM_DIR .. "/core/" .. v .. ".lua"
    local script, serr = _loadfile_impl(filepath)
    if not script then
        return "\n\tfailed to load " .. filepath .. " : " .. serr
    end
    return script
end)

-- load modules
local main = require("main")

-- the main function
function _xmake_main()
    return main.entry()
end