native-vector-store
Version:
High-performance local vector store with SIMD optimization for MCP servers
107 lines (86 loc) • 3.15 kB
Plain Text
# 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