# Global rules shared by all makefiles     -*-Makefile-*-
#
# Each individual makefile must define the following variables:
# TOPSRCDIR    : top-level source directory
# TOPOBJDIR    : top-level object directory
# SRCDIR       : source directory for this module
# MODULE       : name of the module being built
#
# Each individual makefile may define the following additional variables:
# C_SRCS       : C sources for the module
# ASM_SRCS     : assembly sources
# GEN_C_SRCS   : generated C files
# GEN_ASM_SRCS : generated assembly sources
# RC_SRCS      : resource source files
# SPEC_SRCS    : interface definition files
# GLUE         : C sources for which glue code needs to be generated
# EXTRA_SRCS   : extra source files for make depend
# EXTRA_OBJS   : extra object files
# SUBDIRS      : subdirectories that contain a Makefile
# EXTRASUBDIRS : subdirectories that do not contain a Makefile

# First some useful definitions

SHELL     = /bin/sh
CC        = @CC@
CPP       = @CPP@
CFLAGS    = @CFLAGS@
OPTIONS   = @OPTIONS@ -D_REENTRANT
X_CFLAGS  = @X_CFLAGS@
X_LIBS    = @X_LIBS@
XLIB      = @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@
DLL_LINK  = @DLL_LINK@
LIBS      = @LIBS@
YACC      = @YACC@
LEX       = @LEX@
LEXLIB    = @LEXLIB@
LIBEXT    = @LIBEXT@
LDSHARED  = @LDSHARED@
DLLWRAP   = @DLLWRAP@
DLLWRAPFLAGS = --add-stdcall-alias
RANLIB    = @RANLIB@
LN_S      = @LN_S@
DIVINCL   = -I$(SRCDIR) -I. -I$(TOPSRCDIR)/include -I$(TOPOBJDIR)/include $(EXTRAINCL)
ALLCFLAGS = $(DIVINCL) $(CFLAGS) $(DEFS) $(OPTIONS) $(X_CFLAGS)
LDCOMBINE = @LDCOMBINE@
LDFLAGS   = @LDFLAGS@
AR        = ar rc
RM        = rm -f
MV        = mv
MKDIR     = mkdir -p
C2MAN     = @C2MAN@
MANSPECS  = -w $(TOPSRCDIR)/dlls/gdi/gdi32.spec \
	    -w $(TOPSRCDIR)/dlls/user/user32.spec \
	    -w $(TOPSRCDIR)/dlls/comctl32/comctl32.spec \
	    -w $(TOPSRCDIR)/dlls/comdlg32/comdlg32.spec \
	    -w $(TOPSRCDIR)/dlls/kernel/kernel32.spec 
LINT      = @LINT@
LINTFLAGS = @LINTFLAGS@
ALLLINTFLAGS = $(LINTFLAGS) $(DEFS) $(OPTIONS) $(DIVINCL)
WINAPI_CHECK = $(TOPSRCDIR)/tools/winapi_check/winapi_check
WINEBUILD = $(TOPOBJDIR)/tools/winebuild/winebuild
MAKEDEP   = $(TOPOBJDIR)/tools/makedep
WRC       = $(TOPOBJDIR)/tools/wrc/wrc
WMC       = $(TOPOBJDIR)/tools/wmc/wmc
LDPATH    = @LDPATH@
DLLDIR    = $(TOPOBJDIR)/dlls
LIBWINE   = -L$(TOPOBJDIR)/library -lwine
LIBTSX11  = -L$(TOPOBJDIR)/tsx11 -lwine_tsx11
LIBUNICODE= -L$(TOPOBJDIR)/unicode -lwine_unicode
LIBUUID   = -L$(TOPOBJDIR)/ole -lwine_uuid

@SET_MAKE@

# Installation infos

INSTALL         = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA    = @INSTALL_DATA@
prefix          = @prefix@
exec_prefix     = @exec_prefix@
bindir          = @bindir@
libdir          = @libdir@
infodir         = @infodir@
mandir          = @mandir@
prog_manext     = 1
conf_manext     = 5
includedir      = @includedir@/wine
CLEAN_FILES     = *.o *.a *.so *.ln \\\#*\\\# *~ *% .\\\#* *.bak *.orig *.rej \
                  *.flc *.spec.c *.glue.c y.tab.c y.tab.h lex.yy.c core

OBJS = $(SPEC_SRCS:.spec=.spec.o) $(C_SRCS:.c=.o) $(GEN_C_SRCS:.c=.o) $(GEN_ASM_SRCS:.s=.o) \
       $(ASM_SRCS:.S=.o) $(GLUE:.c=.glue.o) $(EXTRA_OBJS)

LINTS = $(C_SRCS:.c=.ln)

# DLL list

X_DLLS = \
	ddraw \
	@OPENGL32_DLL@ \
	x11drv

DLLS = \
	@X_DLLS@ \
	advapi32 \
	avifil32 \
	comctl32 \
	comdlg32 \
	crtdll \
	dciman32 \
	dinput \
	dplay \
	dplayx \
	dsound \
	gdi32 \
	icmp \
	imagehlp \
	imm32 \
	joystick.drv \
	kernel32 \
	lz32 \
	mcianim.drv \
	mciavi.drv \
	mcicda.drv \
	mciseq.drv \
	mciwave.drv \
	midimap.drv \
	mpr \
	msacm.drv \
	msacm32 \
	msnet32 \
	msvcrt \
	msvfw32 \
	odbc32 \
	ole32 \
	oleaut32 \
	olecli32 \
	oledlg \
	olepro32 \
	olesvr32 \
	psapi \
	rasapi32 \
	riched32 \
	rpcrt4 \
	serialui \
	setupapi \
	shdocvw \
	shell32 \
	shfolder \
	shlwapi \
	tapi32 \
	ttydrv \
	urlmon \
	user32 \
	version \
	w32skrnl \
	winedos \
	wineoss.drv \
	wineps \
	wininet \
	winmm \
	winnls32 \
	winspool.drv \
	wnaspi32 \
	wow32 \
	ws2_32 \
	wsock32

