# This Makefile understands the following targets:
#
# all (default):	build wine
# 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
#

# Directories

TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .
SRCDIR    = @srcdir@
VPATH     = @srcdir@
LIBEXT    = @LIBEXT@
LDSHARED  = @LDSHARED@
LDCONFIG  = @LDCONFIG@
MODULE    = wine
SOVERSION = 1.0
SONAME    = libwine.so

TOOLSUBDIRS = \
	tools \
	tools/wrc

LIBSUBDIRS = \
	controls \
	console \
	debugger \
	dlls/advapi32 \
	dlls/crtdll \
	dlls/display \
	dlls/mouse \
	dlls/ntdll \
	files \
	graphics \
	graphics/enhmetafiledrv \
	graphics/metafiledrv \
	graphics/psdrv \
	graphics/win16drv \
	if1632 \
	library \
	loader \
	loader/ne \
	loader/dos \
	memory \
	misc \
	msdos \
	objects \
	ole \
	relay32 \
	resources \
	scheduler \
	win32 \
	windows

EMUSUBDIRS = \
	miscemu \
	server

PROGSUBDIRS = libtest programs

DOCSUBDIRS = documentation

INCSUBDIRS = include

PROGRAMS = \
	loader/dos/dosmod \
	server/wineserver \
	windows/x11drv/wineclipsrv

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

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

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

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

# Extra sub-directories to clean
CLEANSUBDIRS = dlls include include/bitmaps include/wine tools/cvdump

LIBOBJS = \
	controls/controls.o \
	console/console.o \
	debugger/debugger.o \
	dlls/advapi32/advapi32.o \
	dlls/crtdll/crtdll.o \
	dlls/display/display.o \
	dlls/mouse/mouse.o \
	dlls/ntdll/ntdll.o \
	files/files.o \
	graphics/graphics.o \
	graphics/enhmetafiledrv/enhmetafiledrv.o \
	graphics/metafiledrv/metafiledrv.o \
	graphics/psdrv/psdrv.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 \
	win32/win32.o \
	windows/windows.o

EMUOBJS = \
	miscemu/miscemu.o

DLLOBJS = $(DLLS:%=dlls/lib%.@LIBEXT@)

EXTRA_OBJS = $(LIBOBJS)

EMU_TARGET = @EMU_TARGET@

all: Make.rules $(PROGRAMS) $(EMU_TARGET)
	@echo "Wine build complete."

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

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

WINAPI_CHECK_EXTRA_FLAGS = --global

@MAKE_RULES@

all: lib$(MODULE).$(LIBEXT) $(DLLOBJS)

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

wine wine.sym: lib$(MODULE).$(LIBEXT) $(DLLOBJS) $(EMUOBJS)
	$(CC) -o wine $(EMUOBJS) $(DLL_LINK) $(LDOPTIONS) $(X_LIBS) $(XLIB) $(LIBS)
	nm -n wine | grep -v _compiled >wine.sym

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

install_so: lib$(MODULE).so.$(SOVERSION)
	[ -d $(libdir) ] || $(MKDIR) $(libdir)
	$(INSTALL_PROGRAM) lib$(MODULE).so.$(SOVERSION) $(libdir)/lib$(MODULE).so.$(SOVERSION)
	cd $(libdir) && $(RM) lib$(MODULE).so && $(LN_S) lib$(MODULE).so.$(SOVERSION) lib$(MODULE).so

install_a: lib$(MODULE).a
	[ -d $(libdir) ] || $(MKDIR) $(libdir)
	$(INSTALL_DATA) lib$(MODULE).a $(libdir)/lib$(MODULE).a

install_wine: wine
	[ -d $(bindir) ] || $(MKDIR) $(bindir)
	[ -d $(libdir) ] || $(MKDIR) $(libdir)
	[ -f wine.sym ] && $(INSTALL_DATA) wine.sym $(libdir)/wine.sym
	$(INSTALL_PROGRAM) wine $(bindir)/wine

install:: $(PROGRAMS) $(EMU_TARGET:%=install_%) $(LIBEXT:%=install_%)
	[ -d $(bindir) ] || $(MKDIR) $(bindir)
	$(INSTALL_PROGRAM) server/wineserver $(bindir)/wineserver
	$(INSTALL_PROGRAM) windows/x11drv/wineclipsrv $(bindir)/wineclipsrv
	$(INSTALL_PROGRAM) loader/dos/dosmod $(bindir)/dosmod

uninstall::
	cd $(libdir) && $(RM) libwine.a libwine.so libwine.so.$(SOVERSION) wine.sym
	cd $(bindir) && $(RM) wine wineserver wineclipsrv dosmod

lib$(MODULE).so.$(SOVERSION): $(OBJS) Makefile.in Make.rules.in
	$(LDSHARED) $(OBJS) -o $@

lib$(MODULE).so: lib$(MODULE).so.$(SOVERSION)
	$(RM) $@ && $(LN_S) lib$(MODULE).so.$(SOVERSION) $@

lib$(MODULE).a: $(OBJS) Makefile.in Make.rules.in
	$(RM) $@
	$(AR) $@ $(OBJS)
	$(RANLIB) $@

checklink::
	$(CC) -o checklink $(TOPSRCDIR)/library/checklink.c -L. -lwine $(LDOPTIONS) $(X_LIBS) $(XLIB) $(LIBS) && $(RM) checklink

$(EMUOBJS) $(LIBOBJS) $(DLLOBJS) $(PROGRAMS): $(TOOLSUBDIRS) dummy
	@cd `dirname $@` && $(MAKE) `basename $@`

$(BUILDSUBDIRS): dummy
	@cd $@ && $(MAKE)

$(LIBLINTS) $(EMULINTS): dummy
	@cd `dirname $@` && $(MAKE) lint

install_programs: dummy
	@cd programs && $(MAKE) install

uninstall_programs: dummy
	@cd programs && $(MAKE) uninstall

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

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

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

checklink::
	@cd dlls && $(MAKE) checklink

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 $(CLEANSUBDIRS); do (cd $$i && $(RM) $(CLEAN_FILES)); done
	$(RM) wine wine.sym libwine.so.1.0 TAGS

distclean: clean
	$(RM) config.* Make.rules dlls/Makedll.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:
