# 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@
LDD       = @LDD@
MODULE    = none

# Sub-directories containing stand-alone programs
PROGSUBDIRS = \
	server

# Sub-directories containing programs that use some Wine dlls
LIBPROGSUBDIRS = \
	miscemu \
	programs

# Sub-directories containing libraries (not dlls) to build
LIBSUBDIRS = \
	library \
	ole \
	tsx11 \
	unicode

# Sub-directories to run make depend/clean/install into
SUBDIRS = \
	$(LIBPROGSUBDIRS) \
	$(LIBSUBDIRS) \
	$(PROGSUBDIRS) \
	dlls \
	documentation \
	include \
	tools

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

EMUOBJS = \
	miscemu/miscemu.o

all: Make.rules $(PROGSUBDIRS) $(LIBPROGSUBDIRS) 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: $(WINEWRAPPER)
	$(RM) $@ && $(LN_S) $(WINEWRAPPER) $@

install:: all $(SUBDIRS:%=%/__install__)
	-$(LDCONFIG)
	@if test -n "`LANG=C $(LDD) $(bindir)/wine|grep not.found`";	\
	then								\
		echo "*************************************************" ; \
		echo "*************************************************" ; \
		echo "The installed Wine libraries will not be found!" ; \
		echo "You can either:" ; 				\
		echo "   Add the line '$(libdir)' to /etc/ld.so.conf" ;	\
		echo '   export LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(libdir)' ; \
		echo "*************************************************" ; \
		echo "*************************************************" ; \
	fi

uninstall:: $(SUBDIRS:%=%/__uninstall__)

# Dependencies between directories

$(LIBPROGSUBDIRS): tools dlls $(LIBSUBDIRS)

$(PROGSUBDIRS): tools $(LIBSUBDIRS)

dlls: tools $(LIBSUBDIRS)

tools: $(LIBSUBDIRS)

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

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

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

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

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

TAGS etags:
	etags `find $(TOPSRCDIR) -name '*.[ch]' -a -not -name '*.spec.c' -a -not -name '*.glue.c' -a -not -name '*.dbg.c' -print`

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

htmlpages:
	$(MKINSTALLDIRS) $(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:
