# 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@
RANLIB    = @RANLIB@
LN_S      = @LN_S@
DIVINCL   = -I$(SRCDIR) -I. -I$(TOPSRCDIR)/include -I$(TOPOBJDIR)/include
ALLCFLAGS = $(DIVINCL) $(CFLAGS) $(DEFS) $(OPTIONS) $(X_CFLAGS)
LDCOMBINE = ld -r
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
DLLDIR    = $(TOPOBJDIR)/dlls
@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 \
	msvfw32 \
	odbc32 \
	ole32 \
	oleaut32 \
	olecli32 \
	oledlg \
	olepro32 \
	olesvr32 \
	psapi \
	rasapi32 \
	riched32 \
	rpcrt4 \
	serialui \
	setupapi \
	shell32 \
	shfolder \
	shlwapi \
	tapi32 \
	ttydrv \
	urlmon \
	user32 \
	version \
	w32skrnl \
	wineoss.drv \
	wineps \
	wininet \
	winmm \
	winspool.drv \
	wnaspi32 \
	wow32 \
	ws2_32 \
	wsock32

# Implicit rules

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

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

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

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

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

.mc.rc:
	LD_LIBRARY_PATH="$(TOPOBJDIR):$$LD_LIBRARY_PATH" $(WMC) -i -H /dev/null -o $@ $<

.rc.res:
	LD_LIBRARY_PATH="$(TOPOBJDIR):$$LD_LIBRARY_PATH" $(WRC) $(WRCFLAGS) $(DIVINCL) -o $@ -r $<

.spec.spec.c:
	LD_LIBRARY_PATH="$(TOPOBJDIR):$$LD_LIBRARY_PATH" $(WINEBUILD) @DLLFLAGS@ -o $@ -spec $<

.c.glue.c:
	LD_LIBRARY_PATH="$(TOPOBJDIR):$$LD_LIBRARY_PATH" $(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 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

# Rule for main module spec file

$(MODULE).spec.c: $(RC_SRCS:.rc=.res)

# 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) $(C_SRCS) $(RC_SRCS) $(EXTRA_SRCS) $(GEN_C_SRCS) $(SUBDIRS:%=%/__depend__)
	$(MAKEDEP) $(DIVINCL) -C$(SRCDIR) $(C_SRCS) $(RC_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=.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=.rc): $(WMC)

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

dummy:

# End of global rules
