# 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

TOOLSUBDIRS = \
	tools \
	tools/wrc

LIBSUBDIRS = \
	controls \
	console \
	dlls/advapi32 \
	dlls/avifil32 \
	dlls/comctl32 \
	dlls/commdlg \
	dlls/crtdll \
	dlls/dciman32 \
	dlls/dplayx \
	dlls/dsound \
	dlls/imagehlp \
	dlls/imm32 \
	dlls/lzexpand \
	dlls/mpr \
	dlls/msacm \
	dlls/msacm32 \
	dlls/msnet32 \
	dlls/msvideo \
	dlls/ntdll \
	dlls/ole32 \
	dlls/oleaut32 \
	dlls/olecli \
	dlls/oledlg \
	dlls/olesvr \
	dlls/psapi \
	dlls/rasapi32 \
	dlls/shell32 \
	dlls/sound \
	dlls/stress \
	dlls/tapi32 \
	dlls/ver \
	dlls/version \
	dlls/win32s \
	dlls/win87em \
	dlls/winaspi \
	dlls/windebug \
	dlls/wing \
	dlls/winmm \
	dlls/winmm/mcianim \
	dlls/winmm/mciavi \
	dlls/winmm/mcicda \
	dlls/winmm/mciseq \
	dlls/winmm/mciwave \
	dlls/winmm/midimap \
	dlls/winmm/wavemap \
	dlls/winmm/wineoss \
	dlls/winspool \
	dlls/wnaspi32 \
	files \
	graphics \
	graphics/enhmetafiledrv \
	graphics/metafiledrv \
	graphics/psdrv \
	graphics/ttydrv \
	graphics/win16drv \
	if1632 \
	library \
	loader \
	loader/ne \
	loader/dos \
	memory \
	misc \
	msdos \
	objects \
	ole \
	relay32 \
	resources \
	scheduler \
	server \
	win32 \
	windows \
	windows/ttydrv

X11SUBDIRS = \
	graphics/x11drv \
	tsx11 \
	windows/x11drv

EMUSUBDIRS = \
	debugger \
	miscemu

PROGSUBDIRS = libtest programs

DOCSUBDIRS = documentation

INCSUBDIRS = include

# Sub-directories to run make into
BUILDSUBDIRS = \
	$(TOOLSUBDIRS) \
	$(LIBSUBDIRS) \
	$(X11SUBDIRS) \
	$(EMUSUBDIRS) \
	$(PROGSUBDIRS) \
	$(DOCSUBDIRS)

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

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

# Sub-directories to run make lint into
LINTSUBDIRS = $(LIBSUBDIRS) $(X11SUBDIRS) $(EMUSUBDIRS) $(DOCSUBDIRS)

LIBOBJS = \
	controls/controls.o \
	console/console.o \
	dlls/advapi32/advapi32.o \
	dlls/avifil32/avifil32.o \
	dlls/comctl32/comctl32.o \
	dlls/commdlg/commdlg.o \
	dlls/crtdll/crtdll.o \
	dlls/dciman32/dciman32.o \
	dlls/dplayx/dplayx.o \
	dlls/dsound/dsound.o \
	dlls/imagehlp/imagehlp.o \
	dlls/imm32/imm32.o \
	dlls/lzexpand/lzexpand.o \
	dlls/mpr/mpr.o \
	dlls/msacm/msacm.o \
	dlls/msacm32/msacm32.o \
	dlls/msnet32/msnet32.o \
	dlls/msvideo/msvideo.o \
	dlls/ntdll/ntdll.o \
	dlls/ole32/ole32.o \
	dlls/oleaut32/oleaut32.o \
	dlls/olecli/olecli.o \
	dlls/oledlg/oledlg.o \
	dlls/olesvr/olesvr.o \
	dlls/psapi/psapi.o \
	dlls/rasapi32/rasapi32.o \
	dlls/shell32/shell32.o \
	dlls/sound/sound.o \
	dlls/stress/stress.o \
	dlls/tapi32/tapi32.o \
	dlls/ver/ver.o \
	dlls/version/version.o \
	dlls/win32s/win32s.o \
	dlls/win87em/win87em.o \
	dlls/winaspi/winaspi.o \
	dlls/windebug/windebug.o \
	dlls/wing/wing.o \
	dlls/winmm/winmm.o \
	dlls/winmm/mcianim/mcianim.drv.o \
	dlls/winmm/mciavi/mciavi.drv.o \
	dlls/winmm/mcicda/mcicda.drv.o \
	dlls/winmm/mciseq/mciseq.drv.o \
	dlls/winmm/mciwave/mciwave.drv.o \
	dlls/winmm/midimap/midimap.drv.o \
	dlls/winmm/wavemap/msacm.drv.o \
	dlls/winmm/wineoss/wineoss.o \
	dlls/winspool/winspool.o \
	dlls/wnaspi32/wnaspi32.o \
	files/files.o \
	graphics/graphics.o \
	graphics/enhmetafiledrv/enhmetafiledrv.o \
	graphics/metafiledrv/metafiledrv.o \
	graphics/psdrv/psdrv.o \
	graphics/ttydrv/ttydrv.o \
	graphics/win16drv/win16drv.o \
	if1632/if1632.o \
	loader/loader.o \
	loader/ne/ne.o \
	loader/dos/dos.o \
	memory/memory.o \
	misc/misc.o \
	msdos/msdos.o \
	objects/objects.o \
	ole/ole.o \
	relay32/relay32.o \
	resources/resources.o \
	scheduler/scheduler.o \
	server/server.o \
	win32/win32.o \
	windows/windows.o \
	windows/ttydrv/ttydrv.o

