# This Makefile understands the following targets:
#
# all (default):   build wine
# clean:           remove all intermediate files
# distclean:       also remove all files created by configure
# test:            run tests
# testclean:       clean test results to force running all tests again
# 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@
LDCONFIG  = @LDCONFIG@
MODULE    = wine
IMPORTS   = ntdll.dll

# Stand-alone programs
PROGRAMS = \
	server/wineserver

# Programs that link with libwine
LIBPROGRAMS = \
	debugger/winedbg \
	programs/wineconsole/wineconsole

# Libraries (not dlls) to build
LIBRARIES = \
	library/libwine.$(LIBEXT) \
	ole/libwine_uuid.a \
	tsx11/libwine_tsx11.$(LIBEXT) \
	unicode/libwine_unicode.$(LIBEXT)

# Dlls that we need to link against (should go away)
LINKABLE_DLLS = user32.dll gdi32.dll kernel32.dll ntdll.dll

# Libraries symlinks to create at the top level
LIBSYMLINKS = \
	$(LINKABLE_DLLS:%=lib%.$(LIBEXT)) \
	libwine.$(LIBEXT) \
	libwine_tsx11.$(LIBEXT) \
	libwine_unicode.$(LIBEXT) \
	libwine_uuid.a

# Sub-directories to run make depend/clean into
SUBDIRS = \
	$(INSTALLSUBDIRS) \
	libtest \
	miscemu \
	programs

# Sub-directories to run make install into
INSTALLSUBDIRS = \
	debugger \
	dlls \
	documentation \
	include \
	library \
	ole \
	programs/wineconsole \
	server \
	tools \
	tsx11 \
	unicode

# Sub-directories to run make test into
TESTSUBDIRS = \
	programs/winetest \
	dlls

EMUOBJS = \
	miscemu/miscemu.o

all: Make.rules $(PROGRAMS) $(LIBPROGRAMS) $(LIBSYMLINKS) wine
	@echo "Wine build complete."

WINAPI_CHECK_EXTRA_FLAGS = --global

@MAKE_RULES@

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

wine: $(EMUOBJS) $(IMPORTS:%=lib%.$(LIBEXT)) library/libwine.$(LIBEXT) unicode/libwine_unicode.$(LIBEXT)
	$(CC) -o wine $(EMUOBJS) -L. $(IMPORTS:%=-l%) $(LIBWINE) $(LIBUNICODE) $(LIBS) $(LDFLAGS)

install_wine: dummy
	[ -d $(bindir) ] || $(MKDIR) $(bindir)
	$(INSTALL_PROGRAM) wine $(bindir)/wine

install:: all install_wine $(INSTALLSUBDIRS:%=%/__install__)
	-$(LDCONFIG)

uninstall:: $(INSTALLSUBDIRS:%=%/__uninstall__)
	cd $(bindir) && $(RM) wine

$(EMUOBJS) $(PROGRAMS) $(LIBPROGRAMS) $(LIBRARIES): dummy
	@cd `dirname $@` && $(MAKE) `basename $@`

# Symlinks to libraries that we need to link against

libwine.$(LIBEXT): library/libwine.$(LIBEXT)
	$(RM) $@ && $(LN_S) library/libwine.$(LIBEXT) $@

libwine_tsx11.$(LIBEXT): tsx11/libwine_tsx11.$(LIBEXT)
	$(RM) $@ && $(LN_S) tsx11/libwine_tsx11.$(LIBEXT) $@

libwine_unicode.$(LIBEXT): unicode/libwine_unicode.$(LIBEXT)
	$(RM) $@ && $(LN_S) unicode/libwine_unicode.$(LIBEXT) $@

libwine_uuid.a: ole/libwine_uuid.a
	$(RM) $@ && $(LN_S) ole/libwine_uuid.a $@

libuser32.dll.$(LIBEXT): dlls/user32.dll$(DLLEXT)
	$(RM) $@ && $(LN_S) dlls/user32.dll$(DLLEXT) $@

libgdi32.dll.$(LIBEXT): dlls/gdi32.dll$(DLLEXT)
	$(RM) $@ && $(LN_S) dlls/gdi32.dll$(DLLEXT) $@

libkernel32.dll.$(LIBEXT): dlls/kernel32.dll$(DLLEXT)
	$(RM) $@ && $(LN_S) dlls/kernel32.dll$(DLLEXT) $@

libntdll.dll.$(LIBEXT): dlls/ntdll.dll$(DLLEXT)
	$(RM) $@ && $(LN_S) dlls/ntdll.dll$(DLLEXT) $@

$(LINKABLE_DLLS:%=dlls/%$(DLLEXT)): dlls

# Dependencies between directories

$(PROGRAMS): tools

$(EMUOBJS): tools dlls

$(LIBPROGRAMS): tools dlls wine

server tools: $(LIBRARIES)

dlls: tools $(LIBRARIES)

checklink::
	$(CC) -o checklink $(TOPSRCDIR)/library/checklink.c $(LIBWINE) $(LIBS) && $(RM) checklink

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

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

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

test_environment: dummy
	@cd programs/winetest && $(MAKE) all

$(TESTSUBDIRS:%=%/__test__): test_environment

check test:: $(TESTSUBDIRS:%=%/__test__)

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

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

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

clean::
	$(RM) wine

distclean: clean
	$(RM) config.* TAGS Make.rules dlls/Makedll.rules programs/Makeprog.rules include/config.h
	$(RM) -r autom4te.cache
	$(RM) `find . \( -name Makefile -o -size 0 \) -print`

### Dependencies:
