# A sample Makefile for building Google Test and using it in user
# tests.  Please tweak it to suit your environment and project.  You
# may want to move it to your project's root directory.
#
# SYNOPSIS:
#
#   make [all]  - makes everything.
#   make TARGET - makes the given target.
#   make clean  - removes all files generated by make.

# Please tweak the following variable definitions as needed by your
# project, except GTEST_HEADERS, which you can use in your own targets
# but shouldn't modify.

# Points to the root of Google Test, relative to where this file is.
# Remember to tweak this if you move this file.
GTEST_DIR = ../../lib/test/gtest

# Where to find user code.
USER_DIR = ../main
TEST_DIR = unit
USER_INCLUDE_DIR = $(USER_DIR)

OBJECT_DIR = ../../obj/test

WARN_FLAGS	= -Wall -Wextra

ifneq ($(filter $(OPTIONS),FAIL_ON_WARNINGS),)
WARN_FLAGS      += -Werror
endif

COMMON_FLAGS = \
	-g \
	-pthread \
	$(WARN_FLAGS) \
	-ggdb3 \
	-O0 \
	-DUNIT_TEST \
	-isystem $(GTEST_DIR)/inc \
	-MMD -MP

# Flags passed to the C compiler.
C_FLAGS = $(COMMON_FLAGS) \
	-std=gnu99

# Flags passed to the C++ compiler.
CXX_FLAGS = $(COMMON_FLAGS) \
	-std=gnu++11

# Compiler flags for coverage instrumentation
COVERAGE_FLAGS := --coverage

C_FLAGS   += $(COVERAGE_FLAGS)
CXX_FLAGS += $(COVERAGE_FLAGS)

#enable fast Maths tests
C_FLAGS   += -DFAST_MATH
CXX_FLAGS += -DFAST_MATH

# Determine the OS and set up the parameter group linker flags accordingly
UNAME := $(shell uname -s)
ifeq ($(UNAME), Darwin)
PG_FLAGS = -Wl,-map,$(OBJECT_DIR)/$@.map
else
PG_FLAGS = -Wl,-T,$(TEST_DIR)/parameter_group.ld -Wl,-Map,$(OBJECT_DIR)/$@.map
endif

