Add an opt-in, post-processing limited-response model applied to the finished linear HDR before tone mapping. Each RGB channel is processed independently and isotropically: overflow above E spreads to the eight neighbours with a fixed 9-point stencil, while the rest is absorbed or lost at the image boundary. The synchronous ping-pong update uses a monotonic bounding box and a row-parallel, deterministic reduction; the conservative round bound reserves fp guard rounds inside a 4096 hard limit and fails before touching HDR when exceeded. Expose --sensor-bloom-limit E and --sensor-bloom-transfer e (both required together, default disabled), validate them before expensive initialization, and route every output path through the same hook in write_frame_outputs: raw FITS first, bloom, tone-mapped PNG/PPM, then the mesh overlay. The raw --hdr-output FITS therefore stays pre-bloom. Add a standalone unit test (stencil, boundary loss, cascade reference, symmetry, thread determinism, convergence limits, validation, allocation failure), CLI integration and regression coverage, an isolated sensor-bloom-bench target, and document the model in the design, usage, README, and build docs.
289 lines
12 KiB
Makefile
289 lines
12 KiB
Makefile
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,$(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 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
|
|
$(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_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
|
|
FRAME_TEST_TARGET := $(TEST_OUT_DIR)/test_frame
|
|
SCHWARZSCHILD_TEST_TARGET := $(TEST_OUT_DIR)/test_schwarzschild
|
|
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
|
|
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
|
|
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)
|
|
$(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 $@
|
|
|
|
$(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 $@
|
|
|
|
$(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 $@
|
|
|
|
$(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) $(FRAME_TEST_TARGET) $(SCHWARZSCHILD_TEST_TARGET) $(OBSERVER_TRACK_TEST_TARGET) $(CATALOG_PREFETCH_TEST_TARGET) $(FAST_PSF_FFTW_TEST_DEP) $(TONE_MAP_TEST_TARGET) $(SENSOR_BLOOM_TEST_TARGET)
|
|
$(TEST_OUT_DIR)/test_observer_minkowski
|
|
$(TEST_OUT_DIR)/test_observer_schwarzschild
|
|
$(TEST_TARGET)
|
|
$(FRAME_TEST_TARGET)
|
|
$(SCHWARZSCHILD_TEST_TARGET)
|
|
$(OBSERVER_TRACK_TEST_TARGET)
|
|
$(CATALOG_PREFETCH_TEST_TARGET)
|
|
$(FAST_PSF_FFTW_TEST_RUN)
|
|
$(TONE_MAP_TEST_TARGET)
|
|
$(SENSOR_BLOOM_TEST_TARGET)
|
|
python3 tests/test_camera_cli.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 $@
|