# This Makefile understands the following targets:
#
# all (default):	build wine
# lib:                  build libwine
# clean:		remove all intermediate files
# distclean:		also remove all files created by configure
# install:              install everything
# uninstall:		uninstall everything
# depend:		create the dependencies
# etags:		create a TAGS file for Emacs.
# manpages:		compile manpages for Wine API
#

# Main target to build

MAIN_TARGET = @MAIN_TARGET@

# Directories

TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .
SRCDIR    = @srcdir@
VPATH     = @srcdir@
MODULE    = none

LIBSUBDIRS = \
	tools \
	tools/wrc \
	controls \
	dlls/comctl32 \
	dlls/imagehlp \
	dlls/msacm \
	dlls/msacm32 \
	dlls/ntdll \
	dlls/psapi \
	dlls/shell32 \
	dlls/winaspi \
	dlls/wnaspi32 \
	files \
	graphics \
	graphics/metafiledrv \
	graphics/x11drv \
	ipc \
	library \
	loader \
	loader/ne \
	loader/dos \
	memory \
	misc \
	msdos \
	multimedia \
	objects \
	ole \
	relay32 \
	resources \
	scheduler \
	server \
	tsx11 \
	win32 \
	windows

EMUSUBDIRS = \
	debugger \
	graphics/psdrv \
	graphics/win16drv \
	if1632 \
	miscemu

PROGSUBDIRS = libtest programs

DOCSUBDIRS = documentation

# All sub-directories
ALLSUBDIRS = \
	$(LIBSUBDIRS) \
	$(EMUSUBDIRS) \
	$(PROGSUBDIRS) \
	$(DOCSUBDIRS)

# Sub-directories to run make depend into
DEPENDSUBDIRS = $(LIBSUBDIRS) $(EMUSUBDIRS) $(DOCSUBDIRS)

# Sub-directories to run make install into
INSTALLSUBDIRS = $(DOCSUBDIRS)

LIBOBJS = \
	controls/controls.o \
	dlls/comctl32/comctl32.o \
	dlls/imagehlp/imagehlp.o \
	dlls/msacm/msacm.o \
	dlls/msacm32/msacm32.o \
	dlls/ntdll/ntdll.o \
	dlls/psapi/psapi.o \
	dlls/shell32/shell32.o \
	dlls/winaspi/winaspi.o \
	dlls/wnaspi32/wnaspi32.o \
	files/files.o \
	graphics/graphics.o \
	graphics/metafiledrv/metafiledrv.o \
	graphics/x11drv/x11drv.o \
	ipc/ipc.o \
	loader/loader.o \
	loader/ne/ne.o \
	loader/dos/dos.o \
	memory/memory.o \
	misc/misc.o \
	msdos/msdos.o \
	multimedia/multimedia.o \
	objects/objects.o \
	ole/ole.o \
	relay32/relay32.o \
	resources/resources.o \
	scheduler/scheduler.o \
	server/server.o \
	tsx11/tsx11.o \
	win32/win32.o \
	windows/windows.o

EMUOBJS = \
	debugger/debugger.o \
	graphics/psdrv/psdrv.o \
	graphics/win16drv/win16drv.o \
	if1632/if1632.o \
	miscemu/miscemu.o

LIB_TARGET  = @LIB_TARGET@

ALT_LINK    = @ALT_LINK@

all: $(MAIN_TARGET)

@MAKE_RULES@

install:: install_$(MAIN_TARGET)

uninstall:: uninstall_$(MAIN_TARGET)

emu: wine

lib: $(LIBSUBDIRS) $(LIB_TARGET)

wine wine.sym: $(LIBSUBDIRS) $(LIB_TARGET) $(EMUSUBDIRS) dummy
	$(CC) -o wine $(EMUOBJS) $(LIB_TARGET) $(ALT_LINK) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LIBS)
	@echo "Please ignore the 'gets' warning message, it only applies to Windows programs which use 'gets'"
	nm -n wine | grep -v _compiled >wine.sym
	@echo "Wine build complete."

libwine.a: $(LIBOBJS)
	$(RM) $@
	$(AR) $@ $(LIBOBJS)
	$(RANLIB) $@

libwine.so.1.0: $(LIBOBJS)
	$(CC) -shared -Wl,-soname,libwine.so -o$@ $(LIBOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LIBS)

install_emu: install_lib
	[ -d $(bindir) ] || $(MKDIR) $(bindir)
	$(INSTALL_PROGRAM) wine $(bindir)/wine
	$(INSTALL_PROGRAM) loader/dos/dosmod $(bindir)/dosmod

uninstall_emu: uninstall_lib
	$(RM) $(bindir)/wine $(bindir)/dosmod

install_lib: install_includes
	[ -d $(libdir) ] || $(MKDIR) $(libdir)
	if [ $(LIB_TARGET) ]; then $(INSTALL_DATA) $(LIB_TARGET) $(libdir); fi
	$(INSTALL_DATA) wine.sym $(libdir)/wine.sym

uninstall_lib: uninstall_includes
	cd $(libdir); $(RM) $(LIB_TARGET)
	$(RM) $(libdir)/wine.sym

install_includes: dummy
	[ -d $(includedir) ] || $(MKDIR) $(includedir)
	cd $(TOPSRCDIR)/include; $(INSTALL_DATA) windows.h wintypes.h $(includedir)

# Don't just do a rm -rf on $(includedir) -- don't want to wipe out 
# anything extra the user may have put there.
uninstall_includes: dummy
	$(RM) $(includedir)/windows.h $(includedir)/wintypes.h
	-rmdir $(includedir)

$(ALLSUBDIRS): dummy
	@cd $@; $(SUBMAKE)

install_programs: dummy
	@cd programs; $(SUBMAKE) install

uninstall_programs: dummy
	@cd programs; $(SUBMAKE) uninstall

install::
	for i in $(INSTALLSUBDIRS); do (cd $$i && $(MAKE) install) || exit 1; done

uninstall::
	for i in $(INSTALLSUBDIRS); do (cd $$i && $(MAKE) uninstall) || exit 1; done

depend:: dummy
	for i in $(DEPENDSUBDIRS); do (cd $$i && $(MAKE) depend) || exit 1; done

TAGS etags:
	etags `find $(TOPSRCDIR) -name '*.[chS]' -print | grep -v dbgmain`

manpages:
	-$(MKDIR) $(TOPOBJDIR)/documentation/man3w
	for i in $(LIBSUBDIRS); do (cd $$i && $(MAKE) man); done

htmlpages:
	-$(MKDIR) $(TOPOBJDIR)/documentation/html
	for i in $(LIBSUBDIRS); do (cd $$i && $(MAKE) html); done

clean::
	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done
	for i in include; do (cd $$i; $(RM) *.o \#*\# .#* *~ *% *.bak *.orig *.rej *.flc); done
	$(RM) wine wine.sym libwine.a libwine.so.1.0 TAGS .#*

distclean: clean
	$(RM) config.* Make.rules include/config.h
	$(RM) `find . \( -name Makefile -o -size 0 \) -print`

configure: configure.in
	autoconf

include/config.h.in: configure.in include/acconfig.h
	autoheader -l include

### Dependencies:
