#!/bin/bash

# 1. parametr: nazev projektu
# 2. parametr: typ projektu (Program, StaticLibrary, SharedLibrary)
# 3. parametr: typ verze (Debug, Release)
# 4. parametr: nastaveni projektu
# 5. parametr: nastaveni projektu pro debug verzi
# 6. parametr: nastaveni projektu pro release verzi
# 7. parametr: nazev precompiled headeru (povinne)
# 8. parametr: include path 1 (muze byt prazdny)
# 9. parametr: include path 2 (muze byt prazdny)
# 10. parametr: include path 3 (muze byt prazdny)
# 11. parametr: knihovny, ktere se maji prilinkovat (je treba zadat jako seznam v pythonu)
# 12. parametr: adresar, kde se maji hledat knihovny (je treba zadat jako seznam v pythonu)
# 13. parametr: adresar projektu
# 14. parametr: adresar, kam se ma zkopirovat vystup kompilace (nepovinne)
# 15. parametr: adresar, ze ktereho budou zkopirovany vsechny .so soubory do vystupniho adresare (nepovinne)
# Pozn.: Nektere z parametru musi byt v uvozovkach, protoze vetsinou obsahuji mezery

if [ "$#" -eq 15 ]; then

    # Nastaveni hlavnich promennych
    ProjectName="$1";       shift
    ProjectType="$1";       shift
    Version="$1";           shift
    Options="$1";           shift
    DebugOptions="$1";      shift
    ReleaseOptions="$1";    shift
    PrecompiledHeader="$1"; shift
    IncludePath1="$1";      shift
    IncludePath2="$1";      shift
    IncludePath3="$1";      shift
    Libs="$1";              shift
    LibPath="$1";           shift
    ProjectDir="$1";        shift
    OutputDir="$1";         shift
    LibraryDir="$1"
    CurrentDir=`pwd`

    # Nastaveni pro scons
    TargetScript="./SConstruct"
    AllOptions="$DebugOptions $Options"
    if [ "$Version" = "Release" ]; then
        AllOptions="$ReleaseOptions $Options"
    fi

    # Nastaveni pro precompiled header
    HeaderOptions="-c $AllOptions -I$IncludePath1"
    if [ -n "$IncludePath1" ]; then
        HeaderOptions="$HeaderOptions -I$IncludePath1"
    fi
    if [ -n "$IncludePath2" ]; then
        HeaderOptions="$HeaderOptions -I$IncludePath2"
    fi
    if [ -n "$IncludePath3" ]; then
        HeaderOptions="$HeaderOptions -I$IncludePath3"
    fi


    # Nastavi cestu na adresar projektu
    cd $ProjectDir

    # Vygeneruje script
    echo "Generating SConstruct..."

    # Vlozi do scriptu seznam souboru
    echo "Files = Split(\"\"\"" > $TargetScript
    find | grep .cpp$ >> $TargetScript
    echo "\"\"\")" >> $TargetScript

    # Vlozi do scriptu includepaths
    echo "Paths = Split(\"\"\"" >> $TargetScript
    if [ -n "$IncludePath1" ]; then
        echo $IncludePath1 >> $TargetScript
    fi
    if [ -n "$IncludePath2" ]; then
        echo $IncludePath2 >> $TargetScript
    fi
    if [ -n "$IncludePath3" ]; then
        echo $IncludePath3 >> $TargetScript
    fi
    echo "\"\"\")" >> $TargetScript

    # Vlozi do scriptu spousteci funkci
    echo "$ProjectType(\"$ProjectName\", Files, CPPPATH = Paths, CCFLAGS = \"$AllOptions\", LIBPATH = $LibPath, LIBS = $Libs)" >> $TargetScript

    # Zjisti, zda je v projektu nejaka zmena
    echo "Checking for modifications..."
    scons -s -q
    CheckResult=$?

    if [ $CheckResult -ne 0 ]; then
        PHCompileResult=0
        if [ -n "$PrecompiledHeader" ]; then
            # Zjisti, zda je treba zkompilovat precompiled header
            PHResult=`scons -Q -n | grep \`echo "$PrecompiledHeader" | sed "s/.h\$//"\`.cpp`;

            # Zkompiluje precompiled header
            PHCompileResult=0
            if [ -n "$PHResult" ]; then
                echo "Compiling precompiled header..." &&
                echo "g++ $HeaderOptions $PrecompiledHeader" &&
                g++ $HeaderOptions $PrecompiledHeader
                PHCompileResult=$?
            fi
        fi

        # Zkompiluje projekt
        [ $PHCompileResult -eq 0 ] &&
        echo "Compiling project..." &&
        scons -Q &&

        # Pokud byl zadan vystupni adresar
        if [ -n "$OutputDir" ]; then
            # Pripravi nazev vystupniho souboru
            OutputFile="$ProjectName"
            if [ "$ProjectType" = "StaticLibrary" ]; then
                OutputFile="lib$ProjectName.a"
            else
                if [ "$ProjectType" = "SharedLibrary" ]; then
                    OutputFile="lib$ProjectName.so"
                fi
            fi

            # Zkopiruje data, pokud existuje vystupni soubor
            if [ -f $OutputFile ]; then
                echo "Copying the output file to $OutputDir..."
                cp $OutputFile $OutputDir

                # Zkopiruje knihovny, pokud byl zadan jejich adresar
                if [ -n "$LibraryDir" ]; then
                    echo "Copying libraries to $OutputDir..."
                    cp $LibraryDir/*.so $OutputDir &> /dev/null
                    cp $LibraryDir/*.so.* $OutputDir &> /dev/null
                fi
            else
                echo "Cannot copy the output file."
            fi
        fi
    fi

    ExitResult=$?

    # Vrati adresar zpet
    cd $CurrentDir
    [ $CheckResult -eq 0 -o $ExitResult -eq 0 ]

else
    echo "Not enough parameters."
fi
