# Used for building sundry applications on the 16WW Raspberry Pi server.

all::
.PHONY: all

.PHONY: clean
clean::
	rm -f *.o

# Optimisation/compilation flags for runtime production code.
CFLAGS= -Wall -Werror \
    -I. \
    -std=c++0x -O3 -flto -fuse-linker-plugin -fstack-check

LIBMODBUS=modbus
LIBMODBUSS=/usr/local/lib

# Wrapper: compiled with target code for maximum optimisation.
MBA=mbaccess
# Dependencies, source incl header.
MBD=$(MBA).h $(MBA).cpp

# Plug-in modules for I/O access.
IOMODULES=i2caccess mbaccess ExpanderPi
# All main I/O module sources.
IOMODULEDEPS=$(IOMODULES:%=%.h) $(IOMODULES:%=%.cpp)

# Expander Pi stand-alone test.
# Exit code 0 implies Expander Pi board present, so RPI3B rather than RPi1/2.
all:: ExpanderPi-demo
ExpanderPi-demo: ExpanderPi-demo.cpp ExpanderPi.cpp ExpanderPi.h \
		i2caccess.cpp i2caccess.h
	rm -f $@
	g++ $(CFLAGS) ExpanderPi-demo.cpp ExpanderPi.cpp i2caccess.cpp -o $@
clean::
	rm -f ExpanderPi-demo

# Expander Pi toggle of dump load control line.
all:: ExpanderPi-dumptoggle
ExpanderPi-dumptoggle: ExpanderPi-dumptoggle.cpp ExpanderPi.cpp ExpanderPi.h \
		i2caccess.cpp i2caccess.h
	rm -f $@
	g++ $(CFLAGS) ExpanderPi-dumptoggle.cpp ExpanderPi.cpp i2caccess.cpp -o $@
clean::
	rm -f ExpanderPi-dumptoggle

# If presence of Expander Pi can be tested at compiler time, do so.
isexppi.mk: makefile ExpanderPi-demo
	@rm -f $@
	@if ./ExpanderPi-demo >/dev/null 2>&1; then \
	    echo 'ISEXPPI = true'; \
	    echo 'CFLAGS += -DISEXPPI=1'; \
	  else \
	    echo 'ISEXPPI = false'; \
	    echo 'CFLAGS += -DISEXPPI=0'; \
	  fi > $@
-include isexppi.mk

# GTest base.
GTEST_DIR=/usr/local/misc/googletest-release-1.8.0/googletest
# GTest includes.
GTEST_INC=$(GTEST_DIR)/include
# GTest object excluding main.
# To (re)build run make in its directory.
GTEST_ALL=$(GTEST_DIR)/make/gtest-all.o
# GTest main.
GTEST_M=$(GTEST_DIR)/make/gtest_main.o

# Built unit tests executable using gtest and its main.
tests/tests-g1: tests/tests-g1.cpp powermng.h
	rm -f $@
	g++ $(CFLAGS) -pthread tests/tests-g1.cpp $(GTEST_ALL) $(GTEST_M) -o $@

# Run tests.
# Fail if any test fails.
all:: tests
tests:: tests/tests-g1
	tests/tests-g1 --gtest_throw_on_failure

# Build power-management utility.
# May require "apt-get install libi2c-dev" to have been done.
all:: powermng
powermng: powermng.cpp powermng.h $(IOMODULEDEPS) isexppi.mk
	rm -f $@
	chmod a+r powermng.cpp
	g++ $(CFLAGS) powermng.cpp $(IOMODULES:%=%.cpp) -l$(LIBMODBUS) -o $@

# Build utility to talk to SS-MPPT-15L over MODBUS.
all:: ssmppt15l-modbus
ssmppt15l-modbus: ssmppt15l-modbus.cpp $(MBD)
	rm -f $@
	chmod a+r ssmppt15l-modbus.cpp
	g++ $(CFLAGS) ssmppt15l-modbus.cpp $(MBA).cpp -l$(LIBMODBUS) -o ssmppt15l-modbus
clean::
	rm -f ssmppt15l-modbus

# Install directly from here
# (powermgr probably has to be run as root).
# Will not install if the tests fail.
install:: powermng tests
	cp -f powermng /usr/local/bin/powermng
	chmod 555 /usr/local/bin/powermng

# Install directly from here
install:: ssmppt15l-modbus tests
	cp -f ssmppt15l-modbus /usr/local/bin/ssmppt15l-modbus
	chmod 555 /usr/local/bin/ssmppt15l-modbus

# Make 'release' copy.
# RELEASE COPY
.PHONY: release
release: powermng ssmppt15l-modbus
	rm -f release/DATE.txt
	cp makefile powermng.cpp powermng.h $(IOMODULEDEPS) release/
	cp ExpanderPi-demo.cpp release/
	cp ssmppt15l-modbus.cpp $(MBD) release/
	echo Release `date -u` > release/DATE.txt
	echo Remember to ensure source files are under repo control.
