SHELL = /bin/sh

# Terminal
KODIERUNG = UTF-8

# Inhalt von Textdateien
TEXTKODIERUNG := $(KODIERUNG)

CFLAGS = -Os -Wall
#CPPFLAGS += -D_FILE_OFFSET_BITS=64
#CPPFLAGS += -DTEXTKODIERUNG=\"$(TEXTKODIERUNG)\"
#CPPFLAGS += -DLATIN1
#CPPFLAGS += -DKEIN_CGI
#CPPFLAGS += -DKEIN_INDEXER
#CPPFLAGS += -DNICHT_EXTERN
LDFLAGS =

ARCH != uname -m
AWK = awk
ICONV = iconv
SED = sed
ROFF = groff
PS2PDF = ps2pdf
PDFOPT = pdfopt
INSTALL = install -c
INSTALL_PROGRAM = $(INSTALL) -m 755 -s
INSTALL_SCRIPT = $(INSTALL) -m 755
INSTALL_DATA = $(INSTALL) -m 644
SERVER = akfoerster.de

DESTDIR =
prefix = /usr/local
bindir = $(prefix)/bin
libdir = $(prefix)/lib
mandir = $(prefix)/man
includedir = $(prefix)/include

.SUFFIXES: .man .text .html .ps .pdf
.PHONY: all cgi doc check install install-strip install-dirs uninstall
.PHONY: text txt ps pdf html
.PHONY: clean distclean dist

LIBOBJ = Ausgabe.o Eingabe.o Methoden.o Methodenname.o Medientyp.o \
      Zahl.o Ganzzahl.o Links.o Datengrstr.o Dauer.o \
      urlkod.o urldekod.o xmltext.o Formular.o CGI-Formular.o \
      Zeitanalyse.o Zeitvergl.o Verzeichnis.o sockadresse.o sockport.o \
      Datengroesse.o base64kod.o base64dekod.o Systemfehler.o \
      Verbindung.o Statusmeldung.o gestueckelt.o gopherselect.o gopherurl.o \
      stueckfilter.o stuecktext.o Kopf.o Wochentag.o Monat.o auth_basic.o \
      Adrtext.o Adrzuw.o Zahlstr.o Ganzzahlstr.o httpZeit.o \
      Tempdatei.o Text.o xmltextvar.o urlkodtext.o url.o urlverbind.o \
      Tokensuche.o Kopfende.o UTF-8.o Vereinbarung.o Sprachauswahl.o \
      Lokalverbind.o ipv4bindung.o ipv6bindung.o lokalbindung.o \
      Linkseite.o daemon.o socks4verb.o socks5verb.o proxyverb.o \
      Entitaet.o cp1252.o scrape.o Liste.o ipaddr.o stdport.o einlesen.o \
      kopiere.o deutsch.o urlkodpuf.o privadr.o

QUELLEN = akfnetz.h version.h Ausgabe.c Eingabe.c Methoden.c Methodenname.c \
      Medientyp.c Zahl.c Ganzzahl.c urlkod.c urldekod.c xmltext.c Formular.c \
      CGI-Formular.c Zeitanalyse.c Zeitvergl.c Dauer.c sockadresse.c sockport.c \
      mime-types.h Verzeichnis.c Verzeichnis.h Sprachen.h \
      Datengroesse.c base64kod.c base64dekod.c akfbase64.c \
      akfwebserver.c akfwebserver.h httpserver.c httptransport.c akfnetztest.c \
      SysFehler-l1.c Verbindung.c Statusmeldung.c Datengrstr.c \
      gestueckelt.c stueckfilter.c stuecktext.c Kopf.c akfindexer.c \
      Wochentag.c Monat.c auth_basic.c akfweb-dl.c Links.c \
      Adrtext.c Adrzuw.c Zahlstr.c Ganzzahlstr.c gopherselect.c gopherurl.c \
      httpZeit.c akfquery.c cgi.c cgi-Kind.c stdport.c \
      Tempdatei.c Text.c xmltextvar.c urlkodtext.c url.c urlverbind.c \
      akfnetzpass.c Tokensuche.c httpclient.c httpclient.h \
      Kopfende.c UTF-8.c Vereinbarung.c Sprachauswahl.c akfgopher-dl.c \
      Medienfehler.c Lokalverbind.c ipv4bindung.c ipv6bindung.c ipaddr.c \
      lokalbindung.c Linkseite.c Webfehler.c Logbuch.c daemon.c \
      socks4verb.c socks5verb.c Entitaet.[ch] akfscraper.c scrape.c \
      cp1252.c akfnetztyp.c Liste.c Datei.c proxyverb.c gophermenu \
      einlesen.c akfgb.c akfgb.h akf32.png akf64.png kopiere.c deutsch.c \
      urlkodpuf.c akfgopherserver.c privadr.c gophertyp.h \
      text2c.awk VerzStil.css FehlerStil.css

# keine kompilierten CGIs hier
CGI = cgi-src/Demo.cgi cgi-src/Manpage.cgi cgi-src/Kalender.cgi cgi-src/Name.cgi \
	cgi-src/zensiert.cgi cgi-src/akfcgi.lua cgi-src/beispiel_lua.cgi \
	cgi-src/md cgi-src/LIESMICH-Lua.text

CGISRC = cgi-src/var.c cgi-src/hochladen.c cgi-src/beispiel_c.c \
	cgi-src/cgi.ads cgi-src/cgi.adb cgi-src/beispiel_ada.adb \
	cgi-src/Sprache.c cgi-src/gopherweb.c \
	cgi-src/GopherStil.css cgi-src/GopherStil-gruen.css

all: akfwebserver akfweb-dl akfnetzpass akfscraper akfindexer akfquery \
     akfgopherserver akfgb akfgopher-dl akfbase64 akfnetztyp cgi

doc:
	$(MAKE) -C doc all

text:
	$(MAKE) -C doc text

txt: text

html:
	$(MAKE) -C doc html

ps:
	$(MAKE) -C doc ps

pdf:
	$(MAKE) -C doc pdf


check: ./akfnetztest
	./akfnetztest

cgi:
	$(MAKE) -C cgi-src all

akfwebserver: akfwebserver.o httptransport.o httpserver.o cgi.o cgi-Kind.o \
	Webfehler.o Logbuch.o Datei.o libakfnetz.a
	$(CC) akfwebserver.o httpserver.o httptransport.o cgi.o cgi-Kind.o \
	  Webfehler.o Logbuch.o Datei.o \
	  -L. -lakfnetz $(LDFLAGS) -o $@

akfweb-dl: akfweb-dl.o httpclient.o libakfnetz.a
	$(CC) akfweb-dl.o httpclient.o -L. -lakfnetz $(LDFLAGS) -o $@

akfgopherserver: akfgopherserver.o libakfnetz.a
	$(CC) akfgopherserver.o -L. -lakfnetz $(LDFLAGS) -o $@

akfnetztyp: akfnetztyp.o Medientyp.o
	$(CC) akfnetztyp.o Medientyp.o $(LDFLAGS) -o $@

akfnetzpass: akfnetzpass.o base64kod.o
	$(CC) akfnetzpass.o base64kod.o $(LDFLAGS) -o $@

akfindexer: akfindexer.o libakfnetz.a
	$(CC) akfindexer.o -L. -lakfnetz $(LDFLAGS) -o $@

akfquery: akfquery.o urldekod.o xmltext.o
	$(CC) akfquery.o urldekod.o xmltext.o $(LDFLAGS) -o $@
	-ln -sf ../akfquery cgi-src/akfquery

akfgopher-dl: akfgopher-dl.o libakfnetz.a
	$(CC) akfgopher-dl.o -L. -lakfnetz $(LDFLAGS) -o $@

akfgb: akfgb.o libakfnetz.a
	$(CC) akfgb.o -L. -lakfnetz $(LDFLAGS) -o $@

akfscraper: akfnetz.h akfscraper.o libakfnetz.a
	$(CC) akfscraper.o -L. -lakfnetz $(LDFLAGS) -o $@


