SUBDIRS	= backend debug models
TARGETS	= $(OBJDIR)console$(EXEEXT) $(OBJDIR)debugger$(EXEEXT) $(OBJDIR)gdeasm$(EXEEXT) $(OBJDIR)sequel$(EXEEXT) $(OBJDIR)simulator$(EXEEXT)
OBJDIR	=
PREFIX	= /usr/local
DESTDIR	=
BINDIR	= $(PREFIX)/bin
SBINDIR	= $(PREFIX)/sbin
CC	= cc
CPPFLAGSF=
CPPFLAGS=
CFLAGSF	= `pkg-config --cflags libDesktop`
CFLAGS	= -W -Wall -g -O2 -pedantic -D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIE
LDFLAGSF= `pkg-config --libs libDesktop`
LDFLAGS	= -pie -Wl,-z,relro -Wl,-z,now
EXEEXT	=
RM	= rm -f
LN	= ln -f
MKDIR	= mkdir -m 0755 -p
INSTALL	= install


all: subdirs $(TARGETS)

subdirs:
	@for i in $(SUBDIRS); do (cd "$$i" && \
		if [ -n "$(OBJDIR)" ]; then \
		([ -d "$(OBJDIR)$$i" ] || $(MKDIR) -- "$(OBJDIR)$$i") && \
		$(MAKE) OBJDIR="$(OBJDIR)$$i/"; \
		else $(MAKE); fi) || exit; done

console_OBJS = $(OBJDIR)console.o
console_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
console_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)

$(OBJDIR)console$(EXEEXT): $(console_OBJS)
	$(CC) -o $(OBJDIR)console$(EXEEXT) $(console_OBJS) $(console_LDFLAGS)

debugger_OBJS = $(OBJDIR)debugger.o $(OBJDIR)debugger-main.o
debugger_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) `pkg-config --cflags Asm`
debugger_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) `pkg-config --libs Asm`

$(OBJDIR)debugger$(EXEEXT): $(debugger_OBJS)
	$(CC) -o $(OBJDIR)debugger$(EXEEXT) $(debugger_OBJS) $(debugger_LDFLAGS)

gdeasm_OBJS = $(OBJDIR)gdeasm.o $(OBJDIR)gdeasm-main.o
gdeasm_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) `pkg-config --cflags Asm`
gdeasm_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) `pkg-config --libs Asm`

$(OBJDIR)gdeasm$(EXEEXT): $(gdeasm_OBJS)
	$(CC) -o $(OBJDIR)gdeasm$(EXEEXT) $(gdeasm_OBJS) $(gdeasm_LDFLAGS)

sequel_OBJS = $(OBJDIR)sequel.o $(OBJDIR)sequel-main.o
sequel_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) `pkg-config --cflags libDatabase`
sequel_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) `pkg-config --libs libDatabase`

$(OBJDIR)sequel$(EXEEXT): $(sequel_OBJS)
	$(CC) -o $(OBJDIR)sequel$(EXEEXT) $(sequel_OBJS) $(sequel_LDFLAGS)

simulator_OBJS = $(OBJDIR)simulator.o $(OBJDIR)simulator-main.o
simulator_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) `pkg-config --cflags x11`
simulator_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) `pkg-config --libs x11` -lXtst

$(OBJDIR)simulator$(EXEEXT): $(simulator_OBJS)
	$(CC) -o $(OBJDIR)simulator$(EXEEXT) $(simulator_OBJS) $(simulator_LDFLAGS)

$(OBJDIR)console.o: console.c ../config.h
	$(CC) $(console_CFLAGS) -o $(OBJDIR)console.o -c console.c

$(OBJDIR)debugger.o: debugger.c backend.h common.h debug.h debugger.h ../config.h
	$(CC) $(debugger_CFLAGS) -o $(OBJDIR)debugger.o -c debugger.c

$(OBJDIR)debugger-main.o: debugger-main.c common.h debugger.h ../config.h
	$(CC) $(debugger_CFLAGS) -o $(OBJDIR)debugger-main.o -c debugger-main.c

$(OBJDIR)gdeasm.o: gdeasm.c ../config.h
	$(CC) $(gdeasm_CFLAGS) -o $(OBJDIR)gdeasm.o -c gdeasm.c

