summaryrefslogtreecommitdiff
path: root/mbld/mbld.myr
diff options
context:
space:
mode:
Diffstat (limited to 'mbld/mbld.myr')
-rw-r--r--mbld/mbld.myr160
1 files changed, 160 insertions, 0 deletions
diff --git a/mbld/mbld.myr b/mbld/mbld.myr
new file mode 100644
index 0000000..c2724d1
--- /dev/null
+++ b/mbld/mbld.myr
@@ -0,0 +1,160 @@
+use std
+use regex
+use thread
+use bld
+
+use "config"
+
+const main = {args : byte[:][:]
+ var b : bld.build#
+ var targname
+ var runsrc
+ var path
+ var tmp
+ var cmd
+ var tags
+ var pid
+ var ok, r
+
+ cmd = std.optparse(args, &[
+ .argdesc = "[inputs...]",
+ .opts = [
+ [.opt='j', .arg="jobs", .desc="build with at most 'jobs' jobs"],
+ [.opt='t', .arg="tag", .desc="build with specified systag"],
+ [.opt='T', .arg="tag", .desc="build with only the specified systag"],
+ [.opt='S', .desc="generate assembly when building"],
+ [.opt='I', .arg="inc", .desc="add 'inc' to your include path"],
+ [.opt='R', .arg="runsrc", .desc="source to compile and run"],
+ [.opt='B', .arg="base", .desc="install into 'base'"],
+ [.opt='b', .arg="bin", .desc="compile binary 'bin' from inputs"],
+ [.opt='r', .arg="rt", .desc="link against runtime 'rt'"],
+ [.opt='o', .arg="dir", .desc="output directory"],
+ [.opt='p', .arg="proj", .desc="build from project 'proj'"],
+ [.opt='D', .arg="dir", .desc="store deps in 'dir'"],
+ ][:]
+ ])
+
+ tags = [][:]
+ runsrc = ""
+ targname = ""
+ ok = true
+
+ bld.initopts()
+ for opt : cmd.opts
+ match opt
+ | ('S', ""): bld.opt_genasm = true
+ | ('I', arg): std.slpush(&bld.opt_incpaths, arg)
+ | ('B', arg): bld.opt_instbase = arg
+ | ('t', tag): std.slpush(&tags, tag)
+ | ('T', tag): std.slpush(&bld.opt_alltags, tag)
+ | ('j', arg): bld.opt_maxproc = std.getv(std.intparse(arg), 1)
+ | ('R', arg): runsrc = arg
+ | ('o', arg): bld.opt_objdir = arg
+ | ('b', arg): targname = arg
+ | ('r', arg): bld.opt_runtime = arg
+ | ('p', arg): std.chdir(arg)
+ | ('D', dir): bld.opt_depsdir = dir
+ | _: std.die("unreachable\n")
+ ;;
+ ;;
+ path = std.pathcat(bld.opt_instbase, config.Libpath)
+ std.slpush(&bld.opt_incpaths, path)
+
+ for (e, v) : config.Env
+ std.setenv(e, v)
+ ;;
+
+ b = bld.mkbuild(tags, true)
+ if targname.len != 0
+ ok = buildimm(b, targname, cmd.args)
+ elif runsrc.len != 0
+ bld.opt_silent = true
+ tmp = std.mktemppath("runmyr")
+ ok = buildimm(b, tmp, [runsrc][:])
+ if ok
+ pid = runcmd(tmp, cmd.args)
+ match std.wait(pid)
+ | `std.Wsuccess: ok = true
+ | _: ok = false
+ ;;
+ ;;
+ std.remove(tmp)
+ else
+ findproj(b)
+ bld.load(b)
+ bld.deps(b)
+ bld.testdeps(b)
+ bld.resolve(b)
+ /* default: buildall */
+ if cmd.args.len == 0
+ ok = bld.buildtarg(b, "all")
+ else
+ match cmd.args[0]
+ | "clean": r = bld.clean(b)
+ | "install": r = bld.install(b)
+ | "uninstall": r = bld.uninstall(b)
+ | "test": r = bld.test(b, cmd.args[1:])
+ | "bench": r = bld.bench(b, cmd.args[1:])
+ | "list": r = show(b, cmd.args[1:])
+ | _:
+ ok = true
+ for target : cmd.args
+ r = ok && bld.buildtarg(b, target)
+ ;;
+ ;;
+ ;;
+ ;;
+ if !ok
+ std.exit(1)
+ ;;
+}
+
+const buildimm = {b, targ, inputs
+ var mt : bld.myrtarg
+
+ mt = [
+ .name=targ,
+ .inputs=inputs,
+ .runtime=bld.opt_runtime,
+ .incpath=bld.opt_incpaths,
+ .libdeps=[][:]
+ ]
+ bld.opt_objdir = ""
+ std.slpush(&b.all, "__out__")
+ std.htput(b.targs, "__out__", `bld.Bin &mt)
+ bld.deps(b)
+ bld.resolve(b)
+ -> bld.buildtarg(b, "all")
+}
+
+const runcmd = {bin, args
+ var sl
+
+ sl = std.sldup([bin][:])
+ -> bld.run(std.sljoin(&sl, args), "")
+}
+
+const findproj = {b
+ var dir
+
+ dir = std.getcwd()
+ while dir.len > 0 && !std.eq(dir, "/")
+ if std.chdir(dir) && std.fexists("bld.proj")
+ b.basedir = dir
+ break
+ ;;
+ dir = std.dirname(dir)
+ ;;
+ if dir.len > 0 && std.eq(b.basedir, "/")
+ std.fatal("could not find bld.proj\n")
+ ;;
+}
+
+const show = {b, targs
+ var k
+
+ k = std.htkeys(b.targs)
+ std.put("{j=\n}\n", k)
+ std.slfree(k)
+ -> true
+}