# Detect OS UNAME_S := $(shell uname -s) # Compiler ifeq ($(UNAME_S),Darwin) CXX = clang++ else CXX = g++ endif # Base flags CXXFLAGS = -std=c++17 -g -O0 -fno-omit-frame-pointer -DDEBUG # OS-specific configuration ifeq ($(UNAME_S),Darwin) # macOS configuration INCLUDES = -I. -I../deps/simdjson -I../deps/atomic_queue -I../deps -I/opt/homebrew/opt/libomp/include LDFLAGS = -L/opt/homebrew/opt/libomp/lib LIBS = -lomp # Add flags for better debugging with lldb CXXFLAGS += -glldb -gdwarf-4 # OpenMP flags for macOS CXXFLAGS += -Xpreprocessor -fopenmp else # Linux configuration INCLUDES = -I. -I../deps/simdjson -I../deps/atomic_queue -I../deps LDFLAGS = -L/usr/lib LIBS = -lgomp # OpenMP flags for Linux CXXFLAGS += -fopenmp endif TARGET = test_vector_store STRESS_TARGET = test_stress BM25_TARGET = test_bm25 HYBRID_TARGET = test_hybrid_search SOURCES = test_main.cpp vector_store.cpp simple_tokenizer.cpp ../deps/simdjson/simdjson.cpp STRESS_SOURCES = test_stress.cpp vector_store.cpp simple_tokenizer.cpp vector_store_loader.cpp vector_store_loader_mmap.cpp vector_store_loader_adaptive.cpp ../deps/simdjson/simdjson.cpp BM25_SOURCES = test_bm25.cpp vector_store.cpp simple_tokenizer.cpp ../deps/simdjson/simdjson.cpp HYBRID_SOURCES = test_hybrid_search.cpp vector_store.cpp simple_tokenizer.cpp ../deps/simdjson/simdjson.cpp OBJECTS = $(SOURCES:.cpp=.o) STRESS_OBJECTS = $(STRESS_SOURCES:.cpp=.o) BM25_OBJECTS = $(BM25_SOURCES:.cpp=.o) HYBRID_OBJECTS = $(HYBRID_SOURCES:.cpp=.o) all: $(TARGET) $(STRESS_TARGET) $(BM25_TARGET) $(HYBRID_TARGET) $(TARGET): $(OBJECTS) $(CXX) $(CXXFLAGS) $(OBJECTS) -o $(TARGET) $(LDFLAGS) $(LIBS) $(STRESS_TARGET): $(STRESS_OBJECTS) $(CXX) $(CXXFLAGS) $(STRESS_OBJECTS) -o $(STRESS_TARGET) $(LDFLAGS) $(LIBS) $(BM25_TARGET): $(BM25_OBJECTS) $(CXX) $(CXXFLAGS) $(BM25_OBJECTS) -o $(BM25_TARGET) $(LDFLAGS) $(LIBS) $(HYBRID_TARGET): $(HYBRID_OBJECTS) $(CXX) $(CXXFLAGS) $(HYBRID_OBJECTS) -o $(HYBRID_TARGET) $(LDFLAGS) $(LIBS) %.o: %.cpp $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@ clean: rm -f $(OBJECTS) $(STRESS_OBJECTS) $(BM25_OBJECTS) $(HYBRID_OBJECTS) $(TARGET) $(STRESS_TARGET) $(BM25_TARGET) $(HYBRID_TARGET) # BM25 test bm25: $(BM25_TARGET) ./$(BM25_TARGET) # Hybrid search test hybrid: $(HYBRID_TARGET) ./$(HYBRID_TARGET) # Force rebuild (useful for CI) rebuild: clean all run: $(TARGET) ./$(TARGET) ../test debug: $(TARGET) lldb ./$(TARGET) # Sanitizer builds test-asan: CXXFLAGS += -fsanitize=address -fno-sanitize-recover=all test-asan: LDFLAGS += -fsanitize=address test-asan: clean $(STRESS_TARGET) ./$(STRESS_TARGET) test-tsan: CXXFLAGS += -fsanitize=thread -fno-sanitize-recover=all test-tsan: LDFLAGS += -fsanitize=thread test-tsan: clean $(STRESS_TARGET) ./$(STRESS_TARGET) # Run stress tests with sanitizers by default # Use SANITIZER=none to disable, SANITIZER=thread for TSan SANITIZER ?= address ifeq ($(SANITIZER),address) stress: test-asan else ifeq ($(SANITIZER),thread) stress: test-tsan else stress: $(STRESS_TARGET) ./$(STRESS_TARGET) endif .PHONY: all clean run debug test-asan test-tsan stress