# This makefile uses make recursively to allow for two separate
# builds: debug and opt (the latter being the default).

# If you don't want to get GLUI, GLE, or PLIB, or don't have glext.h,
# modify the EXTRA_FLAGS line before building.

# Look at the OPT_FLAGS line and change it if necessary!
CC = g++
#CC = /opt/intel_cc_80/bin/icc
OPT_FLAGS = -O3 -finline-functions -Winline	-Wall -pedantic
#OPT_FLAGS = -O3 -ipo
DEBUG_FLAGS = -O0 -g -Wall -pedantic
EXTRA_FLAGS = 
LDFLAGS = -L/usr/X11R6/lib -L/usr/local/lib -lglut -lGLU -lGL -lX11 -lXmu

SRC = \
application.cpp \
axes.cpp \
box.cpp \
bumpy_simple_heightmap.cpp \
camera.cpp \
car_ai.cpp \
coll_detect.cpp \
collision_body.cpp \
collision_body_mesh.cpp \
config_file.cpp \
constraint_body_body_max_distance.cpp \
constraint_body_body_point.cpp \
constraint_fixed_point.cpp \
cylinder.cpp \
distance.cpp \
ellipsoid.cpp \
flat_simple_heightmap.cpp \
hinge_joint.cpp \
intersection.cpp \
jiggle.cpp \
log_trace.cpp \
main.cpp \
object_controller.cpp \
physics.cpp \
ragdoll.cpp \
ray_car.cpp \
ray_wheel.cpp \
render_manager.cpp \
rigid_body.cpp \
simple_heightmap.cpp \
tetrahedron.cpp \
viewport.cpp

# gets over-ridden on the real make
OBJDIR := .
OBJS := $(SRC:%.cpp=$(OBJDIR)/%.o)

#default target
opt: .opt
	@echo "############ Starting Optimised build #########################"
	$(MAKE) ../jiggle CFLAGS="$(OPT_FLAGS) $(EXTRA_FLAGS)" OBJDIR=.opt

debug: .debug
	@echo "############ Starting debug build ##############################"
	$(MAKE) ../jiggle_debug CFLAGS="$(DEBUG_FLAGS) $(EXTRA_FLAGS)" OBJDIR=.debug

gprof: .gprof
	@echo "############ Starting gprof build ##############################"
	$(MAKE) ../jiggle_gprof CFLAGS="-pg $(OPT_FLAGS) $(EXTRA_FLAGS)" OBJDIR=.gprof

../jiggle: $(OBJS)
	$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS) 

../jiggle_debug: $(OBJS)
	$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS) 

../jiggle_gprof: $(OBJS)
	$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS) 

.debug:
	mkdir .debug

.opt:
	mkdir .opt

.gprof:
	mkdir .gprof

FORCE:

clean: debug_clean opt_clean

debug_clean:
	\rm -f *~ .debug/*.o .debug/*~ carsim_debug .debug/.depend

opt_clean:
	\rm -f *~ .opt/*.o .opt/*~ carsim .opt/.depend

# How we get a .o from a .cpp
$(OBJDIR)/%.o: %.cpp
	$(CC) -c $(CFLAGS) -o $@ $<

$(OBJDIR)/%.d: %.cpp
	$(CC) -MM $(CFLAGS) $< | sed -e "s/\(^[a-zA-Z]\)/$(OBJDIR)\/\1/" -e 's@^\(.*\)\.o:@\1.d \1.o:@' > $@

ifneq ($(OBJDIR),.)
-include $(OBJS:.o=.d)
endif

