####
#### Aria top level makefile
####
####
#### Internal variables:
####
#### CFILEEXT -- This is to denote the file extension that is used. This is
####             used by the build rules to figure out which files to build.
####               ie: cpp
####               ie: cxx
####               ie: cc

# Make sure we're using a compiler (we probably don't need to define
# it but we have been so here it is unless it was already set)
ifndef CXX
CXX:=g++
endif

####
#### General variables
####

CFILEEXT:=cpp
# this is set up with the extra layer since the python wrapper needs exceptions
# but I didn't want to have two sets of defines
BARECXXFLAGS:=-g -Wall -D_REENTRANT  #-pg -fprofile-arcs
CXXFLAGS+=$(BARECXXFLAGS) -fno-exceptions 
CXXINC:=-Iinclude
CXXLINK=-Llib -lAria
CXXSTATICLINK:=-Llib -Xlinker -Bstatic -lAria -Xlinker -Bdynamic 

host:=$(shell uname | cut -d _ -f 1)
ifeq ($(host),MINGW32)
  $(info Building on MinGW)
	#CXXFLAGS+=-mwindows -mms-bitfields -D__MINGW__ -DMINGW
	CXXFLAGS+=-mms-bitfields -D__MINGW__ -DMINGW
	CXXLINK+=-lpthreadGC2 -lwinmm -lws2_32 -lstdc++
	CXXSTATICLINK+=-Wl,-Bstatic -lpthread -Wl,-Bdynamic -lwinmm -lws2_32 -lstdc++
	binsuffix:=.exe
else
	BARECXXFLAGS+=-fPIC
	CXXLINK+=-lpthread -ldl -lrt
	CXXSTATICLINK+=-Xlinker -Bdynamic -lpthread -ldl -lrt -Xlinker -Bstatic -lstdc++ -Xlinker -Bdynamic
	binsuffix:=
endif


ifndef JAVAC
ifdef JAVA_BIN
JAVAC:=$(JAVA_BIN)/javac
else
JAVAC:=javac
endif #ifdef JAVA_BIN
endif #ifndef JAVAC

ifndef JAR
ifdef JAVA_BIN
JAR:=$(JAVA_BIN)/jar
else
JAR:=jar
endif #ifdef JAVA_BIN
endif #ifndef JAR

####
#### Aria build variables
####

# Default targets to build in the default rule:
TARGETS:=lib/libAria.so examples/demo$(binsuffix)

# Default static libraries and examples:
STATIC_TARGETS:=lib/libAria.a examples/demoStatic$(binsuffix)

# Lots of targets, to build in the everything rule:
ALL_TARGETS:=lib/libAria.so utils examples tests docs params lib/libArNetworking.so swig arnetworking_docs arnetworking_swig clib/libArNetworking.a $(STATIC_TARGETS)

CFILES:= \
	ArAction.cpp \
	ArActionAvoidFront.cpp \
	ArActionAvoidSide.cpp \
	ArActionBumpers.cpp \
	ArActionColorFollow.cpp \
	ArActionConstantVelocity.cpp \
	ArActionDeceleratingLimiter.cpp \
	ArActionDesired.cpp \
	ArActionDriveDistance.cpp \
	ArActionGoto.cpp \
	ArActionGotoStraight.cpp \
	ArActionGroup.cpp \
	ArActionGroups.cpp \
	ArActionInput.cpp \
	ArActionIRs.cpp \
	ArActionJoydrive.cpp \
	ArActionKeydrive.cpp \
	ArActionLimiterBackwards.cpp \
	ArActionLimiterForwards.cpp \
	ArActionLimiterRot.cpp \
	ArActionLimiterTableSensor.cpp \
	ArActionMovementParameters.cpp \
	ArActionMovementParametersDebugging.cpp \
	ArActionRatioInput.cpp \
	ArActionRobotJoydrive.cpp \
	ArActionStallRecover.cpp \
	ArActionStop.cpp \
	ArActionTriangleDriveTo.cpp \
	ArActionTurn.cpp \
	ArACTS.cpp \
	ArAMPTU.cpp \
	ArAnalogGyro.cpp \
	ArArg.cpp \
	ArArgumentBuilder.cpp \
	ArArgumentParser.cpp \
	ArASyncTask.cpp \
	ArBasePacket.cpp \
	ArBatteryConnector.cpp \
	ArBatteryMTX.cpp \
	ArBumpers.cpp \
	ArCameraCommands.cpp \
	ArCameraCollection.cpp \
	ArCondition_LIN.cpp \
	ArConfig.cpp \
	ArConfigArg.cpp \
	ArConfigGroup.cpp \
	ArDataLogger.cpp \
	ArDeviceConnection.cpp \
	ArDPPTU.cpp \
	ArFileParser.cpp \
	ArForbiddenRangeDevice.cpp \
	ArFunctorASyncTask.cpp \
	ArGPS.cpp \
	ArGPSConnector.cpp \
	ArGPSCoords.cpp \
	ArGripper.cpp \
	ArInterpolation.cpp \
	ArIrrfDevice.cpp \
	ArIRs.cpp \
	ArJoyHandler.cpp \
	ArKeyHandler.cpp \
	ArLaser.cpp \
	ArLaserConnector.cpp \
	ArLaserFilter.cpp \
	ArLaserLogger.cpp \
	ArLaserReflectorDevice.cpp \
	ArLCDConnector.cpp \
	ArLCDMTX.cpp \
	ArLineFinder.cpp \
	ArLMS1XX.cpp \
	ArLMS2xx.cpp \
	ArLMS2xxPacket.cpp \
	ArLMS2xxPacketReceiver.cpp \
	ArLog.cpp \
	ArLogFileConnection.cpp \
	ArMap.cpp \
	ArMapComponents.cpp \
	ArMapInterface.cpp \
	ArMapObject.cpp \
	ArMapUtils.cpp \
	ArMD5Calculator.cpp \
	ArMode.cpp \
	ArModes.cpp \
	ArModule.cpp \
	ArModuleLoader.cpp \
	ArMutex.cpp \
	ArMutex_LIN.cpp \
	ArNetServer.cpp \
	ArNMEAParser.cpp \
	ArNovatelGPS.cpp \
	ArP2Arm.cpp \
	ArPriorityResolver.cpp \
	ArPTZ.cpp \
  ArPTZConnector.cpp \
	ArRangeBuffer.cpp \
	ArRangeDevice.cpp \
	ArRangeDeviceThreaded.cpp \
	ArRatioInputKeydrive.cpp \
	ArRatioInputJoydrive.cpp \
	ArRatioInputRobotJoydrive.cpp \
	ArRecurrentTask.cpp \
	ArRobot.cpp \
	ArRobotBatteryPacketReader.cpp \
	ArRobotConfig.cpp \
	ArRobotConfigPacketReader.cpp \
	ArRobotConnector.cpp \
	ArRobotJoyHandler.cpp \
	ArRobotPacket.cpp \
	ArRobotPacketReceiver.cpp \
	ArRobotPacketReaderThread.cpp \
	ArRobotPacketSender.cpp \
	ArRobotParams.cpp \
	ArRobotTypes.cpp \
	ArRVisionPTZ.cpp \
	ArS3Series.cpp \
	ArSZSeries.cpp \
	ArSick.cpp \
	ArSimpleConnector.cpp \
	ArSimulatedLaser.cpp \
	ArSocket.cpp \
	ArSonarConnector.cpp \
	ArSonarDevice.cpp \
	ArSonarMTX.cpp \
	ArSensorReading.cpp \
	ArSonyPTZ.cpp \
	ArSoundsQueue.cpp \
	ArSoundPlayer.cpp \
	ArStringInfoGroup.cpp \
	ArSyncLoop.cpp \
	ArSyncTask.cpp \
	ArSystemStatus.cpp \
	ArSonarAutoDisabler.cpp \
	ArSpeech.cpp \
	ArTCM2.cpp \
	ArTCMCompassDirect.cpp \
	ArTCMCompassRobot.cpp \
	ArTcpConnection.cpp \
	ArThread.cpp \
	ArThread_LIN.cpp \
	ArTransform.cpp \
	ArTrimbleGPS.cpp \
	ArUrg.cpp \
	ArUrg_2_0.cpp \
	ArVCC4.cpp \
	Aria.cpp \
	ariaUtil.cpp \
	md5.cpp

# Omit some Linux-only classes, and replace others with Win32 implementations.
ifeq ($(host),MINGW32)
	CFILES+=ArSocket_WIN.cpp \
		ArJoyHandler_WIN.cpp \
		ArSerialConnection_WIN.cpp \
		ArSignalHandler_WIN.cpp
else
	CFILES+=ArSocket_LIN.cpp \
		ArJoyHandler_LIN.cpp \
		ArSerialConnection_LIN.cpp \
		ArSignalHandler_LIN.cpp \
		ArVersalogicIO.cpp \
    ArMTXIO.cpp
endif




####
#### Utility variables. No need to touch these.
####

OTFILES:=$(patsubst %.$(CFILEEXT),%.o,$(CFILES))
OFILES:=$(patsubst %,obj/%,$(OTFILES))
EXAMPLES_CPP:=$(shell find examples -name "*.$(CFILEEXT)" | grep -v Mod.cpp | grep -v proprietary)
EXAMPLES:=$(patsubst %.$(CFILEEXT),%$(binsuffix),$(EXAMPLES_CPP))
EXAMPLES_STATIC:=$(patsubst %,%Static$(binsuffix),$(EXAMPLES))
MOD_EXAMPLES_CPP:=$(shell find examples -name "*.$(CFILEEXT)" | grep Mod.cpp)
MOD_EXAMPLES:=$(patsubst %.$(CFILEEXT),%.so,$(MOD_EXAMPLES_CPP))
TESTS_CPP:=$(shell find tests -name "*.$(CFILEEXT)" | grep -v Mod.cpp | grep -v proprietary)
MOD_TESTS_CPP:=$(shell find tests -name "*Mod.$(CFILEEXT)")
MOD_TESTS:=$(patsubst %.$(CFILEEXT),%.so,$(MOD_TESTS_CPP))
TESTS:=$(patsubst %.$(CFILEEXT),%$(binsuffix),$(TESTS_CPP))
TESTS_STATIC:=$(patsubst %,%Static$(binsuffix),$(TESTS))
ADVANCED_CPP:=$(shell find advanced -name "*.$(CFILEEXT)" | grep -v Mod.cpp | grep -v proprietary)
ADVANCED:=$(patsubst %.$(CFILEEXT),%,$(ADVANCED_CPP))
UTILS_CPP:=$(shell find utils -name "*.$(CFILEEXT)")
UTILS:=$(patsubst %.$(CFILEEXT),%$(binsuffix),$(UTILS_CPP))
SRC_FILES:=$(patsubst %,src/%,$(CFILES))
HEADER_FILES:=$(shell find include -type f -name \*.h)




####
#### General rules for user invocation
####

# Default Rule
all: dirs $(TARGETS)

# Build all targets, docs, params, etc. etc.
everything: dirs $(ALL_TARGETS) 

static: dirs $(STATIC_TARGETS)

# Build everything required for distribution packages
dist-all: lib/libAria.so params docs CommandLineOptions.txt.in \
  lib/libArNetworking.so ArNetworking/CommandLineOptions.txt.in examples/demo \
  examples/demoStatic ArNetworking/examples/serverDemo \
  ArNetworking/examples/serverDemoStatic ArNetworking/examples/clientDemo \
  ArNetworking/examples/clientDemoStatic java python  arnetworking_swig \
  arnetworking_docs

examples: $(EXAMPLES) 

modExamples: $(MOD_EXAMPLES)

tests: $(TESTS) $(MOD_TESTS)

advanced: $(ADVANCED)

utils: $(UTILS)

cleanDep:
	-rm Makefile.dep `find . -name Makefile.dep`

# directories that might not exist:
dirs:
	@mkdir -p -v obj
	@mkdir -p -v lib

docs: doc
doc: docs/index.html
docs/index.html: $(SRC_FILES) $(HEADER_FILES) $(EXAMPLES_CPP) docs/overview.dox docs/options/all_options.dox docs/params.dox
	@echo Removing old documentation...
	$(MAKE) cleanDoc
	@echo Running dist/make-doc.sh to generate HTML API documentation...
	dist/make-doc.sh dev ARIA_DIST_NO_NTP=1
	
arnetworking_swig:
	$(MAKE) -C ArNetworking java python

arnetworking_docs:
	$(MAKE) -C ArNetworking docs

help:
	@echo To make most things, run \'make\' or \'make all\'
	@echo Some useful targets include: 
	@echo "  allLibs, cleanAllLibs, depAllLibs (do all subdirectories)"
	@echo "  clean"
	@echo "  dep"
	@echo "  cleanDep"
	@echo "  docs"
	@echo "  cleanAll (also cleans ArNetworking, java, python, etc.)"
	@echo "  examples"
	@echo "  tests"
	@echo "  utils"
	@echo "  python" 
	@echo "  cleanPython"
	@echo "  java" 
	@echo "  cleanJava"
	@echo "  examples/<Some Example>, where examples/<Some Example>.cpp is an example program source file."
	@echo "  tests/<Some Test>, where tests/<Some Test>.cpp is a test program source file."
	@echo "  allLibs (try to build all auxilliary libraries that you have installed by running make in each directory starting with \"Ar\")"
	@echo "  cleanAllLibs, depAllLibs (do make clean or make dep in the \"Ar*\" auxilliary libraries)"
	@echo "  install (if this is a source tar.gz package)"

info:
	@echo ARIA=$(ARIA)
	@echo CXX=$(CXX)
	@echo CXXFLAGS=$(CXXFLAGS)
	@echo CXXINC=$(CXXINC)
	@echo CXXLINK=$(CXXLINK)
	@echo CXXSTATICLINK=$(CXXSTATICLINK)
	@echo ALL_TARGETS=$(ALL_TARGETS)
	@echo
	@echo JAVAC=$(JAVAC)
	@echo JAR=$(JAR)
	@echo
	@echo Use \'make moreinfo\' for info about individual files, etc.

moreinfo:
	@echo CFILES=$(CFILES)
	@echo
	@echo EXAMPLES=$(EXAMPLES)
	@echo
	@echo MOD_EXAMPLES=$(MOD_EXAMPLES)
	@echo
	@echo TESTS=$(TESTS)
	@echo
	@echo MOD_TESTS=$(MOD_TESTS)
	@echo
	@echo ADVANCED=$(ADVANCED)
	@echo
	@echo UTILS=$(UTILS)
	@echo
	@echo SRC_FILES=$(SRC_FILES)
	@echo
	@echo HEADER_FILES=$(HEADER_FILES)



clean: cleanUtils cleanExamples cleanModules cleanTests cleanAdvanced 
	-rm -f lib/libAria.a lib/libAria.so $(OFILES) `find . -name core` `find . -name '*~'` obj/AriaPy.o obj/AriaJava.o

cleanUtils:
	-rm -f $(UTILS)

cleanExamples:
	-rm -f $(EXAMPLES) $(EXAMPLES_STATIC)

cleanTests:
	-rm -f $(TESTS) $(TESTS_STATIC)

cleanAdvanced:
	-rm -f $(ADVANCED)

cleanModules:
	-rm -f $(MOD_EXAMPLES)

cleanDoc:
	-rm  docs/*.html docs/*.png docs/doxygen.css

cleandoc: cleanDoc

cleanPython:
	-rm python/_AriaPy.so
	-rm python/AriaPy.py
	-rm python/AriaPy.pyc
	-rm python/AriaPy_wrap.cpp
	-rm python/AriaPy_wrap.h
	-rm obj/AriaPy_wrap.o

cleanpython: cleanPython

dep: clean 
	if [ -f `echo src/*.cpp | cut -d' ' -f1` ]; then \
	$(CXX) $(CXXFLAGS) $(CXXINC) -MM src/*.cpp | \
	awk '$$1 ~ /:/{printf "obj/%s\n", $$0} $$1 !~ /:/' > Makefile.dep; fi
	if [ -f `echo examples/*.cpp | cut -d' ' -f1` ]; then \
	$(CXX) $(CXXFLAGS) $(CXXINC) -MM examples/*.cpp | \
	awk '$$1 ~ /:/{printf "examples/%s$(binsuffix)\n", $$0} $$1 !~ /:/' | \
	sed 's/\.o//' >> Makefile.dep; fi
	if [ -f `echo utils/*.cpp | cut -d' ' -f1` ]; then \
	$(CXX) $(CXXFLAGS) $(CXXINC) -MM utils/*.cpp | \
	awk '$$1 ~ /:/{printf "utils/%s$(binsuffix)\n", $$0} $$1 !~ /:/' | \
	sed 's/\.o//' >> Makefile.dep; fi
	if [ -f `echo tests/*.cpp | cut -d' ' -f1` ]; then \
	$(CXX) $(CXXFLAGS) $(CXXINC) -MM tests/*.cpp | \
	awk '$$1 ~ /:/{printf "tests/%s$(binsuffix)\n", $$0} $$1 !~ /:/' | \
	sed 's/\.o//' >> Makefile.dep; fi
	if [ -f `echo advanced/*.cpp | cut -d' ' -f1` ]; then \
	$(CXX) $(CXXFLAGS) $(CXXINC) -MM advanced/*.cpp | \
	awk '$$1 ~ /:/{printf "advanced/%s$(binsuffix)\n", $$0} $$1 !~ /:/' | \
	sed 's/\.o//' >> Makefile.dep; fi

Makefile.dep:
	$(MAKE) dep

depAll: cleanDep
	make dep;
	for dir in `find . -maxdepth 1 -name "Ar*" -xtype d`; do cd $$dir; make dep; cd ..; done

cleanAll: clean 
	rm -f lib/lib*.so*
	for dir in `find . -maxdepth 1 -name "Ar*" -xtype d`; do cd $$dir; make clean; cd ..; done
	$(MAKE) -C ArVideo cleanAll
	$(MAKE) -C ArNetworking cleanAll

fullCleanAll: cleanAll cleanJava cleanPython 
	rm -f lib/lib*.so*
	rm -f obj/*.o*
	for dir in `find . -maxdepth 1 -name "Ar*" -xtype d`; do cd $$dir; make fullClean; cd ..; done



params: utils/makeParams$(binsuffix)
	-mkdir params
	utils/makeParams$(binsuffix)

CommandLineOptions.txt.in docs/options/all_options.dox: utils/genCommandLineOptionDocs$(binsuffix) src/ArSimpleConnector.cpp src/ArGPSConnector.cpp src/ArTCM2.cpp
	-mkdir docs/options
	utils/genCommandLineOptionDocs$(binsuffix)

alllibs: allLibs

allLibs: all 
	find . -type d -and -name Ar\* -maxdepth 1 -exec $(MAKE) -C \{\}  \;

cleanAllLibs: clean cleanJava cleanPython cleanDep
	for dir in `find . -maxdepth 1 -name "Ar*" -xtype d`; do $(MAKE) -C $$dir clean cleanAll; done

cleanalllibs: cleanAllLibs

checkAll:
	$(MAKE) everything > checkAll.log 2>&1
	$(MAKE) allLibs >> checkAll.log 2>&1
	grep -n -v 'Error 1 (ignored)' checkAll.log | grep -C 4 'Error' > checkAll-Errors.log
	@echo
	@echo Errors were:
	@echo
	@cat checkAll-Errors.log
	@echo
	@echo Error log also saved as checkAll-Errors.log.  Full log saved as checkAll.log.

####
#### Swig wrappers
####

ifndef SWIG
SWIG=swig
endif

### Python wrapper: ###


ifdef PYTHON_INCLUDE
PYTHON_INCLUDE_FLAGS=-I$(PYTHON_INCLUDE)
else
ifdef DIST_INSTALL
$(warning WARNING using default value of /usr/include/python2.5 for PYTHON_INCLUDE directory. Set PYTHON_INCLUDE environment variable if you would like to use a different version of the Python C development library to build the Python ARIA wrapper.)
endif
PYTHON_INCLUDE:=/usr/include/python2.5
PYTHON_INCLUDE_FLAGS=-I/usr/include/python2.5
endif

python: python/_AriaPy.so python/AriaPy.py

py: python

python-doc: python/AriaPy.html

python/AriaPy.html: python/AriaPy.py
	cd python; pydoc -w AriaPy

python/AriaPy_wrap.cpp python/AriaPy.py: include/wrapper.i include/*.h
	-rm -f `find python -maxdepth 1 -xtype f -name "*Aria*" | grep -v .ds | grep -v .sln | grep -v .vcproj`
	cd python; $(SWIG) -Wall -c++ -python -modern -module AriaPy -Dlinux -DAREXPORT -o AriaPy_wrap.cpp -I../include ../include/wrapper.i 

python/_AriaPy.so: obj/AriaPy_wrap.o lib/libAria.so Makefile.dep
	if ! test -f $(PYTHON_INCLUDE)/Python.h; then echo Error: $(PYTHON_INCLUDE)/Python.h not found. Is the Python development package installed on this system? Is PYTHON_INCLUDE set correctly?; exit 1; fi
	$(CXX) -shared -o $(@) obj/AriaPy_wrap.o $(CXXLINK)

obj/AriaPy_wrap.o: python/AriaPy_wrap.cpp
	mkdir -p obj
	@ if test -z "$(PYTHON_INCLUDE)"; then echo "*** Error: PYTHON_INCLUDE is not set, cannot build ARIA python wrapper"; fi
	if ! test -f $(PYTHON_INCLUDE)/Python.h; then echo Error: $(PYTHON_INCLUDE)/Python.h not found. Is the Python development package installed on this system? Is PYTHON_INCLUDE set correctly?; exit 1; fi
	$(CXX) -c $(BARECXXFLAGS) $(CXXINC) $(PYTHON_INCLUDE_FLAGS) $< -o $@


### Java Wrapper: ###



java:  lib/libAriaJava.so java/Aria.jar

java/Aria.jar: java/com/mobilerobots/Aria/ArRobot.class
	cd java; $(JAR) cf Aria.jar com/mobilerobots/Aria/*.class

cleanJava:
	-rm -f `find java -xtype f -maxdepth 1 | grep -v .ds | grep -v .sln | grep -v .vcproj` 
	-rm lib/libAriaJava.so
	-rm java/AriaJava_wrap.cpp
	-rm java/AriaJava_wrap.h
	-rm obj/AriaJava_wrap.o

cleanjava: cleanJava

cleanSwigJava:
	-rm -r java/Aria.jar java/com/mobilerobots/Aria

lib/libAriaJava.so: obj/AriaJava_wrap.o lib/libAria.so Makefile.dep
	$(CXX) -shared -o $(@) obj/AriaJava_wrap.o $(CXXLINK) 

obj/AriaJava_wrap.o: java/AriaJava_wrap.cpp
	@ if test -z "$(JAVA_INCLUDE)"; then echo "Error: JAVA_INCLUDE is not set, compiling AriaJava_wrap.cpp will fail!"; fi
	@ test -n "$(JAVA_INCLUDE)"
	@ if test \! -d "$(JAVA_INCLUDE)"; then echo "Error: JAVA_INCLUDE directory $(JAVA_INCLUDE) does not exist, compiling AriaJava_wrap.cpp will fail!"; fi
	@ test -d "$(JAVA_INCLUDE)" 
	mkdir -p obj
	$(CXX) -c $(BARECXXFLAGS) $(CXXINC) -I$(JAVA_INCLUDE) -I$(JAVA_INCLUDE)/linux $< -o $@

java/AriaJava_wrap.cpp java/com/mobilerobots/Aria/ArRobot.java: include/wrapper.i $(HEADER_FILES)
	-mkdir -p java/com/mobilerobots/Aria; rm java/com/mobilerobots/Aria/*.java java/AriaJava_wrap.cpp java/AriaJava_wrap.h;  $(SWIG) -Wall -c++ -java -package com.mobilerobots.Aria -outdir java/com/mobilerobots/Aria -module AriaJava -Dlinux -DAREXPORT -o java/AriaJava_wrap.cpp -Iinclude include/wrapper.i 
    
# The sed script is a hack to let subclasses outside of Aria work for ArFunctor;
# for some reason SWIG doesn't use my %typmeap(javabody) for ArFunctor. 
#    \
#	  && sed 's/protected static long getCPtr/public ArFunctor() { this(0, false); }     public static long getCPtr/' java/com/mobilerobots/Aria/ArFunctor.java > ArFunctor.java.tmp  \
#		&& mv ArFunctor.java.tmp java/com/mobilerobots/Aria/ArFunctor.java

# It is much faster to compile them all at once. Use ArRobot.java/class as a
# stand-in for all java files and all class files.
java/com/mobilerobots/Aria/ArRobot.class: java/com/mobilerobots/Aria/ArRobot.java
		rm java/com/mobilerobots/Aria/*.class; $(JAVAC) -classpath java java/com/mobilerobots/Aria/*.java 


java/ArNetworking.jar: FORCE
	$(MAKE) -C ArNetworking ../$@

lib/libArNetworkingJava.so: FORCE
	$(MAKE) -C ArNetworking ../$@

python/ArNetworkingPy.py: FORCE
	$(MAKE) -C ArNetworking ../$@

python/_ArNetworkingPy.so: FORCE
	$(MAKE) -C ArNetworking ../$@


####
#### Targets to actually build binaries (libraries, programs)
####

lib/libAria.so: $(OFILES) Makefile.dep 
	$(CXX) -shared -o $(@) $(OFILES)

lib/libAria.a: $(OFILES) Makefile.dep 
	ar -cr $(@) $(OFILES)
	ranlib $(@)

examples/%.so: examples/%.$(CFILEEXT) lib/libAria.so Makefile.dep
	$(CXX) $(CXXFLAGS) $(CXXINC) -shared $< -o $@

examples/%$(binsuffix): examples/%.$(CFILEEXT) lib/libAria.so Makefile.dep
	$(CXX) $(CXXFLAGS) $(CXXINC) $< -o $@ $(CXXLINK)

examples/%Static$(binsuffix): examples/%.$(CFILEEXT) lib/libAria.a Makefile.dep
	$(CXX) $(CXXFLAGS) $(CXXINC) $< -o $@ $(CXXSTATICLINK)
	if test -n "$$NOSTRIP"; then strip $@; fi

tests/%.so: tests/%.$(CFILEEXT) lib/libAria.so Makefile.dep
	$(CXX) $(CXXFLAGS) $(CXXINC) -shared $< -o $@

tests/%$(binsuffix): tests/%.$(CFILEEXT) lib/libAria.so Makefile.dep
	$(CXX) $(CXXFLAGS) $(CXXINC) $< -o $@ $(CXXLINK)

tests/%Static$(binsuffix): tests/%.$(CFILEEXT) lib/libAria.a Makefile.dep
	$(CXX) $(CXXFLAGS) $(CXXINC) $< -o $@ $(CXXSTATICLINK)
	if test -n "$$NOSTRIP"; then strip $@; fi

advanced/%.so: advanced/%.$(CFILEEXT) lib/libAria.so
	$(CXX) $(CXXFLAGS) $(CXXINC) -shared $< -o $@

advanced/%$(binsuffix): advanced/%.$(CFILEEXT) lib/libAria.so Makefile.dep
	$(CXX) $(CXXFLAGS) $(CXXINC) $< -o $@ $(CXXLINK)

advanced/%Static$(binsuffix): advanced/%.$(CFILEEXT) lib/libAria.a Makefile.dep
	$(CXX) $(CXXFLAGS) $(CXXINC) $< -o $@ $(CXXSTATICLINK)
	#strip $@

utils/%$(binsuffix): utils/%.$(CFILEEXT) lib/libAria.so Makefile.dep
	$(CXX) $(CXXFLAGS) $(CXXINC) $< -o $@ $(CXXLINK)

utils/%Static$(binsuffix): utils/%.$(CFILEEXT) lib/libAria.a Makefile.dep
	$(CXX) $(CXXFLAGS) $(CXXINC) $< -o $@ $(CXXSTATICLINK)
	#strip $@

utils/genCommandLineOptionDocs$(binsuffix): utils/genCommandLineOptionDocs.cpp lib/libAria.so Makefile.dep
	$(CXX) $(CXXFLAGS) -DFOR_ARIA $(CXXINC) $< -o $@ $(CXXLINK)

ifneq ($(binsuffix),)
examples/%: examples/%$(binsuffix)
utils/%: utils/%$(binsuffix)
advanced/%: advanced/%$(binsuffix)
tests/%: tests/$(binsuffix)
endif

obj/%.o : src/%.cpp Makefile.dep
	@mkdir -p obj
	$(CXX) -c $(CXXFLAGS) $(CXXINC) $< -o $@

obj/%.o : src/%.c Makefile.dep
	@mjdir -p obj
	$(CXX) -c $(CXXFLAGS) $(CXXINC) $< -o $@

include/%.i: include/%.h Makefile.dep
	$(CXX) -E $(CXXFLAGS) $(CXXINC) $< -o $@
	
src/%.i: src/%.cpp Makefile.dep
	$(CXX) -E $(CXXFLAGS) $(CXXINC) $< -o $@
	
# Don't build .o files if their library is up to date with respect to source files:
.INTERMEDIATE: $(OFILES)

# But don't delete .o files if we do make them in order to make a library:
.PRECIOUS: $(OFILES)


# To build things in the ArNetworking subdirectory:

lib/libArNetworking.so: FORCE
	$(MAKE) -C ArNetworking ../$@

lib/libArNetworking.a: FORCE 
	$(MAKE) -C ArNetworking ../$@

ArNetworking/examples/%: ArNetworking/examples/%.cpp lib/libArNetworking.so
	$(MAKE) -C ArNetworking examples/$*

ArNetworking/examples/%Static: ArNetworking/examples/%.cpp lib/libArNetworking.a
	$(MAKE) -C ArNetworking examples/$*Static

#ArNetworking/docs/index.html: FORCE
#	$(MAKE) -C ArNetworking docs/index.html

ArNetworking/%: FORCE
	$(MAKE) -C ArNetworking $*

# This rule doesn't actually produce its target, so anything depending on it
# will always get remade.
FORCE:


####
#### Installation and distribution 
####


ifndef INSTALL_DIR
INSTALL_DIR=/usr/local/Aria
endif

ifndef SYSTEM_ETC_DIR
SYSTEM_ETC_DIR=/etc
endif

# What to put in /etc/Aria:
ifndef STORED_INSTALL_DIR
STORED_INSTALL_DIR=$(INSTALL_DIR)
endif

# How to run 'install' for the install rule:
ifndef INSTALL
INSTALL:=install --preserve-timestamps
endif


dist: FORCE
	dist/dist.sh

dist-install: install

# Install rule.  This can be used by users or ARIA developers; in the latter
# case it also installs various files needed to make a release distribution.
# Override installation locations with INSTALL_DIR environment variable.
# Things are installed group-writable so as to be hacked upon.
install:
	@echo      	--------------------------------------
	@echo		    Installing ARIA in $(DESTDIR)$(INSTALL_DIR)...
	@echo      	--------------------------------------
	$(INSTALL) -m 775 -d $(DESTDIR)$(INSTALL_DIR)
	find    include src tests utils params docs examples advanced maps \
	        ArNetworking java javaExamples python pythonExamples  obj \
	        \( -name \*.o -or -name core -or -name CVS -or -name .\* -or -name \*~ -or -name tmp -or -name proprietary* -or -name \*.bak -or -name \*.class \) -prune  \
	        -or -type d   -exec $(INSTALL) -d -m 777 $(DESTDIR)$(INSTALL_DIR)/\{\} \; \
	        -or -type l   -exec cp --no-dereference \{\} $(DESTDIR)$(INSTALL_DIR)/\{\} \; \
	        -or -name \*.a -exec $(INSTALL) -D -m 666 \{\}  $(DESTDIR)$(INSTALL_DIR)/\{\} \; \
	        -or -perm +1  -exec $(INSTALL) -D --strip -m 777 \{\}  $(DESTDIR)$(INSTALL_DIR)/\{\} \; \
	        -or           -exec $(INSTALL) -D -m 666 \{\} $(DESTDIR)$(INSTALL_DIR)/\{\} \;
	$(INSTALL) -D -m 664 LICENSE.txt INSTALL.txt README.txt Makefile Aria-Reference.html version.txt Changes.txt CommandLineOptions.txt icon.png $(DESTDIR)$(INSTALL_DIR)/
	$(INSTALL) -D -m 666  Makefile.dep doxygen.conf $(DESTDIR)$(INSTALL_DIR)/
	$(INSTALL) -D -m 664 bin/SIMULATOR_README.txt $(DESTDIR)$(INSTALL_DIR)/bin/SIMULATOR_README.txt
	$(INSTALL) -d -m 777 $(DESTDIR)$(INSTALL_DIR)/lib/
	$(INSTALL) -D --strip -m 666 lib/libAria.so lib/libArNetworking.so lib/libAriaJava.so lib/libArNetworkingJava.so $(DESTDIR)$(INSTALL_DIR)/lib/
	@if test -z "$(DIST_INSTALL)"; then \
		echo "if test \! -d $(DESTDIR)$(SYSTEM_ETC_DIR); then install -d $(DESTDIR)$(SYSTEM_ETC_DIR); fi" ;\
		if test \! -d $(DESTDIR)$(SYSTEM_ETC_DIR); then install -d $(DESTDIR)$(SYSTEM_ETC_DIR); fi ;\
		echo "echo $(STORED_INSTALL_DIR) > $(DESTDIR)$(SYSTEM_ETC_DIR)/Aria" ;\
		echo $(STORED_INSTALL_DIR) > $(DESTDIR)$(SYSTEM_ETC_DIR)/Aria ;\
		echo       ------------------------------------------------------------------------------------ ;\
		echo       ARIA has been installed in $(DESTDIR)$(INSTALL_DIR). ;\
		echo ;\
		echo       To be able to use the ARIA libraries, you must now add $(DESTDIR)$(INSTALL_DIR)/lib ;\
		echo       to your LD_LIBRARY_PATH environment variable, or to the /etc/ld.so.conf system file, ;\
		echo       then run \'ldconfig\';\
		echo     	 ------------------------------------------------------------------------------------ ;\
	fi

#		echo ;\
#		echo       The files are owned by the group \"users\", and all members of that group ;\
#		echo       can enter the directory, read files, and modify the \"examples\" directory. ;\

###
### Make optimization, tell it what rules aren't files:
###
.PHONY: all everything examples modExamples tests advanced utils cleanDep docs doc dirs help info moreinfo clean cleanUtils cleanExamples cleanTests cleanAdvanced cleanModules cleanDoc cleanPython dep depAll cleanAll params allLibs python python-doc java cleanJava install alllibs arnetworking_swig arnetworking_docs params swig help info moreinfo py python-doc cleanSwigJava checkAll

### Autogenerated dependencies:
# Just see if there is a Makefile.dep, if so include one... there
# should be one because various rules above depend on Makefile.dep.
# Note, use this ifeq/wildcard hacok rather than "-include" directive to 
# prevent Make from trying to create Makefile.dep itself if missing during the
# recursive call to $(MAKE) dep.  (it just keeps
# calling make dep recursively).
ifeq (Makefile.dep,$(wildcard Makefile.dep))
include Makefile.dep
# End of the Makefile.dep check
endif