#!/usr/bin/tclsh

#
# Erstellt eine Abhaengigkeitsliste der '#include'-Anweisungen
# Dabei wird NICHT auf '#if' und aehnliches geachtet
# (vgl. makedepend)
# Ausgegeben wird in der Form:
# Dateiname_ohne_Anhang.o: Dateiname Abhaengigkeiten
# \t$(CPPC) $(CFLAGS) -c Dateiname $(INCLUDE)
#
# 17. September 2001
# Diether Knof

# Abhaengigkeitsliste
set abhaengigkeiten { }
# Liste der INode-Number
# (wird fuer den Vergleich der Dateien benoetigt)
set ino_list { }

# Funktion, die die Abhaengigkeiten rekursiv sucht und
# in 'abhaengigkeiten' speichert
proc abhaengigkeiten_suchen { datei } {
    global abhaengigkeiten
    global ino_list
    # schauen, ob ueberhaupt '#include'-Anweisungen vorhanden sind
    if { [catch {exec grep "#include \"" $datei} dateiliste] == 0 } {
	# alle '#include'-Anweisungen durchgehen
	foreach include [split $dateiliste "\n"] {
	    # 'include' ist jetzt von der Form '#include "datei.h"'
	    set include [string range $include \
		    [expr [string first "\"" $include ] + 1] \
		    [expr [string last "\"" $include ] - 1] ]
	    # Verzeichnis eventuel ergaenzen
	    if { [ file dirname $datei ] != "."  } {
		# Die Datei liegt in einem anderen Verzeichnis
		set include "[file dirname $datei]/$include"
	    }
	    # Nachschauen, ob die Datei schon in der Liste ist
	    if { ![ file exists $include ] } {
		puts stderr "include-Datei $include in $datei existiert nicht"
	    } else {
		file stat $include include_stat
		if { [lsearch -exact $ino_list $include_stat(ino) ] == -1} {
		    lappend abhaengigkeiten "$include"
		    lappend ino_list "$include_stat(ino)"
		    abhaengigkeiten_suchen $include
		}
	    }
	}
    }
}
# proc abhaengigkeiten_suchen {datei}


# Alle Argumente durchgehen
foreach datei $argv {
    # Liste leer machen
    global abhaengigkeiten
    set abhaengigkeiten { }
    set ino_list { }

    # rekursiv Abhaengigkeiten suchen
    abhaengigkeiten_suchen $datei

    # Abhaengigkeiten ausgeben (Form vergleiche oben)
    puts "[file rootname $datei].\$(OBJ_SUFFIX): $datei $abhaengigkeiten"
    puts "\t\$(CXX) \$(CXXFLAGS) \$(CPPFLAGS) -c $datei \$(INCLUDE)"
    puts ""
}
