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 PSF_EVENT_SINK ?= 1 PSF_BACKEND ?= cpu HIPCC ?= hipcc HIP_CXXFLAGS ?= -std=c++17 -O2 -Wall -Wextra -Wpedantic 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/dummy_psf.c src/fast_psf_fftw.c src/spacetime_minkowski.c src/spacetime_schwarzschild.c src/spacetime_alcubierre.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 .PHONY: all backend clean run test tone-map-test sensor-bloom-test sensor-bloom-bench hip-psf-test hip-psf-bench fast-psf-fftw-bench minkowski schwarzschild alcubierre FORCE ifneq ($(filter 0 1,$(PSF_EVENT_SINK)),$(PSF_EVENT_SINK)) $(error Unknown PSF_EVENT_SINK '$(PSF_EVENT_SINK)'; choose 0 or 1) endif BUILD_CPPFLAGS += -DFRAME_PSF_EVENT_SINK=$(PSF_EVENT_SINK) ifeq ($(PSF_BACKEND),cpu) RENDER_LINKER := $(CC) ifeq ($(shell pkg-config --exists fftw3_omp && echo yes),yes) CPU_FFTW_CPPFLAGS := -DFAST_PSF_FFTW $(shell pkg-config --cflags fftw3_omp) CPU_FFTW_LDLIBS := $(shell pkg-config --libs fftw3_omp) CPU_FFTW_SOURCES := src/fast_psf_fftw.c BUILD_CPPFLAGS += $(CPU_FFTW_CPPFLAGS) LDLIBS += $(CPU_FFTW_LDLIBS) else $(error PSF_BACKEND=cpu requires the FFTW OpenMP package 'fftw3_omp' (pkg-config --exists fftw3_omp). On Gentoo enable sci-libs/fftw[openmp].) endif else ifeq ($(PSF_BACKEND),hip) RENDER_LINKER := $(HIPCC) BUILD_CPPFLAGS += -DPSF_BACKEND_HIP else ifeq ($(PSF_BACKEND),dummy) RENDER_LINKER := $(CC) BUILD_CPPFLAGS += -DPSF_BACKEND_DUMMY else $(error Unknown PSF_BACKEND '$(PSF_BACKEND)'; choose cpu, hip, or dummy) endif # `make test` builds and runs the CPU regression suite. The dummy and hip # backends do not build those binaries, so reject the goal explicitly instead of # silently reusing a stale test binary left by an earlier CPU build. ifneq ($(filter test test-reference-images,$(MAKECMDGOALS)),) ifneq ($(PSF_BACKEND),cpu) $(error make test requires PSF_BACKEND=cpu) endif endif # psf-capture is a CPU producer diagnostic; the dummy and hip backends do not # provide the producer/frame symbols it links. ifneq ($(filter psf-capture,$(MAKECMDGOALS)),) ifneq ($(PSF_BACKEND),cpu) $(error psf-capture requires PSF_BACKEND=cpu) endif endif ifeq ($(SPACETIME),minkowski) BACKEND_CPPFLAGS := -DSPACETIME_MINKOWSKI else ifeq ($(SPACETIME),schwarzschild) BACKEND_CPPFLAGS := -DSPACETIME_SCHWARZSCHILD else ifeq ($(SPACETIME),alcubierre) BACKEND_CPPFLAGS := -DSPACETIME_ALCUBIERRE else $(error Unknown SPACETIME '$(SPACETIME)'; choose minkowski, schwarzschild, or alcubierre) 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_sink$(PSF_EVENT_SINK)_$(PSF_BACKEND) else ifeq ($(ENABLE_HDR),0) HDR_BUILD_TAG := standard_sink$(PSF_EVENT_SINK)_$(PSF_BACKEND) else $(error Unknown ENABLE_HDR '$(ENABLE_HDR)'; choose 0 or 1) endif # Test binaries are namespaced by spacetime and build tag so that switching # PSF_BACKEND/ENABLE_HDR/PSF_EVENT_SINK cannot silently reuse a stale binary # built for a different backend. TEST_OUT_DIR := $(OBJECT_DIR)/$(HDR_BUILD_TAG) TEST_TARGET := $(TEST_OUT_DIR)/test_geodesic ADAPTIVE_GEODESIC_TEST_TARGET := $(TEST_OUT_DIR)/test_geodesic_adaptive ASYMPTOTIC_TEST_TARGET := $(TEST_OUT_DIR)/test_asymptotic ASYMPTOTIC_SCHWARZSCHILD_TEST_TARGET := $(TEST_OUT_DIR)/test_asymptotic_schwarzschild TERMINATION_ORACLE_TEST_TARGET := $(TEST_OUT_DIR)/test_termination_oracle FRAME_TEST_TARGET := $(TEST_OUT_DIR)/test_frame SCHWARZSCHILD_TEST_TARGET := $(TEST_OUT_DIR)/test_schwarzschild ALCUBIERRE_TEST_TARGET := $(TEST_OUT_DIR)/test_alcubierre OBSERVER_TRACK_TEST_TARGET := $(TEST_OUT_DIR)/test_observer_track CATALOG_PREFETCH_TEST_TARGET := $(TEST_OUT_DIR)/test_catalog_prefetch HIP_PSF_TEST_TARGET := $(TEST_OUT_DIR)/test_hip_psf HIP_PSF_BENCH_TARGET := $(TEST_OUT_DIR)/benchmark_hip_psf CAMERA_TEST_TARGETS := $(TEST_OUT_DIR)/test_observer_minkowski $(TEST_OUT_DIR)/test_observer_schwarzschild FAST_PSF_FFTW_TEST_TARGET := $(TEST_OUT_DIR)/test_fast_psf_fftw FAST_PSF_FFTW_BENCH_TARGET := $(TEST_OUT_DIR)/benchmark_fast_psf_fftw TONE_MAP_TEST_TARGET := $(TEST_OUT_DIR)/test_tone_map MOVIE_OUTPUT_TEST_TARGET := $(TEST_OUT_DIR)/test_movie_output SENSOR_BLOOM_TEST_TARGET := $(TEST_OUT_DIR)/test_sensor_bloom SENSOR_BLOOM_BENCH_TARGET := $(TEST_OUT_DIR)/benchmark_sensor_bloom ifeq ($(PSF_BACKEND),hip) TARGET := $(BUILD_DIR)/$(TARGET_BASENAME)_hip else ifeq ($(PSF_BACKEND),dummy) TARGET := $(BUILD_DIR)/$(TARGET_BASENAME)_dummy else TARGET := $(BUILD_DIR)/$(TARGET_BASENAME) endif RENDER_SOURCES := $(COMMON_SOURCES) $(PROVIDER_SOURCE) src/main.c RENDER_SOURCES += $(CPU_FFTW_SOURCES) ifeq ($(PSF_BACKEND),dummy) RENDER_SOURCES += src/dummy_psf.c endif RENDER_OBJECTS := $(patsubst %.c,$(OBJECT_DIR)/$(HDR_BUILD_TAG)/%.o,$(RENDER_SOURCES)) ifeq ($(PSF_BACKEND),hip) HIP_PSF_OBJECT := $(OBJECT_DIR)/$(HDR_BUILD_TAG)/src/hip_psf.o RENDER_OBJECTS += $(HIP_PSF_OBJECT) endif 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 alcubierre endif minkowski: $(MAKE) SPACETIME=minkowski ENABLE_HDR=$(ENABLE_HDR) backend schwarzschild: $(MAKE) SPACETIME=schwarzschild ENABLE_HDR=$(ENABLE_HDR) backend alcubierre: $(MAKE) SPACETIME=alcubierre 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) $(RENDER_LINKER) $(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 $@ $(OBJECT_DIR)/$(HDR_BUILD_TAG)/src/hip_psf.o: src/hip_psf.hip src/hip_psf.h src/optics.h @mkdir -p $(dir $@) $(HIPCC) $(HIP_CXXFLAGS) $(BUILD_CPPFLAGS) -Isrc -c $< -o $@ # This is a production-sink regression, not the removed float analytic spike. # It requires PSF_BACKEND=hip and an actual HIP GPU agent at execution time. ifeq ($(PSF_BACKEND),hip) hip-psf-test: $(HIP_PSF_TEST_TARGET) hip-psf-bench: $(HIP_PSF_BENCH_TARGET) $(HIP_PSF_BENCH_TARGET): tests/benchmark_hip_psf.hip $(HIP_PSF_OBJECT) $(OBJECT_DIR)/$(HDR_BUILD_TAG)/src/optics.o | $(TEST_OUT_DIR) $(HIPCC) $(HIP_CXXFLAGS) $(OPENMP_FLAGS) -Isrc -x hip $< -x none $(filter-out $<,$^) $(LDLIBS) $(HDR_LDLIBS) -o $@ $(HIP_PSF_TEST_TARGET): tests/test_hip_psf.hip $(HIP_PSF_OBJECT) $(OBJECT_DIR)/$(HDR_BUILD_TAG)/src/optics.o | $(TEST_OUT_DIR) $(HIPCC) $(HIP_CXXFLAGS) $(OPENMP_FLAGS) -Isrc -x hip $< -x none $(filter-out $<,$^) $(LDLIBS) $(HDR_LDLIBS) -o $@ else hip-psf-test hip-psf-bench: $(error HIP PSF checks require PSF_BACKEND=hip) endif run: $(TARGET) mkdir -p output/imgs ./$(TARGET) --catalog assets/sky_grid_5deg.csv --output output/imgs/$(SPACETIME)_sky.$(IMAGE_EXT) $(TEST_OUT_DIR): | $(BUILD_DIR) mkdir -p $@ $(TEST_TARGET): tests/test_geodesic.c $(CORE_MINKOWSKI_SOURCES) $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ # Explicit adaptive DP5(4) core and RayPool regression. The test textually # includes both analytic providers (renaming spacetime_create_default), so the # link line deliberately omits src/spacetime_{minkowski,schwarzschild}.c. $(ADAPTIVE_GEODESIC_TEST_TARGET): tests/test_geodesic_adaptive.c $(COMMON_SOURCES) $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -DGEODESIC_EVENT_TESTING -Isrc $^ $(LDLIBS) -o $@ $(ASYMPTOTIC_TEST_TARGET): tests/test_asymptotic.c $(CORE_MINKOWSKI_SOURCES) $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ $(ASYMPTOTIC_SCHWARZSCHILD_TEST_TARGET): tests/test_asymptotic_schwarzschild.c $(COMMON_SOURCES) src/spacetime_schwarzschild.c $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -DSPACETIME_SCHWARZSCHILD -Isrc $^ $(LDLIBS) -o $@ $(FRAME_TEST_TARGET): tests/test_frame.c $(CORE_MINKOWSKI_SOURCES) $(CPU_FFTW_SOURCES) | $(TEST_OUT_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 $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ # Independent physics oracle for the termination policy (plan P0); links the # analytic Schwarzschild backend and its exterior module. $(TERMINATION_ORACLE_TEST_TARGET): tests/test_termination_oracle.c $(COMMON_SOURCES) src/spacetime_schwarzschild.c $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -DSPACETIME_SCHWARZSCHILD -Isrc $^ $(LDLIBS) -o $@ $(ALCUBIERRE_TEST_TARGET): tests/test_alcubierre.c $(COMMON_SOURCES) src/spacetime_alcubierre.c $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ $(OBSERVER_TRACK_TEST_TARGET): tests/test_observer_track.c $(COMMON_SOURCES) $(CPU_FFTW_SOURCES) | $(TEST_OUT_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) $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ $(TEST_OUT_DIR)/test_observer_minkowski: tests/test_observer.c $(CORE_MINKOWSKI_SOURCES) $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ $(TEST_OUT_DIR)/test_observer_schwarzschild: tests/test_observer.c $(COMMON_SOURCES) src/spacetime_schwarzschild.c $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -DSPACETIME_SCHWARZSCHILD -Isrc $^ $(LDLIBS) -o $@ $(FAST_PSF_FFTW_TEST_TARGET): tests/test_fast_psf_fftw.c $(CORE_MINKOWSKI_SOURCES) $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ # The tone-map regression links production optics.c only, so it neither needs a # catalog nor touches ray tracing, the mesh, or any image writer at runtime. $(TONE_MAP_TEST_TARGET): tests/test_tone_map.c src/optics.c src/optics.h $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc tests/test_tone_map.c src/optics.c $(CPU_FFTW_SOURCES) $(LDLIBS) -o $@ # The movie-output queue links production optics + fast_psf_fftw only, so it # needs neither a catalog nor ray tracing. $(MOVIE_OUTPUT_TEST_TARGET): tests/test_movie_output.c src/movie_output.c src/movie_output.h src/optics.c src/optics.h $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc tests/test_movie_output.c src/movie_output.c src/optics.c $(CPU_FFTW_SOURCES) $(LDLIBS) -o $@ $(FAST_PSF_FFTW_BENCH_TARGET): tests/benchmark_fast_psf_fftw.c $(CORE_MINKOWSKI_SOURCES) $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ # The sensor-bloom checks link only the standalone model, so they need neither # a catalog nor ray tracing, and build in every ENABLE_HDR/PSF_BACKEND # configuration. $(SENSOR_BLOOM_TEST_TARGET): tests/test_sensor_bloom.c src/sensor_bloom.c src/sensor_bloom.h | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc tests/test_sensor_bloom.c src/sensor_bloom.c $(LDLIBS) -o $@ $(SENSOR_BLOOM_BENCH_TARGET): tests/benchmark_sensor_bloom.c src/sensor_bloom.c src/sensor_bloom.h | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc tests/benchmark_sensor_bloom.c src/sensor_bloom.c $(LDLIBS) -o $@ # The FFTW-vs-spatial test is meaningful only in the CPU PSF build. ifneq ($(CPU_FFTW_SOURCES),) FAST_PSF_FFTW_TEST_DEP := $(FAST_PSF_FFTW_TEST_TARGET) FAST_PSF_FFTW_TEST_RUN := $(FAST_PSF_FFTW_TEST_TARGET) else FAST_PSF_FFTW_TEST_DEP := FAST_PSF_FFTW_TEST_RUN := endif test: $(CAMERA_TEST_TARGETS) $(TEST_TARGET) $(ADAPTIVE_GEODESIC_TEST_TARGET) $(ASYMPTOTIC_TEST_TARGET) $(ASYMPTOTIC_SCHWARZSCHILD_TEST_TARGET) $(TERMINATION_ORACLE_TEST_TARGET) $(FRAME_TEST_TARGET) $(SCHWARZSCHILD_TEST_TARGET) $(ALCUBIERRE_TEST_TARGET) $(OBSERVER_TRACK_TEST_TARGET) $(CATALOG_PREFETCH_TEST_TARGET) $(FAST_PSF_FFTW_TEST_DEP) $(TONE_MAP_TEST_TARGET) $(MOVIE_OUTPUT_TEST_TARGET) $(SENSOR_BLOOM_TEST_TARGET) $(TEST_OUT_DIR)/test_observer_minkowski $(TEST_OUT_DIR)/test_observer_schwarzschild $(TEST_TARGET) $(ADAPTIVE_GEODESIC_TEST_TARGET) $(ASYMPTOTIC_TEST_TARGET) $(ASYMPTOTIC_SCHWARZSCHILD_TEST_TARGET) $(TERMINATION_ORACLE_TEST_TARGET) $(FRAME_TEST_TARGET) $(SCHWARZSCHILD_TEST_TARGET) $(ALCUBIERRE_TEST_TARGET) $(OBSERVER_TRACK_TEST_TARGET) $(CATALOG_PREFETCH_TEST_TARGET) $(FAST_PSF_FFTW_TEST_RUN) $(TONE_MAP_TEST_TARGET) $(MOVIE_OUTPUT_TEST_TARGET) $(SENSOR_BLOOM_TEST_TARGET) python3 tests/test_camera_cli.py $(BUILD_DIR) $(TEST_OUT_DIR) python3 tests/test_adaptive_cli.py $(BUILD_DIR) $(TEST_OUT_DIR) python3 tests/test_ray_diagnostics.py $(BUILD_DIR) $(TEST_OUT_DIR) python3 tests/test_output_streams.py $(BUILD_DIR) $(TEST_OUT_DIR) tone-map-test: $(TONE_MAP_TEST_TARGET) $(TONE_MAP_TEST_TARGET) sensor-bloom-test: $(SENSOR_BLOOM_TEST_TARGET) $(SENSOR_BLOOM_TEST_TARGET) sensor-bloom-bench: $(SENSOR_BLOOM_BENCH_TARGET) fast-psf-fftw-bench: $(FAST_PSF_FFTW_BENCH_TARGET) clean: rm -rf build -include $(RENDER_DEPS) include mk/reference_images.mk # Test-only producer consumer: never linked into a renderer. .PHONY: psf-capture psf-capture: $(TEST_OUT_DIR)/capture_psf $(TEST_OUT_DIR)/capture_psf: tests/capture_psf.c $(CORE_MINKOWSKI_SOURCES) $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $< $(filter-out src/frame.c,$(CORE_MINKOWSKI_SOURCES)) $(CPU_FFTW_SOURCES) $(LDLIBS) -o $@ .PHONY: hip-psf-replay hip-psf-replay: $(TEST_OUT_DIR)/replay_psf $(TEST_OUT_DIR)/replay_psf: tests/replay_psf.hip src/hip_psf.hip src/hip_psf.h src/optics.h $(OBJECT_DIR)/$(HDR_BUILD_TAG)/src/optics.o | $(TEST_OUT_DIR) $(HIPCC) $(HIP_CXXFLAGS) $(OPENMP_FLAGS) -Isrc -x hip $< -x none $(filter %.o,$^) $(LDLIBS) $(HDR_LDLIBS) -o $@ $(TEST_OUT_DIR)/make_psf_fixture: tests/make_psf_fixture.c src/optics.c src/optics.h $(CPU_FFTW_SOURCES) | $(TEST_OUT_DIR) $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $< src/optics.c $(CPU_FFTW_SOURCES) $(LDLIBS) -o $@