include common.mk

VERSION=$(shell dpkg-parsechangelog --show-field Version)

DISTROS=debian11 ubuntu2110
PROJECTNAME=webserver
PLUGINS= \
         cgi \
         fcgi \
         redirect \
         static-files \
         statistics \
         webbox \
         weblog

CXXFLAGS+=-fPIE -DVERSION=\"$(VERSION)\"

LDLIBS+=\
-lcommon \
-lboost_context \
-lboost_filesystem \
-lboost_timer \
-lboost_system \
-lcrypt \
-lssl -lcrypto \
-lpthread \
-ldl

#-lboost_coroutine \
#-lboost_program_options \
#-lboost_thread \
#-lboost_regex \

LDFLAGS+=-pie -Llibcommon

PROGSRC=\
    auth.cpp \
    base64.cpp \
    config.cpp \
    http.cpp \
    https.cpp \
    os.cpp \
    plugin.cpp \
    privileges.cpp \
    response.cpp \
    statistics.cpp \
    server.cpp

SRC=$(PROGSRC) webserver.cpp

build: $(PROJECTNAME) $(PLUGINS)

all: build
	./webserver -c webserver.conf

$(PROJECTNAME): libcommon/libcommon.a $(SRC:.cpp=.o)
	$(CXX) $(LDFLAGS) $^ $(LDLIBS) $(LIBS) -o $@

libcommon/libcommon.a:
	$(MAKE) -C libcommon

$(PLUGINS):
	cd plugins/$@ && $(MAKE)

%.d: %.cpp
	$(CXX) $(CXXFLAGS) -MM -MP -MF $@ -c $<

%.o: %.cpp %.d
	$(CXX) $(CXXFLAGS) -c $< -o $@

# dependencies

ADD_DEP=Makefile

test:
	$(MAKE) -C tests

install:
	mkdir -p $(DESTDIR)/usr/bin
	cp webserver $(DESTDIR)/usr/bin

	mkdir -p $(DESTDIR)/usr/lib/webserver/plugins
	set -e ; for i in $(PLUGINS) ; do make -C plugins/$$i install ; done

	mkdir -p $(DESTDIR)/usr/local/lib/webserver/plugins

	#mkdir -p $(DESTDIR)/etc
	#cp webserver.conf $(DESTDIR)/etc/webserver.conf

# misc ---------------------------------------------------
deb:
	# build binary deb package
	dpkg-buildpackage -rfakeroot

deb-src:
	dh_clean
	dh_auto_clean
	dpkg-source -b -I.git -Iresult -Ifastcgi -Icgi-bin .

$(DISTROS): deb-src
	sudo pbuilder build --basetgz /var/cache/pbuilder/$@.tgz --buildresult result/$@ ../webserver_$(VERSION).dsc
	debsign result/$@/webserver_$(VERSION)_amd64.changes

debs: $(DISTROS)

clean:
	-rm -f $(PROJECTNAME)
	-rm -f plugins/*.so
	-find . -name '*.o' -o -name '*.d' -o -name '*.gcno' -o -name '*.gcda' -o -name '*.so' | xargs rm -f
	#for i in $(PLUGINS) ; do $(MAKE) -C plugins/$$i clean ; done
	for i in libcommon tests ; do $(MAKE) -C $$i clean ; done

DISTFILES= \
	archive.h \
	auth.cpp \
	auth.h \
	base64.cpp \
	base64.h \
	config.cpp \
	config.h \
	http.cpp \
	http.h \
	https.cpp \
	https.h \
	os.cpp \
	os.h \
	plugin.cpp \
	plugin.h \
	plugin_interface.h \
	privileges.cpp \
	privileges.h \
	response.cpp \
	response.h \
	server.cpp \
	server.h \
	statistics.cpp \
	statistics.h \
	tests/Makefile \
	tests/test-webserver.cpp \
	webserver.cpp \
	webserver.1 \
	README.txt \
	LICENSE.txt \
	Makefile \
	common.mk \
	debian/changelog \
	debian/compat \
	debian/control \
	debian/copyright \
	debian/README.Debian \
	debian/rules \
	debian/source/format \
	debian/webserver.conf \
	debian/webserver.dirs \
	debian/webserver.docs \
	debian/webserver.install \
	debian/webserver.manpages \
	debian/webserver.service \
	libcommon/Makefile \
	libcommon/mime.h \
	libcommon/mime.cpp \
	libcommon/file.h \
	libcommon/file.cpp \
	libcommon/stringutil.h \
	libcommon/stringutil.cpp \
	libcommon/tempfile.h \
	libcommon/tempfile.cpp \
	libcommon/url.h \
	libcommon/url.cpp \
	plugins/cgi/cgi.h \
	plugins/cgi/Makefile \
	plugins/cgi/cgi.cpp \
	plugins/fcgi/Makefile \
	plugins/fcgi/fastcgi.h \
	plugins/fcgi/fcgi.h \
	plugins/fcgi/fcgi.cpp \
	plugins/fcgi/fcgiid.h \
	plugins/fcgi/fcgiid.cpp \
	plugins/fcgi/socket.h \
	plugins/fcgi/socket.cpp \
	plugins/webbox/webbox.h \
	plugins/webbox/html/refresh-inverted.png \
	plugins/webbox/html/directory.png \
	plugins/webbox/html/file.png \
	plugins/webbox/html/menu.png \
	plugins/webbox/html/webbox.css \
	plugins/webbox/html/favicon.ico \
	plugins/webbox/html/index.html \
	plugins/webbox/html/webbox.js \
	plugins/webbox/html/checkbox.png \
	plugins/webbox/html/checkbox-checked.png \
	plugins/webbox/Makefile \
	plugins/webbox/webbox.cpp \
	plugins/weblog/weblog.h \
	plugins/weblog/procmail/procmailrc \
	plugins/weblog/procmail/procmail.sh \
	plugins/weblog/Makefile \
	plugins/weblog/weblog.cpp \
	plugins/redirect/Makefile \
	plugins/redirect/redirect.h \
	plugins/redirect/redirect.cpp \
	plugins/static-files/static-files.h \
	plugins/static-files/static-files.cpp \
	plugins/static-files/Makefile \
	plugins/statistics/statistics.h \
	plugins/statistics/Makefile \
	plugins/statistics/statistics.cpp
	
dist: clean
	rm -rf $(PROJECTNAME)-$(VERSION)
	mkdir $(PROJECTNAME)-$(VERSION)
	cp --parents -r $(DISTFILES) $(PROJECTNAME)-$(VERSION)
	tar cfJ ../$(PROJECTNAME)-$(VERSION).tar.xz $(PROJECTNAME)-$(VERSION)
	rm -rf $(PROJECTNAME)-$(VERSION)
	ls -l ../$(PROJECTNAME)-$(VERSION).tar.xz

.PHONY: clean all zip test install deb deb-src debs all $(DISTROS) $(PLUGINS)

-include $(wildcard $(SRC:.cpp=.d))