# Global rules shared by all makefiles     -*-Makefile-*-
#
# Each individual makefile should 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
# C_SRCS       : C sources for the module (optional)
# ASM_SRCS     : assembly sources (optional)
# GEN_ASM_SRCS : generated assembly sources (optional)
# RC_SRCS      : resource source files (optional)
# EXTRA_SRCS   : extra source files for make depend (optional)
# EXTRA_OBJS   : extra object files (optional)
# WRCEXTRA     : extra wrc flags (e.g. '-p _SysRes') (optional)

# 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@
WINELIB   = $(WINESTUB) -L$(TOPOBJDIR) -lwine
LIBS      = @LIBS@
YACC      = @YACC@
LEX       = @LEX@
LEXLIB    = @LEXLIB@
RANLIB    = @RANLIB@
LN_S      = @LN_S@
DIVINCL   = -I$(TOPSRCDIR)/include -I$(TOPOBJDIR)/include -I$(SRCDIR) -I.
ALLCFLAGS = $(CFLAGS) $(DEFS) $(OPTIONS) $(DIVINCL) $(X_CFLAGS)
LDCOMBINE = ld -r
LDSHARED  = @LDSHARED@
AR        = ar rc
RM        = rm -f
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      = lclint
LINTFLAGS = +posixlib +gnuextensions +trytorecover
BUILD     = $(TOPOBJDIR)/tools/build@PROGEXT@
MAKEDEP   = $(TOPOBJDIR)/tools/makedep@PROGEXT@
WINERC    = $(TOPOBJDIR)/rc/winerc@PROGEXT@
WRC       = $(TOPOBJDIR)/tools/wrc/wrc@PROGEXT@
WRCFLAGS  = -t -c
WINESTUB  = $(TOPOBJDIR)/library/winestub.o
SUBMAKE   = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'OPTIONS=$(OPTIONS)'
@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@/man1
manext          = .1
includedir      = @includedir@/wine

OBJS = $(C_SRCS:.c=.o) $(GEN_ASM_SRCS:.s=.o) $(ASM_SRCS:.S=.o) \
       $(RC_SRCS:.rc=.o) $(EXTRA_OBJS)

# Implicit rules

.SUFFIXES: .rc .res

.c.o:
	$(CC) -c $(ALLCFLAGS) -o $*.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 $<

# Obsolete
#.rc.c:
#	echo "#include \"windows.h\"" >$*-tmp.c
#	echo WINDOWS_H_ENDS_HERE >>$*-tmp.c
#	cat $< >>$*-tmp.c
#	$(CPP) $(DEFS) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P $*-tmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) $(RCFLAGS) -c -o $* -p $*
#	$(RM) $*-tmp.c
#
#.rc.h:
#	echo "#include \"windows.h\"" >$*-tmp.c
#	echo WINDOWS_H_ENDS_HERE >>$*-tmp.c
#	cat $< >>$*-tmp.c
#	$(CPP) $(DEFS) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P $*-tmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) $(RCFLAGS) -c -o $* -p $*
#	$(RM) $*-tmp.c
#


# Rule to rebuild the resource compiler

$(WINERC) check_winerc:
	cd $(TOPOBJDIR)/rc; $(SUBMAKE) winerc@PROGEXT@

$(WRC) check_wrc:
	cd $(TOPOBJDIR)/tools/wrc; $(SUBMAKE) wrc@PROGEXT@

# Rule to rebuild the 'makedep' program

$(MAKEDEP) check_makedep:
	cd $(TOPOBJDIR)/tools; $(SUBMAKE) makedep@PROGEXT@

# Rule to rebuild the 'build' program

$(BUILD) checkbuild:
	cd $(TOPOBJDIR)/tools; $(SUBMAKE) build@PROGEXT@

# Rule for main module

$(MODULE).o: Makefile $(OBJS)
	$(LDCOMBINE) $(OBJS) -o $(MODULE).o

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

lint:
	for i in $(C_SRCS); do $(LINT) $(LINTFLAGS) -D__WINE__ $(OPTIONS) $(DIVINCL) $(X_CFLAGS) $$i; done

# Misc. rules

depend:: $(MAKEDEP) $(C_SRCS) $(RC_SRCS) $(EXTRA_SRCS)
	$(MAKEDEP) $(DIVINCL) -C$(SRCDIR) $(C_SRCS) $(RC_SRCS) $(EXTRA_SRCS)

clean::
	$(RM) *.o \#*\# *~ *% .#* *.bak *.orig *.rej *.flc *-tmp.c y.tab.c y.tab.h lex.yy.c core $(GEN_ASM_SRCS) $(RC_SRCS:.rc=.s) $(RC_SRCS:.rc=.h) $(PROGRAMS)

dummy:

# End of global rules
