shithub: mc

ref: 6a59af339f9aa012ce018621564d6c3c5c4bdc74
dir: /mbld/install.myr/

View raw version
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)
}