#
# rcsid $Header: /usr/cvsroot/magic-8.0/Makefile,v 1.1.1.1 2008/02/03 20:43:49 tim Exp $
#

MAGICDIR   = .
PROGRAMS   = magic
TECHS      = scmos
LIBRARIES  = database utils extflat
MODULES    = bplane cmwind commands database dbwind debug drc extflat \
	     extract graphics netmenu plow resis select sim textio tiles \
	     utils windows wiring

# This was `cat VERSION`
VERSION    := $(shell cat ${MAGICDIR}/VERSION)

MAKEFLAGS  =
INSTALL_CAD_DIRS = windows doc ${TECHS}

-include defs.mak

all:	$(ALL_TARGET) techs

standard: mains

tcl: tcllibrary

force:
	@${MAKE} clean
	@${MAKE} all

defs.mak:
	@echo No \"defs.mak\" file found.  Run "configure" to make one.
	@exit 1

config:
	${MAGICDIR}/configure

tcllibrary: database/database.h modules
	@echo --- making Tcl shared libraries
	for dir in ${PROGRAMS}; do \
		(cd $$dir && ${MAKE} tcl-main) || exit 1; done

mains: database/database.h modules libs
	@echo --- making main programs
	for dir in ${PROGRAMS}; do \
		(cd $$dir && ${MAKE} main) || exit 1; done

database/database.h: ${MAGICDIR}/database/database.h.in
	@echo --- making header file database/database.h
	${SCRIPTS}/makedbh ${MAGICDIR}/database/database.h.in database/database.h

# tiles xyz => tiles/libtiles.o xyz/libxyz.o
MODULES_SUBDIR := $(shell for i in ${MODULES}; do echo "$${i}/lib$${i}.o"; done)
# tiles xyz => tiles/libtiles.a xyz/libxyz.a
LIBS_SUBDIR := $(shell for i in ${MODULES}; do echo "$${i}/lib$${i}.a"; done)

.PHONY: FORCE
${MODULES_SUBDIR}: FORCE
	@${MAKE} -C $(dir $@) module

.PHONY: modules
modules: database/database.h depend ${MODULES_SUBDIR}

${LIBS_SUBDIR}: FORCE
	@${MAKE} -C $(dir $@) lib

# Force the tiles/utils modules to exist first for libdatabase.a
.PHONY: libs
libs: database/database.h depend tiles/libtiles.o utils/libutils.o ${LIBS_SUBDIR}

#
# extcheck - utility tool
# net2ir   - utility tool
# oa       - disabled (needs 'clean' target renaming)
SUBDIRS = bplane cmwind commands database dbwind debug drc extflat extract graphics \
	  magic netmenu plow resis select sim textio tiles utils windows wiring

BUNDLED_MODULES = readline lisp

# Unique list of all subdir that might have Depend file, we have to deduplicate otherwise
# MAKE will warning loudly.  This list is somewhat empty when defs.mak does not exist
SUBDIRS_FILTERED := $(shell echo ${MODULES} ${PROGRAMS} ${SUBDIRS} | tr ' ' '\n' | sort | uniq)

SUBDIRS_DEPEND = $(addsuffix /Depend, ${SUBDIRS_FILTERED})

${SUBDIRS_DEPEND}: database/database.h
	@echo --- making dependencies
	${MAKE} -C $(dir $@) depend

.PHONY: depend
depend: defs.mak ${SUBDIRS_DEPEND}

.PHONY: techs
techs: depend
	@echo --- making techs
	for dir in ${TECHS}; do \
		(cd $$dir && ${MAKE} all) || exit 1; done

install: $(INSTALL_TARGET)

install-magic:
	@echo --- installing executable to $(DESTDIR)${INSTALL_BINDIR}
	@echo --- installing runtime files to $(DESTDIR)${INSTALL_LIBDIR}
	@${MAKE} install-real

install-real: install-dirs
	for dir in ${INSTALL_CAD_DIRS}; do \
		(cd $$dir && ${MAKE} install); done
	for dir in ${PROGRAMS}; do \
		(cd $$dir && ${MAKE} install); done

install-tcl-dirs:
	${MAGICDIR}/scripts/mkdirs $(DESTDIR)${INSTALL_BINDIR} \
	$(DESTDIR)${INSTALL_MANDIR} $(DESTDIR)${INSTALL_SYSDIR} \
	$(DESTDIR)${INSTALL_TCLDIR} $(DESTDIR)${INSTALL_TCLDIR}/bitmaps

install-dirs:
	${MAGICDIR}/scripts/mkdirs $(DESTDIR)${INSTALL_BINDIR} \
	$(DESTDIR)${INSTALL_MANDIR} $(DESTDIR)${INSTALL_SYSDIR} \
	$(DESTDIR)${INSTALL_SCMDIR}

install-tcl:
	@echo --- installing executable to $(DESTDIR)${INSTALL_BINDIR}
	@echo --- installing runtime files to $(DESTDIR)${INSTALL_LIBDIR}
	@${MAKE} install-tcl-real

install-tcl-real: install-tcl-dirs
	for dir in ${INSTALL_CAD_DIRS} ${PROGRAMS}; do \
		(cd $$dir && ${MAKE} install-tcl); done

clean:
	for dir in ${SUBDIRS_FILTERED} ${TECHS} ${BUNDLED_MODULES}; do \
		(cd $$dir && ${MAKE} clean); done
	${RM} *.tmp */*.tmp *.sav */*.sav *.log TAGS tags

distclean:
	touch defs.mak
	@${MAKE} clean
	${RM} defs.mak old.defs.mak ${MAGICDIR}/scripts/defs.mak
	${RM} ${MAGICDIR}/scripts/default.conf
	${RM} ${MAGICDIR}/scripts/config.log ${MAGICDIR}/scripts/config.status
	${RM} database/database.h
	${RM} scripts/magic.spec magic-${VERSION} magic-${VERSION}.tgz
	${RM} *.log

dist:
	${RM} scripts/magic.spec magic-${VERSION} magic-${VERSION}.tgz
	${SED} -e /@VERSION@/s%@VERSION@%${VERSION}% \
	    scripts/magic.spec.in > scripts/magic.spec
	${LN} -nsf . magic-${VERSION}
	tar zchvf magic-${VERSION}.tgz --exclude CVS \
	    --exclude magic-${VERSION}/magic-${VERSION} \
	    --exclude magic-${VERSION}/magic-${VERSION}.tgz \
	    magic-${VERSION}

clean-mains:
	for dir in ${PROGRAMS}; do \
		(cd $$dir && ${RM} $$dir); done

tags:
	${RM} tags
	find . ${MODULES} ${PROGRAMS} -name "*.[ch]" -maxdepth 1 | xargs ctags -o tags

TAGS:
	${RM} TAGS
	find . ${MODULES} ${PROGRAMS} -name "*.[ch]" -maxdepth 1 | xargs etags -o TAGS

setup-git:
	git config --local include.path ../.gitconfig
	git stash save
	${RM} .git/index
	git checkout HEAD -- "$$(git rev-parse --show-toplevel)"
	git stash pop