akfbase64: akfbase64.o libakfnetz.a
	$(CC) akfbase64.o -L. -lakfnetz $(LDFLAGS) -o $@

libakfnetz.a: $(LIBOBJ)
	$(AR) crufs $@ $(LIBOBJ)

.c.o:
	$(CC) -c $(CPPFLAGS) $(CFLAGS) $<

VerzStil.h: VerzStil.css text2c.awk
	$(AWK) -f text2c.awk -v mode=crlf VerzStil.css >$@

FehlerStil.h: FehlerStil.css text2c.awk
	$(AWK) -f text2c.awk -v mode=crlf FehlerStil.css >$@

$(LIBOBJ): akfnetz.h

akfgb.o: akfnetz.h akfgb.h gophertyp.h version.h

Medientyp.o: akfnetz.h mime-types.h

Medienfehler.o: Medientyp.c akfnetz.h mime-types.h

Entitaet.o: Entitaet.c Entitaet.h

Verzeichnis.o: Verzeichnis.c Verzeichnis.h akfnetz.h VerzStil.h Sprachen.h

akfwebserver.o httptransport.o Logbuch.o Webfehler.o: akfwebserver.h Sprachen.h akfnetz.h

Webfehler.o: FehlerStil.h

akfgopherserver.o akfwebserver.o: akfnetz.h version.h

akfgopherserver.o: gophertyp.h

akfbase64.o akfgopher-dl.o akfweb-dl.o akfnetztyp.o akfscraper.o: akfnetz.h version.h

Datei.o: akfwebserver.h Sprachen.h akfnetz.h

httpserver.o: akfwebserver.h Sprachen.h akfnetz.h

httpclient.o: httpclient.h akfnetz.h

cgi.o cgi-Kind.o: akfwebserver.h Sprachen.h akfnetz.h

Systemfehler.c: SysFehler-l1.c
	(echo '/* GENERIERT! Nicht bearbeiten! Generiert aus SysFehler-l1.c */'; \
	 cat SysFehler-l1.c) | $(ICONV) -f ISO-8859-1 -t $(KODIERUNG) >$@

./akfnetztest: akfnetztest.c Medienfehler.o libakfnetz.a
	$(CC) $(CPPFLAGS) $(CFLAGS) -w \
	  akfnetztest.c Medienfehler.o libakfnetz.a $(LDFLAGS) -o $@

installdirs:
	test -d $(DESTDIR)$(includedir) || $(INSTALL) -d $(DESTDIR)$(includedir)
	test -d $(DESTDIR)$(libdir) || $(INSTALL) -d $(DESTDIR)$(libdir)
	test -d $(DESTDIR)$(bindir) || $(INSTALL) -d $(DESTDIR)$(bindir)
	test -d $(DESTDIR)$(mandir)/man1 || $(INSTALL) -d $(DESTDIR)$(mandir)/man1
	test -d $(DESTDIR)$(mandir)/de/man1 || $(INSTALL) -d $(DESTDIR)$(mandir)/de/man1


install: all installdirs
	$(INSTALL_DATA) akfnetz.h $(DESTDIR)$(includedir)
	$(INSTALL_DATA) libakfnetz.a $(DESTDIR)$(libdir)
	$(INSTALL_PROGRAM) akfwebserver $(DESTDIR)$(bindir)
	$(INSTALL_PROGRAM) akfnetztyp $(DESTDIR)$(bindir)
	$(INSTALL_PROGRAM) akfnetzpass $(DESTDIR)$(bindir)
	$(INSTALL_PROGRAM) akfquery $(DESTDIR)$(bindir)
	$(INSTALL_PROGRAM) akfweb-dl $(DESTDIR)$(bindir)
	$(INSTALL_PROGRAM) akfgopher-dl $(DESTDIR)$(bindir)
	$(INSTALL_PROGRAM) akfgb $(DESTDIR)$(bindir)
	$(INSTALL_SCRIPT) gophermenu $(DESTDIR)$(bindir)
	$(INSTALL_PROGRAM) akfgopherserver $(DESTDIR)$(bindir)
	$(INSTALL_PROGRAM) akfscraper $(DESTDIR)$(bindir)
	$(INSTALL_PROGRAM) akfbase64 $(DESTDIR)$(bindir)
	-$(INSTALL_DATA) doc/akfweb-dl.de.man $(DESTDIR)$(mandir)/de/man1/akfweb-dl.1
	-$(INSTALL_DATA) doc/akfwebserver.de.man $(DESTDIR)$(mandir)/de/man1/akfwebserver.1
	-$(INSTALL_DATA) doc/akfgopherserver.de.man $(DESTDIR)$(mandir)/de/man1/akfgopherserver.1
	-$(INSTALL_DATA) doc/akfnetzpass.de.man $(DESTDIR)$(mandir)/de/man1/akfnetzpass.1
	-$(INSTALL_DATA) doc/akfquery.de.man $(DESTDIR)$(mandir)/de/man1/akfquery.1
	-$(INSTALL_DATA) doc/akfscraper.de.man $(DESTDIR)$(mandir)/de/man1/akfscraper.1
	-$(INSTALL_DATA) doc/akfbase64.de.man $(DESTDIR)$(mandir)/de/man1/akfbase64.1
	-$(INSTALL_DATA) doc/akfgopher-dl.de.man $(DESTDIR)$(mandir)/de/man1/akfgopher-dl.1
	-$(INSTALL_DATA) doc/akfgb.de.man $(DESTDIR)$(mandir)/de/man1/akfgb.1
	-$(INSTALL_DATA) doc/akfgopher-dl.en.man $(DESTDIR)$(mandir)/man1/akfgopher-dl.1
	-$(INSTALL_DATA) doc/akfgb.en.man $(DESTDIR)$(mandir)/man1/akfgb.1
	-$(INSTALL_DATA) doc/akfscraper.en.man $(DESTDIR)$(mandir)/man1/akfscraper.1
	-$(INSTALL_DATA) doc/akfbase64.en.man $(DESTDIR)$(mandir)/man1/akfbase64.1
	-$(INSTALL_DATA) doc/akfquery.en.man $(DESTDIR)$(mandir)/man1/akfquery.1
	-$(INSTALL_DATA) doc/akfnetzpass.en.man $(DESTDIR)$(mandir)/man1/akfnetzpass.1
	-$(INSTALL_DATA) doc/akfgopherserver.en.man $(DESTDIR)$(mandir)/man1/akfgopherserver.1
	-ln -sf ../de/man1/akfweb-dl.1 $(DESTDIR)$(mandir)/man1/
	-ln -sf ../de/man1/akfwebserver.1 $(DESTDIR)$(mandir)/man1/

install-strip: install


uninstall:
	-rm -f $(DESTDIR)$(includedir)/akfnetz.h
	-rm -f $(DESTDIR)$(libdir)/libakfnetz.a
	-rm -f $(DESTDIR)$(bindir)/akfnetzserver
	-rm -f $(DESTDIR)$(bindir)/akfwebserver
	-rm -f $(DESTDIR)$(bindir)/akfnetz
	-rm -f $(DESTDIR)$(bindir)/akfweb
	-rm -f $(DESTDIR)$(bindir)/akfweb-dl
	-rm -f $(DESTDIR)$(bindir)/akfgopher
	-rm -f $(DESTDIR)$(bindir)/akfgopher-dl
	-rm -f $(DESTDIR)$(bindir)/akfgb
	-rm -f $(DESTDIR)$(bindir)/gophermenu
	-rm -f $(DESTDIR)$(bindir)/akfgopherserver
	-rm -f $(DESTDIR)$(bindir)/akfnetztyp
	-rm -f $(DESTDIR)$(bindir)/akfnetzpass
	-rm -f $(DESTDIR)$(bindir)/akfquery
	-rm -f $(DESTDIR)$(bindir)/akfscraper
	-rm -f $(DESTDIR)$(bindir)/akfzufall
	-rm -f $(DESTDIR)$(bindir)/akfbase64
	-rm -f $(DESTDIR)$(mandir)/man1/akfnetz.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfweb.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfweb-dl.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfnetzserver.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfwebserver.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfquery.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfnetzpass.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfscraper.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfbase64.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfgopher.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfgopher-dl.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfgb.1
	-rm -f $(DESTDIR)$(mandir)/man1/akfgopherserver.1
	-rm -f $(DESTDIR)$(mandir)/de/man1/akfweb-dl.1
	-rm -f $(DESTDIR)$(mandir)/de/man1/akfwebserver.1
	-rm -f $(DESTDIR)$(mandir)/de/man1/akfquery.1
	-rm -f $(DESTDIR)$(mandir)/de/man1/akfnetzpass.1
	-rm -f $(DESTDIR)$(mandir)/de/man1/akfscraper.1
	-rm -f $(DESTDIR)$(mandir)/de/man1/akfbase64.1
	-rm -f $(DESTDIR)$(mandir)/de/man1/akfgopher-dl.1
	-rm -f $(DESTDIR)$(mandir)/de/man1/akfgb.1
	-rm -f $(DESTDIR)$(mandir)/de/man1/akfgopherserver.1

clean:
	rm -f *~
	rm -f *.o
	rm -f a.out
	rm -f VerzStil.h FehlerStil.h
	rm -f cgi-src/*~
	rm -f Systemfehler.c
	rm -f libakfnetz.a
	rm -f akfwebserver
	rm -f akfgopherserver
	rm -f akfnetzserver akfnetz
	rm -f akfindexer akfweb-dl akfnetzpass akfscraper
	rm -f akfquery cgi-src/akfquery
	rm -f akfnetztyp
	rm -f akfgopher-dl
	rm -f akfgb
	rm -f akfzufall
	rm -f akfbase64
	rm -f akfnetztest
	rm -f iconimport
	$(MAKE) -C cgi-src clean

distclean: clean
	rm -f favicon.c binimport
	rm -f akfnetz*.tar.gz akfnetz*.tar.gz.sig
	$(MAKE) -C doc distclean

dist: akfnetz.tar.gz

akfnetz.tar.gz:
	mkdir /tmp/akfnetz
	cp $(QUELLEN) Makefile COPYING akfindexer-de.text GPLv3-??.html \
	   /tmp/akfnetz/
	mkdir /tmp/akfnetz/doc
	cp doc/Makefile doc/akfwebserver.??.man doc/akfweb-dl.??.man \
	doc/akfnetzpass.??.man doc/akfquery.??.man \
	doc/akfscraper.??.man doc/akfbase64.??.man \
	doc/akfgopher-dl.??.man doc/akfgb.??.man \
	doc/akfgopherserver.??.man \
	/tmp/akfnetz/doc
	mkdir /tmp/akfnetz/cgi-src
	cp cgi-src/Makefile $(CGI) $(CGISRC) /tmp/akfnetz/cgi-src/
	cp cgi-src/Sprache.??.html cgi-src/gopherweb.??.html /tmp/akfnetz/cgi-src/
	mkdir /tmp/akfnetz/cgi-src/homepage
	cp cgi-src/homepage/* /tmp/akfnetz/cgi-src/homepage/
	tar czf akfnetz.tar.gz -C /tmp --owner=root --group=root akfnetz
	rm -rf /tmp/akfnetz



# Das folgende ist nur fuer den Paket-Betreuer.
# Es wird evtl. zusaetzliche Software benoetigt, sowie Server-Zugriff
.PHONY: public public-bin musl dist-bin
.PHONY: dist-arm dist-aarch64 dist-x86 dist-amd64

musl:
	$(MAKE) all CC=musl-gcc LDFLAGS="-static" \
	  CPPFLAGS+="-DFehlermeldung=akfnetz_Systemfehler"

dist-bin: all pdf
	mkdir /tmp/akfnetz
	cp COPYING GPLv3-??.html \
	   akfwebserver akfgopherserver \
	   akfweb-dl akfnetzpass akfscraper akfbase64 \
	   akfnetztyp akfgopher-dl gophermenu akfgb \
	   /tmp/akfnetz/
	mkdir /tmp/akfnetz/doc
	cp doc/akfwebserver.??.man doc/akfwebserver.??.pdf \
	   doc/akfquery.??.man doc/akfquery.??.pdf \
	   doc/akfweb-dl.??.man doc/akfweb-dl.??.pdf \
	   doc/akfnetzpass.??.man doc/akfnetzpass.??.pdf \
	   doc/akfscraper.??.man doc/akfscraper.??.pdf \
	   doc/akfbase64.??.man doc/akfbase64.??.pdf \
	   doc/akfgopher-dl.??.man doc/akfgopher-dl.??.pdf \
	   doc/akfgb.??.man doc/akfgb.??.pdf \
	   doc/akfgopherserver.??.man doc/akfgopherserver.??.pdf \
	  /tmp/akfnetz/doc
	mkdir /tmp/akfnetz/cgi-src
	cp $(CGI) akfquery cgi-src/beispiel_c.cgi cgi-src/hochladen.cgi \
	   cgi-src/var.cgi cgi-src/Sprache.cgi cgi-src/Sprache.??.html \
	   cgi-src/gopherweb.cgi cgi-src/gopherweb.??.html \
	   cgi-src/GopherStil.css \
	   /tmp/akfnetz/cgi-src/
	mkdir /tmp/akfnetz/cgi-src/homepage
	cp cgi-src/homepage/* /tmp/akfnetz/cgi-src/homepage/
	tar czf akfnetz.bin.linux.$(ARCH).tar.gz -C /tmp \
	  --owner=root --group=root akfnetz/
	rm -rf /tmp/akfnetz

dist-arm: clean pdf
	$(MAKE) dist-bin ARCH=armv7l CC=arm-linux-musleabihf-gcc AR=arm-linux-gnueabihf-ar \
	  LDFLAGS="-static -s" CPPFLAGS="-DFehlermeldung=akfnetz_Systemfehler"

dist-aarch64: clean pdf
	$(MAKE) dist-bin ARCH=aarch64 CC=aarch64-linux-musl-gcc AR=aarch64-linux-gnu-ar \
	  LDFLAGS="-static -s" CPPFLAGS="-DFehlermeldung=akfnetz_Systemfehler"

dist-x86: clean pdf
	$(MAKE) dist-bin ARCH=x86 \
	  CC="i386-linux-musl-gcc -march=i486 -mtune=generic" \
	  AR=i686-linux-gnu-ar LDFLAGS="-static -s" \
	  CPPFLAGS="-DFehlermeldung=akfnetz_Systemfehler"

dist-amd64: clean pdf
	$(MAKE) dist-bin ARCH=x86_64 \
	CC="x86_64-linux-musl-gcc -march=x86-64 -mtune=generic"\
	  AR=x86_64-linux-gnu-ar LDFLAGS="-static -s" \
	  CPPFLAGS="-DFehlermeldung=akfnetz_Systemfehler"

public: akfnetz.tar.gz text pdf
	-gpg -b akfnetz.tar.gz
	date -I > Version.txt
	-cp akfnetz.tar.gz Version.txt \
	  /media/share/download/akf-software/akfnetz/
	-cp akfnetz.tar.gz.sig \
	  /media/share/download/akf-software/akfnetz/
	-cp doc/*.??.pdf doc/*.??.text /media/share/download/akf-software/akfnetz/man/
	scp akfnetz.tar.gz Version.txt \
	  $(SERVER):~/html/dl/akf-software/akfnetz/
	-scp akfnetz.tar.gz.sig \
	  $(SERVER):~/html/dl/akf-software/akfnetz/
	scp doc/*.??.pdf doc/*.??.text $(SERVER):~/html/dl/akf-software/akfnetz/man/

public-bin:
	-cp akfnetz.bin.*.tar.gz /media/share/download/akf-software/akfnetz/
	scp akfnetz.bin.*.tar.gz $(SERVER):~/html/dl/akf-software/akfnetz/
