mirror of https://github.com/natnat-mc/moonbuild
parent
3ed6844a9f
commit
8cd238731c
@ -1,3 +0,0 @@ |
|||||||
/*.lua |
|
||||||
/*.lua.c |
|
||||||
/moonbuild |
|
@ -0,0 +1,155 @@ |
|||||||
|
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 |
||||||
|
} |
@ -0,0 +1,88 @@ |
|||||||
|
import dir, attributes from require 'lfs' |
||||||
|
|
||||||
|
import gmatch, match, gsub, sub from string |
||||||
|
import insert, concat from table |
||||||
|
|
||||||
|
ls = (d) -> |
||||||
|
[f for f in dir d when f!='.' and f!='..'] |
||||||
|
|
||||||
|
lswithpath = (d) -> |
||||||
|
if d=='' |
||||||
|
return ls '.' |
||||||
|
[d..'/'..f for f in dir d when f!='.' and f!='..'] |
||||||
|
|
||||||
|
exists = (f) -> |
||||||
|
(attributes f) != nil |
||||||
|
|
||||||
|
isdir = (f) -> |
||||||
|
a = attributes f |
||||||
|
a and a.mode == 'directory' or false |
||||||
|
|
||||||
|
mtime = (f) -> |
||||||
|
a = attributes f |
||||||
|
a and a.modification |
||||||
|
|
||||||
|
matchglob = (str, glob) -> |
||||||
|
patt = '^'..(gsub (gsub glob, '%*%*', '.*'), '%*', '[^/]*')..'$' |
||||||
|
rst = if (type str)=='table' |
||||||
|
results, i = {}, 1 |
||||||
|
for s in *str |
||||||
|
rst = (match s, patt) and s |
||||||
|
results[i], i = rst, i+1 if rst |
||||||
|
results |
||||||
|
else |
||||||
|
(match str, patt) and str |
||||||
|
rst |
||||||
|
|
||||||
|
wildcard = (glob) -> |
||||||
|
parts = [part for part in gmatch glob, '[^/]+'] |
||||||
|
absolute = (sub glob, 1, 1)=='/' |
||||||
|
|
||||||
|
for i, part in ipairs parts |
||||||
|
prevpath = (absolute and '/' or '') .. concat parts, '/', 1, i-1 |
||||||
|
currpath = prevpath .. '/' .. part |
||||||
|
|
||||||
|
if match part, '%*%*.*%*%*' |
||||||
|
error "Two '**' in the same path component in a wildcard" |
||||||
|
|
||||||
|
if match part, '%*%*' |
||||||
|
prefix = match currpath, '^(.*)%*%*' |
||||||
|
suffix = (match part, '%*%*(.*)$') .. (i==#parts and '' or ('/'..concat parts, '/', i+1, #parts)) |
||||||
|
files = lswithpath prevpath |
||||||
|
|
||||||
|
results = {} |
||||||
|
for file in *files |
||||||
|
if matchglob file, currpath |
||||||
|
if i==#parts |
||||||
|
insert results, file |
||||||
|
elseif isdir file |
||||||
|
for result in *wildcard file .. '/' .. concat parts, '/', i+1, #parts |
||||||
|
insert results, result |
||||||
|
if (matchglob file, prefix..'**') and isdir file |
||||||
|
for result in *wildcard file .. '/**' .. suffix |
||||||
|
insert results, result |
||||||
|
return results |
||||||
|
|
||||||
|
if match part, '%*' |
||||||
|
files = lswithpath prevpath |
||||||
|
|
||||||
|
if i==#parts |
||||||
|
return matchglob files, glob |
||||||
|
|
||||||
|
results = {} |
||||||
|
for file in *files |
||||||
|
if (matchglob file, currpath) and isdir file |
||||||
|
for result in *wildcard file .. '/' .. concat parts, '/', i+1, #parts |
||||||
|
insert results, result |
||||||
|
return results |
||||||
|
|
||||||
|
if exists glob |
||||||
|
return {glob} |
||||||
|
else |
||||||
|
return {} |
||||||
|
|
||||||
|
{ |
||||||
|
:wildcard |
||||||
|
:exists, :isdir |
||||||
|
:mtime |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
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 |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
import match, gmatch, sub from string |
||||||
|
import upper, lower from string |
||||||
|
|
||||||
|
GLOB_PATT='^([^%%]*)%%([^%%]*)$' |
||||||
|
|
||||||
|
patsubst = (str, pattern, replacement) -> |
||||||
|
return [patsubst s, pattern, replacement for s in *str] if (type str)=='table' |
||||||
|
prefix, suffix = match pattern, GLOB_PATT |
||||||
|
return str unless prefix |
||||||
|
reprefix, resuffix = match replacement, GLOB_PATT |
||||||
|
return replacement unless reprefix |
||||||
|
|
||||||
|
if (sub str, 1, #prefix)==prefix and (sub str, -#suffix)==suffix |
||||||
|
return reprefix..(sub str, #prefix+1, -#suffix-1)..resuffix |
||||||
|
str |
||||||
|
|
||||||
|
splitsp = (str) -> |
||||||
|
[elem for elem in gmatch str, '%S+'] |
||||||
|
|
||||||
|
{ |
||||||
|
:patsubst |
||||||
|
:splitsp |
||||||
|
|
||||||
|
:upper, :lower |
||||||
|
} |
@ -0,0 +1,132 @@ |
|||||||
|
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 |
||||||
|
} |
@ -0,0 +1,66 @@ |
|||||||
|
import insert, remove, concat, sort from table |
||||||
|
unpack or= table.unpack |
||||||
|
|
||||||
|
sortedpairs = (table, cmp) -> |
||||||
|
keys = [k for k in pairs table] |
||||||
|
sort keys, cmp |
||||||
|
coroutine.wrap -> |
||||||
|
for key in *keys |
||||||
|
coroutine.yield key, table[key] |
||||||
|
|
||||||
|
min = (table, cmp=(a, b) -> a<b) -> |
||||||
|
val = table[1] |
||||||
|
for i=2, #table |
||||||
|
elem = table[i] |
||||||
|
if cmp val, elem |
||||||
|
val = elem |
||||||
|
val |
||||||
|
|
||||||
|
max = (table, cmp=(a, b) -> a<b) -> |
||||||
|
val = table[1] |
||||||
|
for i=2, #table |
||||||
|
elem = table[i] |
||||||
|
if not cmp val, elem |
||||||
|
val = elem |
||||||
|
val |
||||||
|
|
||||||
|
foreach = (tab, fn) -> |
||||||
|
[fn e for e in *tab] |
||||||
|
|
||||||
|
first = (tab, fn) -> |
||||||
|
for e in *tab |
||||||
|
return e if fn e |
||||||
|
|
||||||
|
exclude = (tab, ...) -> |
||||||
|
i=1 |
||||||
|
while i<=#tab |
||||||
|
removed=false |
||||||
|
for j=1, select '#', ... |
||||||
|
if tab[i]==select j, ... |
||||||
|
remove tab, i |
||||||
|
removed = true |
||||||
|
break |
||||||
|
i += 1 unless removed |
||||||
|
tab |
||||||
|
|
||||||
|
flatten = (tab) -> |
||||||
|
return {tab} if (type tab)!='table' |
||||||
|
out = {} |
||||||
|
for e in *tab |
||||||
|
if (type e)=='table' |
||||||
|
insert out, v for v in *flatten e |
||||||
|
else |
||||||
|
insert out, e |
||||||
|
out |
||||||
|
|
||||||
|
{ |
||||||
|
:min, :max |
||||||
|
:foreach |
||||||
|
:first |
||||||
|
:exclude |
||||||
|
:flatten |
||||||
|
:sortedpairs |
||||||
|
|
||||||
|
:insert, :remove, :concat, :sort |
||||||
|
:unpack |
||||||
|
} |
@ -0,0 +1,189 @@ |
|||||||
|
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 |
||||||
|
} |
@ -0,0 +1,95 @@ |
|||||||
|
import wildcard, exists, isdir, mtime from require 'moonbuild.fsutil' |
||||||
|
import foreach, first, flatten, exclude, sortedpairs, min, max from require 'moonbuild.tableutil' |
||||||
|
import patsubst, splitsp from require 'moonbuild.stringutil' |
||||||
|
|
||||||
|
import insert, concat, sort, pairs from require 'moonbuild.tableutil' |
||||||
|
import upper, lower from require 'moonbuild.stringutil' |
||||||
|
|
||||||
|
GLOB_PATT='^([^%%]*)%%([^%%]*)$' |
||||||
|
|
||||||
|
-- command functions |
||||||
|
escapecmdpart= (p) -> |
||||||
|
if (type p)=='table' |
||||||
|
return p.raw if p.raw |
||||||
|
return concat [escapecmdpart part for part in *p], ' ' |
||||||
|
return p if p\match '^[a-zA-Z0-9_./-]+$' |
||||||
|
'"'..p\gsub('\\', '\\\\')\gsub('"', '\\"')..'"' |
||||||
|
escapecmd= (c, args={}) -> |
||||||
|
c=escapecmdpart c |
||||||
|
for a in *flatten args |
||||||
|
c..=' '..escapecmdpart a if a |
||||||
|
c |
||||||
|
run= (c, args, params={}) -> |
||||||
|
escaped=escapecmd c, args |
||||||
|
print escaped if params.print |
||||||
|
ret, _, code=os.execute escaped |
||||||
|
ret, code=ret==0, ret if (type ret)=='number' |
||||||
|
error "#{c} failed with code #{code}" if params.error and not ret |
||||||
|
ret, code |
||||||
|
popen= (c, args, mode='r', params={}) -> |
||||||
|
escaped=escapecmd c, args |
||||||
|
print escaped if params.print |
||||||
|
io.popen escaped, mode |
||||||
|
|
||||||
|
calccdeps= (infile, includesys=false) -> |
||||||
|
data=(popen 'cc', {includesys and '-M' or '-MM', infile})\read '*a' |
||||||
|
rawdeps=data\gsub('\\\n', '')\match ':(.+)' |
||||||
|
[dep for dep in rawdeps\gmatch '%S+' when dep!=infile] |
||||||
|
|
||||||
|
findclib= (name, mode='all') -> |
||||||
|
args={name} |
||||||
|
insert args, '--cflags' if mode=='all' or mode=='cc' |
||||||
|
insert args, '--libs' if mode=='all' or mode=='ld' |
||||||
|
[arg for arg in (popen 'pkg-config', args)\read('*a')\gmatch '%S+'] |
||||||
|
|
||||||
|
-- glob match |
||||||
|
match= (str, glob) -> |
||||||
|
prefix, suffix=glob\match GLOB_PATT |
||||||
|
return str==glob unless prefix |
||||||
|
return str\sub #prefix+1, -#suffix-1 if (str\sub 1, #prefix)==prefix and (str\sub -#suffix)==suffix |
||||||
|
false |
||||||
|
|
||||||
|
-- is a valid glob |
||||||
|
isglob= (glob) -> |
||||||
|
return if glob\match GLOB_PATT |
||||||
|
true |
||||||
|
else |
||||||
|
false |
||||||
|
|
||||||
|
-- getenv |
||||||
|
env= (key, def) -> |
||||||
|
(os.getenv key) or def |
||||||
|
|
||||||
|
{ |
||||||
|
-- table function |
||||||
|
:min, :max |
||||||
|
:foreach |
||||||
|
:first |
||||||
|
:exclude |
||||||
|
:flatten |
||||||
|
:sortedpairs |
||||||
|
|
||||||
|
:insert, :remove, :concat, :sort |
||||||
|
:unpack |
||||||
|
|
||||||
|
-- file functions |
||||||
|
:wildcard |
||||||
|
:mtime |
||||||
|
:exists, :isdir |
||||||
|
|
||||||
|
-- command functions |
||||||
|
:run, :popen |
||||||
|
:calccdeps, :findclib |
||||||
|
|
||||||
|
-- string functions |
||||||
|
:patsubst |
||||||
|
:splitsp |
||||||
|
|
||||||
|
:upper, :lower |
||||||
|
|
||||||
|
-- glob functions |
||||||
|
:match, :isglob |
||||||
|
|
||||||
|
-- env functions |
||||||
|
:env |
||||||
|
} |
Loading…
Reference in new issue