include ../common.mk # Directories & files SRC_DIR = src OBJ_DIR = obj TESTS_DIR = tests DOXYGEN_DIR = doc DOXYFILE = Doxyfile # Other tools STYLE = astyle --style=gnu --indent=spaces=2 --formatted CPPCHECK = cppcheck --quiet --enable=all DOXYGEN = OWLPS_VERSION=$(OWLPS_VERSION) doxygen >/dev/null # Flags for the tests TESTSCXXFLAGS = -I$(TESTS_DIR) -I$(SRC_DIR) -I. ## Additional libraries ## LDFLAGS += -lstdc++ -lm -lboost_program_options -pthread -lowlps ifeq "$(OS)" "Linux" LDFLAGS += -lrt endif ifeq "$(OS)" "GNU/kFreeBSD" LDFLAGS += -lrt endif TARGET = owlps-positionerd OBJ_TARGET = $(OBJ_DIR)/$(TARGET).o SOURCE_TARGET = $(SRC_DIR)/$(TARGET).cc OBJ_LIST = \ posutil.o \ autocalibration.o \ stock.o \ timestamp.o \ direction.o \ point3d.o \ referencepoint.o \ waypoint.o \ building.o \ area.o \ wifidevice.o \ accesspoint.o \ mobile.o \ measurement.o \ request.o \ calibrationrequest.o \ resultlist.o \ result.o \ minmax.o \ interlinknetworks.o \ fbcm.o \ frbhmbasic.o \ nss.o \ realposition.o \ configuration.o \ userinterface.o \ inputdatareader.o \ accesspointsreadercsv.o \ mobilesreadercsv.o \ topologyreadercsv.o \ textfilereader.o \ csvfilereader.o \ textfilewriter.o \ output.o \ outputterminal.o \ outputcsv.o \ outputudpsocket.o \ outputtcpsocketevaal.o \ positioning.o \ input.o \ inputcsv.o \ inputudpsocket.o \ inputlogcsv.o OBJ_NOTEST_LIST = \ posexcept.o \ trilaterationalgorithm.o \ cartographyalgorithm.o \ outputnetworksocket.o \ inputmedium.o INTERFACES_LIST = \ inputlogmedium.hh \ outputmedium.hh \ trilaterationmethod.hh \ positioningalgorithm.hh OBJ = $(OBJ_LIST:%=$(OBJ_DIR)/%) OBJ_NOTEST = $(OBJ_NOTEST_LIST:%=$(OBJ_DIR)/%) INTERFACES = $(INTERFACES_LIST:%=$(SRC_DIR)/%) SOURCE = \ $(OBJ:$(OBJ_DIR)/%.o=$(SRC_DIR)/%.hh) \ $(OBJ:$(OBJ_DIR)/%.o=$(SRC_DIR)/%.cc) \ $(OBJ_NOTEST:$(OBJ_DIR)/%.o=$(SRC_DIR)/%.hh) \ $(OBJ_NOTEST:$(OBJ_DIR)/%.o=$(SRC_DIR)/%.cc) \ $(INTERFACES) TESTS_XX = $(TESTS_DIR)/tests.cc TESTS_OBJ = $(TESTS_DIR)/tests.o TESTS_TARGET = $(TESTS_DIR)/tests TESTUTIL_OBJ = $(TESTS_DIR)/testutil.o TESTSETUP_OBJ = $(TESTS_DIR)/testsetup.o SOURCE_TESTS = $(OBJ:$(OBJ_DIR)/%.o=$(TESTS_DIR)/%_test.hh) OBJ_TESTS = $(TESTUTIL_OBJ) $(TESTSETUP_OBJ) INCLUDES_TESTS = $(TESTS_DIR)/valuetraits.hh dynamic: $(TARGET) static: $(TARGET).static all: dynamic static # Generic targets $(TESTS_DIR)/%.o: $(TESTS_DIR)/%.cc $(TESTS_DIR)/%.hh $(CXX) $(CXXFLAGS) $(TESTSCXXFLAGS) -o $@ -c $< $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cc $(SRC_DIR)/%.hh $(MKDIR) $(OBJ_DIR) && $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $@ -c $< %: $(OBJ_DIR)/%.o $(CXX) $(STRIPFLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) %.static: $(OBJ_DIR)/%.o $(CXX) $(STRIPFLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -static $(STRIP) $@ # Dependencies $(OBJ_DIR)/autocalibration.o: \ $(OBJ_DIR)/stock.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/point3d.o: \ $(OBJ_DIR)/posutil.o \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/posutil.o: \ $(OBJ_DIR)/stock.o \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/owlps-positionerd.o: \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/owlps-positionerd.o: \ $(OBJ_DIR)/userinterface.o \ $(OBJ_DIR)/inputdatareader.o \ $(OBJ_DIR)/stock.o \ $(OBJ_DIR)/positioning.o $(OBJ_DIR)/userinterface.o: \ $(OBJ_DIR)/configuration.o $(OBJ_DIR)/inputdatareader.o: \ $(OBJ_DIR)/accesspointsreadercsv.o \ $(OBJ_DIR)/mobilesreadercsv.o \ $(OBJ_DIR)/topologyreadercsv.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/accesspointsreadercsv.o: \ $(OBJ_DIR)/csvfilereader.o \ $(OBJ_DIR)/accesspoint.o \ $(OBJ_DIR)/stock.o $(OBJ_DIR)/mobilesreadercsv.o: \ $(OBJ_DIR)/csvfilereader.o \ $(OBJ_DIR)/mobile.o \ $(OBJ_DIR)/stock.o $(OBJ_DIR)/topologyreadercsv.o: \ $(OBJ_DIR)/csvfilereader.o \ $(OBJ_DIR)/area.o \ $(OBJ_DIR)/waypoint.o \ $(OBJ_DIR)/stock.o $(OBJ_DIR)/referencepoint.o: \ $(OBJ_DIR)/point3d.o \ $(OBJ_DIR)/measurement.o \ $(OBJ_DIR)/stock.o $(OBJ_DIR)/waypoint.o: \ $(OBJ_DIR)/point3d.o \ $(OBJ_DIR)/building.o $(OBJ_DIR)/area.o: \ $(OBJ_DIR)/building.o \ $(OBJ_DIR)/point3d.o $(OBJ_DIR)/wifidevice.o: \ $(OBJ_DIR)/posutil.o $(OBJ_DIR)/accesspoint.o: \ $(OBJ_DIR)/wifidevice.o \ $(OBJ_DIR)/posutil.o \ $(OBJ_DIR)/point3d.o $(OBJ_DIR)/mobile.o: \ $(OBJ_DIR)/wifidevice.o $(OBJ_DIR)/measurement.o: \ $(OBJ_DIR)/accesspoint.o \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/request.o: \ $(OBJ_DIR)/timestamp.o \ $(OBJ_DIR)/measurement.o $(OBJ_DIR)/calibrationrequest.o: \ $(OBJ_DIR)/request.o \ $(OBJ_DIR)/referencepoint.o \ $(OBJ_DIR)/direction.o $(OBJ_DIR)/result.o: \ $(OBJ_DIR)/stock.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/area.o \ $(OBJ_DIR)/request.o $(OBJ_DIR)/resultlist.o: \ $(OBJ_DIR)/result.o $(OBJ_DIR)/textfilereader.o: \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/csvfilereader.o: \ $(OBJ_DIR)/textfilereader.o $(OBJ_DIR)/textfilewriter.o: \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/inputmedium.o: \ $(OBJ_DIR)/calibrationrequest.o \ $(OBJ_DIR)/posexcept.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/stock.o $(OBJ_DIR)/inputcsv.o: \ $(OBJ_DIR)/inputmedium.o \ $(OBJ_DIR)/csvfilereader.o \ $(OBJ_DIR)/request.o \ $(OBJ_DIR)/calibrationrequest.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/stock.o $(OBJ_DIR)/inputudpsocket.o: \ $(OBJ_DIR)/inputmedium.o \ $(OBJ_DIR)/posexcept.o \ $(OBJ_DIR)/request.o \ $(OBJ_DIR)/calibrationrequest.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/stock.o $(OBJ_DIR)/inputlogcsv.o: \ $(SRC_DIR)/inputlogmedium.hh \ $(OBJ_DIR)/request.o $(OBJ_DIR)/input.o: \ $(OBJ_DIR)/inputcsv.o \ $(OBJ_DIR)/inputudpsocket.o \ $(OBJ_DIR)/inputlogcsv.o \ $(OBJ_DIR)/calibrationrequest.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/posexcept.o \ $(OBJ_DIR)/stock.o $(OBJ_DIR)/outputterminal.o: \ $(SRC_DIR)/outputmedium.hh \ $(OBJ_DIR)/resultlist.o \ $(OBJ_DIR)/result.o $(OBJ_DIR)/outputcsv.o: \ $(SRC_DIR)/outputmedium.hh \ $(OBJ_DIR)/textfilewriter.o \ $(OBJ_DIR)/resultlist.o \ $(OBJ_DIR)/result.o $(OBJ_DIR)/outputnetworksocket.o: \ $(SRC_DIR)/outputmedium.hh \ $(OBJ_DIR)/resultlist.o \ $(OBJ_DIR)/result.o $(OBJ_DIR)/outputudpsocket.o: \ $(OBJ_DIR)/outputnetworksocket.o \ $(OBJ_DIR)/request.o \ $(OBJ_DIR)/resultlist.o \ $(OBJ_DIR)/result.o \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/outputtcpsocketevaal.o: \ $(OBJ_DIR)/outputnetworksocket.o \ $(OBJ_DIR)/request.o \ $(OBJ_DIR)/resultlist.o \ $(OBJ_DIR)/result.o \ $(OBJ_DIR)/area.o \ $(OBJ_DIR)/posexcept.o \ $(OBJ_DIR)/stock.o $(OBJ_DIR)/outputcsv.o: \ $(SRC_DIR)/outputmedium.hh \ $(OBJ_DIR)/result.o $(OBJ_DIR)/output.o: \ $(OBJ_DIR)/outputterminal.o \ $(OBJ_DIR)/outputcsv.o \ $(OBJ_DIR)/outputudpsocket.o \ $(OBJ_DIR)/outputtcpsocketevaal.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/trilaterationalgorithm.o: \ $(SRC_DIR)/positioningalgorithm.hh \ $(OBJ_DIR)/minmax.o \ $(OBJ_DIR)/mobile.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/cartographyalgorithm.o: \ $(SRC_DIR)/positioningalgorithm.hh \ $(OBJ_DIR)/referencepoint.o $(OBJ_DIR)/minmax.o: \ $(SRC_DIR)/trilaterationmethod.hh \ $(OBJ_DIR)/point3d.o \ $(OBJ_DIR)/accesspoint.o $(OBJ_DIR)/interlinknetworks.o: \ $(OBJ_DIR)/trilaterationalgorithm.o $(OBJ_DIR)/fbcm.o: \ $(OBJ_DIR)/trilaterationalgorithm.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/stock.o $(OBJ_DIR)/frbhmbasic.o: \ $(OBJ_DIR)/nss.o \ $(OBJ_DIR)/fbcm.o $(OBJ_DIR)/nss.o: \ $(OBJ_DIR)/cartographyalgorithm.o $(OBJ_DIR)/realposition.o: \ $(SRC_DIR)/positioningalgorithm.hh \ $(OBJ_DIR)/result.o \ $(OBJ_DIR)/calibrationrequest.o \ $(OBJ_DIR)/referencepoint.o $(OBJ_DIR)/positioning.o: \ $(OBJ_DIR)/inputdatareader.o \ $(OBJ_DIR)/input.o \ $(OBJ_DIR)/realposition.o \ $(OBJ_DIR)/fbcm.o \ $(OBJ_DIR)/frbhmbasic.o \ $(OBJ_DIR)/interlinknetworks.o \ $(OBJ_DIR)/nss.o \ $(OBJ_DIR)/resultlist.o \ $(OBJ_DIR)/output.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/posexcept.o # Specific targets $(TARGET): $(OBJ) $(OBJ_NOTEST) $(OBJ_TARGET) $(TARGET).static: $(OBJ) $(OBJ_NOTEST) $(OBJ_TARGET) $(OBJ_TARGET): $(SOURCE_TARGET) $(CXX) $(CXXFLAGS) -o $@ -c $< $(TESTS_XX): $(SOURCE_TESTS) $(OBJ) $(TESTS_DIR)/cxxtestgen.pl --error-printer \ --include=$(TESTS_DIR)/valuetraits.hh \ --include=$(TESTUTIL_OBJ:.o=.hh) \ -o $@ $(SOURCE_TESTS) $(TESTS_OBJ): $(TESTS_XX) $(INCLUDES_TESTS) $(CXX) $(CXXFLAGS) $(TESTSCXXFLAGS) -o $@ -c $< $(TESTS_TARGET): $(TESTS_OBJ) $(OBJ_TESTS) $(OBJ) $(OBJ_NOTEST) $(LD) $(LDFLAGS) -o $@ $^ test_forced: $(TESTS_TARGET) @$(TESTS_TARGET) test: @echo "Unit tests are currently unmaintained. If you are sure" @echo "you want to try them, use the target 'test_forced'." doc: @$(DOXYGEN) $(DOXYFILE) clean: @$(RM) *~ */*~ *.orig */*.orig @$(RM_RECURSIVE) $(OBJ_DIR) @$(RM) $(TESTS_XX) $(TESTS_DIR)/*.o purge: clean @$(RM) $(TARGET) @$(RM) $(TARGET).static @$(RM) $(TESTS_TARGET) @$(RM_RECURSIVE) $(DOXYGEN_DIR) install: $(TARGET) @$(CP) $(TARGET) $(INSTALL_DIR) && \ chmod 755 $(INSTALL_DIR)/$(TARGET) && \ chown root:root $(INSTALL_DIR)/$(TARGET) uninstall: @$(RM) $(INSTALL_DIR)/$(TARGET) style: @$(STYLE) \ $(SOURCE) \ $(TESTS_DIR)/*.hh \ $(TESTS_DIR)/*.cc check: @$(CPPCHECK) \ $(SOURCE) \ $(TARGET).cc help: @echo "/!\ This program requires GCC >=4.4 /!\\" @echo @echo "Needed libraries:" @echo " libboost-dev" @echo " libboost-program-options-dev" @echo @echo "Optional programs nedded for specific targets:" @echo " doxygen" @echo " CxxTest suite" @echo " astyle (Artistic Style)" @echo " cppcheck" @echo @echo "Targets:" @echo " all (default target): Compiles OwlPS Positioner." @echo " doc: Generates documentation from source files (doxygen \ is required)." @echo " install: Installs OwlPS Positioner." @echo " uninstall: Uninstalls OwlPS Positioner." @echo "" @echo " test: Run unit tests (CxxTest suite is required)." @echo " style: Reindent source files (astyle is required)." @echo " check: Run automated checs on the source code (cppcheck \ is required)." @echo @echo " clean: Delete the temporary files." @echo " purge: Delete all generated files." @echo @echo "Note: Files are installed under $(PREFIX)." @echo "Tune the PREFIX variable in the Makefile to change that."