shithub: mc

ref: 35de3ed9972eb79e61a2516627f3797ad35317d1
dir: /clean.myr/

View raw version
use std

use "config.use"
use "deps.use"
use "opts.use"
use "parse.use"
use "subdir.use"
use "types.use"

pkg bld =
	const cleanall	: (p : parser# -> bool)
	const clean	: (p : parser#, targ : byte[:] -> bool)
;;

const cleanall = {p
	for t in p.targs
		match t
		| `Bin bt:
			cleanup(bt.name, bt.inputs, true)
		| `Lib lt:
			cleanup(lt.name, lt.inputs, true)
		| `Sub subs:
			subdirs(p, subs, `std.None)
		| `Man m:
		;;
	;;
	-> true
}

const clean = {p, targ
	for t in p.targs
		match t
		| `Bin bt:
			if std.sleq(bt.name, targ)
				cleanup(bt.name, bt.inputs, true)
			;;
		| `Lib lt:
			if std.sleq(lt.name, targ)
				cleanup(lt.name, lt.inputs, true)
			;;
		| `Sub subs:
			subdirs(p, subs, `std.Some targ)
		| `Man m:
		;;
	;;
	-> true
}

const cleanup = {out, leaves, islib
	var mchammer_files /* cant touch this */
	var keys
	var dg

	if !myrdeps(&dg, out, leaves, islib)
		std.fatal(1, "Could not load dependencies for %s\n", out)
	;;
	mchammer_files = std.mkht(std.strhash, std.streq)
	for l in leaves
		std.htput(mchammer_files, l, true)
	;;

	keys = std.htkeys(dg.deps)
	for k in keys
		if !std.htgetv(mchammer_files, k, false) && std.remove(k)
			std.put("\tclean %s\n", k)
		;;
	;;
}