X11OBJS = \
	graphics/x11drv/x11drv.o \
	tsx11/tsx11.o \
	windows/x11drv/x11drv.o

EMUOBJS = \
	debugger/debugger.o \
	miscemu/miscemu.o

LIB_TARGET  = @LIB_TARGET@

ALT_LINK    = @ALT_LINK@

all: Makefile Make.rules $(MAIN_TARGET)
	@echo "Wine build complete."

LIBLINTS = $(LIBOBJS:.o=.ln) 
X11LINTS = $(X11OBJS:.o=.ln)
EMULINTS = $(EMUOBJS:.o=.ln)

lint:: llib-lwine.ln $(EMULINTS)
	$(LINT) $(ALLLINTFLAGS) -L. -lwine $(EMULINTS)

WINAPI_CHECK_EXTRA_FLAGS = --global

@MAKE_RULES@

Make.rules: Make.rules.in configure
	@echo $? is newer than 'Make.rules', please rerun ./configure!
	@exit 1

install:: install_$(MAIN_TARGET)

uninstall:: uninstall_$(MAIN_TARGET)

emu: wine

lib: $(LIBSUBDIRS) $(X11SUBDIRS) $(LIB_TARGET)

wine wine.sym: $(LIB_TARGET) $(EMUOBJS) $(X11OBJS) $(LIBOBJS)
	$(CC) -o wine $(EMUOBJS) $(ALT_LINK) $(LDOPTIONS) $(X_LIBS) $(XLIB) $(LIBS)
	nm -n wine | grep -v _compiled >wine.sym

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

llib-lwine.ln : $(LIBLINTS) $(X11LINTS)
	$(LINT) $(ALLLINTFLAGS) -owine $(LIBLINTS) $(X11LINTS)

libwine.so.1.0: $(LIBOBJS) $(X11OBJS)
	$(LDSHARED) -o$@ $(LIBOBJS) $(X11OBJS) $(LDOPTIONS)
	ln -sf $@ libwine.so

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: dummy
	[ -d $(libdir) ] || $(MKDIR) $(libdir)
	if [ -f wine.sym ]; then $(INSTALL_DATA) wine.sym $(libdir)/wine.sym; fi
	if [ $(LIB_TARGET) ]; then \
	    $(INSTALL_DATA) $(LIB_TARGET) $(libdir); \
	    if [ $(LIB_TARGET) = libwine.so.1.0 ]; then $(LDCONFIG); fi \
	fi
	[ -d $(bindir) ] || $(MKDIR) $(bindir)
	$(INSTALL_PROGRAM) windows/x11drv/wineclipsrv $(bindir)/wineclipsrv

uninstall_lib: dummy
	cd $(libdir); $(RM) $(LIB_TARGET) libwine.a libwine.so wine.sym

$(X11OBJS) $(EMUOBJS) $(LIBOBJS): $(TOOLSUBDIRS) dummy
	@cd `dirname $@`; $(SUBMAKE)

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

$(LIBLINTS) $(X11LINTS) $(EMULINTS): dummy
	@echo $@ | sed 's%\(.*\)\/[^\/]*%cd \1 \&\& make lint%' | sh


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 $(BUILDSUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done
	for i in include include/bitmaps include/wine; do (cd $$i; $(RM) *.o \#*\# .#* *~ *% *.bak *.orig *.rej *.flc); done
	$(RM) wine wine.sym libwine.a libwine.so.1.0 libwine.so TAGS .#*

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

# We depend on configure above for checks, so we better don't use this rule.
#configure: configure.in
#	autoconf

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

### Dependencies:
