# 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

# Stand-alone programs
PROGRAMS = \
	loader/dos/dosmod \
	server/wineserver

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

# Libraries (not dlls) to build
LIBRARIES = \
	unicode/libwine_unicode.$(LIBEXT)

# Sub-directories to run make depend/clean into
SUBDIRS = \
	console \
	debugger \
	dlls \
	dlls/ntdll \
	documentation \
	files \
	if1632 \
	include \
	library \
	libtest \
	loader \
	loader/dos \
	loader/ne \
	memory \
	misc \
	miscemu \
	msdos \
	ole \
	programs \
	relay32 \
	scheduler \
	server \
	tools \
	unicode \
	win32

# Sub-directories to run make install into
INSTALLSUBDIRS = \
	debugger \
	dlls \
	documentation \
	include \
	server \
	tools \
	unicode

LIBOBJS = \
	console/console.o \
	dlls/ntdll/ntdll.o \
	files/files.o \
	if1632/if1632.o \
	loader/loader.o \
	loader/ne/ne.o \
	loader/dos/dos.o \
	memory/memory.o \
	misc/misc.o \
	msdos/msdos.o \
	ole/ole.o \
	relay32/relay32.o \
	scheduler/scheduler.o \
	win32/win32.o

EMUOBJS = \
	miscemu/miscemu.o

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

EXTRA_OBJS = $(LIBOBJS)

all: Make.rules $(PROGRAMS) $(LIBPROGRAMS) wine
	@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@

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

wine: libwine.$(LIBEXT) libwine_unicode.$(LIBEXT) dlls $(EMUOBJS)
	$(CC) -o wine $(EMUOBJS) $(DLL_LINK) $(LIBS) $(LDFLAGS)

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

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

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

install:: all $(LIBEXT:%=install_%) $(INSTALLSUBDIRS:%=%/__install__)
	[ -d $(bindir) ] || $(MKDIR) $(bindir)
	$(INSTALL_PROGRAM) wine $(bindir)/wine
	$(INSTALL_PROGRAM) loader/dos/dosmod $(bindir)/dosmod
	-$(LDCONFIG)

uninstall:: $(INSTALLSUBDIRS:%=%/__uninstall__)
	cd $(libdir) && $(RM) libwine.a libwine.so libwine.so.$(SOVERSION)
	cd $(bindir) && $(RM) wine dosmod

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

libwine.so: libwine.so.$(SOVERSION)
	$(RM) $@ && $(LN_S) libwine.so.$(SOVERSION) $@

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

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

# Dependencies between directories

$(EMUOBJS) $(LIBOBJS) $(DLLOBJS) $(PROGRAMS) dlls: tools

$(LIBPROGRAMS): tools dlls libwine.$(LIBEXT) libwine_unicode.$(LIBEXT)

server tools dlls: libwine_unicode.$(LIBEXT)

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

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

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

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

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

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

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 libwine.so.$(SOVERSION) 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:
