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

MODULE   = magic
MAGICDIR = ..

include ${MAGICDIR}/defs.mak

SRCS     = magicTop.c
ifeq (${MAKE_WASM},1)
SRCS    += magicWasm.c
endif

EXTRA_LIBS = ${MAGICDIR}/bplane/libbplane.o \
	    ${MAGICDIR}/cmwind/libcmwind.o \
	    ${MAGICDIR}/commands/libcommands.o \
	    ${MAGICDIR}/database/libdatabase.o \
	    ${MAGICDIR}/dbwind/libdbwind.o \
	    ${MAGICDIR}/drc/libdrc.o \
	    ${MAGICDIR}/debug/libdebug.o \
	    ${MAGICDIR}/extract/libextract.o \
	    ${MAGICDIR}/graphics/libgraphics.o \
	    ${MAGICDIR}/select/libselect.o \
	    ${MAGICDIR}/textio/libtextio.o \
	    ${MAGICDIR}/tiles/libtiles.o \
	    ${MAGICDIR}/windows/libwindows.o \
	    ${MAGICDIR}/wiring/libwiring.o \
	    ${MAGICDIR}/resis/libresis.o \
	    ${MAGICDIR}/sim/libsim.o \
	    ${MAGICDIR}/netmenu/libnetmenu.o \
	    ${MAGICDIR}/plow/libplow.o \
	    ${MAGICDIR}/utils/libutils.o \
	    ${MAIN_EXTRA_LIBS}

BITMAPS = up.gif down.gif left.gif right.gif zoom.gif lock.xbm
DEST_XBM = $(BITMAPS:%=$(DESTDIR)${INSTALL_TCLDIR}/bitmaps/%)

# DFLAGS += -DCAD_DIR="${LIBDIR}"
LIBS   += ${GR_LIBS} ${READLINE_LIBS} -lm ${LD_EXTRA_LIBS} \
		${OA_LIBS} ${ZLIB_FLAG} ${TOP_EXTRA_LIBS}
CLEANS += tclmagic${SHDLIB_EXT} libtclmagic${SHDLIB_EXT}.a proto.magicrc

ifeq (${MAKE_WASM},1)
# magicWasm.c bootstraps the embedded Tcl interp by calling Tcl_CreateInterp /
# Tcl_Init before tclStubsPtr is initialised. With -DUSE_TCL_STUBS those calls
# expand to (*tclStubsPtr->...)() and dereference a NULL stubs pointer; so
# this one file must be compiled with DFLAGS_NOSTUB (= DFLAGS without
# -DUSE_TCL_STUBS). All other files keep using stubs.
magicWasm.o: magicWasm.c
	@echo --- compiling magic/magicWasm.o '(no Tcl stubs)'
	${RM} magicWasm.o
	${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS_NOSTUB} -c magicWasm.c

# Pull in BOTH the main TCL archive (LIB_SPECS_NOSTUB → -ltcl9.x) and the
# stub bootstrap archive (-L${TCL_LIB_DIR} -ltclstub). Magic's source uses
# USE_TCL_STUBS macros, so tclStubsPtr (defined in libtclstub.a) and
# Tcl_InitStubs must be present in the same binary as the actual TCL
# implementation from libtcl9.x.a.
magic.js: lib${MODULE}.o ${EXTRA_LIBS}
	@echo --- building main magic WASM
	${RM} magic.js magic.wasm
	${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS} lib${MODULE}.o ${EXTRA_LIBS} -o magic.js ${LIBS} ${LIB_SPECS_NOSTUB} -L${TCL_LIB_DIR} -ltclstub
endif

main: magic proto.magicrc
ifeq (${MAKE_WASM},1)
	@bash ${MAGICDIR}/toolchains/emscripten/post-build.sh magic.js magic.wasm
endif

tcl-main: tclmagic${SHDLIB_EXT} proto.magicrc

tclmagic${SHDLIB_EXT}: ${EXTRA_LIBS}
	@echo --- making magic Tcl library \(tclmagic${SHDLIB_EXT}\)
	${RM} tclmagic${SHDLIB_EXT}
	${CC} ${CFLAGS} ${CPPFLAGS} -o $@ ${LDDL_FLAGS} ${LD_RUN_PATH} \
		${EXTRA_LIBS} ${LD_EXTRA_LIBS} \
		-lc ${LIBS} ${LIB_SPECS} ${LDFLAGS}

proto.magicrc: proto.magicrc.in
	${MCPP} ${GR_DFLAGS} ${DFLAGS} proto.magicrc.in > proto.magicrc

install: $(DESTDIR)${INSTALL_BINDIR}/${MODULE}${EXEEXT} $(DESTDIR)${INSTALL_SYSDIR}/.magicrc \
	$(DESTDIR)${INSTALL_SYSDIR}/magicps.pro

install-tcl: $(DESTDIR)${INSTALL_TCLDIR}/tclmagic${SHDLIB_EXT} $(DESTDIR)${INSTALL_SYSDIR}/.magicrc \
	$(DESTDIR)${INSTALL_SYSDIR}/.initrc $(DESTDIR)${INSTALL_SYSDIR}/magicps.pro ${DEST_XBM}

$(DESTDIR)${INSTALL_TCLDIR}/tclmagic${SHDLIB_EXT}: tclmagic${SHDLIB_EXT}
	${RM} $(DESTDIR)${INSTALL_TCLDIR}/tclmagic${SHDLIB_EXT}
	${CP} tclmagic${SHDLIB_EXT} $(DESTDIR)${INSTALL_TCLDIR}/tclmagic${SHDLIB_EXT}

$(DESTDIR)${INSTALL_TCLDIR}/bitmaps/%: bitmaps/%
	${RM} $(DESTDIR)${INSTALL_TCLDIR}/bitmaps/$*
	${CP} bitmaps/$* $(DESTDIR)${INSTALL_TCLDIR}/bitmaps/$*

$(DESTDIR)${INSTALL_SYSDIR}/.magicrc: proto.magicrc
	${RM} $(DESTDIR)${INSTALL_SYSDIR}/.magicrc
	${CP} proto.magicrc $(DESTDIR)${INSTALL_SYSDIR}/.magicrc

$(DESTDIR)${INSTALL_SYSDIR}/.initrc: proto.initrc
	${RM} $(DESTDIR)${INSTALL_SYSDIR}/.initrc
	${CP} proto.initrc $(DESTDIR)${INSTALL_SYSDIR}/.initrc

$(DESTDIR)${INSTALL_SYSDIR}/magicps.pro: magicps.pro
	${RM} $(DESTDIR)${INSTALL_SYSDIR}/magicps.pro
	${CP} magicps.pro $(DESTDIR)${INSTALL_SYSDIR}/magicps.pro

include ${MAGICDIR}/rules.mak

ifeq (${MAKE_WASM},1)
# rules.mak defines `${MODULE}` (= `magic`) with a recipe that links a native
# executable without the TCL libraries. For the WASM build the real artifact
# is `magic.js` (+ `magic.wasm`), so override the target to be a phony alias
# that just rebuilds magic.js. Must come after the include so make uses this
# recipe instead of rules.mak's.
.PHONY: magic
magic: magic.js
	@:
endif
