hopefully package correctly for luarocks now

alfons-task
Nathan DECHER 4 years ago
parent 3ed6844a9f
commit 8cd238731c
  1. 3
      .gitignore
  2. 155
      moonbuild/fsutil.lua
  3. 88
      moonbuild/fsutil.moon
  4. 52
      moonbuild/stringutil.lua
  5. 25
      moonbuild/stringutil.moon
  6. 132
      moonbuild/tableutil.lua
  7. 66
      moonbuild/tableutil.moon
  8. 189
      moonbuild/util.lua
  9. 95
      moonbuild/util.moon

3
.gitignore vendored

@ -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…
Cancel
Save