# Makefile for Unix Inform 6 Compiler and Standard Library.
# GNU make is required.

# Your C compiler
#CC ?= gcc
#CC ?= clang

#OPTS = -g -Wall -Wextra

PREFIX ?= /usr/local
MAN_PREFIX = $(PREFIX)

COMPVERSION = 6.34
LIBVERSION = 6.12.4
PKGVERSION = 1
NAME = inform
LANGUAGE = english
BINNAME = $(NAME)
DISTNAME = $(BINNAME)-$(COMPVERSION)-$(LIBVERSION)-$(PKGVERSION)
UNAME := $(shell uname -s)

GIT = git
GIT_DIR ?= .git
SRC = src
LIBSRC = lib
DEMO = demos
TUTOR = tutor

BINDIR     = $(PREFIX)/bin
SHAREDIR   = $(PREFIX)/share
LIBDIR     = $(SHAREDIR)/$(BINNAME)/lib
INCLUDEDIR = $(SHAREDIR)/$(BINNAME)/include
DEMODIR    = $(SHAREDIR)/$(BINNAME)/demos
TUTORDIR   = $(SHAREDIR)/$(BINNAME)/tutor
MANDIR     = $(SHAREDIR)/man/man1
TEMPDIR    = /tmp

DEFINES= -DUNIX -DDefault_Language=\"$(LANGUAGE)\" -DInclude_Directory=\",$(LIBDIR),$(INCLUDEDIR)\" -DTemporary_Directory=\"$(TEMPDIR)\"

MANPAGE    = $(NAME).1

LIB_FILES  = $(wildcard ${LIBSRC}/*)
SOURCES = $(wildcard ${SRC}/*.c)
OBJECTS = $(patsubst %.c,%.o,${SOURCES})

LIB_LINKS = English.h Grammar.h Parser.h Verblib.h VerbLib.h

DEMO_SRC = $(wildcard ${DEMO}/*.inf)
DEMO_Z5  = $(patsubst %.inf,%.z5,${DEMO_SRC})

TUTOR_SRC = $(wildcard ${TUTOR}/*.inf)
TUTOR_Z5  = $(patsubst %.inf,%.z5,${TUTOR_SRC})

ifeq ($(shell touch $(PREFIX)/ctesta $(PREFIX)/ctestA 2>/dev/null && ls $(PREFIX)/ctest? | wc -l | sed 's/^ *//g'), 2)
CASETEST = yes
endif

.PHONY: all clean distclean lib

all:	$(BINNAME) lib demos tutor

# Rules
%.o: %.c
	$(CC) $(DEFINES) $(OPTS) -o $@ -c $<

$(BINNAME): $(OBJECTS)
	$(CC) -o $(BINNAME) $(OBJECTS)
	@echo "** Done building compiler."

%.z5: %.inf
	$(PWD)/$(BINNAME) +lib $< $@

demos:	$(BINNAME) $(DEMO_Z5)
	@echo "** Done building demos."

tutor:	$(BINNAME) $(TUTOR_Z5)
	@echo "** Done building tutorials."

strip: $(BINNAME)
	strip $(BINNAME)

submodule: submodules
submodules:
ifneq ($(and $(wildcard $(GIT_DIR)),$(shell which $(GIT))),)
	rm -rf $(SRC) $(LIBSRC)
	@echo "** Downloading compiler and library source code..."
	@$(GIT) submodule init
	@$(GIT) submodule update
	@$(GIT) submodule update
else
	@echo "Not in a git repository or git command missing."
	@echo "Just try \"make\" now."
endif

install: install-compiler install-lib install-includes install-manual install-demos install-tutor install-contrib

install-compiler: $(BINNAME)
	install -d -m 755 $(DESTDIR)$(BINDIR)
	install -c -m 755 $(BINNAME) $(DESTDIR)$(BINDIR)

install-includes:
	install -d -m 755 $(DESTDIR)$(INCLUDEDIR)
	install -c -m 644 $(wildcard include/*) $(DESTDIR)$(INCLUDEDIR)

install-manual:
	install -d -m 755 $(DESTDIR)$(MANDIR)
	install -c -m 644 $(MANPAGE) $(DESTDIR)$(MANDIR)

install-demos:	demos
	install -d -m 755 $(DESTDIR)$(DEMODIR)
	install -c -m 644 $(wildcard ${DEMO}/*) $(DESTDIR)$(DEMODIR)

install-tutor: tutor
	install -d -m 755 $(DESTDIR)$(TUTORDIR)
	install -c -m 644 $(wildcard ${TUTOR}/*) $(DESTDIR)$(TUTORDIR)

install-contrib:
	install -c -m 755 contrib/pblorb.pl $(DESTDIR)$(BINDIR)
	install -c -m 755 contrib/scanblorb.pl $(DESTDIR)$(BINDIR)
	cd $(DESTDIR)$(BINDIR) ; ln -s pblorb.pl pblorb
	cd $(DESTDIR)$(BINDIR) ; ln -s scanblorb.pl scanblorb

install-lib:
	install -d -m 755 $(DESTDIR)$(LIBDIR)
	install -c -m 644 $(wildcard ${LIBSRC}/*) $(DESTDIR)$(LIBDIR)
	@rm -f $(DESTDIR)$(LIBDIR)/ctest?
ifdef CASETEST
	@echo "Adding library symlinks to installation."
	@ cd $(DESTDIR)$(LIBDIR);				\
	for file in $(LIB_LINKS); do				\
		realfile=`echo $$file | tr '[A-Z]' '[a-z]'`;	\
		echo "  $$file -> $$realfile";			\
		test -r $$file || ln -s $$realfile $$file;	\
	done
else
	@echo "Not adding library symlinks to installation."
endif

install-strip: strip install

uninstall:
	rm -f $(DESTDIR)$(BINDIR)/$(BINNAME)
	rm -f $(DESTDIR)$(BINDIR)/pblorb*
	rm -f $(DESTDIR)$(BINDIR)/scanblorb*
	rm -rf $(LIBDIR)
	rm -rf $(INCLUDEDIR)
	rm -rf $(DEMODIR)
	rm -rf $(TUTORDIR)

dist: distclean
	mkdir $(DISTNAME)
	@for file in `ls`; do \
		if test $$file != $(DISTNAME); then \
			cp -Rp $$file $(DISTNAME)/$$file; \
		fi; \
	done
	find $(DISTNAME) -type l -exec rm -f {} \;
	rm -rf $(DISTNAME)/${SRC}/.git* $(DISTNAME)/${SRC}/.deps
	rm -rf $(DISTNAME)/${LIBSRC}/.git* $(DISTNAME)/${LIBSRC}/.deps
	tar chof $(DISTNAME).tar $(DISTNAME)
	gzip -f --best $(DISTNAME).tar
	rm -rf $(DISTNAME)
	@echo
	@echo "$(DISTNAME).tar.gz created"
	@echo

clean:
	rm -f $(BINNAME)
	rm -f ${SRC}/*.o
	rm -f ${DEMO}/*z5
	rm -f ${TUTOR}/*z5
	rm -f $(LIBSRC)/ctest? $(LIBSRC)/ctest?

gitclean:
ifneq ($(and $(wildcard $(GIT_DIR)),$(shell which $(GIT))),)
	$(GIT) clean -fdx
else
	@echo "Not in a git repository or git command missing."
endif

distclean: clean
	find . -name *core -exec rm -f {} \;
	-rm -rf $(DISTNAME)
	-rm -f $(DISTNAME).tar $(DISTNAME).tar.gz


