#!/usr/local/bin/icmake -qi

#define BINDIR	    "/usr/local/bin"

#define VER	    "1.00"

void compdir (string dir)
{
    string
	orgdir;
    list
	ofiles,
	ccfiles,
	subdirs;
    string
	lib,
	header,
	ofile,
	ccfile;
    int
	i;

    printf ("==== Compiling directory: ", dir, " ====\n");

    orgdir = chdir (".");
    chdir (dir);

    if (dir == ".")
    {
	exec ("rm", "-f", "version.h");
	fprintf ("version.h",
		 "#define VER \"", VER, "\"\n");
	lib = "libkiss.a";
	header = "kiss.h";
    }
    else
    {
	lib = "lib" + dir + ".a";
	header = dir + ".h";
    }

    ccfiles = makelist ("*.cc", younger, lib);
    for (i = 0; i < sizeof (ccfiles); i++)
    {
	ccfile = element (i, ccfiles);
	ofile = change_ext (ccfile, ".o");

	if (ccfile younger ofile || ofile older lib)
	    exec ("gcc", "-c -g -Wall", ccfile);
    }

    if (ofiles = makelist ("*.o"))
    {
	exec ("ar", "rvs", lib, ofiles);
	exec ("rm", "-f", ofiles);
    }

    if (subdirs = makelist (O_SUBDIR, "*"))
	for (i = 0; i < sizeof (subdirs); i++)
	    compdir (element (i, subdirs));

    chdir (orgdir);
}

void libs ()
{
    compdir (".");
}

void prog ()
{
    libs ();
    exec ("gcc",
    	"-g",
    	"-o kiss",
	"-L. -Lstorage -Lstorable -Lmessage -Lprogram -Linput -Lcmdtab -Lcmd "
	  "-Lcmd/more -Lcmd/any -Lcmd/prompt",
	"-lkiss -lstorage -lstorable -lmessage -lprogram "
	  " -linput -lcmdtab -lcmd "
	  "-lmore -lany -lprompt -lprogram -lmessage");
}

clean ()
{
    exec ("find",
	    "-name \\*.o -o -name lib\\*.a",
	    "-exec rm -f {} \\;");
    exec ("rm", "-f",
    	    "kiss", "build.bim");
}

void zip ()
{
    clean ();
    exec ("zip", "-ur", "kiss.zip", "*");
}

void install ()
{
    prog ();
    exec ("strip", "kiss");
    exec ("cp", "kiss", BINDIR);
}

void targz ()
{
    clean ();
    chdir ("..");
    exec ("tar", "cvzf", "kiss-" VER ".tar.gz", "kiss");
}

void usage ()
{
    printf ("\n"
	    "Build what? Use:\n"
	    "\tbuild libs to build libraries\n"
	    "\tbuild prog to make program\n"
	    "\tbuild clean to remove stale files\n"
	    "\tbuild zip to zip it up\n"
	    "\tbuild install to install program in ", BINDIR, "\n"
	    "\tbuild targz to make .tar.gz file in parent dir\n"
	    "\n");
    exit (1);
}

void main (int argc, list argv)
{
    string
	selector;

    selector = element (1, argv);
    if (selector == "libs")
	libs ();
    else if (selector == "prog")
    	prog ();
    else if (selector == "clean")
    	clean ();
    else if (selector == "zip")
	zip ();
    else if (selector == "install")
	install ();
    else if (selector == "targz")
	targz ();
    else
	usage ();

    exit (0);
}
