# This Makefile understands the following targets:
#
# all (default):	build wine
# clean:		remove all intermediate files
# distclean:		also remove all files created by configure
# langclean:		remove all files which have to be remade if
#			a different LANGuage is selected
# depend:		create the dependencies
# etags:		Create a TAGS file for Emacs.
#
# Author: Michael Patra   <micky@marie.physik.tu-berlin.de>
#                         <patra@itp1.physik.tu-berlin.de>

CC 	  = @CC@
CFLAGS 	  = @CFLAGS@
DEFS      = @DEFS@
LANG	  = @LANG@
X_CFLAGS  = @X_CFLAGS@
X_LIBS    = @X_LIBS@
TOPSRC    = @top_srcdir@
DIVINCL   = -I$(TOPSRC)/include
XPM_LIB	  = -lXpm
XLIB	  = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@
LDLIBS	  = @LDLIBS@
AR        = ar rc
RANLIB    = @RANLIB@
RM        = rm -f
@SET_MAKE@

MAIN_TARGET = @MAIN_TARGET@

COMMONSUBDIRS = rc controls ipc loader misc multimedia objects win32 windows

EMUSUBDIRS = tools debugger debugger/readline if1632 memory miscemu

LIBSUBDIRS = toolkit

ALLSUBDIRS = $(COMMONSUBDIRS) $(EMUSUBDIRS) $(LIBSUBDIRS)

COMMONOBJS = \
	controls/controls.o \
	ipc/ipc.o \
	loader/loader.o \
	misc/misc.o \
	multimedia/multimedia.o \
	objects/objects.o \
	rc/rc.o \
	win32/win32.o \
	windows/windows.o

EMUOBJS = \
	debugger/debugger.o \
	debugger/readline/readline.o \
	if1632/if1632.o \
	memory/memory.o \
	miscemu/miscemu.o

LIBOBJS = toolkit/toolkit.o


all: $(MAIN_TARGET)

wine wine.sym: $(COMMONSUBDIRS) $(EMUSUBDIRS) dummy
	$(CC) -o wine $(COMMONOBJS) $(EMUOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
	nm -n wine | grep -v _compiled >wine.sym

winelib.a: $(COMMONSUBDIRS) $(LIBSUBDIRS) dummy
	$(RM) $@
	$(AR) $@ $(COMMONOBJS) $(LIBOBJS)
	$(RANLIB) $@

$(ALLSUBDIRS): dummy
	@cd $@; $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'DEFS=$(DEFS)' 'LANG=$(LANG)'

depend:
	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) depend); done

etags:
	etags `find . -name '*.[chS]' -print`

clean:
	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean); done
	$(RM) *.o \#*\# *~ *.bak *.flc wine wine.sym winelib.a TAGS

distclean:
	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) distclean); done
	echo "/* autoconf.h generated automatically.  Run Configure */" >autoconf.h
	echo "#error You must run Configure before you can build the makefiles." >>autoconf.h
	$(RM) *.o \#*\# *~ *.bak wine wine.sym winelib.a TAGS
	$(RM) config.* include/config.h Make.rules Makefile

langclean:
	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) langclean); done
	$(RM) wine wine.sym winelib.a

dummy:
