CC ?= cc
CFLAGS ?= -std=c11 -O2 -Wall -Wextra -Wpedantic
OPENMP_FLAGS ?= -fopenmp
LDLIBS ?= -lm
ENABLE_PNG ?= 0
SPACETIME ?= minkowski

ifeq ($(ENABLE_PNG),1)
CPPFLAGS += -DENABLE_PNG
LDLIBS += -lpng
endif

COMMON_SOURCES := $(filter-out src/main.c src/spacetime_minkowski.c src/spacetime_schwarzschild.c,$(wildcard src/*.c))
PROVIDER_SOURCE := src/spacetime_$(SPACETIME).c
TARGET := build/$(SPACETIME)_sky
CORE_MINKOWSKI_SOURCES := $(COMMON_SOURCES) src/spacetime_minkowski.c
TEST_TARGET := build/test_geodesic
FRAME_TEST_TARGET := build/test_frame
SCHWARZSCHILD_TEST_TARGET := build/test_schwarzschild

.PHONY: all clean run test minkowski schwarzschild

ifeq ($(SPACETIME),minkowski)
BACKEND_CPPFLAGS := -DSPACETIME_MINKOWSKI
else ifeq ($(SPACETIME),schwarzschild)
BACKEND_CPPFLAGS := -DSPACETIME_SCHWARZSCHILD
else
$(error Unknown SPACETIME '$(SPACETIME)'; choose minkowski or schwarzschild)
endif

all: $(TARGET)

$(TARGET): $(COMMON_SOURCES) $(PROVIDER_SOURCE) src/main.c | build
	$(CC) $(CPPFLAGS) $(BACKEND_CPPFLAGS) $(CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@

build:
	mkdir -p $@

run: $(TARGET)
	mkdir -p output/imgs
	./$(TARGET) --catalog assets/sky_grid_5deg.csv --output output/imgs/$(SPACETIME)_sky.ppm

minkowski:
	$(MAKE) SPACETIME=minkowski all

schwarzschild:
	$(MAKE) SPACETIME=schwarzschild all

$(TEST_TARGET): tests/test_geodesic.c $(CORE_MINKOWSKI_SOURCES) | build
	$(CC) $(CPPFLAGS) $(CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@

$(FRAME_TEST_TARGET): tests/test_frame.c $(CORE_MINKOWSKI_SOURCES) | build
	$(CC) $(CPPFLAGS) $(CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@

$(SCHWARZSCHILD_TEST_TARGET): tests/test_schwarzschild.c $(COMMON_SOURCES) src/spacetime_schwarzschild.c | build
	$(CC) $(CPPFLAGS) $(CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@

test: $(TEST_TARGET) $(FRAME_TEST_TARGET) $(SCHWARZSCHILD_TEST_TARGET)
	./$(TEST_TARGET)
	./$(FRAME_TEST_TARGET)
	./$(SCHWARZSCHILD_TEST_TARGET)

clean:
	rm -rf build
