mirror of
https://github.com/natnat-mc/moonbuild
synced 2026-05-14 08:01:14 +02:00
added lib, new alfons tasks, simplified executor behavior and added task count, fixed _.exclude not being in the _ lib, updated Build.moon and README.md
This commit is contained in:
@@ -155,6 +155,7 @@ common.includes = includes
|
||||
common.patget = patget
|
||||
common.patset = patset
|
||||
common.patsubst = patsubst
|
||||
common.exclude = exclude
|
||||
common.min = min
|
||||
common.max = max
|
||||
common.minmax = minmax
|
||||
|
||||
+23
-5
@@ -1,8 +1,8 @@
|
||||
import first, filter, foreach, flatten, patsubst from require 'moonbuild._common'
|
||||
import first, filter, foreach, flatten, patsubst, includes from require 'moonbuild._common'
|
||||
import runwithcontext from require 'moonbuild.compat.ctx'
|
||||
globalenv = require 'moonbuild.env.global'
|
||||
import exists, parent, mkdirs, clearentry, disableentry, attributes from require 'moonbuild._fs'
|
||||
import sort from table
|
||||
import sort, insert, remove from table
|
||||
import huge from math
|
||||
|
||||
local DepNode, FileTarget
|
||||
@@ -76,6 +76,20 @@ class DepGraph
|
||||
buildablenodes: =>
|
||||
[v for k, v in pairs @nodes when v\canbuild! and not v.built]
|
||||
|
||||
reset: =>
|
||||
n.built = false for k, n in pairs @nodes
|
||||
|
||||
resetchildren: (names) =>
|
||||
done = {}
|
||||
stack = [v for v in *names]
|
||||
while #stack != 0
|
||||
name = remove stack
|
||||
continue if done[name]
|
||||
done[name] = true
|
||||
node = @nodes[name]
|
||||
node.built = false
|
||||
insert stack, n for n in *(node\children!)
|
||||
|
||||
class DepNode
|
||||
new: (@dag, target, @name) =>
|
||||
@priority = target.priority
|
||||
@@ -117,6 +131,9 @@ class DepNode
|
||||
@deps = flatten { deps, after }
|
||||
@built = true if #@deps == 0 and #@buildfunctions == 0
|
||||
|
||||
children: =>
|
||||
[k for k, n in pairs @dag.nodes when (includes n.ins, @name) or (includes n.after, @name)]
|
||||
|
||||
canbuild: =>
|
||||
for node in *flatten { @ins, @after }
|
||||
if not @dag.nodes[node].built
|
||||
@@ -130,10 +147,11 @@ class DepNode
|
||||
force = opts.force or false
|
||||
quiet = opts.quiet or false
|
||||
|
||||
return if @built
|
||||
return unless force or @shouldbuild!
|
||||
print "#{@type == 'virtual' and "Running" or "Building"} #{@name}" unless quiet or #@buildfunctions == 0
|
||||
return false if @built or #@buildfunctions == 0
|
||||
return false unless force or @shouldbuild!
|
||||
print "#{@type == 'virtual' and "Running" or "Building"} #{@name}" unless quiet
|
||||
@actuallybuild!
|
||||
true
|
||||
|
||||
|
||||
shouldbuild: =>
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
ok, MultiProcessExecutor = pcall -> require 'moonbuild.core.multiprocessexecutor'
|
||||
ok and MultiProcessExecutor or require 'moonbuild.core.singleprocessexecutor'
|
||||
@@ -1,3 +1,4 @@
|
||||
SingleProcessExecutor = require 'moonbuild.core.singleprocessexecutor'
|
||||
import fork, _exit from require 'posix.unistd'
|
||||
import wait from require 'posix.sys.wait'
|
||||
import open, stderr from io
|
||||
@@ -17,8 +18,12 @@ class Executor
|
||||
@processes = {}
|
||||
@nprocesses = 0
|
||||
@building = {}
|
||||
@nbuilt = 0
|
||||
|
||||
execute: (opts) =>
|
||||
if @nparallel == 1
|
||||
return (SingleProcessExecutor @dag, 1)\execute opts
|
||||
|
||||
block = @dag\buildablenodes!
|
||||
while #block != 0
|
||||
for node in *block
|
||||
@@ -36,6 +41,12 @@ class Executor
|
||||
for name, node in pairs @dag.nodes
|
||||
error "Node #{name} wasn't built" unless node.built
|
||||
|
||||
unless opts.quiet
|
||||
if @nbuilt == 0
|
||||
print "Nothing to be done"
|
||||
else
|
||||
print "Built #{@nbuilt} targets"
|
||||
|
||||
addprocess: (node, opts) =>
|
||||
if node.sync
|
||||
while @nprocesses != 0
|
||||
@@ -52,18 +63,20 @@ class Executor
|
||||
@nprocesses += 1
|
||||
@building[node] = true
|
||||
else
|
||||
ok, err = pcall -> node\build opts
|
||||
ok, status = pcall -> node\build opts
|
||||
if ok
|
||||
_exit status and 0 or 2
|
||||
_exit 0
|
||||
else
|
||||
stderr\write err
|
||||
stderr\write status
|
||||
_exit 1
|
||||
|
||||
waitprocess: =>
|
||||
pid, ty, status = wait!
|
||||
error "Failed to wait" unless pid
|
||||
error "Failed to build #{@processes[pid].name}" if ty != 'exited' or status != 0
|
||||
error "Failed to build #{@processes[pid].name}" if ty != 'exited' or status != 0 and status != 2
|
||||
@processes[pid].built = true
|
||||
@processes[pid]\updatecache!
|
||||
@processes[pid] = nil
|
||||
@nprocesses -= 1
|
||||
@nbuilt += 1 if status == 0
|
||||
|
||||
@@ -4,13 +4,21 @@ class Executor
|
||||
new: (@dag, @nparallel) =>
|
||||
|
||||
execute: (opts) =>
|
||||
nbuilt = 0
|
||||
|
||||
block = @dag\buildablenodes!
|
||||
while #block != 0
|
||||
for node in *block
|
||||
node\build opts
|
||||
nbuilt +=1 if node\build opts
|
||||
node\updatecache!
|
||||
node.built = true
|
||||
block = @dag\buildablenodes!
|
||||
|
||||
for name, node in pairs @dag.nodes
|
||||
error "Node #{name} wasn't built" unless node.built
|
||||
|
||||
unless opts.quiet
|
||||
if nbuilt == 0
|
||||
print "Nothing to be done"
|
||||
else
|
||||
print "Built #{nbuilt} targets"
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
import loadfile from require 'moonscript.base'
|
||||
Context = require 'moonbuild.context'
|
||||
DepGraph = require 'moonbuild.core.DAG'
|
||||
Executor = require 'moonbuild.core.executor'
|
||||
_ = require 'moonbuild._'
|
||||
import insert from table
|
||||
|
||||
moonbuild = (...) ->
|
||||
-- build argument table
|
||||
opts = {}
|
||||
for i=1, select '#', ...
|
||||
arg = select i, ...
|
||||
if (type arg) == 'string'
|
||||
insert opts, arg
|
||||
elseif (type arg) == 'table'
|
||||
for k, v in pairs arg
|
||||
opts[k] = v if (type k) != 'number'
|
||||
for i, v in ipairs arg
|
||||
insert opts, v
|
||||
else
|
||||
error "Invalid argument type #{type arg} for moonbuild"
|
||||
|
||||
-- resolve arguments
|
||||
buildfile = opts.buildfile or opts.b or 'Build.moon'
|
||||
opts.buildfile = buildfile
|
||||
parallel = opts.parallel or opts.j or 1
|
||||
parallel = true if parallel == 'y'
|
||||
opts.parallel = parallel
|
||||
quiet = opts.quiet or opts.q or false
|
||||
opts.quiet = quiet
|
||||
force = opts.force or opts.f or false
|
||||
opts.force = force
|
||||
verbose = opts.verbose or opts.v or false
|
||||
opts.verbose = verbose
|
||||
|
||||
-- create context and DAG
|
||||
ctx = Context!
|
||||
ctx\load (loadfile buildfile), opts
|
||||
print "Loaded buildfile" if verbose
|
||||
ctx\init!
|
||||
print "Initialized buildfile" if verbose
|
||||
targets = #opts==0 and ctx.defaulttargets or opts
|
||||
dag = DepGraph ctx, targets
|
||||
print "Created dependancy graph" if verbose
|
||||
|
||||
-- and build
|
||||
nparallel = parallel == true and Executor\getmaxparallel! or parallel
|
||||
print "Building with #{nparallel} max parallel process#{nparallel>1 and "es" or ""}" if verbose
|
||||
executor = Executor dag, nparallel
|
||||
executor\execute opts
|
||||
print "Finished" if verbose
|
||||
|
||||
table = {
|
||||
:moonbuild, :_
|
||||
:Context, :DepGraph, :Executor
|
||||
}
|
||||
|
||||
setmetatable table,
|
||||
__call: (...) => moonbuild ...
|
||||
__index: (name) => require "moonbuild.#{name}"
|
||||
Reference in New Issue
Block a user