#!/usr/bin/make -f
#
# Makefile for Obumbrata et Velata

include dirs.mk
include features.mk

vpath %.o .
GENERATED_OBJS:=permobj.o permons.o 
GENERATED_SOURCE:=permobj.cc pobj_id.hh permons.cc pmon_id.hh
GENERATED_MAKES:=dirs.mk features.mk
HANDWRITTEN_OBJS:=cave.o combat.o combo.o coord.o deeds.o display-nc.o dungeon.o fov.o log.o main.o map.o mon1.o mon2.o mon3.o notify-local-tty.o obj1.o obj2.o pmon2.o rng.o role.o shrine.o skills.o sorcery.o u.o util.o
OBJS:=$(GENERATED_OBJS) $(HANDWRITTEN_OBJS)
GAME:=obumbrata
MAJVERS:=1
MINVERS:=0
PATCHVERS:=0
COMMON_CFLAGS:=-Wall -Wwrite-strings -Wunreachable-code -Wformat -Werror=format-security -fstack-protector --param=ssp-buffer-size=4 -DMAJVERS=$(MAJVERS) -DMINVERS=$(MINVERS) -DPATCHVERS=$(PATCHVERS)-std=gnu11 -D_FORTIFY_SOURCE=2 -I$(srcdir)
COMMON_CXXFLAGS:=-Wall -Wwrite-strings -Wno-unused-but-set-variable -Wredundant-decls -Wunreachable-code -Wformat -Werror=format-security -fstack-protector --param=ssp-buffer-size=4 -DMAJVERS=$(MAJVERS) -DMINVERS=$(MINVERS) -DPATCHVERS=$(PATCHVERS) -std=gnu++11 -D_FORTIFY_SOURCE=2 -I$(srcdir)
PRODUCTION_CFLAGS:=$(COMMON_CFLAGS) -O2 
DEVELOPMENT_CFLAGS:=$(COMMON_CFLAGS) -g -Werror
PRODUCTION_CXXFLAGS:=$(COMMON_CXXFLAGS) -O2 
DEVELOPMENT_CXXFLAGS:=$(COMMON_CXXFLAGS) -g -Werror
LIBS=-lpanelw -lncursesw -lxdg-basedir -lm
ARCHIVEDIR:=$(GAME)-$(MAJVERS).$(MINVERS).$(PATCHVERS)
ARCHIVENAME:=$(GAME)_$(MAJVERS).$(MINVERS).$(PATCHVERS)
COMMON_LDFLAGS:=-Wl,-z,relro
DEVELOPMENT_LDFLAGS:=$(COMMON_LDFLAGS) -g

## PHONY targets in this section, please

.PHONY: all archive clean code-docs code-docs-clean debianize-archive install my-debworkflow my-debclean spotless

all: $(GAME)

archive: clean ./permobj.cc ./pobj_id.hh
	mkdir $(ARCHIVEDIR)
	cp `cat MANIFEST` $(ARCHIVEDIR)
	tar czf $(ARCHIVENAME).tar.gz $(ARCHIVEDIR)
	rm -r $(ARCHIVEDIR)

debianize-archive: archive
	mv $(ARCHIVENAME).tar.gz $(ARCHIVENAME).orig.tar.gz

my-debworkflow: my-debclean debianize-archive
	mkdir archive-test
	mv $(ARCHIVENAME).orig.tar.gz archive-test
	(cd archive-test && tar xzf $(ARCHIVENAME).orig.tar.gz)
	cp -R debian archive-test/$(ARCHIVEDIR)/debian
	(cd archive-test/$(ARCHIVEDIR) && debuild -uc -us)

my-debclean:
	-rm -rf archive-test

clean:
	-rm -rf $(ARCHIVEDIR)
	-rm -f *.o $(GAME) *.tar.gz

code-docs:
	doxygen Doxyfile

code-docs-clean:
	-rm -rf html latex

gitclean: spotless
	-rm -rf $(GENERATED_MAKES)

generated-clean: 
	-rm -f $(GENERATED_SOURCE)

install: all
	echo "man6dir is $(man6dir)"
	install -D $(GAME) $(DESTDIR)$(gamesdir)/$(GAME)
	install -D $(GAME).6 $(DESTDIR)$(man6dir)/$(GAME).6

spotless: clean code-docs-clean my-debclean generated-clean

## Real targets only after this point please

