#!/bin/sh
#
# makeit...
#
OPTION="$1"
OS16PATH=""
#
edition () {
    local EDITION="kernel/main/build.h"
    echo -n                              > $EDITION
    echo -n "#define BUILD_DATE \""     >> $EDITION
    echo -n `date "+%Y.%m.%d %H:%M:%S"` >> $EDITION
    echo  "\""                          >> $EDITION
}
#
#
#
makefile () {
    #
    local MAKEFILE="Makefile"
    local TAB=" "
    #
    local SOURCE_C=""
    local C=""
    local SOURCE_S=""
    local S=""
    #
    local c
    local s
    #
    # Trova i file in C.
    #
    for c in *.c
    do
        if [ -f $c ]
        then
        C=`basename $c .c`
            SOURCE_C="$SOURCE_C $C"
        fi
    done
    #
    # Trova i file in ASM.
    #
    for s in *.s
    do
        if [ -f $s ]
        then
        S=`basename $s .s`
            SOURCE_S="$SOURCE_S $S"
        fi
    done
    #
    # Prepara il file make.
    # GCC viene usato per potenziare il controllo degli errori.
    #
    echo -n                                                  > $MAKEFILE
    echo "# This file was made automatically"               >> $MAKEFILE
    echo "# by the script \`makeit\', based on the"         >> $MAKEFILE
    echo "# directory content."                             >> $MAKEFILE
    echo "# Please use \`makeit\' to compile and"           >> $MAKEFILE
    echo "# \`makeit clean\' to clean directories."         >> $MAKEFILE
    echo "#"                                                >> $MAKEFILE
    echo "c = $SOURCE_C"                                    >> $MAKEFILE
    echo "#"                                                >> $MAKEFILE
    echo "s = $SOURCE_S"                                    >> $MAKEFILE
    echo "#"                                                >> $MAKEFILE
    echo "all: \$(s) \$(c)"                                 >> $MAKEFILE
    echo "#"                                                >> $MAKEFILE
    echo "clean:"                                           >> $MAKEFILE
    echo "${TAB}@rm \$(c) \$(s) *.o *.assembler 2> /dev/null ; true" \
                                                            >> $MAKEFILE
    echo "${TAB}@rm *.symbols 2> /dev/null     ; true"      >> $MAKEFILE
    echo "${TAB}@pwd"                                       >> $MAKEFILE
    echo "#"                                                >> $MAKEFILE
    echo "\$(c):"                                           >> $MAKEFILE
    echo "${TAB}@echo \$@.c"                                >> $MAKEFILE
    echo "${TAB}@gcc -Wall -c -o \$@.o " \
                       "-I " \
                       "-I. " \
                       "-I$OS16PATH/lib " \
                       "-I$OS16PATH/ " \
                       "\$@.c"                              >> $MAKEFILE
    echo "${TAB}@rm \$@.o"                                  >> $MAKEFILE
    echo "${TAB}@bcc -ansi -0 -Mc -S -o \$@.assembler " \
                       "-I " \
                       "-I. " \
                       "-I$OS16PATH/lib " \
                       "-I$OS16PATH/ " \
                       "\$@.c"                              >> $MAKEFILE
    echo "${TAB}@bcc -ansi -0 -Mc -c -o \$@.o " \
                       "-I " \
                       "-I. " \
                       "-I$OS16PATH/lib " \
                       "-I$OS16PATH/ " \
                       "\$@.c"                              >> $MAKEFILE
    echo "#"                                                >> $MAKEFILE
    echo "\$(s):"                                           >> $MAKEFILE
    echo "${TAB}@echo \$@.s"                                >> $MAKEFILE
    echo "${TAB}@as86 -u -0 -o \$@.o -s \$@.symbols \$@.s"  >> $MAKEFILE
    #
}
#
#
#
main () {
    #
    local CURDIR=`pwd`
    local OBJECTS
    local OBJLIB
    local EXEC
    local BASENAME
    local PROGNAME
    local d
    local c
    local s
    local o
    #
    edition
    #
    # Copia dello scheletro
    #
    if [ "$OPTION" = "clean" ]
    then
        #
        # La copia non va fatta.
        #
        true
    else
        cp -dpRv skel/etc   /mnt/os16.a/
        cp -dpRv skel/dev   /mnt/os16.a/
        mkdir               /mnt/os16.a/mnt/
        mkdir               /mnt/os16.a/tmp/
        chmod 0777          /mnt/os16.a/tmp/
        mkdir               /mnt/os16.a/usr/
        cp -dpRv skel/root  /mnt/os16.a/
        cp -dpRv skel/home  /mnt/os16.a/
        cp -dpRv skel/usr/* /mnt/os16.b/
    fi
    #
    #
    #
    for d in `find kernel`  \
             `find lib`     \
             `find applic`  \
             `find ported`
    do
        if [ -d "$d" ]
        then
            #
            # Sono presenti dei file C o ASM?
            #
            c=`echo $d/*.c | sed "s/ .*//"`
            s=`echo $d/*.s | sed "s/ .*//"`
            #
            if [ -f "$c" ] || [ -f "$s" ]
            then
                #
                # Sì
                #
                CURDIR=`pwd`
                cd $d
                #
                # Ricrea il file make
                #
                makefile
                #
                # Pulisce quindi la directory
                #
                make clean
                #
                #
                #
                if [ "$OPTION" = "clean" ]
                then
                    #
                    # È stata richiesta la pulitura, ma questa
                    # è appena stata fatta!
                    #
                    true
                else
                    #
                    # Qualunque altro argomento viene considerato
                    # un `make'.
                    #
                    if ! make
                    then
                        #
                        # La compilazione è fallita.
                        #
                        cd "$CURDIR"
                        exit
                    fi
                fi
                cd "$CURDIR"
            fi
        fi
    done
    #
    cd "$CURDIR"
    #
    # Link
    #
    if [ "$OPTION" = "clean" ]
    then
        #
        # Il collegamento non va fatto.
        #
        true
    else
        #
        # Collegamento dei file del kernel.
        #
        OBJECTS=""
        #
        for o in `find kernel   -name \*.o -print` \
                 `find lib      -name \*.o -print`
        do
            if    [ "$o" = "./kernel/main/crt0.o" ] \
               || [ "$o" = "./kernel/main/main.o" ] \
               || [ ! -e "$o" ]
            then
                true
            else
                OBJECTS="$OBJECTS $o"
            fi
        done
        #
        echo "Link"
        #
        ld86 -i -d -s -m -o kimage    \
                kernel/main/crt0.o    \
                kernel/main/main.o    \
                $OBJECTS
        #
        # Copia il kernel nel dischetto.
        #
        if mount | grep /mnt/os16.a > /dev/null
        then
            cp -f kimage /mnt/os16.a/boot
        else
            echo "[$0] Cannot copy the kernel image "
            echo "[$0]   inside the floppy disk image!"
        fi
        sync
        #
        # Collegamento delle applicazioni di os16.
        #
        OBJLIB=""
        #
        for o in `find lib      -name \*.o -print`
        do
            OBJLIB="$OBJLIB $o"
        done
        #
        # Scansione delle applicazioni interne.
        #
        for o in `find applic     -name \*.o -print`
        do
            if    [ "$o" = "applic/crt0.o" ] \
               || [ ! -e "$o" ] \
               || echo "$o" | grep ".crt0.o$" > /dev/null
            then
                #
                # Il file non esiste oppure si tratta di `...crt0.s'.
                #
                true
            else
                #
                # File oggetto differente da `...crt0.s'.
                #
                EXEC=`echo "$o" | sed "s/\.o$//"`
                BASENAME=`basename $o .o`
                if [ -e "applic/$BASENAME.crt0.o" ]
                then
                    #
                    # Qui c'è un file `...crt0.o' specifico.
                    #
                    ld86 -i -d -s -o $EXEC \
                         applic/$BASENAME.crt0.o $o $OBJLIB
                else
                    #
                    # Qui si usa il file `crt0.o' generale.
                    #
                    ld86 -i -d -s -o $EXEC applic/crt0.o $o $OBJLIB
                fi
                #
                if [ -x "applic/$BASENAME" ]
                then
                    if mount | grep /mnt/os16.a > /dev/null
                    then
                        mkdir /mnt/os16.a/bin/ 2> /dev/null
                        cp -f "$EXEC" /mnt/os16.a/bin
                    else
                        echo "[$0] Cannot copy the application "
                        echo "[$0]   $BASENAME inside the floppy "
                        echo "[$0]   disk image!"
                        break
                    fi
                fi
            fi
        done
        sync
        #
        # Collegamento delle applicazioni più semplici,
        # provenienti da altri sistemi operativi.
        #
        for o in `find ported/mix -name \*.o -print`
        do
            if    [ "$o" = "ported/mix/crt0.o" ] \
               || [ ! -e "$o" ] \
               || echo "$o" | grep ".crt0.o$" > /dev/null
            then
                #
                # Il file non esiste oppure si tratta di `...crt0.s'.
                #
                true
            else
                #
                # File oggetto differente da `...crt0.s'.
                #
                EXEC=`echo "$o" | sed "s/\.o$//"`
                BASENAME=`basename $o .o`
                if [ -e "ported/mix/$BASENAME.crt0.o" ]
                then
                    #
                    # Qui c'è un file `...crt0.o' specifico.
                    #
                    ld86 -i -d -s -o $EXEC \
                         applic/$BASENAME.crt0.o $o $OBJLIB
                else
                    #
                    # Qui si usa il file `crt0.o' generale.
                    #
                    ld86 -i -d -s -o $EXEC applic/crt0.o $o $OBJLIB
                fi
                #
                if [ -x "$EXEC" ]
                then
                    if mount | grep /mnt/os16.a > /dev/null
                    then
                        mkdir /mnt/os16.b/bin/ 2> /dev/null
                        cp -f "$EXEC" /mnt/os16.b/bin
                    else
                        echo "[$0] Cannot copy the application "
                        echo "[$0]   $EXEC inside the floppy "
                        echo "[$0]   disk image!"
                        break
                    fi
                fi
            fi
        done
        sync
        #
        # Altre applicazioni più importanti.
        #
        for d in ported/*
        do
            if [ -d "$d" ]
            then
                #
                #
                #
                OBJECTS=""
                BASENAME=`basename $d`
                EXEC="$d/$BASENAME"
                #
                #
                #
                if [ "$BASENAME" = "mix" ]
                then
                    #
                    # già fatto.
                    #
                    continue
                fi
                #
                #
                #
                for o in $d/*.o
                do
                    if    [ "$o" = "$d/crt0.o" ] \
                       || [ ! -e "$o" ]
                    then
                        true
                    else
                        OBJECTS="$OBJECTS $o"
                    fi
                done
                #
                ld86 -i -d -s -o $EXEC $d/crt0.o $OBJECTS $OBJLIB
                #
                if [ -x "$d/$BASENAME" ]
                then
                    if mount | grep /mnt/os16.b > /dev/null
                    then
                        mkdir /mnt/os16.b/bin/ 2> /dev/null
                        cp -f "$EXEC" /mnt/os16.b/bin
                    else
                        echo "[$0] Cannot copy the application "
                        echo "[$0]   $BASENAME inside the floppy "
                        echo "[$0]   disk image!"
                        break
                    fi
                fi
            fi
        done
        sync

    fi
}
#
# Start.
#
if [ -d kernel ]   && \
   [ -d applic ]   && \
   [ -d lib  ]
then
    OS16PATH=`pwd`
    main
else
    echo "[$0] Running from a wrong directory!"
fi
