added glob targets, closes #3

alfons-task
Nathan DECHER 5 years ago
parent 48186658fd
commit 0113de4546
  1. 8
      Build.moon
  2. 4
      README.md
  3. 72
      moonbuild.moon
  4. 26
      util.moon

@ -8,8 +8,6 @@ OUT_C = patsubst MAIN, '%.moon', '%.lua.c'
PREFIX = env 'PREFIX', '/usr/local'
INSTALL_LOC = "#{PREFIX}/bin"
default public target 'all', deps: BINARY
public target 'install', from: BINARY, out: INSTALL_LOC, fn: =>
-install @infile, @outfile
@ -25,10 +23,8 @@ public target 'info', fn: =>
#echo "Compiled lua:", OUT_LUA
#echo "Binary:", BINARY
target BINARY, out: {BINARY, OUT_C}, from: OUT_LUA, fn: =>
default target BINARY, out: {BINARY, OUT_C}, from: OUT_LUA, fn: =>
-luastatic MAIN_LUA, OUT_LUA, '-I/usr/include/lua5.3', '-llua5.3'
foreach OUT_LUA, (file) ->
source=patsubst file, '%.lua', '%.moon'
target file, in: source, out: file, fn: =>
target '%.lua', in: '%.moon', out: '%.lua', fn: =>
-moonc @infile

@ -30,6 +30,10 @@ Define a new target, and give it a list of depenancies, inputs, outputs and a fu
- `outs`: the table of outputs
- `outfile`: the first output
If `name` is a glob, the target becomes a glob target.
Glob targets can be used with name that matches them (with a limit of one glob target per name, and no ordering is specified).
Glob targets will have their name substituted for their inputs, outputs and dependancies.
### `wildcard <wc>`
Returns a table with all the matching files. Valid wildcards contain either `**`, which can be expanded by any characters, including '/', or `*`, which cannot be expanded by `/`. Wildcards can only contain one `**` or `*`.

@ -8,7 +8,7 @@ import truncate_traceback, rewrite_traceback from require 'moonscript.errors'
import trim from require 'moonscript.util'
util=require 'util'
import exists, mtime, run, min, max, first, flatten from util
import exists, mtime, run, min, max, first, flatten, match, patsubst from util
import insert, concat from table
@ -47,42 +47,76 @@ class Command
-- represents a target
class BuildObject
all={}
skip={}
cycle={}
@find: (name) =>
target=all[name]
return target if target
for glob, tgt in pairs all
return tgt if match name, glob
nil
@build: (name) =>
target=all[name] or error "No such target: #{name}"
target\build!
target=@find name or error "No such target: #{name}"
target\build name
__tostring: =>
"Target #{@name} (#{concat @deps, ', '})"
new: (@name, @outs={}, @ins={}, @deps={}, @fn= =>) =>
@skip=false
error "Duplicate build name #{@name}" if all[@name]
all[@name]=@
build: =>
return if @skip
error "Can't build #{@name}: cyclic dependancy" if @cycle
@cycle=true
for depname in *@deps
dep=all[depname] or error "Can't build #{@name}: missing dependancy #{depname}"
dep\build!
return unless @shouldbuild!
print "Building #{@name}"
build: (name) =>
return if skip[name]
error "Can't build #{name}: cyclic depenancies found" if cycle[name]
cycle[name]=true
if @name!=name
@@build patsubst name, @name, dep for dep in *@deps
else
@@build dep for dep in *@deps
return unless @shouldbuild name
ins=@ins
outs=@outs
if @name!=name
ins=[patsubst name, @name, elem for elem in *@ins]
outs=[patsubst name, @name, elem for elem in *@outs]
print "Building #{@name} as #{name}"
else
print "Building #{name}"
ok, err=pcall ->
@.fn ins: @ins, outs: @outs, infile: @ins[1], outfile: @outs[1], name: @name
@.fn
ins: ins
outs: outs
infile: ins[1]
outfile: outs[1]
name: name
error "Can't build #{@name}: lua error\n#{err}" unless ok
for f in *@outs
for f in *outs
error "Can't build #{@name}: output file #{f} not created" unless exists f
@skip=true
skip[name]=true
shouldbuild: =>
shouldbuild: (name) =>
return true if args.noskip
return true if #@ins==0 or #@outs==0
itimes=[mtime f for f in *@ins]
ins=if @name!=name
[patsubst name, @name, elem for elem in *@ins]
else
@ins
itimes=[mtime f for f in *ins]
for i=1, #@ins
error "Can't build #{@name}: missing inputs" unless itimes[i]
otimes=[mtime f for f in *@outs]
outs=if @name!=name
[patsubst name, @name, elem for elem in *@outs]
else
@outs
otimes=[mtime f for f in *outs]
for i=1, #@outs
return true if not otimes[i]

@ -3,6 +3,8 @@ import attributes, dir from require 'lfs'
import insert, concat from table
unpack or=table.unpack
GLOB_PATT='^([^%%]*)%%([^%%]*)$'
-- min and max of table
max= (t) ->
m=t[1]
@ -109,15 +111,29 @@ wildcard= (pattern) ->
-- string pattern
patsubst= (str, pattern, replacement) ->
return [patsubst s, pattern, replacement for s in *str] if (type str)=='table'
prefix, suffix=pattern\match '^(.*)%%(.*)$'
error "Invalid pattern #{pattern}" unless prefix
reprefix, resuffix=replacement\match '^(.*)%%(.*)$'
error "Invalid replacement pattern #{pattern}" unless reprefix
prefix, suffix=pattern\match GLOB_PATT
return str unless prefix
reprefix, resuffix=replacement\match GLOB_PATT
return replacement unless reprefix
if (str\sub 1, #prefix)==prefix and (str\sub -#suffix)==suffix
return reprefix..(str\sub #prefix+1, -#suffix-1)..resuffix
str
-- 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
env= (key, def) ->
(os.getenv key) or def
@ -138,6 +154,6 @@ env= (key, def) ->
:run, :popen
-- string functions
:patsubst
:patsubst, :match, :isglob
:env
}

Loading…
Cancel
Save