ref: d5ade40b51092a405c0ee44b63a461409de20371
dir: /mbld/install.myr/
use std use "config" use "deps" use "opts" use "parse" use "types" use "util" use "build" pkg bld = const install : (p : build# -> bool) const uninstall : (p : build# -> bool) ;; const install = {b buildall(b) -> movetargs(b, false) } const uninstall = {b -> movetargs(b, true) } const movetargs = {b, rm var libarchive, libuse var pfx for tn in b.all match gettarg(b.targs, tn) | `Bin bt: if bt.install && !bt.istest movefile(b, rm, bt.dir, bt.name, config.Binpath, 0o755) ;; | `Lib lt: if lt.install && !lt.istest libuse = std.fmt("lib{}.use", lt.name) movefile(b, rm, lt.dir, libuse, config.Libpath, 0o644) libarchive = std.fmt("lib{}.a", lt.name) movefile(b, rm, lt.dir, libarchive, config.Libpath, 0o644) std.slfree(libarchive) std.slfree(libuse) ;; | `Data dt: for blob in dt.blobs if dt.path.len == 0 pfx = std.pathcat(config.Sharepath, dt.name) movefile(b, rm, dt.dir, blob, pfx, 0o644) std.slfree(pfx) else movefile(b, rm, dt.dir, blob, dt.path, 0o644) ;; ;; | `Gen gt: /* nothing to do */ | `Cmd ct: /* nothing to do */ | `Man mt: /* FIXME: figure out man section by number */ for m in mt.pages moveman(b, rm, mt.dir, m) ;; ;; ;; -> true } const movefile = {b, rm, dir, file, prefix, perm var path setdir(b, dir) makepath(prefix) path = std.pathjoin([opt_destdir, opt_instbase, prefix, file][:]) if rm mbldput("\trm {}\n", path) if !std.remove(path) mbldput("\t\tno such file {}\n", file) ;; else std.remove(path) match std.slurp(file) | `std.Err m: std.fatal("could not open {} for reading\n", file) | `std.Ok buf: if std.blat(path, buf, perm) mbldput("\t{} => {}\n", file, path) else mbldput("could not write {}\n", file) ;; ;; ;; std.slfree(path) } const moveman = {b, rm, dir, man var sect, manrel match std.strrfind(man, ".") | `std.None: std.fatal("manpage {} has no section\n", man) | `std.Some s: sect = s + 1 if s + 1 == man.len std.fatal("manpage {} missing suffix\n", man) ;; ;; manrel = std.fmt("{}{}", config.Manpath, man[sect:]) makepath(manrel) movefile(b, rm, dir, man, manrel, 0o644) std.slfree(manrel) } const makepath = {prefix var p p = std.pathjoin([opt_destdir, opt_instbase, prefix][:]) std.mkpath(p) std.slfree(p) }