##############################################################################
# Makefile for the Mobile Robot Simulator
##############################################################################
#
# CreateDate:   6-Dec-94
# Requirements: gmake
#		OpenWin, DevGuide, Inventor, Ansi-C-Compiler & Includes
# Author:       Horst Stolz (stolz@hermes.informatik.uni-stuttgart.de)
# Time-stamp: <95/03/03 15:34:09 stolz>
#
# Usage:        
#  1. Look into the file 'Defines.$(HOSTTYPE)' and change the compiler, flags
#     and paths to your specific needs.
#     If the file doesn't exist, clone 'Defines.sun4' or 'Defines.iris4d' and
#     make your changes.
#
#  2. Now start compilation by typing 'gmake'
#     This will compile and link the simulator 'mobs', the display-server
#     'ivd_server' and some example-programs
#
#     NOTE: If you can't compile all programs on the same machine, compile
#           all possible programs with 'gmake -k ', do 2.&3 and retry the
#           compilation on another machine. Don't forget 1.!
#
#  3. Now copy with 'gmake install' the executables into the
#     ../bin.$(HOSTTYPE)-directory.
#     
#  4. Delete the old object-files with 'gmake clean'.
#
#
# Makefile-Targets:
# -----------------
# 
# all            make all user-needed executables (mobs,lib,examples)
# mobs           compile and link the Simulator
# lib            generate the interface-library (rob_mobs)
# examples       generate usefull examples
# ivd_server     compile and link the Camera-View-Generater (for SGI)
#
# tests          compile and link test-programs for important modules
#
# install        move the execs, libs and lib-headers to ../obj/bin/include
# clean          delete all exes, o-files and backup-files
# export         copy the interface-lib-code to ../export
#
# info           general project-information (release.version.revision)
# increv         generate a new revision-number
# incver         generate a new version-number
# increl         generate a new release-number
# 
# moveout        move out unnecessary file to ../temp
# movein         move files from ../temp back to .
# backup         create a archive(tar.gz) of the src-directory
# update         install a old archive       
#
##############################################################################
#


##############################################################################
# load architecture-specific defines
#

include Defines.$(HOSTTYPE)


##############################################################################
# some object-list for generating special executables
#
OBJS = rev.o command.o com_motn.o com_motv.o mob.o vehicle.o \
  com_scanner.o scheduler.o basic.o error.o queue.o list.o vector.o \
  integration.o coms_us.o

MOBJS = $(OBJS) conmobs.o

MWOBJS = $(OBJS) mob_world.o space.o triangle.o clipping.o polygon.o text.o \
         mw_object.o mwo_mob.o mw_file.o app2d.o strerror.o us_sensor.o\
	 pvm_server.o mwo.o triangle_projection.o vector_geometry.o pdlist.o

XVOBJS = $(MWOBJS) xdraw.o ivd.o xvmobs_stubs.o xvmobs_ui.o

SPACETESTOBJS = space_test.o space.o error.o list.o triangle.o vector_geometry.o vector.o basic.o clipping.o triangle_projection.o pdlist.o polygon.o



##############################################################################
# targets for make
#

EXECUTABLES = mobs ivd_server 
EXAMPLES    = rob_get_frame rob_us_drive rob_tip rob_camera_example
TESTPRGS    = roblib_test rob_camera_test iv_space_test iv_tp_test ivd_tip \
	ivd_test space_test mobs_pvm_test triangle_test triangle_projection_test \
	edge_reflexion_test iv_er_test polygon_test mw_io_test conmobs
EXECS = $(EXECUTABLES) $(EXAMPLES) $(TESTPRGS)



all:: $(EXECUTABLES) lib examples

lib:: librob_mobs.a

examples:: $(EXAMPLES)

tests:: $(TESTPRGS)

install:: 
	@echo "*** Install main executables and examples"
	-mkdir ../bin.$(HOSTTYPE)
	-mv $(EXECUTABLES) $(EXAMPLES) ../bin.$(HOSTTYPE)
	@echo "*** Install interface-library"
	-mkdir ../lib.$(HOSTTYPE)
	-mv librob_mobs.a ../lib.$(HOSTTYPE)
	@echo "*** Install include-file"
	-mkdir ../include
	-cp rob.h ../include

clean::
	-$(RM) core a.out *.o *~ *.BAK *.bak *.ppm *test *.a $(EXECS)


##############################################################################
# targets for development-purposes
#

EXPORTDIR=../export
EXPORTFILES=mobs_interface.[ch] mobs_interface_def.h rob.[ch] rob_example.c

moveout::
	mkdir -p ../temp
	-$(RM) -rf ../temp/*
	-mv -f core a.out *.o *~ *.BAK *.bak *.ppm *test *mobs *.a $(EXECS) ../temp

movein::
	-mv ../temp/* .

backup:: moveout
	../cmd/project backup
	-mv -f ../temp/* .

info::
	../cmd/project info

update:: moveout
	../cmd/project update `ls ../MOBS* | sort | tail -1`
	-mv -f ../temp/* .

increv::
	../cmd/increv

incver::
	../cmd/project incver

increl::
	../cmd/project increl

export::
	-mkdir $(EXPORTDIR)
	-cp $(EXPORTFILES) $(EXPORTDIR)
	-cp Makefile.mi $(EXPORTDIR)/Makefile


##############################################################################
# executable-generation
#

mobs: $(XVOBJS)
	$(LINK.c) -o $@ $(XVOBJS) $(LDFLAGS) $(XVLDFLAGS) \
		$(PVMLDFLAGS) $(PVMLDLIBS) $(XVLDLIBS) $(LDLIBS)
#	$(RM) rev.c

ivd_server: ivd_server.o error.o
	$(LINK.c) -o $@ ivd_server.o error.o $(PVMLDFLAGS) $(PVMLDLIBS) \
		$(IVLDFLAGS) $(IVLDLIBS) 


##############################################################################
# example-programs
#

rob_camera_example: rob_camera_example.o librob_mobs.a
	$(LINK.c) -o $@ rob_camera_example.o -L. -lrob_mobs $(LDLIBS) \
		$(PVMLDFLAGS) $(PVMLDLIBS)

rob_get_frame: rob_get_frame.o librob_mobs.a
	$(LINK.c) -o $@ rob_get_frame.o -L. -lrob_mobs $(LDLIBS) \
		$(PVMLDFLAGS) $(PVMLDLIBS)

rob_tip: rob_tip.o librob_mobs.a
	$(LINK.c) -o $@ rob_tip.o -L. -lrob_mobs $(LDFLAGS) $(LDLIBS) \
		$(PVMLDFLAGS) $(PVMLDLIBS)

rob_us_drive: rob_us_drive.o rob_us_sensor.o librob_mobs.a
	$(LINK.c) -o $@ rob_us_drive.o rob_us_sensor.o  -L. -lrob_mobs \
		$(LDFLAGS) $(LDLIBS) $(PVMLDFLAGS) $(PVMLDLIBS)

# A. Rausch-Testprogram for porthos.
test5: test5.o librob_mobs.a
	$(LINK.c) -o $@ test5.o -L. -lrob_mobs $(LDFLAGS) $(LDLIBS) \
		$(PVMLDFLAGS) $(PVMLDLIBS)


conmobs: $(MOBJS)


##############################################################################
# executables for test purposes
#

roblib_test: roblib_test.o librob_mobs.a
	$(LINK.c) -o $@ $< -L. -lrob_mobs $(LDFLAGS) $(LDLIBS) \
		$(PVMLDFLAGS) $(PVMLDLIBS)

rob_camera_test: rob_camera_test.o librob_mobs.a
	$(LINK.c) -o $@ rob_camera_test.o -L. -lrob_mobs $(LDFLAGS) \
		 $(LDLIBS) $(PVMLDFLAGS) $(PVMLDLIBS)

iv_space_test: iv_space_test.o space.o error.o list.o triangle.o vector_geometry.o vector.o basic.o clipping.o triangle_projection.o pdlist.o polygon.o iv_draw.o
	$(LINK.c) -o $@ iv_space_test.o space.o error.o list.o triangle.o vector_geometry.o vector.o basic.o clipping.o triangle_projection.o pdlist.o polygon.o iv_draw.o $(IVLDFLAGS) $(IVLDLIBS)

iv_tp_test.o: triangle_projection_test.c
	$(CC) $(CFLAGS) -DUSE_IV  -o $@ -c $< 

iv_tp_test: iv_tp_test.o space.o error.o list.o triangle.o vector_geometry.o vector.o basic.o clipping.o triangle_projection.o pdlist.o polygon.o iv_draw.o 
	$(LINK.c) -o $@ iv_tp_test.o error.o list.o triangle.o vector_geometry.o vector.o basic.o clipping.o triangle_projection.o pdlist.o polygon.o iv_draw.o space.o $(IVLDLIBS)


ivd_tip: ivd_tip.o error.o
	$(LINK.c) -o $@ ivd_tip.o error.o $(LDFLAGS) $(LDLIBS) $(PVMLDFLAGS) $(PVMLDLIBS) 

ivd_test: ivd_test.o ivd.o $(MWOBJS)
	$(LINK.c) -o $@ ivd_test.o ivd.o $(LDFLAGS) $(LDLIBS) $(MWOBJS) $(PVMLDFLAGS) $(PVMLDLIBS)


space_test: $(SPACETESTOBJS)

mobs_pvm_test: mobs_pvm_test.o mobs_interface.o
	$(LINK.c) -o $@ mobs_pvm_test.o mobs_interface.o $(LDFLAGS) $(LDLIBS) $(PVMLDFLAGS) $(PVMLDLIBS)

triangle_test: triangle_test.o triangle.o error.o clipping.o basic.o list.o polygon.o vector_geometry.o vector.o

triangle_projection_test: triangle_projection_test.o triangle.o error.o clipping.o basic.o list.o polygon.o vector_geometry.o triangle_projection.o vector.o

edge_reflexion_test: edge_reflexion_test.o triangle.o error.o clipping.o basic.o list.o polygon.o vector_geometry.o triangle_projection.o vector.o

iv_er_test.o: triangle_projection_test.c
	$(CC) $(CFLAGS) -DUSE_IV  -o $@ -c $<

iv_er_test: iv_er_test.o space.o error.o list.o triangle.o vector_geometry.o vector.o basic.o clipping.o triangle_projection.o pdlist.o polygon.o iv_draw.o
	$(LINK.c) -o $@ iv_er_test.o error.o list.o triangle.o vector_geometry.o vector.o basic.o clipping.o triangle_projection.o pdlist.o polygon.o iv_draw.o space.o $(IVLDLIBS)

polygon_test: polygon_test.o polygon.o error.o basic.o

mw_io_test: $(MWOBJS) mw_test_io.o




##############################################################################
# version-update
#
rev.c:
	increv


##############################################################################
# dependecies for the interface-builder (devguide)
#
%_ui.c: %.G
	$(GUIDEHOME)/bin/gxv $*

%_ui.h: %_ui.c
	@touch $@

%_stubs.c: %_ui.c
	@touch $@

%.info: %_ui.c
	@touch $@


##############################################################################
# library-generation
#

librob_mobs.a: rob.o mobs_interface.o
	$(AR) $(ARFLAGS) $@ rob.o mobs_interface.o
	$(RANLIB) $@


##############################################################################
# object-compilation
#
app2d.o: app2d.c app2d.h vector.h basic.h error.h
basic.o: basic.c basic.h
clipping.o: clipping.c clipping.h vector.h basic.h
com_motn.o: com_motn.c mob_private.h mob.h scheduler.h vehicle.h queue.h basic.h \
  com_scanner.h mob_limits.h error.h
com_motv.o: com_motv.c com_motv.h mob_private.h mob.h scheduler.h vehicle.h \
  queue.h basic.h mob_limits.h com_scanner.h error.h
com_scanner.o: com_scanner.c com_scanner.h basic.h
command.o: command.c mob_private.h mob.h scheduler.h vehicle.h queue.h basic.h \
  command.h com_scanner.h com_motn.h com_motv.h coms_us.h error.h
coms_us.o: coms_us.c mob_private.h mob.h scheduler.h vehicle.h queue.h basic.h \
  com_scanner.h coms_us.h error.h
conmobs.o: conmobs.c mob.h scheduler.h rev.h
darray.o: darray.c darray.h error.h
edge_reflexion_test.o: edge_reflexion_test.c triangle_projection.h vector.h \
  basic.h list.h triangle.h
error.o: error.c error.h
integration.o: integration.c integration.h error.h
iv_draw.o: iv_draw.c iv_draw.h mob_world.h basic.h vector.h list.h \
  mob_world_private.h mw_object.h mwo_mob.h text.h mw_file.h mob.h scheduler.h \
  queue.h space.h triangle.h triangle_projection.h app2d.h us_sensor.h error.h
iv_space_test.o: iv_space_test.c iv_draw.h mob_world.h basic.h vector.h list.h \
  space.h triangle.h triangle_projection.h
ivd.o: ivd.c ivd.h mw_object.h mob_world.h basic.h vector.h list.h ivdp_obj.h \
  error.h mob_world_private.h mwo_mob.h text.h mw_file.h mob.h scheduler.h \
  queue.h space.h triangle.h triangle_projection.h app2d.h us_sensor.h
ivd_test.o: ivd_test.c mob_world.h basic.h vector.h list.h mw_object.h ivd.h
ivd_tip.o: ivd_tip.c ivd.h mw_object.h mob_world.h basic.h vector.h list.h \
  ivdp_obj.h error.h
ivmobs.o: ivmobs.c mob_world.h basic.h vector.h list.h iv_draw.h
list.o: list.c list.h basic.h error.h
mob.o: mob.c mob_private.h mob.h scheduler.h vehicle.h queue.h basic.h error.h \
  mob_limits.h command.h
mob_world.o: mob_world.c mob_world_private.h mob_world.h basic.h vector.h \
  list.h mw_object.h mwo_mob.h text.h mw_file.h mob.h scheduler.h queue.h space.h \
  triangle.h triangle_projection.h app2d.h us_sensor.h error.h strerror.h \
  pvm_server.h
mobs_interface_test.o: mobs_interface_test.c mobs_interface.h
mobs_pvm_test.o: mobs_pvm_test.c mobs_interface.h
mw_file.o: mw_file.c app2d.h vector.h basic.h mw_file.h mob_world_private.h \
  mob_world.h list.h mw_object.h mwo_mob.h text.h mob.h scheduler.h queue.h \
  space.h triangle.h triangle_projection.h us_sensor.h rev.h error.h strerror.h
mw_object.o: mw_object.c mob_world_private.h mob_world.h basic.h vector.h \
  list.h mw_object.h mwo_mob.h text.h mw_file.h mob.h scheduler.h queue.h space.h \
  triangle.h triangle_projection.h app2d.h us_sensor.h error.h strerror.h \
  pvm_server.h
mw_test_io.o: mw_test_io.c mob_world.h basic.h vector.h list.h mw_object.h \
  mwo_mob.h text.h mw_file.h mob_world_private.h mob.h scheduler.h queue.h \
  space.h triangle.h triangle_projection.h app2d.h us_sensor.h
mwo.o: mwo.c basic.h vector.h error.h mwo.h mw_object.h mob_world.h list.h \
  mwo_mob.h text.h
mwo_mob.o: mwo_mob.c app2d.h vector.h basic.h mwo_mob.h mw_object.h mob_world.h \
  list.h text.h mob_world_private.h mw_file.h mob.h scheduler.h queue.h space.h \
  triangle.h triangle_projection.h us_sensor.h error.h pvm_server.h
parray.o: parray.c parray.h error.h
pdlist.o: pdlist.c pdlist.h basic.h error.h
plist.o: plist.c plist.h basic.h error.h
polygon.o: polygon.c polygon.h vector.h basic.h error.h
polygon_test.o: polygon_test.c basic.h polygon.h vector.h
pvm_server.o: pvm_server.c pvm_server.h mob_world.h basic.h vector.h list.h \
  mw_object.h mob_world_private.h mwo_mob.h text.h mw_file.h mob.h scheduler.h \
  queue.h space.h triangle.h triangle_projection.h app2d.h us_sensor.h \
  mobs_interface_def.h ivd.h error.h
queue.o: queue.c queue.h basic.h error.h
rev.o: rev.c
rob.o: rob.c rob.h mobs_interface.h
rob_additions.o: rob_additions.c rob_additions.h
rob_camera_example.o: rob_camera_example.c rob.h
rob_camera_test.o: rob_camera_test.c rob.h
rob_get_frame.o: rob_get_frame.c rob.h
rob_tip.o: rob_tip.c rob.h
rob_us_sensor.o: rob_us_sensor.c rob.h rob_us_sensor.h
roblib_test.o: roblib_test.c rob.h
scheduler.o: scheduler.c scheduler.h
space.o: space.c space_private.h space.h basic.h vector.h list.h triangle.h \
  triangle_projection.h error.h pdlist.h
space_test.o: space_test.c space_private.h space.h basic.h vector.h list.h \
  triangle.h triangle_projection.h
strerror.o: strerror.c
text.o: text.c text.h error.h
triangle.o: triangle.c triangle.h basic.h vector.h list.h error.h clipping.h \
  vector_geometry.h
triangle_projection.o: triangle_projection.c triangle_projection.h vector.h \
  basic.h list.h triangle.h error.h vector_geometry.h polygon.h
triangle_projection_test.o: triangle_projection_test.c \
  triangle_projection.h vector.h basic.h list.h triangle.h
triangle_test.o: triangle_test.c triangle.h basic.h vector.h list.h
us_sensor.o: us_sensor.c error.h us_sensor.h vector.h basic.h queue.h \
  mw_object.h mob_world.h list.h mob_world_private.h mwo_mob.h text.h mw_file.h \
  mob.h scheduler.h space.h triangle.h triangle_projection.h app2d.h \
  vector_geometry.h
us_sensor_drive.o: us_sensor_drive.c rob.h rob_us_sensor.h
vector.o: vector.c vector.h basic.h
vector_geometry.o: vector_geometry.c vector_geometry.h vector.h basic.h \
  error.h
vehicle.o: vehicle.c basic.h vehicle.h scheduler.h queue.h error.h integration.h
xdraw.o: xdraw.c xdraw.h mob_world_private.h mob_world.h basic.h vector.h list.h \
  mw_object.h mwo_mob.h text.h mw_file.h mob.h scheduler.h queue.h space.h \
  triangle.h triangle_projection.h app2d.h us_sensor.h error.h
xvmobs_stubs.o: xvmobs_stubs.c xvmobs_ui.h mob_world.h basic.h vector.h list.h \
  xdraw.h mob_world_private.h mw_object.h mwo_mob.h text.h mw_file.h mob.h \
  scheduler.h queue.h space.h triangle.h triangle_projection.h app2d.h \
  us_sensor.h mwo.h rev.h pvm_server.h ivd.h
xvmobs_ui.o: xvmobs_ui.c xvmobs_ui.h