$(GAME): $(OBJS)
	$(CXX) $(DEVELOPMENT_LDFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $(GAME)

%.o: $(srcdir)/%.cc
	$(CXX) -c $(DEVELOPMENT_CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS) $< -o $@

%.o: $(srcdir)/%.c
	$(CC) -c $(DEVELOPMENT_CFLAGS) $(CPPFLAGS) $(CFLAGS) $< -o $@

## Dependencies for autogeneration
permobj.cc pobj_id.hh: $(srcdir)/default.permobjs $(srcdir)/pobj_comp
	$(srcdir)/pobj_comp $<

permons.cc pmon_id.hh: $(srcdir)/default.permons $(srcdir)/pmon_comp
	$(srcdir)/pmon_comp $<
## Dependencies for the build
cave.o: $(srcdir)/cave.cc $(srcdir)/$(GAME).hh $(srcdir)/map.hh $(srcdir)/mapgen.hh

combat.o: $(srcdir)/combat.cc $(srcdir)/combat.hh $(srcdir)/$(GAME).hh $(srcdir)/monsters.hh $(srcdir)/objects.hh $(srcdir)/notify.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

combo.o: $(srcdir)/combo.cc $(srcdir)/combat.hh $(srcdir)/$(GAME).hh $(srcdir)/notify.hh $(srcdir)/monsters.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

coord.o: $(srcdir)/coord.cc $(srcdir)/coord.hh

deeds.o: $(srcdir)/deeds.cc $(srcdir)/combat.hh $(srcdir)/$(GAME).hh $(srcdir)/notify.hh $(srcdir)/monsters.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

display-nc.o: $(srcdir)/display-nc.cc $(srcdir)/$(GAME).hh $(srcdir)/display.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh $(srcdir)/map.hh $(srcdir)/objects.hh $(srcdir)/monsters.hh $(srcdir)/permon.hh $(srcdir)/permobj.hh

log.o: $(srcdir)/log.cc $(srcdir)/objects.hh $(srcdir)/monsters.hh $(srcdir)/player.hh $(srcdir)/map.hh $(srcdir)/util.h

main.o: $(srcdir)/main.cc $(srcdir)/combat.hh $(srcdir)/$(GAME).hh $(srcdir)/monsters.hh $(srcdir)/notify.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

map.o: $(srcdir)/map.cc $(srcdir)/$(GAME).hh $(srcdir)/map.hh $(srcdir)/core.hh $(srcdir)/notify.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

mon1.o: $(srcdir)/mon1.cc $(srcdir)/$(GAME).hh $(srcdir)/monsters.hh $(srcdir)/notify.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

mon2.o: $(srcdir)/mon2.cc $(srcdir)/$(GAME).hh $(srcdir)/sorcery.hh $(srcdir)/monsters.hh $(srcdir)/map.hh $(srcdir)/notify.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

mon3.o: $(srcdir)/mon3.cc $(srcdir)/$(GAME).hh $(srcdir)/monsters.hh $(srcdir)/notify.hh $(srcdir)/map.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

notify-local-tty.o: $(srcdir)/notify-local-tty.cc $(srcdir)/$(GAME).hh $(srcdir)/combat.hh $(srcdir)/monsters.hh $(srcdir)/notify.hh $(srcdir)/objects.hh $(srcdir)/sorcery.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

permobj.o: ./permobj.cc $(srcdir)/core.hh $(srcdir)/permobj.hh

permons.o: ./permons.cc $(srcdir)/core.hh $(srcdir)/permon.hh

pmon2.o: $(srcdir)/pmon2.cc $(srcdir)/$(GAME).hh $(srcdir)/notify.hh $(srcdir)/monsters.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

obj1.o: $(srcdir)/obj1.cc $(srcdir)/$(GAME).hh $(srcdir)/notify.hh $(srcdir)/objects.hh $(srcdir)/monsters.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

obj2.o: $(srcdir)/obj2.cc $(srcdir)/$(GAME).hh $(srcdir)/notify.hh $(srcdir)/objects.hh $(srcdir)/monsters.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

rng.o: $(srcdir)/rng.cc $(srcdir)/rng.hh

role.o: $(srcdir)/role.cc $(srcdir)/combat.hh $(srcdir)/$(GAME).hh $(srcdir)/notify.hh $(srcdir)/monsters.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

shrine.o: $(srcdir)/shrine.cc $(srcdir)/$(GAME).hh $(srcdir)/notify.hh $(srcdir)/objects.hh $(srcdir)/monsters.hh $(srcdir)/map.hh $(srcdir)/mapgen.hh

skills.o: $(srcdir)/skills.cc $(srcdir)/combat.hh $(srcdir)/$(GAME).hh $(srcdir)/notify.hh $(srcdir)/monsters.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

sorcery.o: $(srcdir)/sorcery.cc $(srcdir)/$(GAME).hh $(srcdir)/notify.hh $(srcdir)/sorcery.hh $(srcdir)/objects.hh $(srcdir)/monsters.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

u.o: $(srcdir)/u.cc $(srcdir)/combat.hh $(srcdir)/$(GAME).hh $(srcdir)/notify.hh $(srcdir)/monsters.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh

util.o: $(srcdir)/util.c $(srcdir)/util.h

# vim:ts=8:sts=8:sw=8:noexpandtab
