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

// your C-compiler, its flags etc.
#define CC		"gcc"
#define CFLAGS		"-c -Wall"
#define STRIP		"strip"
#define AR		"ar"
#define ARREPLACE	"rvs"

// debug flag: -g if you need to debug the programs, -O for the real work
#define DEBUG		"-O2"

#define CALLBACKDIR	"/conf/callback"
#define BINDIR		"/sbin"

// version of this archive.. don't change, that's my task
#define VER		"1.21"

int compdir (string dir)
{
    int
    	i,
    	ret;
    list
    	ofiles,
    	cfiles;
    string
    	hfile,
    	curdir,
    	cfile,
    	ofile,
    	libfile;

    curdir = chdir (".");
    libfile = "lib" + dir + ".a";   
    hfile = dir + ".h";
    
    chdir (dir);

    if (hfile younger libfile)
    	cfiles = makelist ("*.c");
    else
    	cfiles = makelist ("*.c", younger, libfile);
    
    for (i = 0; i < sizeof (cfiles); i++)
    {
    	cfile = element (i, cfiles);
    	ofile = change_ext (cfile, ".o");
    	
    	if (! exists (ofile) || ofile older cfile)
    	    exec (CC, DEBUG, CFLAGS, cfile);
    }
    
    if (ofiles = makelist ("*.o"))
    {
    	exec (AR, ARREPLACE, libfile, "*.o");
    	exec ("rm", "*.o");
    	ret = 1;
    }
    
    chdir (curdir);
    
    return (ret);
}

void linkprog (string dir)
{
    chdir (dir);
    exec (CC, DEBUG, "-o", dir, "-l" + dir, "-lrss", "-L. -L../rss");
    chdir ("..");
}

void buildprogs ()
{
    int
    	cblogin,
    	cbstat,
	cbgetty,
    	rss;
    	
    chdir ("src");
    
    cblogin = compdir ("cblogin");
    cbstat  = compdir ("cbstat");
    cbgetty = compdir ("cbgetty");
    rss     = compdir ("rss");
    
    if (cblogin || rss)
    	linkprog ("cblogin");
    	
    if (cbstat || rss)
    	linkprog ("cbstat");

    if (cbgetty || rss)
	linkprog ("cbgetty");
    	
    chdir ("..");
}

void instprog (string prog, string destdir)
{
    chdir ("src/" + prog);
    exec (STRIP, prog);
    exec ("chmod", "700", prog);
    exec ("cp", prog, destdir);
    chdir ("../..");
}

void install ()
{
    buildprogs ();
    
    instprog ("cblogin", CALLBACKDIR);
    instprog ("cbstat",  BINDIR);
    instprog ("cbgetty", CALLBACKDIR);
}

void cleandir (string dir)
{
    chdir ("src/" + dir);
    exec ("rm", "-f", "*.o lib*.a", dir);
    chdir ("../..");
}

void clean ()
{
    exec ("rm", "-f", "build.bim");
    cleandir ("cblogin");
    cleandir ("cbstat");
    cleandir ("cbgetty");
    cleandir ("rss");
}

void makedist ()
{
    list
    	examples;
    int
    	i;

    buildprogs ();
    
    exec ("cp",
	  "src/cblogin/cblogin", "src/cbstat/cbstat", "src/cbgetty/cbgetty",
	  "bin");
    exec ("cp", "/usr/local/bin/icm*", "icmake-bin");

    clean ();
    
    chdir ("..");
    exec ("tar", "cvzf", "callback-" + VER + ".tar.gz", "callback");
    chdir ("callback");
}

void main (int argc, list argv)
{
    if (element (1, argv) == "progs")
    	buildprogs ();
    else if (element (1, argv) == "install")
    	install ();
    else if (element (1, argv) == "clean")
    	clean ();
    else if (element (1, argv) == "dist")
    	makedist ();
    else
    {
        printf ("\n"
                "Usage: build progs          - builds programs\n"
        	"       build install        - installs program\n"
        	"       build clean          - cleanup .o files etc.\n"
        	"\n"
        	"       build dist           - makes .tar.gz distrib file\n"
        	"\n");
        exit (1);
    }
    
    exit (0);
}
