SUBDIRS	= arch format
TARGETS	= $(OBJDIR)libAsm.a $(OBJDIR)libAsm$(SOEXT).0.0 $(OBJDIR)libAsm$(SOEXT).0 $(OBJDIR)libAsm$(SOEXT) $(OBJDIR)asm$(EXEEXT) $(OBJDIR)deasm$(EXEEXT)
OBJDIR	=
PREFIX	= /usr/local
DESTDIR	=
LIBDIR	= $(PREFIX)/lib
CC	= cc
CPPFLAGSF= -I../include
CPPFLAGS=
CFLAGSF	= `pkg-config --cflags cpp`
CFLAGS	= -W -Wall -g -O2 -D_FORTIFY_SOURCE=2 -fstack-protector
LDFLAGSF= `pkg-config --libs cpp`
LDFLAGS	= -ldl -Wl,-z,relro -Wl,-z,now
EXEEXT	=
AR	= ar
ARFLAGS	= -rc
RANLIB	= ranlib
CCSHARED= $(CC) -shared
SOEXT	= .so
BINDIR	= $(PREFIX)/bin
SBINDIR	= $(PREFIX)/sbin
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

libAsm_OBJS = $(OBJDIR)arch.o $(OBJDIR)asm.o $(OBJDIR)code.o $(OBJDIR)format.o $(OBJDIR)parser.o $(OBJDIR)token.o
libAsm_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) -fPIC
libAsm_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)

$(OBJDIR)libAsm.a: $(libAsm_OBJS)
	$(AR) $(ARFLAGS) $(OBJDIR)libAsm.a $(libAsm_OBJS)
	$(RANLIB) $(OBJDIR)libAsm.a

$(OBJDIR)libAsm$(SOEXT).0.0: $(libAsm_OBJS)
	$(CCSHARED) -o $(OBJDIR)libAsm$(SOEXT).0.0 -Wl,-soname,libAsm$(SOEXT).0 $(libAsm_OBJS) $(libAsm_LDFLAGS)

$(OBJDIR)libAsm$(SOEXT).0: $(OBJDIR)libAsm$(SOEXT).0.0
	$(LN) -s -- libAsm$(SOEXT).0.0 $(OBJDIR)libAsm$(SOEXT).0

$(OBJDIR)libAsm$(SOEXT): $(OBJDIR)libAsm$(SOEXT).0.0
	$(LN) -s -- libAsm$(SOEXT).0.0 $(OBJDIR)libAsm$(SOEXT)

asm_OBJS = $(OBJDIR)main.o
asm_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) -fPIE
asm_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) -L$(OBJDIR). -Wl,-rpath,$(LIBDIR) -lAsm -pie

$(OBJDIR)asm$(EXEEXT): $(asm_OBJS) $(OBJDIR)libAsm$(SOEXT)
	$(CC) -o $(OBJDIR)asm$(EXEEXT) $(asm_OBJS) $(asm_LDFLAGS)

deasm_OBJS = $(OBJDIR)deasm.o
deasm_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) -fPIE
deasm_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) -L$(OBJDIR). -Wl,-rpath,$(LIBDIR) -lAsm -pie

$(OBJDIR)deasm$(EXEEXT): $(deasm_OBJS) $(OBJDIR)libAsm$(SOEXT)
	$(CC) -o $(OBJDIR)deasm$(EXEEXT) $(deasm_OBJS) $(deasm_LDFLAGS)

$(OBJDIR)arch.o: arch.c ../include/Asm/arch.h ../include/Asm/asm.h arch.h code.h ../config.h
	$(CC) -D PREFIX=\"$(PREFIX)\" $(libAsm_CFLAGS) -o $(OBJDIR)arch.o -c arch.c

$(OBJDIR)asm.o: asm.c ../include/Asm.h arch.h code.h format.h parser.h ../config.h
	$(CC) -D PREFIX=\"$(PREFIX)\" $(libAsm_CFLAGS) -o $(OBJDIR)asm.o -c asm.c

$(OBJDIR)code.o: code.c ../include/Asm.h ../include/Asm/arch.h ../include/Asm/asm.h ../include/Asm/format.h arch.h code.h format.h ../config.h
	$(CC) -D PREFIX=\"$(PREFIX)\" $(libAsm_CFLAGS) -o $(OBJDIR)code.o -c code.c

$(OBJDIR)format.o: format.c ../include/Asm/asm.h ../include/Asm/format.h code.h format.h ../config.h
	$(CC) -D PREFIX=\"$(PREFIX)\" $(libAsm_CFLAGS) -o $(OBJDIR)format.o -c format.c

$(OBJDIR)parser.o: parser.c parser.h token.h
	$(CC) $(libAsm_CFLAGS) -o $(OBJDIR)parser.o -c parser.c

$(OBJDIR)token.o: token.c common.h token.h
	$(CC) $(libAsm_CFLAGS) -o $(OBJDIR)token.o -c token.c

$(OBJDIR)main.o: main.c ../include/Asm/asm.h ../config.h
	$(CC) $(asm_CFLAGS) -o $(OBJDIR)main.o -c main.c

$(OBJDIR)deasm.o: deasm.c ../include/Asm.h ../include/Asm/arch.h ../include/Asm/asm.h ../include/Asm/format.h
	$(CC) $(deasm_CFLAGS) -o $(OBJDIR)deasm.o -c deasm.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) -- $(libAsm_OBJS) $(asm_OBJS) $(deasm_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) -- $(libAsm_OBJS) $(asm_OBJS) $(deasm_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)$(LIBDIR)
	$(INSTALL) -m 0644 $(OBJDIR)libAsm.a $(DESTDIR)$(LIBDIR)/libAsm.a
	$(INSTALL) -m 0755 $(OBJDIR)libAsm$(SOEXT).0.0 $(DESTDIR)$(LIBDIR)/libAsm$(SOEXT).0.0
	$(LN) -s -- libAsm$(SOEXT).0.0 $(DESTDIR)$(LIBDIR)/libAsm$(SOEXT).0
	$(LN) -s -- libAsm$(SOEXT).0.0 $(DESTDIR)$(LIBDIR)/libAsm$(SOEXT)
	$(MKDIR) $(DESTDIR)$(BINDIR)
	$(INSTALL) -m 0755 $(OBJDIR)asm$(EXEEXT) $(DESTDIR)$(BINDIR)/asm$(EXEEXT)
	$(MKDIR) $(DESTDIR)$(BINDIR)
	$(INSTALL) -m 0755 $(OBJDIR)deasm$(EXEEXT) $(DESTDIR)$(BINDIR)/deasm$(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)$(LIBDIR)/libAsm.a
	$(RM) -- $(DESTDIR)$(LIBDIR)/libAsm$(SOEXT).0.0
	$(RM) -- $(DESTDIR)$(LIBDIR)/libAsm$(SOEXT).0
	$(RM) -- $(DESTDIR)$(LIBDIR)/libAsm$(SOEXT)
	$(RM) -- $(DESTDIR)$(BINDIR)/asm$(EXEEXT)
	$(RM) -- $(DESTDIR)$(BINDIR)/deasm$(EXEEXT)

.PHONY: all subdirs clean distclean install uninstall
