CC ?= cc CFLAGS ?= -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic OPENMP_FLAGS ?= -fopenmp LDLIBS ?= -lm ENABLE_PNG ?= 1 SPACETIME ?= minkowski BUILD_TYPE ?= Release ENABLE_HDR ?= 0 ifeq ($(BUILD_TYPE),Release) BUILD_CFLAGS := -O2 -DNDEBUG BUILD_CPPFLAGS := else ifeq ($(BUILD_TYPE),Debug) BUILD_CFLAGS := -O0 -g3 BUILD_CPPFLAGS := -DGR_DEBUG else $(error Unknown BUILD_TYPE '$(BUILD_TYPE)'; choose Release or Debug) endif ifeq ($(ENABLE_PNG),1) CPPFLAGS += -DENABLE_PNG LDLIBS += -lpng IMAGE_EXT := png else IMAGE_EXT := ppm 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 BUILD_DIR := build/$(BUILD_TYPE) TARGET_BASENAME := $(SPACETIME)_sky OBJECT_DIR := $(BUILD_DIR)/obj/$(SPACETIME) CORE_MINKOWSKI_SOURCES := $(COMMON_SOURCES) src/spacetime_minkowski.c TEST_TARGET := $(BUILD_DIR)/test_geodesic FRAME_TEST_TARGET := $(BUILD_DIR)/test_frame SCHWARZSCHILD_TEST_TARGET := $(BUILD_DIR)/test_schwarzschild OBSERVER_TRACK_TEST_TARGET := $(BUILD_DIR)/test_observer_track CATALOG_PREFETCH_TEST_TARGET := $(BUILD_DIR)/test_catalog_prefetch .PHONY: all backend clean run test minkowski schwarzschild FORCE 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 ifeq ($(ENABLE_HDR),1) HDR_CPPFLAGS := -DENABLE_HDR_OUTPUT $(shell pkg-config --cflags cfitsio) HDR_LDLIBS := $(shell pkg-config --libs cfitsio) HDR_BUILD_TAG := hdr else ifeq ($(ENABLE_HDR),0) HDR_BUILD_TAG := standard else $(error Unknown ENABLE_HDR '$(ENABLE_HDR)'; choose 0 or 1) endif TARGET := $(BUILD_DIR)/$(TARGET_BASENAME) RENDER_SOURCES := $(COMMON_SOURCES) $(PROVIDER_SOURCE) src/main.c RENDER_OBJECTS := $(patsubst %.c,$(OBJECT_DIR)/$(HDR_BUILD_TAG)/%.o,$(RENDER_SOURCES)) RENDER_DEPS := $(RENDER_OBJECTS:.o=.d) # With no explicit backend choice, all means every currently supported # production spacetime backend. An explicit SPACETIME selects that backend, # so `make SPACETIME=schwarzschild` remains the direct build command. ifneq ($(filter command\ line environment environment\ override,$(origin SPACETIME)),) all: backend else all: minkowski schwarzschild endif minkowski: $(MAKE) SPACETIME=minkowski ENABLE_HDR=$(ENABLE_HDR) backend schwarzschild: $(MAKE) SPACETIME=schwarzschild ENABLE_HDR=$(ENABLE_HDR) backend # Build exactly the selected backend/configuration, e.g. # make SPACETIME=schwarzschild ENABLE_HDR=1 backend backend: $(TARGET) $(TARGET): $(RENDER_OBJECTS) FORCE | $(BUILD_DIR) $(CC) $(BUILD_CFLAGS) $(OPENMP_FLAGS) $(RENDER_OBJECTS) $(LDLIBS) $(HDR_LDLIBS) -o $@ FORCE: $(OBJECT_DIR)/$(HDR_BUILD_TAG)/%.o: %.c @mkdir -p $(dir $@) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(BACKEND_CPPFLAGS) $(HDR_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc -MMD -MP -c $< -o $@ $(BUILD_DIR): mkdir -p $@ run: $(TARGET) mkdir -p output/imgs ./$(TARGET) --catalog assets/sky_grid_5deg.csv --output output/imgs/$(SPACETIME)_sky.$(IMAGE_EXT) $(TEST_TARGET): tests/test_geodesic.c $(CORE_MINKOWSKI_SOURCES) | $(BUILD_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ $(FRAME_TEST_TARGET): tests/test_frame.c $(CORE_MINKOWSKI_SOURCES) | $(BUILD_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ $(SCHWARZSCHILD_TEST_TARGET): tests/test_schwarzschild.c $(COMMON_SOURCES) src/spacetime_schwarzschild.c | $(BUILD_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ $(OBSERVER_TRACK_TEST_TARGET): tests/test_observer_track.c $(COMMON_SOURCES) | $(BUILD_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ $(CATALOG_PREFETCH_TEST_TARGET): tests/test_catalog_prefetch.c $(CORE_MINKOWSKI_SOURCES) | $(BUILD_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ test: $(TEST_TARGET) $(FRAME_TEST_TARGET) $(SCHWARZSCHILD_TEST_TARGET) $(OBSERVER_TRACK_TEST_TARGET) $(CATALOG_PREFETCH_TEST_TARGET) ./$(TEST_TARGET) ./$(FRAME_TEST_TARGET) ./$(SCHWARZSCHILD_TEST_TARGET) ./$(OBSERVER_TRACK_TEST_TARGET) ./$(CATALOG_PREFETCH_TEST_TARGET) clean: rm -rf build -include $(RENDER_DEPS)