.PHONY: all build test ensure-sim-data
CC = g++
TEST_DIR := $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
REPO_ROOT := $(abspath $(TEST_DIR)/../..)
EIGEN_DIR ?= $(REPO_ROOT)/third_party/eigen
EIGEN_CPPFLAGS := $(if $(wildcard $(EIGEN_DIR)/Eigen/Dense),-isystem $(EIGEN_DIR),-isystem /usr/include/eigen3)
BASEFLAGS = -O3 -std=c++20 -Wall -Wextra -Wshadow -Wconversion -funroll-loops -fno-finite-math-only -I$(REPO_ROOT)/src $(EIGEN_CPPFLAGS) $(CPPFLAGS)
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
    CXXFLAGS = $(BASEFLAGS) -march=native
else ifeq ($(UNAME_S),Darwin)
    CXXFLAGS = $(BASEFLAGS) -march=native
else
    CXXFLAGS = $(BASEFLAGS)
endif
LDFLAGS =
VPATH = $(REPO_ROOT)/src/util
TARGETS = kalman_ou_iii-sim accel_vibration_guard-test imu_lever_arm-test kalman_ou_common-test ou_core_numerics-test aw_covariance_policy-test acc_bias_ou-test channel_freeze-test wave_period-test mag_hard_iron-test continuous_mag_hard_iron-test tuner_coupling-test tuner_schedule-test wave_band_sigma-test shipping_contract-test shipping_transition-test rs_law-test startup_init-test sampled_capture-test
all: build test
TARGETS += mag_timing-test
mag_timing-test: mag_timing-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
TARGETS += live_aiding-test
live_aiding-test: live_aiding-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
build: $(TARGETS)
test: ensure-sim-data $(TARGETS)
	bash ./run_tests.sh
ensure-sim-data:
	@$(MAKE) -C "$(REPO_ROOT)" ensure-sim-data
kalman_ou_iii-sim: kalman_ou_iii-sim.o W3dSimCommon.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
accel_vibration_guard-test: accel_vibration_guard-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
imu_lever_arm-test: imu_lever_arm-test.o W3dSimCommon.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
kalman_ou_common-test: kalman_ou_common-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
ou_core_numerics-test: ou_core_numerics-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
aw_covariance_policy-test: aw_covariance_policy-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
acc_bias_ou-test: acc_bias_ou-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
channel_freeze-test: channel_freeze-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
wave_period-test: wave_period-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
tuner_coupling-test: tuner_coupling-test.o W3dSimCommon.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
mag_hard_iron-test: mag_hard_iron-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
continuous_mag_hard_iron-test: continuous_mag_hard_iron-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
startup_init-test: startup_init-test.o W3dSimCommon.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
tuner_schedule-test: tuner_schedule-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
wave_band_sigma-test: wave_band_sigma-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
sampled_capture-test: sampled_capture-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
shipping_contract-test: shipping_contract-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
shipping_transition-test: shipping_transition-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
rs_law-test: rs_law-test.o
	$(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
%.o: %.cpp
	$(CC) $(CXXFLAGS) -MMD -MP -c $< -o $@
-include $(wildcard *.d)
clean:
	rm -f *.o *.d $(TARGETS) *.exe *.csv