# Implicit rules

.SUFFIXES: .mc .rc .mc.rc .res .spec .spec.c .glue.c

.c.o:
	$(CC) -c $(ALLCFLAGS) -o $*.o $<

.s.o:
	$(AS) -o $*.o $<  

.S.o:
	$(CC) -c -o $*.o $<  

.mc.mc.rc:
	$(LDPATH) $(WMC) -i -H /dev/null -o $@ $<

.rc.res:
	$(LDPATH) $(WRC) $(WRCFLAGS) $(DIVINCL) -o $@ -r $<

.spec.spec.c:
	$(LDPATH) $(WINEBUILD) @DLLFLAGS@ -L$(DLLDIR) -o $@ -spec $<

.c.glue.c:
	$(LDPATH) $(WINEBUILD) @DLLFLAGS@ -o $@ -glue $<

.c.ln:
	$(LINT) -c $(ALLLINTFLAGS) $< || ( $(RM) $@ && exit 1 )

.PHONY: all install uninstall clean distclean depend dummy

# 'all' target first in case the enclosing Makefile didn't define any target

all: Makefile

# Rule for main module intermediate object

$(MODULE).tmp.o: $(OBJS) Makefile.in
	$(LDCOMBINE) $(OBJS) -o $@
	-strip --strip-unneeded $@

# Rule for main module spec file

$(MODULE).spec.c: $(MODULE).spec $(RC_SRCS:.rc=.res) $(SYMBOLFILE) $(WINEBUILD)
	$(LDPATH) $(WINEBUILD) @DLLFLAGS@ -L$(DLLDIR) $(SYMBOLFILE:%=-sym %) -o $@ -spec $(SRCDIR)/$(MODULE).spec

# Rule to rebuild the resource compiler

$(WRC):
	cd $(TOPOBJDIR)/tools/wrc && $(MAKE) wrc

# Rule to rebuild the message compiler

$(WMC):
	cd $(TOPOBJDIR)/tools/wmc && $(MAKE) wmc

# Rule to rebuild the 'makedep' program

$(MAKEDEP):
	cd $(TOPOBJDIR)/tools && $(MAKE) makedep

# Rule to rebuild the 'winebuild' program

$(WINEBUILD):
	cd $(TOPOBJDIR)/tools/winebuild && $(MAKE) winebuild

# Rules for makefile

Makefile: Makefile.in $(TOPSRCDIR)/configure
	@echo Makefile is older than $?, please rerun $(TOPSRCDIR)/configure
	@exit 1

# Rules for auto documentation

man: $(C_SRCS)
	for i in $(C_SRCS); do $(C2MAN) -L -o $(TOPOBJDIR)/documentation/man3w -S3w $(DIVINCL) -D__WINE__ $(MANSPECS) $$i; done

doc-html: $(C_SRCS)
	for i in $(C_SRCS); do $(C2MAN) -L -o $(TOPOBJDIR)/documentation/html -Th -iwindows.h  $(DIVINCL) -D__WINE__ $(MANSPECS) $$i; done

# Rule for linting

$(MODULE).ln : $(LINTS)
	if test "$(LINTS)" ; \
	then \
		$(LINT) $(ALLLINTFLAGS) -o$(MODULE) $(LINTS) ; \
	        $(MV) llib-l$(MODULE).ln $(MODULE).ln ; \
	else \
		$(LINT) $(ALLLINTFLAGS) -C$(MODULE) /dev/null ; \
	fi

lint:: $(MODULE).ln

# Rules for Windows API checking

winapi_check::
	$(WINAPI_CHECK) $(WINAPI_CHECK_FLAGS) $(WINAPI_CHECK_EXTRA_FLAGS) .

# Rules for dependencies

$(SUBDIRS:%=%/__depend__): $(MAKEDEP) dummy
	cd `dirname $@` && $(MAKE) depend

depend: $(MAKEDEP) $(GEN_C_SRCS) $(SUBDIRS:%=%/__depend__)
	$(MAKEDEP) $(DIVINCL) -C$(SRCDIR) $(C_SRCS) $(RC_SRCS) $(MC_SRCS) $(EXTRA_SRCS) -C. $(GEN_C_SRCS)

# Rules for cleaning

$(SUBDIRS:%=%/__clean__): dummy
	cd `dirname $@` && $(MAKE) clean

$(EXTRASUBDIRS:%=%/__clean__): dummy
	-cd `dirname $@` && $(RM) $(CLEAN_FILES)

clean:: $(SUBDIRS:%=%/__clean__) $(EXTRASUBDIRS:%=%/__clean__)
	$(RM) $(CLEAN_FILES) $(GEN_C_SRCS) $(GEN_ASM_SRCS) $(RC_SRCS:.rc=.res) $(MC_SRCS:.mc=.mc.rc) $(PROGRAMS)

# Rules for installing

$(SUBDIRS:%=%/__install__): dummy
	cd `dirname $@` && $(MAKE) install

$(SUBDIRS:%=%/__uninstall__): dummy
	cd `dirname $@` && $(MAKE) uninstall

# Misc. rules

$(SPEC_SRCS:.spec=.spec.c): $(WINEBUILD) $(TOPSRCDIR)/include/builtin16.h

$(GLUE:.c=.glue.c): $(WINEBUILD) $(TOPSRCDIR)/include/builtin16.h

$(RC_SRCS:.rc=.res): $(WRC)

$(MC_SRCS:.mc=.mc.rc): $(WMC)

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

dummy:

# End of global rules
