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