
default: opt 

opt: $(EXEC:=.opt)\
	$(LIB:=.opt)\
	$(PLUGIN:=.opt)\

debug: $(EXEC:=.dbg)\
	$(LIB:=.dbg)\
	$(PLUGIN:=.dbg)\

cleandepend: cleandependopt cleandependdbg

cleandependopt:
	@[ -d $(OPTDIR) ] && cd $(OPTDIR); rm -f Makedepend; rm -rf .depend

cleandependdbg:
	@[ -d $(DEBUGDIR) ] && cd $(DEBUGDIR); rm -f Makedepend; rm -rf .depend

cleantarget: cleantargetopt cleantargetdbg

cleantargetopt: 
	@[ -d $(OPTDIR) ] && cd $(OPTDIR); rm -f $(EXEC) $(LIB) $(PLUGIN)

cleantargetdbg: 
	@[ -d $(DEBUGDIR) ] && cd $(DEBUGDIR); rm -f $(EXEC) $(LIB) $(PLUGIN)

clean: cleanopt cleandbg

cleanopt: 
	@[ -d $(OPTDIR) ] && cd $(OPTDIR); rm -f $(OBJS) Makedepend; rm -rf .depend

cleandbg: 
	@[ -d $(DEBUGDIR) ] && cd $(DEBUGDIR); rm -f $(OBJS) Makedepend; rm -rf .depend

clobber: clobberdbg clobberopt

clobberopt: 
	rm -rf $(OPTDIR)

clobberdbg: 
	rm -rf $(DEBUGDIR)


beautify: 
	for f in *.cpp ; do mv $$f $$f.bak; bcpp $$f.bak $$f; rm $$f.bak; done
	for f in *.h ; do mv $$f $$f.bak; bcpp $$f.bak $$f; rm $$f.bak; done

docs:
	[ "$(TARGET_BASENAME)" != "" ] && \
	mkdir -p $(TOPDIR)/doc/doc++/$(TARGET_BASENAME) && \
	doc++ -d $(TOPDIR)/doc/doc++/$(TARGET_BASENAME) -H -A \
	    $(TOPDIR)/include/$(TARGET_BASENAME)/* && \
	echo "$(TARGET_BASENAME) HTML documentation created in "\
	     "$(TOPDIR)/doc/doc++/$(TARGET_BASENAME)"


$(EXEC): $(OBJS) 
	$(C++) $(LDFLAGS) $(OBJS) $(LIBS) -o $@


## Mac OSX makes the distinction between -dynamiclib and -bundle
## causing us to have to make a special case here, rather than 
## just redefining the SHARED argument.

ifeq ($(OS),Darwin)

$(LIB): $(OBJS)
	$(C++) $(LDFLAGS) $(LIBVERSION) -dynamiclib $(OBJS) $(LIBS) -o $@

$(PLUGIN): $(OBJS)
	$(C++) $(LDFLAGS) -bundle $(OBJS) $(LIBS) -o $@
else
ifeq ($(OS),HP-UX)
# we need to explicitly tell the linker the library name - else it will
# include paths like ../../../libosg.sl into executables
$(LIB) $(PLUGIN) : $(OBJS)
	$(C++) $(LDFLAGS) $(SHARED) $(OBJS) $(LIBS) -Wl,+h -Wl,$@ -o $@
else
$(LIB) $(PLUGIN) : $(OBJS)
	$(C++) $(LDFLAGS) $(SHARED) $(OBJS) $(LIBS) -o $@

endif # not HP-UX
endif # not Darwin

$(EXEC:=.dbg) :
	@[ -d $(DEBUGDIR) ] || mkdir $(DEBUGDIR)
	@cd $(DEBUGDIR); \
	  $(MAKE) -f ../GNUmakefile "DOF=$(DBGF)"  TOPDIR=../${TOPDIR} \
	      THISDIR=../$(THISDIR)\
	      MAKEDEPEND=Makedepend $(EXEC)
	@$(MAKE) LNSRC=$(DEBUGDIR)/$(EXEC) LNDEST=$(BININST)/$(OS)$(ARCH)/$(EXEC) __link

$(LIB:=.dbg) : $(PLUGIN:=.dbg)
	@[ -d $(DEBUGDIR) ] || mkdir $(DEBUGDIR)
	@cd $(DEBUGDIR);\
	  $(MAKE) -f ../GNUmakefile "DOF=$(DBGF)"  TOPDIR=../${TOPDIR} \
	      THISDIR=../$(THISDIR)\
	      MAKEDEPEND=Makedepend $(LIB)
	@$(MAKE) LNSRC=$(DEBUGDIR)/$(LIB) LNDEST=$(LIBINST)/$(OS)$(ARCH)/$(LIB) __link

$(PLUGIN:=.dbg) : 
	@[ -d $(DEBUGDIR) ] || mkdir $(DEBUGDIR)
	@cd $(DEBUGDIR); \
	  $(MAKE) -f ../GNUmakefile "DOF=$(DBGF)"  TOPDIR=../${TOPDIR} \
	      THISDIR=../$(THISDIR)\
	      MAKEDEPEND=Makedepend $(PLUGIN)
	@$(MAKE) LNSRC=$(DEBUGDIR)/$(PLUGIN) LNDEST=$(PLUGININST)/$(PLUGIN) __link

$(EXEC:=.opt) : 
	@[ -d $(OPTDIR) ] || mkdir $(OPTDIR)
	@cd $(OPTDIR); \
	  $(MAKE) -f ../GNUmakefile DOF=$(OPTF)  TOPDIR=../${TOPDIR} \
	      THISDIR=../$(THISDIR)\
	      MAKEDEPEND=Makedepend $(EXEC)
	@$(MAKE) LNSRC=$(OPTDIR)/$(EXEC) LNDEST=$(BININST)/$(OS)$(ARCH)/$(EXEC) __link


$(LIB:=.opt) : 
	@[ -d $(OPTDIR) ] || mkdir -p $(OPTDIR)
	@cd $(OPTDIR);\
	  $(MAKE) -f ../GNUmakefile DOF=$(OPTF) TOPDIR=../${TOPDIR} \
	        THISDIR=../$(THISDIR)\
	        MAKEDEPEND=Makedepend $(LIB)
	@$(MAKE) LNSRC=$(OPTDIR)/$(LIB) LNDEST=$(LIBINST)/$(OS)$(ARCH)/$(LIB) __link

$(PLUGIN:=.opt) : 
	@[ -d $(OPTDIR) ] || mkdir -p $(OPTDIR)
	@cd $(OPTDIR); \
	  $(MAKE) -f ../GNUmakefile DOF=$(OPTF) TOPDIR=../${TOPDIR} \
	    THISDIR=../$(THISDIR)\
	               MAKEDEPEND=Makedepend $(PLUGIN)
	@$(MAKE) LNSRC=$(OPTDIR)/$(PLUGIN) LNDEST=$(PLUGININST)/$(PLUGIN) __link


## Revamped method for making Makedepend files
## Under this method, Makedepend simply includes
## all dependency files which are built for each 
## individual source file.  At update, only the individual
## dependency file is updated rather than the whole of Makedepend

Makedepend : $(CXXFILES) $(CFILES)
ifeq ($(OS),IRIX)
	touch $@
else
	@ touch $@
	@if [ ! -d .depend ] ; then  \
		mkdir .depend;\
		depfiles="$+";\
	else\
		depfiles="$?";\
	fi;\
	if [ ! -z "$$depfiles" ]; then\
	for f in $$depfiles; do \
		echo "$(C++) $(DEPARG) $(INC) $$f  pipeto .depend/`basename $$f`"; \
		$(C++) $(DEPARG) $(INC) $$f > .depend/`basename $$f`; \
		grep $$f $@ || echo include .depend/`basename $$f` >> Makedepend ;\
	done;\
	fi
endif


ifeq (0,1) ##### OLD WAY : Keep until we've proven that this doesn't trip up
           ##### on other OS's.
    Makedepend : $(CXXFILES) $(CFILES) 
    ifeq ($(OS),IRIX)   
    	touch $@
    else
    	$(C++) $(INC) $(DEPARG) $^ > $(MAKEDEPEND)
    endif

endif


.SUFFIXES: .cpp .o
.cpp.o:
	$(C++) $(CXXFLAGS) -c $<

depend : $(MAKEDEPEND)

__link : 
	@sh $(TOPDIR)/Make/dolink.sh $(TOPDIR) $(LNSRC) $(LNDEST) "$(LINK)"
		
__instfiles :
	@echo $(INSTFILES)

sinclude $(MAKEDEPEND)

