# 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
# WRCEXTRA     : extra wrc flags (e.g. '-p _SysRes')
# 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
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
BUILD     = $(TOPOBJDIR)/tools/winebuild/winebuild
MAKEDEP   = $(TOPOBJDIR)/tools/makedep
WRC       = $(TOPOBJDIR)/tools/wrc/wrc
WRCFLAGS  = -c -s -p $*
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) $(RC_SRCS:.rc=.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.s:
	$(WRC) $(WRCFLAGS) $(WRCEXTRA) $(DIVINCL) $<

.rc.h:
	$(WRC) $(WRCFLAGS) $(WRCEXTRA) $(DIVINCL) -nh $<

.rc.res:
	$(WRC) $(WRCFLAGS) $(WRCEXTRA) $(DIVINCL) -r $<

.res.s:
	$(WRC) $(WRCFLAGS) $(WRCEXTRA) -b $<

.res.h:
	$(WRC) $(WRCFLAGS) $(WRCEXTRA) -bnh $<

.spec.spec.c:
	$(BUILD) @DLLFLAGS@ -o $@ -spec $<

.c.glue.c:
	$(BUILD) @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) check_wrc:
	cd $(TOPOBJDIR)/tools/wrc && $(MAKE) wrc

# Rule to rebuild the message compiler

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

# Rule to rebuild the 'makedep' program

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

# Rule to rebuild the 'winebuild' program

$(BUILD) check_winebuild:
	cd $(TOPOBJDIR)/tools/winebuild && $(MAKE) winebuild

# Rule for main module

$(MODULE).o: $(OBJS) Makefile.in $(TOPSRCDIR)/Make.rules.in
	$(LDCOMBINE) $(OBJS) -o $(MODULE).o

# 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

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=.s) $(RC_SRCS:.rc=.h) $(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): $(BUILD) $(TOPSRCDIR)/include/builtin16.h $(TOPSRCDIR)/include/builtin32.h

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

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

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

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

dummy:

# End of global rules