$(OBJDIR)gdeasm-main.o: gdeasm-main.c
	$(CC) $(gdeasm_CFLAGS) -o $(OBJDIR)gdeasm-main.o -c gdeasm-main.c

$(OBJDIR)sequel.o: sequel.c sequel.h
	$(CC) $(sequel_CFLAGS) -o $(OBJDIR)sequel.o -c sequel.c

$(OBJDIR)sequel-main.o: sequel-main.c sequel.h
	$(CC) $(sequel_CFLAGS) -o $(OBJDIR)sequel-main.o -c sequel-main.c

$(OBJDIR)simulator.o: simulator.c simulator.h ../config.h
	$(CC) -D PREFIX=\"$(PREFIX)\" $(simulator_CFLAGS) -o $(OBJDIR)simulator.o -c simulator.c

$(OBJDIR)simulator-main.o: simulator-main.c simulator.h
	$(CC) $(simulator_CFLAGS) -o $(OBJDIR)simulator-main.o -c simulator-main.c

clean:
	@for i in $(SUBDIRS); do (cd "$$i" && \
		if [ -n "$(OBJDIR)" ]; then \
		$(MAKE) OBJDIR="$(OBJDIR)$$i/" clean; \
		else $(MAKE) clean; fi) || exit; done
	$(RM) -- $(console_OBJS) $(debugger_OBJS) $(gdeasm_OBJS) $(sequel_OBJS) $(simulator_OBJS)

distclean:
	@for i in $(SUBDIRS); do (cd "$$i" && \
		if [ -n "$(OBJDIR)" ]; then \
		$(MAKE) OBJDIR="$(OBJDIR)$$i/" distclean; \
		else $(MAKE) distclean; fi) || exit; done
	$(RM) -- $(console_OBJS) $(debugger_OBJS) $(gdeasm_OBJS) $(sequel_OBJS) $(simulator_OBJS)
	$(RM) -- $(TARGETS)

install: all
	@for i in $(SUBDIRS); do (cd "$$i" && \
		if [ -n "$(OBJDIR)" ]; then \
		$(MAKE) OBJDIR="$(OBJDIR)$$i/" install; \
		else $(MAKE) install; fi) || exit; done
	$(MKDIR) $(DESTDIR)$(BINDIR)
	$(INSTALL) -m 0755 $(OBJDIR)console$(EXEEXT) $(DESTDIR)$(BINDIR)/console$(EXEEXT)
	$(MKDIR) $(DESTDIR)$(BINDIR)
	$(INSTALL) -m 0755 $(OBJDIR)debugger$(EXEEXT) $(DESTDIR)$(BINDIR)/debugger$(EXEEXT)
	$(MKDIR) $(DESTDIR)$(BINDIR)
	$(INSTALL) -m 0755 $(OBJDIR)gdeasm$(EXEEXT) $(DESTDIR)$(BINDIR)/gdeasm$(EXEEXT)
	$(MKDIR) $(DESTDIR)$(BINDIR)
	$(INSTALL) -m 0755 $(OBJDIR)sequel$(EXEEXT) $(DESTDIR)$(BINDIR)/sequel$(EXEEXT)
	$(MKDIR) $(DESTDIR)$(BINDIR)
	$(INSTALL) -m 0755 $(OBJDIR)simulator$(EXEEXT) $(DESTDIR)$(BINDIR)/simulator$(EXEEXT)

uninstall:
	@for i in $(SUBDIRS); do (cd "$$i" && \
		if [ -n "$(OBJDIR)" ]; then \
		$(MAKE) OBJDIR="$(OBJDIR)$$i/" uninstall; \
		else $(MAKE) uninstall; fi) || exit; done
	$(RM) -- $(DESTDIR)$(BINDIR)/console$(EXEEXT)
	$(RM) -- $(DESTDIR)$(BINDIR)/debugger$(EXEEXT)
	$(RM) -- $(DESTDIR)$(BINDIR)/gdeasm$(EXEEXT)
	$(RM) -- $(DESTDIR)$(BINDIR)/sequel$(EXEEXT)
	$(RM) -- $(DESTDIR)$(BINDIR)/simulator$(EXEEXT)

.PHONY: all subdirs clean distclean install uninstall
