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