#                                 Makefile.common
#
# This file is included by the main MagicStats make file "Makefile" as
# well as all of the plugins' makefiles.  This file defines common rules
# to do things like compile a .cpp file or generate the dependancies.
# These are platform dependant, so this is the file used to specify these
# system dependant operations.
#
# The following functionality may be set by setting incoming variables:
#
# 1. LEVEL - The level of the current subdirectory from the top of the 
#    MagicStats view.  This level should be expressed as a path, for 
#    example, ../.. for two levels deep.
#
# 2. DIRS - A list of subdirectories to be built.  Fake targets are set up
#    so that each of the targets "all", "install", and "clean" each build.
#    the subdirectories before the local target.
#
# 3. Source - If specified, this sets the source code filenames.  If this
#    is not set, it defaults to be all of the .cpp, .c, .y, and .l files 
#    in the current directory.
#


# Default Rule:
all ::

# Default for install is to at least build everything...
install ::

#--------------------------------------------------------------------
# Installation configuration options... 
#--------------------------------------------------------------------

BinInstDir=/usr/local/bin
LibInstDir=/var/lib/MagicStats
DocInstDir=/usr/doc/MagicStats

#---------------------------------------------------------
# Compilation options...
#---------------------------------------------------------

# Enable this for profiling support with 'gprof'
#Prof = -pg

# Compile a file, don't link...

# Someday, add in these warnings: -Weffc++

Compile  = $(CXX) $(Prof) -Wall -c -I$(LEVEL)/include $(CPPFLAGS) $(CXXFLAGS) -fno-rtti  -W
CompileG = $(Compile) -g  -D_DEBUG -Wnon-virtual-dtor
# Add This for DebugMalloc: -fno-defer-pop
CompileO = $(Compile) -O3 -DNDEBUG -finline-functions -felide-constructors -fnonnull-objects -freg-struct-return -fshort-enums -fstrict-aliasing

# Link final executable
Link     = $(CXX) $(Prof) -Wl,-export-dynamic
LinkG    = $(Link) -g
LinkO    = $(Link) -O3

# Create a .so file from a .cpp file...
MakeSO   = $(CXX) -shared $(Prof)
MakeSOG  = $(MakeSO) -g
MakeSOO  = $(MakeSO) -O3

# Create dependancy file from CPP file, send to stdout.
Depend   = $(CXX) -MM -I$(LEVEL)/include $(CPPFLAGS) 

# Archive a bunch of .o files into a .a file...
AR       = ar cq 

#----------------------------------------------------------

# Source includes all of the cpp files, and objects are derived from the
# source files...
ifndef Source
Source   = $(wildcard *.cpp *.c *.y *.l)
endif
Objs = $(sort $(addsuffix .o,$(basename $(Source))))
ObjectsO = $(addprefix Release/,$(Objs))
ObjectsG = $(addprefix Debug/,$(Objs))

#---------------------------------------------------------
# Handle the DIRS option
#---------------------------------------------------------

ifdef DIRS  # Only do this if we're using DIRS!

all     :: $(addsuffix /.makeall    , $(DIRS))
install :: $(addsuffix /.makeinstall, $(DIRS))
clean   :: $(addsuffix /.makeclean  , $(DIRS))

%/.makeall %/.makeclean %/.makeinstall:
	cd $(@D); $(MAKE) $(subst $(@D)/.make,,$@)
endif


#---------------------------------------------------------

# Create dependacies for the cpp files...
Depend/%.d: %.cpp Depend/.dir
	$(Depend) $< | sed 's|$*\.o *|Release/& Debug/& Depend/$(@F)|g' > $@

# Create .o files in the ObjectFiles directory from the .cpp files...
Release/%.o: %.cpp Release/.dir Depend/.dir
	$(CompileO) $< -o $@

Debug/%.o: %.cpp Debug/.dir Depend/.dir
	$(CompileG) $< -o $@

# Create a .cpp source file from a flex input file...
%.cpp: %.l
	flex -t $< | sed '/^find_rule/d' > $@

# Rule for building the bison parsers...

%.cpp %.h : %.y
	bison -d -p $(<:%Parser.y=%) $(basename $@).y
	mv -f $(basename $@).tab.c $(basename $@).cpp
	mv -f $(basename $@).tab.h $(basename $@).h

# Rules to create documentation...
#%.txt: $(basename $(notdir %)).sdf
#%.txt: %.sdf
#$(LEVEL)/Install/Docs/%.txt: %.sdf
#	@-echo Creating .TXT output of $(basename $(@F))
#	@-echo `pwd` -- $@ -- $<
#	sdf -2txt $(basename $(@F))
#	-cp -f $(basename $(@F)).txt $@

#$(LEVEL)/Install/Docs/%.html: %.sdf
#	@-echo Creating .HTML output of $(basename $(@F))
#	sdf -2html $(basename $(@F))
#	RemoveHTMLComments < $(basename $(@F)).html > $@

#$(LEVEL)/Install/Docs/%.ps: %.sdf
#	@-echo Creating .PS output of $(basename $(@F))
#	sdf +sdf2ps_sgml $(basename $(@F)) > /dev/null
#	mv $(basename $(@F)).out.ps $@

# To create the directories...
%/.dir:
	mkdir -p $(@D)
	@date > $@

# Clean does not remove the output files... just the temporaries
clean::
	rm -rf Debug Release Depend
	rm -f core *.o *.d *.so

# If dependancies were generated for the file that included this file,
# include the dependancies now...
#
SourceDepend = $(addsuffix .d,$(addprefix Depend/,$(basename $(Source))))
ifneq ($(SourceDepend),)
include $(SourceDepend)
endif
