shithub: mc

ref: c819f3a197d66c0f7c7c49aaffdf045bd4a46123
dir: /mbld/clean.myr/

View raw version
use std

use "config"
use "deps"
use "opts"
use "parse"
use "types"
use "util"

pkg bld =
	const cleanall	: (b : build# -> bool)
	const clean	: (b : build#, targ : byte[:] -> bool)
	const cleanmyr	: (b : build#, mt : myrtarg# -> void)
;;

const cleanall = {b
	for tn in b.all
		match gettarg(b.targs, tn)
		| `Bin bt:
			cleanup(b, bt, bt.inputs)
		| `Lib lt:
			cleanup(b, lt, lt.inputs)
		| `Gen gt:
			for f in gt.out
				if !gt.durable && std.remove(f)
					mbldput("\tclean {}\n", f)
				;;
			;;
		| `Data _:	/* nothing to do */
		| `Cmd _:	/* nothing to do */
		| `Man _:	/* nothing to do */
		;;
	;;
	-> true
}

const clean = {b, targ
	for tn in b.all
		match gettarg(b.targs, tn)
		| `Bin bt:
			if std.sleq(bt.name, targ)
				cleanup(b, bt, bt.inputs)
			;;
		| `Lib lt:
			if std.sleq(lt.name, targ)
				cleanup(b, lt, lt.inputs)
			;;
		| `Gen gt:
			for f in gt.out
				if !gt.durable && std.remove(f)
					mbldput("\tclean {}\n", f)
				;;
			;;
		| `Data _:	/* nothing to do */
		| `Cmd _:	/* nothing to do */
		| `Man _:	/* nothing to do */
		;;
	;;
	-> true
}

const cleanmyr = {b, targ
	cleanup(b, targ, targ.inputs)
}

const cleanup = {b, targ, leaves
	var mchammer_files /* cant touch this */
	var keys, dg, test

	/*
	we want to automatically add 'clean' sources since otherwise,
	mbld won't be able to clean code after changing a build file.
	*/
	setdir(b, targ.dir)
	dg = myrdeps(b, targ, true, true)
	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)
			mbldput("\tclean {}\n", k)
		;;
		test = std.pathcat("test", k)
		if std.remove(test)
			mbldput("\tclean {}\n", test)
		;;
		std.slfree(test)
	;;
}