#
# universelle Make-Prozedur
#
# fr alle Module wird eine Abh„ngigkeit von einer
# eventuellen Gesamtprojekt-Includedatei und eventuellen modulspezifischen
# Includedateien, die denselben Namen wie das Modul tragen, angenommen.
#
# lauff„hig erst ab Interpreterversion 2.01
#
# (c) P.Vranken, 4.6.1992
#
# Bemerkungen: Da auf konsequente Anwendung von "" verzichtet wurde, ist
# darauf zu achten, daž keine Variablen des Namens c, h, o, s, cll, mke  u.a.
# verwendet werden. Aužerdem mssen Pfade und Optionen natrlich korrekt
# angepažt werden.

func set_options()
#
# hier die gewnschten Optionen angeben
#
# Programmname:
   let programm$ = "programm.prg"
# Module (ohne .C) und ihre Anzahl eintragen:
   let anz_module = 3
   let modul$[1] = "main"
   let modul$[2] = "up_1"
   let modul$[3] = "up_2"
# Gesamtprojekt-Include:
   let include$  = "gen_inc.h"
# Compiler:
   let cc$ = "\usr\bin\cc.prg"
   let cc_optionen$ = "-xyz -inc=\usr\include"
# Linker:
   let cl$ = "\usr\bin\cl.prg"
   let cl_optionen$ = '-o=programm$ -lib=\usr\lib\'
   let cl_library$  = "float.lib std.lib tos.lib"
endfunc

func cc_comline(); # hier wird die Compilerkommandozeile erzeugt
   let cc_com$ = cc_optionen$
   for t=1 to anz_module
      if istomake(modul$[t].o: modul$[t].c, modul$[t].h, include$, argv$[0].mke)
         let cc_com$ += ' modul$[t].c'
      endif
   next
   let cc_comline = strcmp('cc_optionen$', 'cc_com$')
endfunc

# es wird davon ausgegangen, daž der Binder als Eingabe auch eine Datei
# verarbeiten kann, denn die in der L„nge begrenzte Kommandozeile reicht
# gew”hnlich nicht, um eine Reihe von Objektmodulen und Bibliotheken anzu-
# geben.
func cl_comfile(); # hier wird die Linkeranweisungsliste erstellt
   puts "Eine Datei mit Linkeranweisungen"
   OUT_TO modul$[1].cll
   puts cl_optionen$.
   for t=1 to anz_module
      puts modul$[t], ".o".
   next
   puts cl_library$.
   OUT_TO stdout
   puts " wurde erstellt:".
   shows modul$[1].cll
endfunc

func mustlink(); # muž der Linker aufgerufen werden?
   let mustlink = istomake(programm$: modul$[1].cll)
   for t=1 to anz_module
      let mustlink = mustlink || istomake(programm$: modul$[t].o)
   next
endfunc

#
# Beginn des Hauptprogramms
#
warn_ver 201
gosub set_options()
putc " >>>>>> Makeprozedur zur Erzeugung von ", programm$, " <<<<<< ".
putc DATE$.

if istomake(modul$[1].cll: "standard.mke");# Linkeranweisungen mssen neu erzeugt werden
   del modul$[1].cll
   gosub cl_comfile()
endif

# šbersetzung, solange n”tig
while cc_comline();     # dann ist eine šbersetzung erforderlich
   putc "cc.prg ", cc_com$.
   del c_err
   out_to c_err;    # Ausgabe umlenken
   cc$ cc_com$;      # tcc aufrufen
   out_to stdout
   if RC;               # es trat ein Fehler auf
      ed.prg c_err
      exit RC;          # Editor mit Returncode!=0 verlassen => Prozedur abbrechen
   else
      showc c_err;      # Warnungen anzeigen
   endif
again
#
# Zusammenbinden, falls erforderlich
#
if mustlink()
   putc "cl.prg -inc=", modul$[1], ".cll".
   cl$ -inc=modul$[1].cll
   if RC;                   # Link-Fehler: Ausgabe anhalten, damit man die
      putc "eine Taste zum Fortfahren". 
      gosub getchar();      # Meldung des Linkers lesen kann
      del programm$;        # sonst k”nnen fehlerhafte Programme erzeugt werden
   else
      putc programm$, " wurde erzeugt".
   endif
else
   putc programm$, " ist auf dem aktuellen Stand!".
   gosub getchar()
endif
end.
