ref: a2ff9547b25b4c44d8e9095659bd282a2b4e160e
dir: /mbld/main.myr/
use std use regex use thread use "build" use "config" use "deps" use "install" use "opts" use "parse" use "test" use "types" use "util" use "syssel" const main = {args : byte[:][:] var b : bld.build# var bintarg 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='t', .arg="tag", .desc="build with specified systag"], [.opt='S', .desc="generate assembly when building"], [.opt='d', .desc="dump debugging information for mbld"], [.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 named 'bin' from inputs"], [.opt='l', .arg="lib", .desc="compile lib named 'lib' from inputs"], [.opt='r', .arg="rt", .desc="link against runtime 'rt' instead of default"], ][:] ]) tags = [][:] runsrc = "" targname = "" ok = true bld.initopts() for opt in 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) | ('R', arg): runsrc = arg | ('b', arg): targname = arg bintarg = true | ('l', arg): targname = arg bintarg = false | ('r', arg): if std.sleq(arg, "none") bld.opt_runtime = "" else bld.opt_runtime = arg ;; /* internal undocumented args; used by compiler suite for building with an uninstalled compiler. */ | ('d', arg): bld.opt_debug = true | _: std.die("unreachable\n") ;; ;; path = std.pathcat(bld.opt_instbase, config.Libpath) std.slpush(&bld.opt_incpaths, path) for (e, v) in config.Env std.setenv(e, v) ;; b = mkbuild(tags) if targname.len != 0 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) /*bld.configure()*/ /* default: buildall */ if cmd.args.len == 0 bld.buildtarg(b, "all") else for c in cmd.args match c | "clean": r = bld.clean(b) | "install": r = bld.install(b) | "uninstall": r = bld.uninstall(b) | "test": r = bld.test(b) | target: r = bld.buildtarg(b, target) ;; ok = ok && r ;; ;; ;; 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=[][:] ] 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 mkbuild = {tags var b b = std.zalloc() b.libs = std.mkht(std.strhash, std.streq) b.proc = std.mkht(std.inthash, std.inteq) b.targs = std.mkht(std.strhash, std.streq) b.tags = std.mkht(std.strhash, std.streq) b.deps = std.mk([ .targs = std.mkht(std.strhash, std.streq), .gen = std.mkht(std.strhash, std.streq), .leaves = [][:], .nodes = [][:], ]) bld.addsysattrs(b, tags) -> b } const findproj = {b var dir dir = std.getcwd() while dir.len > 0 && !std.sleq(dir, "/") if std.chdir(dir) && std.fexists("bld.proj") b.basedir = dir break ;; dir = std.dirname(dir) ;; if dir.len > 0 && std.sleq(b.basedir, "/") std.fatal("could not find bld.proj\n") ;; }