# 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)/relay32/gdi32.spec \
	    -w $(TOPSRCDIR)/relay32/user32.spec \
	    -w $(TOPSRCDIR)/relay32/comctl32.spec \
	    -w $(TOPSRCDIR)/relay32/comdlg32.spec \
	    -w $(TOPSRCDIR)/relay32/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@ \
	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 \
	msacm.drv \
	msacm32 \
	msnet32 \
	msvfw32 \
	odbc32 \
	ole32 \
	oleaut32 \
	olecli32 \
	oledlg \
	olepro32 \
	olesvr32 \
	psapi \
	rasapi32 \
	riched32 \
	rpcrt4 \
	serialui \
	setupapi \
	setupx \
	shell32 \
	shfolder \
	shlwapi \
	sound \
	stress \
	tapi32 \
	ttydrv \
	urlmon \
	user32 \
	version \
	w32skrnl \
	win87em \
	windebug \
	wineoss.drv \
	wineps \
	wing \
	wininet \
	winmm \
	winspool.drv \
	wnaspi32 \
	wow32 \
	ws2_32 \
	wsock32

# Implicit rules

.SUFFIXES: .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 $<  

.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) $(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)

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

dummy:

# End of global rules
