mirror of https://github.com/natnat-mc/moonbuild
depend on amalg.lua to produce a single binary, fix #10
parent
28116da35e
commit
750b6e152a
@ -0,0 +1 @@ |
||||
/*/**.lua |
@ -0,0 +1,989 @@ |
||||
do |
||||
|
||||
do |
||||
local _ENV = _ENV |
||||
package.preload[ "moonbuild.fsutil" ] = function( ... ) local arg = _G.arg; |
||||
local dir, attributes |
||||
do |
||||
local _obj_0 = require('lfs') |
||||
dir, attributes = _obj_0.dir, _obj_0.attributes |
||||
end |
||||
local gmatch, match, gsub, sub |
||||
do |
||||
local _obj_0 = string |
||||
gmatch, match, gsub, sub = _obj_0.gmatch, _obj_0.match, _obj_0.gsub, _obj_0.sub |
||||
end |
||||
local insert, concat |
||||
do |
||||
local _obj_0 = table |
||||
insert, concat = _obj_0.insert, _obj_0.concat |
||||
end |
||||
local ls |
||||
ls = function(d) |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for f in dir(d) do |
||||
if f ~= '.' and f ~= '..' then |
||||
_accum_0[_len_0] = f |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local lswithpath |
||||
lswithpath = function(d) |
||||
if d == '' then |
||||
return ls('.') |
||||
end |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for f in dir(d) do |
||||
if f ~= '.' and f ~= '..' then |
||||
_accum_0[_len_0] = d .. '/' .. f |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local exists |
||||
exists = function(f) |
||||
return (attributes(f)) ~= nil |
||||
end |
||||
local isdir |
||||
isdir = function(f) |
||||
local a = attributes(f) |
||||
return a and a.mode == 'directory' or false |
||||
end |
||||
local mtime |
||||
mtime = function(f) |
||||
local a = attributes(f) |
||||
return a and a.modification |
||||
end |
||||
local matchglob |
||||
matchglob = function(str, glob) |
||||
local patt = '^' .. (gsub((gsub(glob, '%*%*', '.*')), '%*', '[^/]*')) .. '$' |
||||
local rst |
||||
if (type(str)) == 'table' then |
||||
local results, i = { }, 1 |
||||
for _index_0 = 1, #str do |
||||
local s = str[_index_0] |
||||
rst = (match(s, patt)) and s |
||||
if rst then |
||||
results[i], i = rst, i + 1 |
||||
end |
||||
end |
||||
rst = results |
||||
else |
||||
rst = (match(str, patt)) and str |
||||
end |
||||
return rst |
||||
end |
||||
local wildcard |
||||
wildcard = function(glob) |
||||
local parts |
||||
do |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for part in gmatch(glob, '[^/]+') do |
||||
_accum_0[_len_0] = part |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
parts = _accum_0 |
||||
end |
||||
local absolute = (sub(glob, 1, 1)) == '/' |
||||
for i, part in ipairs(parts) do |
||||
local prevpath = (absolute and '/' or '') .. concat(parts, '/', 1, i - 1) |
||||
local currpath = prevpath .. '/' .. part |
||||
if match(part, '%*%*.*%*%*') then |
||||
error("Two '**' in the same path component in a wildcard") |
||||
end |
||||
if match(part, '%*%*') then |
||||
local prefix = match(currpath, '^(.*)%*%*') |
||||
local suffix = (match(part, '%*%*(.*)$')) .. (i == #parts and '' or ('/' .. concat(parts, '/', i + 1, #parts))) |
||||
local files = lswithpath(prevpath) |
||||
local results = { } |
||||
for _index_0 = 1, #files do |
||||
local file = files[_index_0] |
||||
if matchglob(file, currpath) then |
||||
if i == #parts then |
||||
insert(results, file) |
||||
elseif isdir(file) then |
||||
local _list_0 = wildcard(file .. '/' .. concat(parts, '/', i + 1, #parts)) |
||||
for _index_1 = 1, #_list_0 do |
||||
local result = _list_0[_index_1] |
||||
insert(results, result) |
||||
end |
||||
end |
||||
end |
||||
if (matchglob(file, prefix .. '**')) and isdir(file) then |
||||
local _list_0 = wildcard(file .. '/**' .. suffix) |
||||
for _index_1 = 1, #_list_0 do |
||||
local result = _list_0[_index_1] |
||||
insert(results, result) |
||||
end |
||||
end |
||||
end |
||||
return results |
||||
end |
||||
if match(part, '%*') then |
||||
local files = lswithpath(prevpath) |
||||
if i == #parts then |
||||
return matchglob(files, glob) |
||||
end |
||||
local results = { } |
||||
for _index_0 = 1, #files do |
||||
local file = files[_index_0] |
||||
if (matchglob(file, currpath)) and isdir(file) then |
||||
local _list_0 = wildcard(file .. '/' .. concat(parts, '/', i + 1, #parts)) |
||||
for _index_1 = 1, #_list_0 do |
||||
local result = _list_0[_index_1] |
||||
insert(results, result) |
||||
end |
||||
end |
||||
end |
||||
return results |
||||
end |
||||
end |
||||
if exists(glob) then |
||||
return { |
||||
glob |
||||
} |
||||
else |
||||
return { } |
||||
end |
||||
end |
||||
return { |
||||
wildcard = wildcard, |
||||
exists = exists, |
||||
isdir = isdir, |
||||
mtime = mtime |
||||
} |
||||
|
||||
end |
||||
end |
||||
|
||||
do |
||||
local _ENV = _ENV |
||||
package.preload[ "moonbuild.stringutil" ] = function( ... ) local arg = _G.arg; |
||||
local match, gmatch, sub |
||||
do |
||||
local _obj_0 = string |
||||
match, gmatch, sub = _obj_0.match, _obj_0.gmatch, _obj_0.sub |
||||
end |
||||
local upper, lower |
||||
do |
||||
local _obj_0 = string |
||||
upper, lower = _obj_0.upper, _obj_0.lower |
||||
end |
||||
local GLOB_PATT = '^([^%%]*)%%([^%%]*)$' |
||||
local patsubst |
||||
patsubst = function(str, pattern, replacement) |
||||
if (type(str)) == 'table' then |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for _index_0 = 1, #str do |
||||
local s = str[_index_0] |
||||
_accum_0[_len_0] = patsubst(s, pattern, replacement) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local prefix, suffix = match(pattern, GLOB_PATT) |
||||
if not (prefix) then |
||||
return str |
||||
end |
||||
local reprefix, resuffix = match(replacement, GLOB_PATT) |
||||
if not (reprefix) then |
||||
return replacement |
||||
end |
||||
if (sub(str, 1, #prefix)) == prefix and (sub(str, -#suffix)) == suffix then |
||||
return reprefix .. (sub(str, #prefix + 1, -#suffix - 1)) .. resuffix |
||||
end |
||||
return str |
||||
end |
||||
local splitsp |
||||
splitsp = function(str) |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for elem in gmatch(str, '%S+') do |
||||
_accum_0[_len_0] = elem |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
return _accum_0 |
||||
end |
||||
return { |
||||
patsubst = patsubst, |
||||
splitsp = splitsp, |
||||
upper = upper, |
||||
lower = lower |
||||
} |
||||
|
||||
end |
||||
end |
||||
|
||||
do |
||||
local _ENV = _ENV |
||||
package.preload[ "moonbuild.tableutil" ] = function( ... ) local arg = _G.arg; |
||||
local insert, remove, concat, sort |
||||
do |
||||
local _obj_0 = table |
||||
insert, remove, concat, sort = _obj_0.insert, _obj_0.remove, _obj_0.concat, _obj_0.sort |
||||
end |
||||
local unpack = unpack or table.unpack |
||||
local sortedpairs |
||||
sortedpairs = function(table, cmp) |
||||
local keys |
||||
do |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for k in pairs(table) do |
||||
_accum_0[_len_0] = k |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
keys = _accum_0 |
||||
end |
||||
sort(keys, cmp) |
||||
return coroutine.wrap(function() |
||||
for _index_0 = 1, #keys do |
||||
local key = keys[_index_0] |
||||
coroutine.yield(key, table[key]) |
||||
end |
||||
end) |
||||
end |
||||
local min |
||||
min = function(table, cmp) |
||||
if cmp == nil then |
||||
cmp = function(a, b) |
||||
return a < b |
||||
end |
||||
end |
||||
local val = table[1] |
||||
for i = 2, #table do |
||||
local elem = table[i] |
||||
if cmp(val, elem) then |
||||
val = elem |
||||
end |
||||
end |
||||
return val |
||||
end |
||||
local max |
||||
max = function(table, cmp) |
||||
if cmp == nil then |
||||
cmp = function(a, b) |
||||
return a < b |
||||
end |
||||
end |
||||
local val = table[1] |
||||
for i = 2, #table do |
||||
local elem = table[i] |
||||
if not cmp(val, elem) then |
||||
val = elem |
||||
end |
||||
end |
||||
return val |
||||
end |
||||
local foreach |
||||
foreach = function(tab, fn) |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for _index_0 = 1, #tab do |
||||
local e = tab[_index_0] |
||||
_accum_0[_len_0] = fn(e) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local first |
||||
first = function(tab, fn) |
||||
for _index_0 = 1, #tab do |
||||
local e = tab[_index_0] |
||||
if fn(e) then |
||||
return e |
||||
end |
||||
end |
||||
end |
||||
local exclude |
||||
exclude = function(tab, ...) |
||||
local i = 1 |
||||
while i <= #tab do |
||||
local removed = false |
||||
for j = 1, select('#', ...) do |
||||
if tab[i] == select(j, ...) then |
||||
remove(tab, i) |
||||
removed = true |
||||
break |
||||
end |
||||
end |
||||
if not (removed) then |
||||
i = i + 1 |
||||
end |
||||
end |
||||
return tab |
||||
end |
||||
local flatten |
||||
flatten = function(tab) |
||||
if (type(tab)) ~= 'table' then |
||||
return { |
||||
tab |
||||
} |
||||
end |
||||
local out = { } |
||||
for _index_0 = 1, #tab do |
||||
local e = tab[_index_0] |
||||
if (type(e)) == 'table' then |
||||
local _list_0 = flatten(e) |
||||
for _index_1 = 1, #_list_0 do |
||||
local v = _list_0[_index_1] |
||||
insert(out, v) |
||||
end |
||||
else |
||||
insert(out, e) |
||||
end |
||||
end |
||||
return out |
||||
end |
||||
return { |
||||
min = min, |
||||
max = max, |
||||
foreach = foreach, |
||||
first = first, |
||||
exclude = exclude, |
||||
flatten = flatten, |
||||
sortedpairs = sortedpairs, |
||||
insert = insert, |
||||
remove = remove, |
||||
concat = concat, |
||||
sort = sort, |
||||
unpack = unpack |
||||
} |
||||
|
||||
end |
||||
end |
||||
|
||||
do |
||||
local _ENV = _ENV |
||||
package.preload[ "moonbuild.util" ] = function( ... ) local arg = _G.arg; |
||||
local wildcard, exists, isdir, mtime |
||||
do |
||||
local _obj_0 = require('moonbuild.fsutil') |
||||
wildcard, exists, isdir, mtime = _obj_0.wildcard, _obj_0.exists, _obj_0.isdir, _obj_0.mtime |
||||
end |
||||
local foreach, first, flatten, exclude, sortedpairs, min, max |
||||
do |
||||
local _obj_0 = require('moonbuild.tableutil') |
||||
foreach, first, flatten, exclude, sortedpairs, min, max = _obj_0.foreach, _obj_0.first, _obj_0.flatten, _obj_0.exclude, _obj_0.sortedpairs, _obj_0.min, _obj_0.max |
||||
end |
||||
local patsubst, splitsp |
||||
do |
||||
local _obj_0 = require('moonbuild.stringutil') |
||||
patsubst, splitsp = _obj_0.patsubst, _obj_0.splitsp |
||||
end |
||||
local insert, concat, sort, pairs |
||||
do |
||||
local _obj_0 = require('moonbuild.tableutil') |
||||
insert, concat, sort, pairs = _obj_0.insert, _obj_0.concat, _obj_0.sort, _obj_0.pairs |
||||
end |
||||
local upper, lower |
||||
do |
||||
local _obj_0 = require('moonbuild.stringutil') |
||||
upper, lower = _obj_0.upper, _obj_0.lower |
||||
end |
||||
local GLOB_PATT = '^([^%%]*)%%([^%%]*)$' |
||||
local escapecmdpart |
||||
escapecmdpart = function(p) |
||||
if (type(p)) == 'table' then |
||||
if p.raw then |
||||
return p.raw |
||||
end |
||||
return concat((function() |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for _index_0 = 1, #p do |
||||
local part = p[_index_0] |
||||
_accum_0[_len_0] = escapecmdpart(part) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
return _accum_0 |
||||
end)(), ' ') |
||||
end |
||||
if p:match('^[a-zA-Z0-9_./-]+$') then |
||||
return p |
||||
end |
||||
return '"' .. p:gsub('\\', '\\\\'):gsub('"', '\\"') .. '"' |
||||
end |
||||
local escapecmd |
||||
escapecmd = function(c, args) |
||||
if args == nil then |
||||
args = { } |
||||
end |
||||
c = escapecmdpart(c) |
||||
local _list_0 = flatten(args) |
||||
for _index_0 = 1, #_list_0 do |
||||
local a = _list_0[_index_0] |
||||
if a then |
||||
c = c .. (' ' .. escapecmdpart(a)) |
||||
end |
||||
end |
||||
return c |
||||
end |
||||
local run |
||||
run = function(c, args, params) |
||||
if params == nil then |
||||
params = { } |
||||
end |
||||
local escaped = escapecmd(c, args) |
||||
if params.print then |
||||
print(escaped) |
||||
end |
||||
local ret, _, code = os.execute(escaped) |
||||
if (type(ret)) == 'number' then |
||||
ret, code = ret == 0, ret |
||||
end |
||||
if params.error and not ret then |
||||
error(tostring(c) .. " failed with code " .. tostring(code)) |
||||
end |
||||
return ret, code |
||||
end |
||||
local popen |
||||
popen = function(c, args, mode, params) |
||||
if mode == nil then |
||||
mode = 'r' |
||||
end |
||||
if params == nil then |
||||
params = { } |
||||
end |
||||
local escaped = escapecmd(c, args) |
||||
if params.print then |
||||
print(escaped) |
||||
end |
||||
return io.popen(escaped, mode) |
||||
end |
||||
local calccdeps |
||||
calccdeps = function(infile, includesys) |
||||
if includesys == nil then |
||||
includesys = false |
||||
end |
||||
local data = (popen('cc', { |
||||
includesys and '-M' or '-MM', |
||||
infile |
||||
})):read('*a') |
||||
local rawdeps = data:gsub('\\\n', ''):match(':(.+)') |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for dep in rawdeps:gmatch('%S+') do |
||||
if dep ~= infile then |
||||
_accum_0[_len_0] = dep |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local findclib |
||||
findclib = function(name, mode) |
||||
if mode == nil then |
||||
mode = 'all' |
||||
end |
||||
local args = { |
||||
name |
||||
} |
||||
if mode == 'all' or mode == 'cc' then |
||||
insert(args, '--cflags') |
||||
end |
||||
if mode == 'all' or mode == 'ld' then |
||||
insert(args, '--libs') |
||||
end |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for arg in (popen('pkg-config', args)):read('*a'):gmatch('%S+') do |
||||
_accum_0[_len_0] = arg |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local match |
||||
match = function(str, glob) |
||||
local prefix, suffix = glob:match(GLOB_PATT) |
||||
if not (prefix) then |
||||
return str == glob |
||||
end |
||||
if (str:sub(1, #prefix)) == prefix and (str:sub(-#suffix)) == suffix then |
||||
return str:sub(#prefix + 1, -#suffix - 1) |
||||
end |
||||
return false |
||||
end |
||||
local isglob |
||||
isglob = function(glob) |
||||
if glob:match(GLOB_PATT) then |
||||
return true |
||||
else |
||||
return false |
||||
end |
||||
end |
||||
local env |
||||
env = function(key, def) |
||||
return (os.getenv(key)) or def |
||||
end |
||||
return { |
||||
min = min, |
||||
max = max, |
||||
foreach = foreach, |
||||
first = first, |
||||
exclude = exclude, |
||||
flatten = flatten, |
||||
sortedpairs = sortedpairs, |
||||
insert = insert, |
||||
remove = remove, |
||||
concat = concat, |
||||
sort = sort, |
||||
unpack = unpack, |
||||
wildcard = wildcard, |
||||
mtime = mtime, |
||||
exists = exists, |
||||
isdir = isdir, |
||||
run = run, |
||||
popen = popen, |
||||
calccdeps = calccdeps, |
||||
findclib = findclib, |
||||
patsubst = patsubst, |
||||
splitsp = splitsp, |
||||
upper = upper, |
||||
lower = lower, |
||||
match = match, |
||||
isglob = isglob, |
||||
env = env |
||||
} |
||||
|
||||
end |
||||
end |
||||
|
||||
end |
||||
|
||||
local argparse = require('argparse') |
||||
require('moonscript') |
||||
local loadfile |
||||
loadfile = require('moonscript.base').loadfile |
||||
local truncate_traceback, rewrite_traceback |
||||
do |
||||
local _obj_0 = require('moonscript.errors') |
||||
truncate_traceback, rewrite_traceback = _obj_0.truncate_traceback, _obj_0.rewrite_traceback |
||||
end |
||||
local trim |
||||
trim = require('moonscript.util').trim |
||||
local util = require('moonbuild.util') |
||||
local exists, mtime, run, min, max, first, flatten, match, patsubst, sortedpairs |
||||
exists, mtime, run, min, max, first, flatten, match, patsubst, sortedpairs = util.exists, util.mtime, util.run, util.min, util.max, util.first, util.flatten, util.match, util.patsubst, util.sortedpairs |
||||
local insert, concat |
||||
do |
||||
local _obj_0 = table |
||||
insert, concat = _obj_0.insert, _obj_0.concat |
||||
end |
||||
local parser = argparse('moonbuild') |
||||
parser:argument('targets', "Targets to run"):args('*') |
||||
parser:flag('-a --noskip', "Always run targets") |
||||
parser:flag('-l --list', "List available targets") |
||||
parser:flag('-d --deps', "List targets and their dependancies") |
||||
local args = parser:parse() |
||||
local loadwithscope |
||||
loadwithscope = function(file, scope) |
||||
local fn, err = loadfile(file) |
||||
if not (fn) then |
||||
error(err or "failed to load code") |
||||
end |
||||
local dumped |
||||
dumped, err = string.dump(fn) |
||||
if not (dumped) then |
||||
error(err or "failed to dump function") |
||||
end |
||||
return load(dumped, file, 'b', scope) |
||||
end |
||||
local pcall |
||||
pcall = function(fn, ...) |
||||
local rewrite |
||||
rewrite = function(err) |
||||
local trace = debug.traceback('', 2) |
||||
local trunc = truncate_traceback(trim(trace)) |
||||
return rewrite_traceback(trunc, err) |
||||
end |
||||
return xpcall(fn, rewrite, ...) |
||||
end |
||||
local Command |
||||
do |
||||
local _class_0 |
||||
local _base_0 = { |
||||
__unm = function(self) |
||||
return self:run({ |
||||
error = true, |
||||
print = true |
||||
}) |
||||
end, |
||||
__len = function(self) |
||||
return self:run({ |
||||
error = true |
||||
}) |
||||
end, |
||||
__tostring = function(self) |
||||
return self.cmd |
||||
end, |
||||
run = function(self, params) |
||||
return run(self.cmd, self.args, params) |
||||
end |
||||
} |
||||
_base_0.__index = _base_0 |
||||
_class_0 = setmetatable({ |
||||
__init = function(self, cmd, ...) |
||||
self.cmd = cmd |
||||
self.args = { |
||||
... |
||||
} |
||||
end, |
||||
__base = _base_0, |
||||
__name = "Command" |
||||
}, { |
||||
__index = _base_0, |
||||
__call = function(cls, ...) |
||||
local _self_0 = setmetatable({}, _base_0) |
||||
cls.__init(_self_0, ...) |
||||
return _self_0 |
||||
end |
||||
}) |
||||
_base_0.__class = _class_0 |
||||
local self = _class_0 |
||||
self.run = function(self, ...) |
||||
return -self(...) |
||||
end |
||||
Command = _class_0 |
||||
end |
||||
local BuildObject |
||||
do |
||||
local _class_0 |
||||
local all, skip |
||||
local _base_0 = { |
||||
__tostring = function(self) |
||||
return "Target " .. tostring(self.name) .. " (" .. tostring(concat(self.deps, ', ')) .. ")" |
||||
end, |
||||
build = function(self, name, upper) |
||||
if upper == nil then |
||||
upper = { } |
||||
end |
||||
if skip[name] then |
||||
return |
||||
end |
||||
if upper[self] then |
||||
error("Cycle detected on " .. tostring(self.name)) |
||||
end |
||||
upper = setmetatable({ |
||||
[self] = true |
||||
}, { |
||||
__index = upper |
||||
}) |
||||
if self.name ~= name then |
||||
local _list_0 = self.deps |
||||
for _index_0 = 1, #_list_0 do |
||||
local dep = _list_0[_index_0] |
||||
self.__class:build((patsubst(name, self.name, dep)), upper) |
||||
end |
||||
else |
||||
local _list_0 = self.deps |
||||
for _index_0 = 1, #_list_0 do |
||||
local dep = _list_0[_index_0] |
||||
self.__class:build(dep, upper) |
||||
end |
||||
end |
||||
if not (self:shouldbuild(name)) then |
||||
return |
||||
end |
||||
local ins = self.ins |
||||
local outs = self.outs |
||||
if self.name ~= name then |
||||
do |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
local _list_0 = self.ins |
||||
for _index_0 = 1, #_list_0 do |
||||
local elem = _list_0[_index_0] |
||||
_accum_0[_len_0] = patsubst(name, self.name, elem) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
ins = _accum_0 |
||||
end |
||||
do |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
local _list_0 = self.outs |
||||
for _index_0 = 1, #_list_0 do |
||||
local elem = _list_0[_index_0] |
||||
_accum_0[_len_0] = patsubst(name, self.name, elem) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
outs = _accum_0 |
||||
end |
||||
print("Building " .. tostring(self.name) .. " as " .. tostring(name)) |
||||
else |
||||
print("Building " .. tostring(name)) |
||||
end |
||||
local ok, err = pcall(function() |
||||
return self.fn({ |
||||
ins = ins, |
||||
outs = outs, |
||||
infile = ins[1], |
||||
outfile = outs[1], |
||||
name = name |
||||
}) |
||||
end) |
||||
if not (ok) then |
||||
error("Can't build " .. tostring(self.name) .. ": lua error\n" .. tostring(err)) |
||||
end |
||||
for _index_0 = 1, #outs do |
||||
local f = outs[_index_0] |
||||
if not (exists(f)) then |
||||
error("Can't build " .. tostring(self.name) .. ": output file " .. tostring(f) .. " not created") |
||||
end |
||||
end |
||||
skip[name] = true |
||||
end, |
||||
shouldbuild = function(self, name) |
||||
if args.noskip then |
||||
return true |
||||
end |
||||
if #self.ins == 0 or #self.outs == 0 then |
||||
return true |
||||
end |
||||
local ins |
||||
if self.name ~= name then |
||||
do |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
local _list_0 = self.ins |
||||
for _index_0 = 1, #_list_0 do |
||||
local elem = _list_0[_index_0] |
||||
_accum_0[_len_0] = patsubst(name, self.name, elem) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
ins = _accum_0 |
||||
end |
||||
else |
||||
ins = self.ins |
||||
end |
||||
local itimes |
||||
do |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for _index_0 = 1, #ins do |
||||
local f = ins[_index_0] |
||||
_accum_0[_len_0] = mtime(f) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
itimes = _accum_0 |
||||
end |
||||
for i = 1, #self.ins do |
||||
if not (itimes[i]) then |
||||
error("Can't build " .. tostring(self.name) .. ": missing inputs") |
||||
end |
||||
end |
||||
local outs |
||||
if self.name ~= name then |
||||
do |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
local _list_0 = self.outs |
||||
for _index_0 = 1, #_list_0 do |
||||
local elem = _list_0[_index_0] |
||||
_accum_0[_len_0] = patsubst(name, self.name, elem) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
outs = _accum_0 |
||||
end |
||||
else |
||||
outs = self.outs |
||||
end |
||||
local otimes |
||||
do |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for _index_0 = 1, #outs do |
||||
local f = outs[_index_0] |
||||
_accum_0[_len_0] = mtime(f) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
otimes = _accum_0 |
||||
end |
||||
for i = 1, #self.outs do |
||||
if not otimes[i] then |
||||
return true |
||||
end |
||||
end |
||||
return (max(itimes)) > (min(otimes)) |
||||
end |
||||
} |
||||
_base_0.__index = _base_0 |
||||
_class_0 = setmetatable({ |
||||
__init = function(self, name, outs, ins, deps, fn) |
||||
if outs == nil then |
||||
outs = { } |
||||
end |
||||
if ins == nil then |
||||
ins = { } |
||||
end |
||||
if deps == nil then |
||||
deps = { } |
||||
end |
||||
if fn == nil then |
||||
fn = function(self) end |
||||
end |
||||
self.name, self.outs, self.ins, self.deps, self.fn = name, outs, ins, deps, fn |
||||
self.skip = false |
||||
if all[self.name] then |
||||
error("Duplicate build name " .. tostring(self.name)) |
||||
end |
||||
all[self.name] = self |
||||
end, |
||||
__base = _base_0, |
||||
__name = "BuildObject" |
||||
}, { |
||||
__index = _base_0, |
||||
__call = function(cls, ...) |
||||
local _self_0 = setmetatable({}, _base_0) |
||||
cls.__init(_self_0, ...) |
||||
return _self_0 |
||||
end |
||||
}) |
||||
_base_0.__class = _class_0 |
||||
local self = _class_0 |
||||
all = { } |
||||
skip = { } |
||||
self.find = function(self, name) |
||||
local target = all[name] |
||||
if target then |
||||
return target |
||||
end |
||||
for glob, tgt in pairs(all) do |
||||
if match(name, glob) then |
||||
return tgt |
||||
end |
||||
end |
||||
return nil |
||||
end |
||||
self.list = function(self) |
||||
local _tbl_0 = { } |
||||
for name, target in pairs(all) do |
||||
do |
||||
local _tbl_1 = { } |
||||
local _list_0 = target.deps |
||||
for _index_0 = 1, #_list_0 do |
||||
local dep = _list_0[_index_0] |
||||
_tbl_1[dep] = self:find(dep) |
||||
end |
||||
_tbl_0[target] = _tbl_1 |
||||
end |
||||
end |
||||
return _tbl_0 |
||||
end |
||||
self.build = function(self, name, upper) |
||||
local target = (self:find(name)) or error("No such target: " .. tostring(name)) |
||||
return target:build(name, upper) |
||||
end |
||||
BuildObject = _class_0 |
||||
end |
||||
if setfenv then |
||||
error("Need Lua >=5.2") |
||||
end |
||||
local targets = { } |
||||
local defaulttarget = 'all' |
||||
local buildscope = { |
||||
default = function(target) |
||||
defaulttarget = target.name |
||||
return target |
||||
end, |
||||
public = function(target) |
||||
insert(targets, target.name) |
||||
return target |
||||
end, |
||||
target = function(name, params) |
||||
local tout = flatten(params.out) |
||||
local tin = flatten(params["in"]) |
||||
local tdeps = flatten(params.deps) |
||||
local _list_0 = flatten(params.from) |
||||
for _index_0 = 1, #_list_0 do |
||||
local f = _list_0[_index_0] |
||||
insert(tin, f) |
||||
insert(tdeps, f) |
||||
end |
||||
return BuildObject(name, tout, tin, tdeps, params.fn) |
||||
end, |
||||
Command = Command |
||||
} |
||||
for k, fn in pairs(util) do |
||||
buildscope[k] = fn |
||||
end |
||||
setmetatable(buildscope, { |
||||
__index = function(self, k) |
||||
local global = rawget(_G, k) |
||||
if global then |
||||
return global |
||||
end |
||||
return function(...) |
||||
return Command(k, ...) |
||||
end |
||||
end |
||||
}) |
||||
local file = first({ |
||||
'Build.moon', |
||||
'Buildfile.moon', |
||||
'Build', |
||||
'Buildfile' |
||||
}, exists) |
||||
if not (file) then |
||||
error("No Build.moon or Buildfile found") |
||||
end |
||||
local buildfn = loadwithscope(file, buildscope) |
||||
if not (buildfn) then |
||||
error("Failed to load build function") |
||||
end |
||||
local ok, err = pcall(buildfn) |
||||
if not (ok) then |
||||
if err then |
||||
io.stderr:write(err, '\n') |
||||
else |
||||
io.stderr:write("Unknown error\n") |
||||
end |
||||
os.exit(1) |
||||
end |
||||
if args.list then |
||||
io.write("Available targets:\n") |
||||
io.write("\t" .. tostring(concat(targets, ', ')) .. "\n") |
||||
os.exit(0) |
||||
end |
||||
if args.deps then |
||||
io.write("Targets:\n") |
||||
for target, deps in sortedpairs(BuildObject:list(), function(a, b) |
||||
return a.name < b.name |
||||
end) do |
||||
io.write("\t" .. tostring(target.name) .. " ") |
||||
if #target.ins == 0 then |
||||
if #target.outs == 0 then |
||||
io.write("[no in/out]") |
||||
else |
||||
io.write("[spontaneous generation]") |
||||
end |
||||
else |
||||
if #target.outs == 0 then |
||||
io.write("[consumer]") |
||||
else |
||||
io.write("(" .. tostring(concat(target.ins, ', ')) .. " -> " .. tostring(concat(target.outs, ', ')) .. ")") |
||||
end |
||||
end |
||||
io.write("\n") |
||||
for name, dep in sortedpairs(deps) do |
||||
io.write("\t\t" .. tostring(name) .. " (" .. tostring(dep.name) .. ")\n") |
||||
end |
||||
end |
||||
os.exit(0) |
||||
end |
||||
if #args.targets == 0 then |
||||
BuildObject:build(defaulttarget) |
||||
end |
||||
local _list_0 = args.targets |
||||
for _index_0 = 1, #_list_0 do |
||||
local target = _list_0[_index_0] |
||||
BuildObject:build(target) |
||||
end |
@ -1,155 +0,0 @@ |
||||
local dir, attributes |
||||
do |
||||
local _obj_0 = require('lfs') |
||||
dir, attributes = _obj_0.dir, _obj_0.attributes |
||||
end |
||||
local gmatch, match, gsub, sub |
||||
do |
||||
local _obj_0 = string |
||||
gmatch, match, gsub, sub = _obj_0.gmatch, _obj_0.match, _obj_0.gsub, _obj_0.sub |
||||
end |
||||
local insert, concat |
||||
do |
||||
local _obj_0 = table |
||||
insert, concat = _obj_0.insert, _obj_0.concat |
||||
end |
||||
local ls |
||||
ls = function(d) |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for f in dir(d) do |
||||
if f ~= '.' and f ~= '..' then |
||||
_accum_0[_len_0] = f |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local lswithpath |
||||
lswithpath = function(d) |
||||
if d == '' then |
||||
return ls('.') |
||||
end |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for f in dir(d) do |
||||
if f ~= '.' and f ~= '..' then |
||||
_accum_0[_len_0] = d .. '/' .. f |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local exists |
||||
exists = function(f) |
||||
return (attributes(f)) ~= nil |
||||
end |
||||
local isdir |
||||
isdir = function(f) |
||||
local a = attributes(f) |
||||
return a and a.mode == 'directory' or false |
||||
end |
||||
local mtime |
||||
mtime = function(f) |
||||
local a = attributes(f) |
||||
return a and a.modification |
||||
end |
||||
local matchglob |
||||
matchglob = function(str, glob) |
||||
local patt = '^' .. (gsub((gsub(glob, '%*%*', '.*')), '%*', '[^/]*')) .. '$' |
||||
local rst |
||||
if (type(str)) == 'table' then |
||||
local results, i = { }, 1 |
||||
for _index_0 = 1, #str do |
||||
local s = str[_index_0] |
||||
rst = (match(s, patt)) and s |
||||
if rst then |
||||
results[i], i = rst, i + 1 |
||||
end |
||||
end |
||||
rst = results |
||||
else |
||||
rst = (match(str, patt)) and str |
||||
end |
||||
return rst |
||||
end |
||||
local wildcard |
||||
wildcard = function(glob) |
||||
local parts |
||||
do |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for part in gmatch(glob, '[^/]+') do |
||||
_accum_0[_len_0] = part |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
parts = _accum_0 |
||||
end |
||||
local absolute = (sub(glob, 1, 1)) == '/' |
||||
for i, part in ipairs(parts) do |
||||
local prevpath = (absolute and '/' or '') .. concat(parts, '/', 1, i - 1) |
||||
local currpath = prevpath .. '/' .. part |
||||
if match(part, '%*%*.*%*%*') then |
||||
error("Two '**' in the same path component in a wildcard") |
||||
end |
||||
if match(part, '%*%*') then |
||||
local prefix = match(currpath, '^(.*)%*%*') |
||||
local suffix = (match(part, '%*%*(.*)$')) .. (i == #parts and '' or ('/' .. concat(parts, '/', i + 1, #parts))) |
||||
local files = lswithpath(prevpath) |
||||
local results = { } |
||||
for _index_0 = 1, #files do |
||||
local file = files[_index_0] |
||||
if matchglob(file, currpath) then |
||||
if i == #parts then |
||||
insert(results, file) |
||||
elseif isdir(file) then |
||||
local _list_0 = wildcard(file .. '/' .. concat(parts, '/', i + 1, #parts)) |
||||
for _index_1 = 1, #_list_0 do |
||||
local result = _list_0[_index_1] |
||||
insert(results, result) |
||||
end |
||||
end |
||||
end |
||||
if (matchglob(file, prefix .. '**')) and isdir(file) then |
||||
local _list_0 = wildcard(file .. '/**' .. suffix) |
||||
for _index_1 = 1, #_list_0 do |
||||
local result = _list_0[_index_1] |
||||
insert(results, result) |
||||
end |
||||
end |
||||
end |
||||
return results |
||||
end |
||||
if match(part, '%*') then |
||||
local files = lswithpath(prevpath) |
||||
if i == #parts then |
||||
return matchglob(files, glob) |
||||
end |
||||
local results = { } |
||||
for _index_0 = 1, #files do |
||||
local file = files[_index_0] |
||||
if (matchglob(file, currpath)) and isdir(file) then |
||||
local _list_0 = wildcard(file .. '/' .. concat(parts, '/', i + 1, #parts)) |
||||
for _index_1 = 1, #_list_0 do |
||||
local result = _list_0[_index_1] |
||||
insert(results, result) |
||||
end |
||||
end |
||||
end |
||||
return results |
||||
end |
||||
end |
||||
if exists(glob) then |
||||
return { |
||||
glob |
||||
} |
||||
else |
||||
return { } |
||||
end |
||||
end |
||||
return { |
||||
wildcard = wildcard, |
||||
exists = exists, |
||||
isdir = isdir, |
||||
mtime = mtime |
||||
} |
@ -1,52 +0,0 @@ |
||||
local match, gmatch, sub |
||||
do |
||||
local _obj_0 = string |
||||
match, gmatch, sub = _obj_0.match, _obj_0.gmatch, _obj_0.sub |
||||
end |
||||
local upper, lower |
||||
do |
||||
local _obj_0 = string |
||||
upper, lower = _obj_0.upper, _obj_0.lower |
||||
end |
||||
local GLOB_PATT = '^([^%%]*)%%([^%%]*)$' |
||||
local patsubst |
||||
patsubst = function(str, pattern, replacement) |
||||
if (type(str)) == 'table' then |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for _index_0 = 1, #str do |
||||
local s = str[_index_0] |
||||
_accum_0[_len_0] = patsubst(s, pattern, replacement) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local prefix, suffix = match(pattern, GLOB_PATT) |
||||
if not (prefix) then |
||||
return str |
||||
end |
||||
local reprefix, resuffix = match(replacement, GLOB_PATT) |
||||
if not (reprefix) then |
||||
return replacement |
||||
end |
||||
if (sub(str, 1, #prefix)) == prefix and (sub(str, -#suffix)) == suffix then |
||||
return reprefix .. (sub(str, #prefix + 1, -#suffix - 1)) .. resuffix |
||||
end |
||||
return str |
||||
end |
||||
local splitsp |
||||
splitsp = function(str) |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for elem in gmatch(str, '%S+') do |
||||
_accum_0[_len_0] = elem |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
return _accum_0 |
||||
end |
||||
return { |
||||
patsubst = patsubst, |
||||
splitsp = splitsp, |
||||
upper = upper, |
||||
lower = lower |
||||
} |
@ -1,132 +0,0 @@ |
||||
local insert, remove, concat, sort |
||||
do |
||||
local _obj_0 = table |
||||
insert, remove, concat, sort = _obj_0.insert, _obj_0.remove, _obj_0.concat, _obj_0.sort |
||||
end |
||||
local unpack = unpack or table.unpack |
||||
local sortedpairs |
||||
sortedpairs = function(table, cmp) |
||||
local keys |
||||
do |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for k in pairs(table) do |
||||
_accum_0[_len_0] = k |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
keys = _accum_0 |
||||
end |
||||
sort(keys, cmp) |
||||
return coroutine.wrap(function() |
||||
for _index_0 = 1, #keys do |
||||
local key = keys[_index_0] |
||||
coroutine.yield(key, table[key]) |
||||
end |
||||
end) |
||||
end |
||||
local min |
||||
min = function(table, cmp) |
||||
if cmp == nil then |
||||
cmp = function(a, b) |
||||
return a < b |
||||
end |
||||
end |
||||
local val = table[1] |
||||
for i = 2, #table do |
||||
local elem = table[i] |
||||
if cmp(val, elem) then |
||||
val = elem |
||||
end |
||||
end |
||||
return val |
||||
end |
||||
local max |
||||
max = function(table, cmp) |
||||
if cmp == nil then |
||||
cmp = function(a, b) |
||||
return a < b |
||||
end |
||||
end |
||||
local val = table[1] |
||||
for i = 2, #table do |
||||
local elem = table[i] |
||||
if not cmp(val, elem) then |
||||
val = elem |
||||
end |
||||
end |
||||
return val |
||||
end |
||||
local foreach |
||||
foreach = function(tab, fn) |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for _index_0 = 1, #tab do |
||||
local e = tab[_index_0] |
||||
_accum_0[_len_0] = fn(e) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local first |
||||
first = function(tab, fn) |
||||
for _index_0 = 1, #tab do |
||||
local e = tab[_index_0] |
||||
if fn(e) then |
||||
return e |
||||
end |
||||
end |
||||
end |
||||
local exclude |
||||
exclude = function(tab, ...) |
||||
local i = 1 |
||||
while i <= #tab do |
||||
local removed = false |
||||
for j = 1, select('#', ...) do |
||||
if tab[i] == select(j, ...) then |
||||
remove(tab, i) |
||||
removed = true |
||||
break |
||||
end |
||||
end |
||||
if not (removed) then |
||||
i = i + 1 |
||||
end |
||||
end |
||||
return tab |
||||
end |
||||
local flatten |
||||
flatten = function(tab) |
||||
if (type(tab)) ~= 'table' then |
||||
return { |
||||
tab |
||||
} |
||||
end |
||||
local out = { } |
||||
for _index_0 = 1, #tab do |
||||
local e = tab[_index_0] |
||||
if (type(e)) == 'table' then |
||||
local _list_0 = flatten(e) |
||||
for _index_1 = 1, #_list_0 do |
||||
local v = _list_0[_index_1] |
||||
insert(out, v) |
||||
end |
||||
else |
||||
insert(out, e) |
||||
end |
||||
end |
||||
return out |
||||
end |
||||
return { |
||||
min = min, |
||||
max = max, |
||||
foreach = foreach, |
||||
first = first, |
||||
exclude = exclude, |
||||
flatten = flatten, |
||||
sortedpairs = sortedpairs, |
||||
insert = insert, |
||||
remove = remove, |
||||
concat = concat, |
||||
sort = sort, |
||||
unpack = unpack |
||||
} |
@ -1,189 +0,0 @@ |
||||
local wildcard, exists, isdir, mtime |
||||
do |
||||
local _obj_0 = require('moonbuild.fsutil') |
||||
wildcard, exists, isdir, mtime = _obj_0.wildcard, _obj_0.exists, _obj_0.isdir, _obj_0.mtime |
||||
end |
||||
local foreach, first, flatten, exclude, sortedpairs, min, max |
||||
do |
||||
local _obj_0 = require('moonbuild.tableutil') |
||||
foreach, first, flatten, exclude, sortedpairs, min, max = _obj_0.foreach, _obj_0.first, _obj_0.flatten, _obj_0.exclude, _obj_0.sortedpairs, _obj_0.min, _obj_0.max |
||||
end |
||||
local patsubst, splitsp |
||||
do |
||||
local _obj_0 = require('moonbuild.stringutil') |
||||
patsubst, splitsp = _obj_0.patsubst, _obj_0.splitsp |
||||
end |
||||
local insert, concat, sort, pairs |
||||
do |
||||
local _obj_0 = require('moonbuild.tableutil') |
||||
insert, concat, sort, pairs = _obj_0.insert, _obj_0.concat, _obj_0.sort, _obj_0.pairs |
||||
end |
||||
local upper, lower |
||||
do |
||||
local _obj_0 = require('moonbuild.stringutil') |
||||
upper, lower = _obj_0.upper, _obj_0.lower |
||||
end |
||||
local GLOB_PATT = '^([^%%]*)%%([^%%]*)$' |
||||
local escapecmdpart |
||||
escapecmdpart = function(p) |
||||
if (type(p)) == 'table' then |
||||
if p.raw then |
||||
return p.raw |
||||
end |
||||
return concat((function() |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for _index_0 = 1, #p do |
||||
local part = p[_index_0] |
||||
_accum_0[_len_0] = escapecmdpart(part) |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
return _accum_0 |
||||
end)(), ' ') |
||||
end |
||||
if p:match('^[a-zA-Z0-9_./-]+$') then |
||||
return p |
||||
end |
||||
return '"' .. p:gsub('\\', '\\\\'):gsub('"', '\\"') .. '"' |
||||
end |
||||
local escapecmd |
||||
escapecmd = function(c, args) |
||||
if args == nil then |
||||
args = { } |
||||
end |
||||
c = escapecmdpart(c) |
||||
local _list_0 = flatten(args) |
||||
for _index_0 = 1, #_list_0 do |
||||
local a = _list_0[_index_0] |
||||
if a then |
||||
c = c .. (' ' .. escapecmdpart(a)) |
||||
end |
||||
end |
||||
return c |
||||
end |
||||
local run |
||||
run = function(c, args, params) |
||||
if params == nil then |
||||
params = { } |
||||
end |
||||
local escaped = escapecmd(c, args) |
||||
if params.print then |
||||
print(escaped) |
||||
end |
||||
local ret, _, code = os.execute(escaped) |
||||
if (type(ret)) == 'number' then |
||||
ret, code = ret == 0, ret |
||||
end |
||||
if params.error and not ret then |
||||
error(tostring(c) .. " failed with code " .. tostring(code)) |
||||
end |
||||
return ret, code |
||||
end |
||||
local popen |
||||
popen = function(c, args, mode, params) |
||||
if mode == nil then |
||||
mode = 'r' |
||||
end |
||||
if params == nil then |
||||
params = { } |
||||
end |
||||
local escaped = escapecmd(c, args) |
||||
if params.print then |
||||
print(escaped) |
||||
end |
||||
return io.popen(escaped, mode) |
||||
end |
||||
local calccdeps |
||||
calccdeps = function(infile, includesys) |
||||
if includesys == nil then |
||||
includesys = false |
||||
end |
||||
local data = (popen('cc', { |
||||
includesys and '-M' or '-MM', |
||||
infile |
||||
})):read('*a') |
||||
local rawdeps = data:gsub('\\\n', ''):match(':(.+)') |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for dep in rawdeps:gmatch('%S+') do |
||||
if dep ~= infile then |
||||
_accum_0[_len_0] = dep |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local findclib |
||||
findclib = function(name, mode) |
||||
if mode == nil then |
||||
mode = 'all' |
||||
end |
||||
local args = { |
||||
name |
||||
} |
||||
if mode == 'all' or mode == 'cc' then |
||||
insert(args, '--cflags') |
||||
end |
||||
if mode == 'all' or mode == 'ld' then |
||||
insert(args, '--libs') |
||||
end |
||||
local _accum_0 = { } |
||||
local _len_0 = 1 |
||||
for arg in (popen('pkg-config', args)):read('*a'):gmatch('%S+') do |
||||
_accum_0[_len_0] = arg |
||||
_len_0 = _len_0 + 1 |
||||
end |
||||
return _accum_0 |
||||
end |
||||
local match |
||||
match = function(str, glob) |
||||
local prefix, suffix = glob:match(GLOB_PATT) |
||||
if not (prefix) then |
||||
return str == glob |
||||
end |
||||
if (str:sub(1, #prefix)) == prefix and (str:sub(-#suffix)) == suffix then |
||||
return str:sub(#prefix + 1, -#suffix - 1) |
||||
end |
||||
return false |
||||
end |
||||
local isglob |
||||
isglob = function(glob) |
||||
if glob:match(GLOB_PATT) then |
||||
return true |
||||
else |
||||
return false |
||||
end |
||||
end |
||||
local env |
||||
env = function(key, def) |
||||
return (os.getenv(key)) or def |
||||
end |
||||
return { |
||||
min = min, |
||||
max = max, |
||||
foreach = foreach, |
||||
first = first, |
||||
exclude = exclude, |
||||
flatten = flatten, |
||||
sortedpairs = sortedpairs, |
||||
insert = insert, |
||||
remove = remove, |
||||
concat = concat, |
||||
sort = sort, |
||||
unpack = unpack, |
||||
wildcard = wildcard, |
||||
mtime = mtime, |
||||
exists = exists, |
||||
isdir = isdir, |
||||
run = run, |
||||
popen = popen, |
||||
calccdeps = calccdeps, |
||||
findclib = findclib, |
||||
patsubst = patsubst, |
||||
splitsp = splitsp, |
||||
upper = upper, |
||||
lower = lower, |
||||
match = match, |
||||
isglob = isglob, |
||||
env = env |
||||
} |
Loading…
Reference in new issue