SOURCES = $(CXX_OBJECTS:%.o=%.cpp) $(C_OBJECTS:%.o=%.c) \
			$(MAIN_OBJECT:%.o=%.cpp)
LIB_OBJECTS = $(CXX_OBJECTS) $(C_OBJECTS)
CXX_OBJECTS = monotonic_function_space.o minimath.o opt1d.o halfedge.o opt_height_field.o
C_OBJECTS = 
## The main object is assumed to be a '.cpp' file.
MAIN_OBJECT = test.o
#MAIN_OBJECT = tests.o

ARCH = $(shell uname)
include Makefile.$(ARCH)

TARGET = toposmooth2
LIBTARGET = lib$(TARGET).a
DYLIBTARGET = lib$(TARGET).$(DYLIB_SUFFIX)

CPPCOMPILER = g++
CCOMPILER = gcc

#WARNINGFLAGS = -Wall -Wno-sign-compare -Wshadow -Woverloaded-virtual -fkeep-inline-functions
WARNINGFLAGS = -Wall -Wno-sign-compare -Woverloaded-virtual -fkeep-inline-functions
## This isn't supported by my gcc.
#-Werror=return-type

#COMPILERFLAGS = -g $(WARNINGFLAGS) -fno-inline -Winline
#COMPILERFLAGS = -g $(WARNINGFLAGS) -Winline -finline-functions
## Turn on -msse2 for Eigen
#COMPILERFLAGS = -g $(WARNINGFLAGS) -fno-inline -ftree-vectorize -msse2 -DNDEBUG
#COMPILERFLAGS = -g -O2 $(WARNINGFLAGS) -finline-functions -ftree-vectorize -msse2 -DNDEBUG
COMPILERFLAGS = -g -O2 $(WARNINGFLAGS) -finline-functions -ftree-vectorize -msse2

#COMPILERFLAGS = -g -O3 -fno-inline $(WARNINGFLAGS) -Winline -DNDEBUG
#COMPILERFLAGS = -g -O3 -fkeep-inline-functions $(WARNINGFLAGS) -Winline
#COMPILERFLAGS = -g -O3 $(WARNINGFLAGS) -Winline -DNDEBUG
#COMPILERFLAGS = -O3 $(WARNINGFLAGS) -Winline
#COMPILERFLAGS = -O3 $(WARNINGFLAGS) -fno-inline -DNDEBUG
#COMPILERFLAGS = -O3 -fkeep-inline-functions $(WARNINGFLAGS) -Winline -DNDEBUG
#COMPILERFLAGS = -O3 $(WARNINGFLAGS) -Winline -DNDEBUG

AR = /usr/bin/ar
ARFLAGS = -rus

## This comes from Makefile.$(ARCH)
#DYLIB_FLAGS = -shared
COMPILERFLAGS += -fPIC

MAKEDEPEND = $(CPPCOMPILER) -MM
DEPENDFILE = Makefile.depend

INCLUDEFLAGS	= -Iext -Iext/eigen2
LINKTIMEFLAGS = -lm -Lext/tnc -ltnc

## For libLBFGS
#INCLUDEFLAGS	+= -Iext/liblbfgs-1.8/include
#LINKTIMEFLAGS += -Lext/liblbfgs-1.8/lib/.libs -llbfgs

#FRAMEWORKS	= -framework OpenGL -framework GLUT -framework AppKit -framework vecLib

# clear out implicit rules
.SUFFIXES:

all: $(LIBTARGET) $(TARGET) $(DYLIBTARGET)

$(TARGET): $(MAIN_OBJECT) $(LIBTARGET)
	$(CPPCOMPILER) -o $@ \
	$(MAIN_OBJECT) \
	$(LIBTARGET) \
	$(INCLUDEFLAGS) $(LINKTIMEFLAGS) \
	$(FRAMEWORKS)

#$(TARGET): $(LIB_OBJECTS) $(MAIN_OBJECT)
#	$(CPPCOMPILER) -o $@ \
#	$(LIB_OBJECTS) $(MAIN_OBJECT) \
#	$(INCLUDEFLAGS) $(LINKTIMEFLAGS) \
#	$(FRAMEWORKS)

library: $(LIBTARGET) $(DYLIBTARGET)

$(LIBTARGET): $(LIB_OBJECTS)
	$(AR) $(ARFLAGS) $@ $(LIB_OBJECTS)

$(DYLIBTARGET): $(LIB_OBJECTS)
	$(CPPCOMPILER) $(DYLIB_FLAGS) -o $@ $(LIB_OBJECTS) $(LINKTIMEFLAGS)

%.o: %.cpp
	$(CPPCOMPILER) $(COMPILERFLAGS) $(INCLUDEFLAGS) -c $<

%.o: %.c
	$(CCOMPILER) $(COMPILERFLAGS) $(INCLUDEFLAGS) -c $<

.PHONY : clean tidy
clean: tidy
	rm -f $(TARGET)
	rm -f $(LIBTARGET)
	rm -f $(DYLIBTARGET)
	rm -f $(DEPENDFILE)
#	touch $(DEPENDFILE)

tidy:
	rm -f $(LIB_OBJECTS) $(MAIN_OBJECT)

relib:
	rm -f $(TARGET)

depend:
	$(MAKEDEPEND) $(INCLUDEFLAGS) $(SOURCES) > $(DEPENDFILE)

-include $(DEPENDFILE)
