.PHONY: all build test ensure-sim-data clean

CXX = 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),-I$(EIGEN_DIR),-I/usr/include/eigen3)

BASEFLAGS = -O3 -std=c++20 -funroll-loops -fno-finite-math-only \
            -MMD -MP \
            -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 =

# Look for W3dSimCommon.cpp in src/util.
VPATH = $(REPO_ROOT)/src/util

TARGETS = nlo-sim local_gravity-test mag_turns-test device_heave-test

all: build test

build: $(TARGETS)

test: ensure-sim-data $(TARGETS)
	bash ./run_tests.sh

ensure-sim-data:
	@$(MAKE) -C "$(REPO_ROOT)" ensure-sim-data

nlo-sim: nlo-sim.o W3dSimCommon.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

mag_turns-test: mag_turns-test.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

local_gravity-test: local_gravity-test.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

device_heave-test: device_heave-test.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

-include $(wildcard *.d)

clean:
	rm -f *.o *.d $(TARGETS) *.exe *.csv