# Gather up all of the tests.
TEST_SRC = $(sort $(wildcard $(TEST_DIR)/*.cc))
TESTS = $(TEST_SRC:$(TEST_DIR)/%.cc=%)
TEST_BINARIES = $(TESTS:%=$(OBJECT_DIR)/%)

# All Google Test headers.  Usually you shouldn't change this
# definition.
GTEST_HEADERS = $(GTEST_DIR)/inc/gtest/*.h

# House-keeping build targets.

## all         : Build all Unit Tests (Default goal)
all : $(TEST_BINARIES)

## clean       : Cleanup the UnitTest binaries.
clean :
	rm -rf $(OBJECT_DIR)


# Builds gtest.a and gtest_main.a.

# Usually you shouldn't tweak such internal variables, indicated by a
# trailing _.
GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/inc/gtest/*.h $(GTEST_HEADERS)

# For simplicity and to avoid depending on Google Test's
# implementation details, the dependencies specified below are
# conservative and not optimized.  This is fine as Google Test
# compiles fast and for ordinary users its source rarely changes.
$(OBJECT_DIR)/gtest-all.o : $(GTEST_SRCS_)
	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) -I$(GTEST_DIR) -Wno-missing-field-initializers -Wno-unused-const-variable -c \
            $(GTEST_DIR)/src/gtest-all.cc -o $@

$(OBJECT_DIR)/gtest_main.o : $(GTEST_SRCS_)
	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) -I$(GTEST_DIR) -c \
            $(GTEST_DIR)/src/gtest_main.cc -o $@

$(OBJECT_DIR)/gtest.a : $(OBJECT_DIR)/gtest-all.o
	$(AR) $(ARFLAGS) $@ $^

$(OBJECT_DIR)/gtest_main.a : $(OBJECT_DIR)/gtest-all.o $(OBJECT_DIR)/gtest_main.o
	$(AR) $(ARFLAGS) $@ $^

# Builds a sample test.  A test should link with either gtest.a or
# gtest_main.a, depending on whether it defines its own main()
# function.

# includes in test dir must override includes in user dir
TEST_INCLUDE_DIRS := $(TEST_DIR) \
	$(USER_INCLUDE_DIR)

TEST_CFLAGS	 = $(addprefix -I,$(TEST_INCLUDE_DIRS))

DEPS = $(TEST_BINARIES:%=%.d)

$(OBJECT_DIR)/common/maths.o : \
	$(USER_DIR)/common/maths.c \
	$(USER_DIR)/common/maths.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/common/maths.c -o $@

$(OBJECT_DIR)/maths_unittest.o : \
	$(TEST_DIR)/maths_unittest.cc \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/maths_unittest.cc -o $@

$(OBJECT_DIR)/maths_unittest : \
	$(OBJECT_DIR)/maths_unittest.o \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/common/filter.o : \
	$(USER_DIR)/common/filter.c \
	$(USER_DIR)/common/filter.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/common/filter.c -o $@

$(OBJECT_DIR)/common_filter_unittest.o : \
	$(TEST_DIR)/common_filter_unittest.cc \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/common_filter_unittest.cc -o $@

$(OBJECT_DIR)/common_filter_unittest : \
	$(OBJECT_DIR)/common_filter_unittest.o \
	$(OBJECT_DIR)/common/filter.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/common/encoding.o : $(USER_DIR)/common/encoding.c $(USER_DIR)/common/encoding.h $(GTEST_HEADERS)
	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/common/encoding.c -o $@

$(OBJECT_DIR)/encoding_unittest.o : \
	$(TEST_DIR)/encoding_unittest.cc \
	$(USER_DIR)/common/encoding.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/encoding_unittest.cc -o $@

$(OBJECT_DIR)/encoding_unittest : \
	$(OBJECT_DIR)/common/encoding.o \
	$(OBJECT_DIR)/encoding_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/common/typeconversion.o : \
	$(USER_DIR)/common/typeconversion.c \
	$(USER_DIR)/common/typeconversion.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/common/typeconversion.c -o $@

$(OBJECT_DIR)/type_conversion_unittest.o : \
	$(TEST_DIR)/type_conversion_unittest.cc \
	$(USER_DIR)/common/typeconversion.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/type_conversion_unittest.cc -o $@

$(OBJECT_DIR)/type_conversion_unittest : \
	$(OBJECT_DIR)/common/typeconversion.o \
	$(OBJECT_DIR)/type_conversion_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@



$(OBJECT_DIR)/flight/imu.o : \
	$(USER_DIR)/flight/imu.c \
	$(USER_DIR)/flight/imu.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/flight/imu.c -o $@

$(OBJECT_DIR)/flight_imu_unittest.o : \
	$(TEST_DIR)/flight_imu_unittest.cc \
	$(USER_DIR)/flight/imu.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/flight_imu_unittest.cc -o $@

$(OBJECT_DIR)/flight_imu_unittest : \
	$(OBJECT_DIR)/flight/imu.o \
	$(OBJECT_DIR)/common/filter.o \
	$(OBJECT_DIR)/flight/altitudehold.o \
	$(OBJECT_DIR)/flight_imu_unittest.o \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/flight/pid.o : \
	$(USER_DIR)/flight/pid.c \
	$(USER_DIR)/flight/pid.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -DBLACKBOX -c $(USER_DIR)/flight/pid.c -o $@

$(OBJECT_DIR)/flight/pid_luxfloat.o : \
	$(USER_DIR)/flight/pid_luxfloat.c \
	$(USER_DIR)/flight/pid.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -DBLACKBOX -c $(USER_DIR)/flight/pid_luxfloat.c -o $@

$(OBJECT_DIR)/flight/pid_mwrewrite.o : \
	$(USER_DIR)/flight/pid_mwrewrite.c \
	$(USER_DIR)/flight/pid.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -DBLACKBOX -c $(USER_DIR)/flight/pid_mwrewrite.c -o $@

$(OBJECT_DIR)/flight/pid_mw23.o : \
	$(USER_DIR)/flight/pid_mw23.c \
	$(USER_DIR)/flight/pid.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -DBLACKBOX -c $(USER_DIR)/flight/pid_mw23.c -o $@

$(OBJECT_DIR)/flight_pid_unittest.o : \
	$(TEST_DIR)/flight_pid_unittest.cc \
	$(USER_DIR)/flight/pid.h \
	$(USER_DIR)/flight/pid.c \
	$(USER_DIR)/flight/pid_luxfloat.c \
	$(USER_DIR)/flight/pid_mwrewrite.c \
	$(USER_DIR)/flight/pid_mw23.c \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/flight_pid_unittest.cc -o $@

$(OBJECT_DIR)/flight_pid_unittest : \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/common/filter.o \
	$(OBJECT_DIR)/flight/pid.o \
	$(OBJECT_DIR)/flight/pid_luxfloat.o \
	$(OBJECT_DIR)/flight/pid_mwrewrite.o \
	$(OBJECT_DIR)/flight/pid_mw23.o \
	$(OBJECT_DIR)/flight_pid_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/flight/altitudehold.o : \
	$(USER_DIR)/flight/altitudehold.c \
	$(USER_DIR)/flight/altitudehold.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/flight/altitudehold.c -o $@

$(OBJECT_DIR)/flight_altitudehold_unittest.o : \
	$(TEST_DIR)/flight_altitudehold_unittest.cc \
	$(USER_DIR)/flight/altitudehold.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/flight_altitudehold_unittest.cc -o $@

$(OBJECT_DIR)/flight_altitudehold_unittest : \
	$(OBJECT_DIR)/flight/altitudehold.o \
	$(OBJECT_DIR)/flight_altitudehold_unittest.o \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@


$(OBJECT_DIR)/flight/gps_conversion.o : \
	$(USER_DIR)/flight/gps_conversion.c \
	$(USER_DIR)/flight/gps_conversion.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/flight/gps_conversion.c -o $@

$(OBJECT_DIR)/gps_conversion_unittest.o : \
	$(TEST_DIR)/gps_conversion_unittest.cc \
	$(USER_DIR)/flight/gps_conversion.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/gps_conversion_unittest.cc -o $@

$(OBJECT_DIR)/gps_conversion_unittest : \
	$(OBJECT_DIR)/flight/gps_conversion.o \
	$(OBJECT_DIR)/gps_conversion_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@



$(OBJECT_DIR)/flight/mixer.o : \
	$(USER_DIR)/flight/mixer.c \
	$(USER_DIR)/flight/mixer.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/flight/mixer.c -o $@

$(OBJECT_DIR)/flight/servos.o : \
	$(USER_DIR)/flight/servos.c \
	$(USER_DIR)/flight/servos.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/flight/servos.c -o $@

$(OBJECT_DIR)/flight_mixer_unittest.o : \
	$(TEST_DIR)/flight_mixer_unittest.cc \
	$(USER_DIR)/flight/mixer.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/flight_mixer_unittest.cc -o $@

$(OBJECT_DIR)/flight_mixer_unittest : \
	$(OBJECT_DIR)/flight/mixer.o \
	$(OBJECT_DIR)/flight/servos.o \
	$(OBJECT_DIR)/flight_mixer_unittest.o \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/flight/failsafe.o : \
	$(USER_DIR)/flight/failsafe.c \
	$(USER_DIR)/flight/failsafe.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/flight/failsafe.c -o $@

$(OBJECT_DIR)/flight_failsafe_unittest.o : \
	$(TEST_DIR)/flight_failsafe_unittest.cc \
	$(USER_DIR)/flight/failsafe.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/flight_failsafe_unittest.cc -o $@

$(OBJECT_DIR)/flight_failsafe_unittest : \
	$(OBJECT_DIR)/flight/failsafe.o \
	$(OBJECT_DIR)/flight_failsafe_unittest.o \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@



$(OBJECT_DIR)/telemetry/hott.o : \
	$(USER_DIR)/telemetry/hott.c \
	$(USER_DIR)/telemetry/hott.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/telemetry/hott.c -o $@

$(OBJECT_DIR)/telemetry_hott_unittest.o : \
	$(TEST_DIR)/telemetry_hott_unittest.cc \
	$(USER_DIR)/telemetry/hott.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/telemetry_hott_unittest.cc -o $@

$(OBJECT_DIR)/telemetry_hott_unittest : \
	$(OBJECT_DIR)/telemetry/hott.o \
	$(OBJECT_DIR)/telemetry_hott_unittest.o \
	$(OBJECT_DIR)/flight/gps_conversion.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@



$(OBJECT_DIR)/io/rate_profile.o : \
	$(USER_DIR)/io/rate_profile.c \
	$(USER_DIR)/io/rate_profile.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/io/rc_controls.c -o $@

$(OBJECT_DIR)/io/rc_adjustments.o : \
	$(USER_DIR)/io/rc_adjustments.c \
	$(USER_DIR)/io/rc_adjustments.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/io/rc_adjustments.c -o $@

$(OBJECT_DIR)/io/rc_controls.o : \
	$(USER_DIR)/io/rc_controls.c \
	$(USER_DIR)/io/rc_controls.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/io/rc_controls.c -o $@

$(OBJECT_DIR)/rc_controls_unittest.o : \
	$(TEST_DIR)/rc_controls_unittest.cc \
	$(USER_DIR)/io/rc_controls.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/rc_controls_unittest.cc -o $@

$(OBJECT_DIR)/rc_controls_unittest : \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/io/rc_controls.o \
	$(OBJECT_DIR)/io/rc_adjustments.o \
	$(OBJECT_DIR)/rc_controls_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@


$(OBJECT_DIR)/io/ledstrip.o : \
	$(USER_DIR)/io/ledstrip.c \
	$(USER_DIR)/io/ledstrip.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/io/ledstrip.c -o $@

$(OBJECT_DIR)/ledstrip_unittest.o : \
	$(TEST_DIR)/ledstrip_unittest.cc \
	$(USER_DIR)/io/ledstrip.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/ledstrip_unittest.cc -o $@

$(OBJECT_DIR)/ledstrip_unittest : \
	$(OBJECT_DIR)/io/ledstrip.o \
	$(OBJECT_DIR)/ledstrip_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@



$(OBJECT_DIR)/drivers/light_ws2811strip.o : \
	$(USER_DIR)/drivers/light_ws2811strip.c \
	$(USER_DIR)/drivers/light_ws2811strip.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/drivers/light_ws2811strip.c -o $@

$(OBJECT_DIR)/ws2811_unittest.o : \
	$(TEST_DIR)/ws2811_unittest.cc \
	$(USER_DIR)/drivers/light_ws2811strip.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/ws2811_unittest.cc -o $@

$(OBJECT_DIR)/ws2811_unittest : \
	$(OBJECT_DIR)/drivers/light_ws2811strip.o \
	$(OBJECT_DIR)/ws2811_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/io/serial.o : \
	$(USER_DIR)/io/serial.c \
	$(USER_DIR)/io/serial.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/io/serial.c -o $@

$(OBJECT_DIR)/io_serial_unittest.o : \
	$(TEST_DIR)/io_serial_unittest.cc \
	$(USER_DIR)/io/serial.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/io_serial_unittest.cc -o $@

$(OBJECT_DIR)/io_serial_unittest : \
	$(OBJECT_DIR)/io/serial.o \
	$(OBJECT_DIR)/io_serial_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/rx/rx.o : \
	$(USER_DIR)/rx/rx.c \
	$(USER_DIR)/rx/rx.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/rx/rx.c -o $@

$(OBJECT_DIR)/rx_rx_unittest.o : \
	$(TEST_DIR)/rx_rx_unittest.cc \
	$(USER_DIR)/rx/rx.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/rx_rx_unittest.cc -o $@

$(OBJECT_DIR)/rx_rx_unittest : \
	$(OBJECT_DIR)/rx/rx.o \
	$(OBJECT_DIR)/rx_rx_unittest.o \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/rx_ranges_unittest.o : \
	$(TEST_DIR)/rx_ranges_unittest.cc \
	$(USER_DIR)/rx/rx.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/rx_ranges_unittest.cc -o $@

$(OBJECT_DIR)/rx_ranges_unittest : \
	$(OBJECT_DIR)/rx/rx.o \
	$(OBJECT_DIR)/rx_ranges_unittest.o \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@


$(OBJECT_DIR)/sensors/battery.o : $(USER_DIR)/sensors/battery.c $(USER_DIR)/sensors/battery.h $(GTEST_HEADERS)
	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/sensors/battery.c -o $@

$(OBJECT_DIR)/battery_unittest.o : \
	$(TEST_DIR)/battery_unittest.cc \
	$(USER_DIR)/sensors/battery.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $< -o $@

$(OBJECT_DIR)/battery_unittest : \
	$(OBJECT_DIR)/sensors/battery.o \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/battery_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $@


$(OBJECT_DIR)/drivers/barometer_ms5611.o : \
    $(USER_DIR)/drivers/barometer_ms5611.c \
    $(USER_DIR)/drivers/barometer_ms5611.h \
    $(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/drivers/barometer_ms5611.c -o $@

$(OBJECT_DIR)/baro_ms5611_unittest.o : \
	$(TEST_DIR)/baro_ms5611_unittest.cc \
	$(USER_DIR)/drivers/barometer_ms5611.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/baro_ms5611_unittest.cc -o $@

$(OBJECT_DIR)/baro_ms5611_unittest : \
	$(OBJECT_DIR)/drivers/barometer_ms5611.o \
	$(OBJECT_DIR)/baro_ms5611_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/drivers/barometer_bmp085.o : \
    $(USER_DIR)/drivers/barometer_bmp085.c \
    $(USER_DIR)/drivers/barometer_bmp085.h \
    $(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/drivers/barometer_bmp085.c -o $@

$(OBJECT_DIR)/baro_bmp085_unittest.o : \
	$(TEST_DIR)/baro_bmp085_unittest.cc \
	$(USER_DIR)/drivers/barometer_bmp085.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/baro_bmp085_unittest.cc -o $@

$(OBJECT_DIR)/baro_bmp085_unittest : \
	$(OBJECT_DIR)/drivers/barometer_bmp085.o \
	$(OBJECT_DIR)/baro_bmp085_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/drivers/barometer_bmp280.o : \
    $(USER_DIR)/drivers/barometer_bmp280.c \
    $(USER_DIR)/drivers/barometer_bmp280.h \
    $(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/drivers/barometer_bmp280.c -o $@

$(OBJECT_DIR)/baro_bmp280_unittest.o : \
	$(TEST_DIR)/baro_bmp280_unittest.cc \
	$(USER_DIR)/drivers/barometer_bmp280.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/baro_bmp280_unittest.cc -o $@

$(OBJECT_DIR)/baro_bmp280_unittest : \
	$(OBJECT_DIR)/drivers/barometer_bmp280.o \
	$(OBJECT_DIR)/baro_bmp280_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/drivers/sonar_hcsr04.o : \
        $(USER_DIR)/drivers/sonar_hcsr04.c \
        $(USER_DIR)/drivers/sonar_hcsr04.h \
        $(GTEST_HEADERS)
	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -DSONAR -c $(USER_DIR)/drivers/sonar_hcsr04.c -o $@

$(OBJECT_DIR)/sensors/sonar.o : \
	$(USER_DIR)/sensors/sonar.c \
	$(USER_DIR)/sensors/sonar.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -DSONAR -c $(USER_DIR)/sensors/sonar.c -o $@

$(OBJECT_DIR)/sonar_unittest.o : \
	$(TEST_DIR)/sonar_unittest.cc \
	$(USER_DIR)/drivers/sonar_hcsr04.h \
	$(USER_DIR)/sensors/sonar.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/sonar_unittest.cc -o $@

$(OBJECT_DIR)/sonar_unittest : \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/drivers/sonar_hcsr04.o \
	$(OBJECT_DIR)/sensors/sonar.o \
	$(OBJECT_DIR)/sonar_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/sensors/boardalignment.o : \
	$(USER_DIR)/sensors/boardalignment.c \
	$(USER_DIR)/sensors/boardalignment.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/sensors/boardalignment.c -o $@

$(OBJECT_DIR)/alignsensor_unittest.o : \
	$(TEST_DIR)/alignsensor_unittest.cc \
	$(USER_DIR)/sensors/boardalignment.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/alignsensor_unittest.cc -o $@

$(OBJECT_DIR)/alignsensor_unittest : \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/sensors/boardalignment.o \
	$(OBJECT_DIR)/alignsensor_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@


$(OBJECT_DIR)/version.o : \
	$(USER_DIR)/version.c \
	$(USER_DIR)/version.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -D'__TARGET__="TEST"' -D'__REVISION__="revision"' -c $(USER_DIR)/version.c -o $@

$(OBJECT_DIR)/drivers/buf_writer.o : \
	$(USER_DIR)/drivers/buf_writer.c \
	$(USER_DIR)/drivers/buf_writer.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -D'__TARGET__="TEST"' -D'__REVISION__="revision"' -c $(USER_DIR)/drivers/buf_writer.c -o $@

$(OBJECT_DIR)/common/streambuf.o : \
	$(USER_DIR)/common/streambuf.c \
	$(USER_DIR)/common/streambuf.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -D'__TARGET__="TEST"' -D'__REVISION__="revision"' -c $(USER_DIR)/common/streambuf.c -o $@

$(OBJECT_DIR)/io/serial_msp.o : \
	$(USER_DIR)/io/serial_msp.c \
	$(USER_DIR)/io/serial_msp.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/io/serial_msp.c -o $@

$(OBJECT_DIR)/io/msp.o : \
	$(USER_DIR)/io/msp.c \
	$(USER_DIR)/io/msp.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/io/msp.c -o $@

$(OBJECT_DIR)/serial_msp_unittest.o : \
	$(TEST_DIR)/serial_msp_unittest.cc \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/serial_msp_unittest.cc -o $@

$(OBJECT_DIR)/serial_msp_unittest : \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/common/streambuf.o \
	$(OBJECT_DIR)/version.o \
	$(OBJECT_DIR)/io/serial.o \
	$(OBJECT_DIR)/io/serial_msp.o \
	$(OBJECT_DIR)/drivers/buf_writer.o \
	$(OBJECT_DIR)/config/parameter_group.o \
	$(OBJECT_DIR)/serial_msp_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $(PG_FLAGS) $^ -o $(OBJECT_DIR)/$@

$(OBJECT_DIR)/msp_unittest.o : \
	$(TEST_DIR)/msp_unittest.cc \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/msp_unittest.cc -o $@

$(OBJECT_DIR)/msp_unittest : \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/common/streambuf.o \
	$(OBJECT_DIR)/version.o \
	$(OBJECT_DIR)/io/serial.o \
	$(OBJECT_DIR)/io/msp.o \
	$(OBJECT_DIR)/config/parameter_group.o \
	$(OBJECT_DIR)/msp_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $(PG_FLAGS) $^ -o $(OBJECT_DIR)/$@


$(OBJECT_DIR)/scheduler_tasks.o : \
	$(USER_DIR)/scheduler_tasks.c \
	$(USER_DIR)/scheduler.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/scheduler_tasks.c -o $@

$(OBJECT_DIR)/scheduler.o : \
	$(USER_DIR)/scheduler.c \
	$(USER_DIR)/scheduler.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -c $(USER_DIR)/scheduler.c -o $@

$(OBJECT_DIR)/scheduler_unittest.o : \
	$(TEST_DIR)/scheduler_unittest.cc \
	$(USER_DIR)/scheduler.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/scheduler_unittest.cc -o $@

$(OBJECT_DIR)/scheduler_unittest : \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/scheduler_tasks.o \
	$(OBJECT_DIR)/scheduler.o \
	$(OBJECT_DIR)/scheduler_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@


$(OBJECT_DIR)/config/feature.o : \
	$(USER_DIR)/config/feature.c \
	$(USER_DIR)/config/feature.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -D'FLASH_SIZE = 128' -DSTM32F10X_MD -c $(USER_DIR)/config/feature.c -o $@

$(OBJECT_DIR)/config/profile.o : \
	$(USER_DIR)/config/profile.c \
	$(USER_DIR)/config/profile.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -D'FLASH_SIZE = 128' -DSTM32F10X_MD -c $(USER_DIR)/config/profile.c -o $@

$(OBJECT_DIR)/config/config.o : \
	$(USER_DIR)/config/config.c \
	$(USER_DIR)/config/config.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -D'FLASH_SIZE = 128' -DSTM32F10X_MD -c $(USER_DIR)/config/config.c -o $@

$(OBJECT_DIR)/config/config_eeprom.o : \
	$(USER_DIR)/config/config_eeprom.c \
	$(USER_DIR)/config/config_eeprom.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -D'FLASH_SIZE = 128' -DSTM32F10X_MD -c $(USER_DIR)/config/config_eeprom.c -o $@


$(OBJECT_DIR)/config/parameter_group.o : \
	$(USER_DIR)/config/parameter_group.c \
	$(USER_DIR)/config/parameter_group.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -D'FLASH_SIZE = 128' -DSTM32F10X_MD -c $(USER_DIR)/config/parameter_group.c -o $@

$(OBJECT_DIR)/config_eeprom_unittest.o : \
	$(TEST_DIR)/config_eeprom_unittest.cc \
	$(USER_DIR)/config/config_eeprom.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/config_eeprom_unittest.cc -o $@

$(OBJECT_DIR)/mock/mock_flash.o : \
	$(TEST_DIR)/../mock/mock_flash.cc \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/../mock/mock_flash.cc -o $@

$(OBJECT_DIR)/mock/mock_system.o : \
	$(TEST_DIR)/../mock/mock_system.cc \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/../mock/mock_system.cc -o $@

$(OBJECT_DIR)/config_eeprom_unittest : \
	$(OBJECT_DIR)/config/config_eeprom.o \
	$(OBJECT_DIR)/mock/mock_flash.o \
	$(OBJECT_DIR)/mock/mock_system.o \
	$(OBJECT_DIR)/common/maths.o \
	$(OBJECT_DIR)/config/config.o \
	$(OBJECT_DIR)/config/config_streamer.o \
	$(OBJECT_DIR)/config/feature.o \
	$(OBJECT_DIR)/config/profile.o \
	$(OBJECT_DIR)/config/parameter_group.o \
	$(OBJECT_DIR)/config_eeprom_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $(PG_FLAGS) $^ -o $(OBJECT_DIR)/$@


$(OBJECT_DIR)/config/config_streamer.o : \
	$(USER_DIR)/config/config_streamer.c \
	$(USER_DIR)/config/config_streamer.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CC) $(C_FLAGS) $(TEST_CFLAGS) -D'FLASH_SIZE = 128' -DSTM32F10X_MD -c $(USER_DIR)/config/config_streamer.c -o $@

$(OBJECT_DIR)/config_streamer_unittest.o : \
	$(TEST_DIR)/config_streamer_unittest.cc \
	$(USER_DIR)/config/config.h \
	$(GTEST_HEADERS)

	@mkdir -p $(dir $@)
	$(CXX) $(CXX_FLAGS) $(TEST_CFLAGS) -c $(TEST_DIR)/config_streamer_unittest.cc -o $@

$(OBJECT_DIR)/config_streamer_unittest : \
	$(OBJECT_DIR)/config/config_streamer.o \
	$(OBJECT_DIR)/config_streamer_unittest.o \
	$(OBJECT_DIR)/gtest_main.a

	$(CXX) $(CXX_FLAGS) $^ -o $(OBJECT_DIR)/$@

## test        : Build and run the Unit Tests
test: $(TESTS:%=test-%)

## junittest   : Build and run the Unit Tests, producing Junit XML result files."
junittest: EXEC_OPTS = "--gtest_output=xml:$<_results.xml" 
junittest: $(TESTS:%=test-%)

test-%: $(OBJECT_DIR)/%
	$< $(EXEC_OPTS)

## help        : print this help message and exit
## what        : print this help message and exit
## usage       : print this help message and exit
help what usage: Makefile
	@echo ""
	@echo "Makefile for Unit Tests"
	@echo ""
	@echo "Usage:"
	@echo "        make [goal] "
	@echo ""
	@echo "Valid goals are:"
	@echo ""
	@sed -n 's/^## //p' $<
	@echo ""
	@echo "Any of the Unit Test programs can be used as goals:"
	@$(foreach prg, $(TEST_BINARIES), echo "    $(prg)";)



-include $(DEPS)
