.DEFAULT_GOAL := all CC ?= cc CXX ?= c++ PKG_CONFIG ?= pkg-config FLTK_CONFIG ?= fltk-config BUILD_DIR ?= build PREFIX ?= /usr/local CFLAGS ?= -O2 -g CFLAGS += -std=c99 -Wall -Wextra -Wpedantic -Wconversion -Wshadow -Iinclude CXXFLAGS ?= -O2 -g CXXFLAGS += -std=c++17 -Wall -Wextra -Wpedantic -Iinclude LDFLAGS ?= CORE_SOURCES := src/core/xtc.c src/graph/graph.c src/dsp/gain.c src/engine/offline_engine.c src/engine/realtime.c src/backend/jack_backend.c JACK_AVAILABLE := $(shell $(PKG_CONFIG) --exists jack 2>/dev/null && echo yes) ifeq ($(JACK_AVAILABLE),yes) JACK_CFLAGS := $(shell $(PKG_CONFIG) --cflags jack) JACK_LIBS := $(shell $(PKG_CONFIG) --libs jack) BACKEND_TEST := $(BUILD_DIR)/test_backend $(BUILD_DIR)/tests/unit/test_backend.o: CPPFLAGS += $(JACK_CFLAGS) $(BUILD_DIR)/src/backend/jack_backend.o: CPPFLAGS += -DXTC_HAVE_JACK $(JACK_CFLAGS) endif CORE_OBJECTS := $(CORE_SOURCES:%.c=$(BUILD_DIR)/%.o) TEST_OBJECT := $(BUILD_DIR)/tests/unit/test_core.o ifeq ($(shell $(PKG_CONFIG) --exists fltk 2>/dev/null && echo yes),yes) FLTK_CXXFLAGS := $(shell $(PKG_CONFIG) --cflags fltk) FLTK_LIBS := $(shell $(PKG_CONFIG) --libs fltk) GUI_AVAILABLE := yes else ifeq ($(shell $(FLTK_CONFIG) --version >/dev/null 2>&1 && echo yes),yes) FLTK_CXXFLAGS := $(shell $(FLTK_CONFIG) --cxxflags) FLTK_LIBS := $(shell $(FLTK_CONFIG) --ldflags) GUI_AVAILABLE := yes endif .PHONY: all clean test test-jack test-gui test-gui-jack debug gui install all: $(BUILD_DIR)/libxtc.a $(BUILD_DIR)/xtc-check $(BUILD_DIR)/xtc-check: $(BUILD_DIR)/src/main.o $(BUILD_DIR)/libxtc.a $(CC) $(LDFLAGS) -o $@ $^ -lm $(BUILD_DIR)/libxtc.a: $(CORE_OBJECTS) @mkdir -p $(@D) $(AR) rcs $@ $^ $(BUILD_DIR)/%.o: %.c @mkdir -p $(@D) $(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@ $(BUILD_DIR)/%.o: %.cpp @mkdir -p $(@D) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(FLTK_CXXFLAGS) -MMD -MP -c $< -o $@ $(TEST_OBJECT): tests/unit/test_core.c @mkdir -p $(@D) $(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@ $(BUILD_DIR)/test_core: $(TEST_OBJECT) $(BUILD_DIR)/libxtc.a $(CC) $(LDFLAGS) -o $@ $(TEST_OBJECT) $(BUILD_DIR)/libxtc.a -lm $(BUILD_DIR)/test_offline: $(BUILD_DIR)/tests/unit/test_offline.o $(BUILD_DIR)/libxtc.a $(CC) $(LDFLAGS) -o $@ $^ -lm $(BUILD_DIR)/test_realtime: $(BUILD_DIR)/tests/unit/test_realtime.o $(BUILD_DIR)/libxtc.a $(CC) $(LDFLAGS) -o $@ $^ -lm -pthread $(BUILD_DIR)/test_backend: $(BUILD_DIR)/tests/unit/test_backend.o $(BUILD_DIR)/libxtc.a $(CC) $(LDFLAGS) -o $@ $^ -lm test: $(BACKEND_TEST) $(BUILD_DIR)/test_realtime $(BUILD_DIR)/test_core $(BUILD_DIR)/test_offline $(BUILD_DIR)/xtc-check $(if $(BACKEND_TEST),./$(BACKEND_TEST),@echo "JACK fault tests skipped: JACK development files unavailable") ./$(BUILD_DIR)/test_realtime ./$(BUILD_DIR)/test_core ./$(BUILD_DIR)/test_offline ./$(BUILD_DIR)/xtc-check debug: $(MAKE) BUILD_DIR="$(BUILD_DIR)/debug" CFLAGS="$(CFLAGS) -O0 -g3" CXXFLAGS="$(CXXFLAGS) -O0 -g3" all test ifeq ($(JACK_AVAILABLE),yes) $(BUILD_DIR)/tests/integration/test_jack.o: CPPFLAGS += $(JACK_CFLAGS) $(BUILD_DIR)/test_jack: $(BUILD_DIR)/tests/integration/test_jack.o $(BUILD_DIR)/libxtc.a $(CC) $(LDFLAGS) -o $@ $^ $(JACK_LIBS) -lm test-jack: $(BUILD_DIR)/test_jack ./$(BUILD_DIR)/test_jack else test-jack: @echo "JACK development files are required for the live integration test." @exit 1 endif ifeq ($(GUI_AVAILABLE),yes) gui: $(BUILD_DIR)/xtc $(BUILD_DIR)/test_gui: $(BUILD_DIR)/tests/integration/test_gui.o $(BUILD_DIR)/src/gui/main_window.o $(BUILD_DIR)/libxtc.a $(CXX) $(LDFLAGS) -o $@ $^ $(FLTK_LIBS) -lm test-gui: $(BUILD_DIR)/test_gui xvfb-run -a -s "-screen 0 1280x800x24" ./$(BUILD_DIR)/test_gui ifeq ($(JACK_AVAILABLE),yes) $(BUILD_DIR)/test_gui_jack: $(BUILD_DIR)/tests/integration/test_gui_jack.o $(BUILD_DIR)/src/gui/main_window.o $(BUILD_DIR)/libxtc.a $(CXX) $(LDFLAGS) -o $@ $^ $(FLTK_LIBS) $(JACK_LIBS) -lm test-gui-jack: $(BUILD_DIR)/test_gui_jack xvfb-run -a -s "-screen 0 1280x800x24" ./$(BUILD_DIR)/test_gui_jack else test-gui-jack: @echo "JACK development files are required for the live GUI test." @exit 1 endif $(BUILD_DIR)/xtc: $(BUILD_DIR)/src/gui/main.o $(BUILD_DIR)/src/gui/main_window.o $(BUILD_DIR)/libxtc.a $(CXX) $(LDFLAGS) -o $@ $^ $(FLTK_LIBS) $(JACK_LIBS) -lm else test-gui-jack test-gui: @echo "FLTK development files are required for GUI tests." @exit 1 gui: @echo "FLTK was not found by pkg-config or fltk-config. GUI requires FLTK development files." @exit 1 endif install: all install -d "$(DESTDIR)$(PREFIX)/include/xtc" "$(DESTDIR)$(PREFIX)/lib" install -m 0644 include/xtc/*.h "$(DESTDIR)$(PREFIX)/include/xtc/" install -m 0644 "$(BUILD_DIR)/libxtc.a" "$(DESTDIR)$(PREFIX)/lib/" clean: rm -rf "$(BUILD_DIR)" -include $(CORE_OBJECTS:.o=.d) $(TEST_OBJECT:.o=.d) $(BUILD_DIR)/src/main.d $(BUILD_DIR)/tests/unit/test_offline.d $(BUILD_DIR)/tests/unit/test_realtime.d $(BUILD_DIR)/tests/unit/test_backend.d \ $(BUILD_DIR)/src/gui/main.d $(BUILD_DIR)/src/gui/main_window.d $(BUILD_DIR)/tests/integration/test_jack.d $(BUILD_DIR)/tests/integration/test_gui.d $(BUILD_DIR)/tests/integration/test_gui_jack.d