summaryrefslogtreecommitdiffstats
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile136
1 files changed, 136 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..4f9c63c
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,136 @@
+CC = cc
+CXX = c++
+CFLAGS = -march=native -O2 -std=c11 -Wall -Wextra
+CXXFLAGS = -march=native -O2 -O2 -Wall -Wextra
+INCLUDES = -I. -Ideps/include
+
+LLAMA_TAG = b10107
+LLAMA_URL = https://github.com/ggml-org/llama.cpp/archive/refs/tags/$(LLAMA_TAG).tar.gz
+LLAMA_TAR = deps/llama-$(LLAMA_TAG).tar.gz
+LLAMA_SRC_DIR = deps/llama.cpp-src
+LLAMA_BUILD = $(LLAMA_SRC_DIR)/build
+
+STATIC_LIBS = deps/lib/libllama.a \
+ deps/lib/libggml.a \
+ deps/lib/libggml-cpu.a \
+
+# System flags required for static linking llama on OpenBSD
+SYS_LIBS = -static -pthread -lm -lc++ -lc++abi
+
+TARGET = victor
+SRC = llm.c main.c
+OBJS = $(SRC:.c=.o)
+
+# Standard tools and target directory
+BINDIR = /usr/local/bin
+RCDIR = /etc/rc.d
+VARDIR = /var/$(TARGET)
+INSTALL = install
+INSTALL_PROGRAM = $(INSTALL) -m 755
+INSTALL_SCRIPT = $(INSTALL) -m 555
+MKDIR_P = mkdir -p
+
+# Service user configuration
+SERVICE_USER = _victor
+SERVICE_GROUP = _victor
+
+.PHONY: all clean distclean install install-user uninstall
+
+all: $(TARGET)
+
+# Explicit link order: libllama -> libggml-cpu -> libggml -> libggml-base
+$(TARGET): deps/lib/libllama.a $(OBJS)
+ $(CXX) $(CXXFLAGS) $(OBJS) \
+ -Wl,--start-group \
+ deps/lib/libllama.a \
+ deps/lib/libggml-cpu.a \
+ deps/lib/libggml.a \
+ deps/lib/libggml-base.a \
+ -Wl,--end-group \
+ $(SYS_LIBS) -o $@
+
+# BSD suffix rule: compiles any .c file into .o
+.c.o:
+ $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
+
+# Rebuild objects if the shared header changes
+$(OBJS): llm.h
+
+# Download llama source and build statically
+deps/lib/libllama.a deps/lib/libggml.a deps/lib/libggml-cpu.a:
+ @command -v cmake >/dev/null 2>&1 || { echo >&2 "===> Error: cmake is required but not installed. Aborting."; exit 1; }
+ @mkdir -p deps/lib deps/include
+ @echo "===> Downloading llama.cpp $(LLAMA_TAG) source..."
+ ftp -o $(LLAMA_TAR) $(LLAMA_URL)
+
+ @echo "===> Extracting source archive..."
+ tar -xzf $(LLAMA_TAR) -C deps
+ rm -rf $(LLAMA_SRC_DIR)
+ mv deps/llama.cpp-$(LLAMA_TAG) $(LLAMA_SRC_DIR)
+ rm -f $(LLAMA_TAR)
+
+ @echo "===> Compiling llama static archives..."
+ cmake -S $(LLAMA_SRC_DIR) -B $(LLAMA_BUILD) \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DBUILD_SHARED_LIBS=OFF \
+ -DGGML_OPENMP=OFF \
+ -DGGML_VULKAN=OFF \
+ -DLLAMA_BUILD_APP=OFF \
+ -DLLAMA_BUILD_COMMON=OFF \
+ -DLLAMA_BUILD_TESTS=OFF \
+ -DLLAMA_BUILD_UI=OFF \
+ -DLLAMA_BUILD_EXAMPLES=OFF \
+ -DLLAMA_BUILD_SERVER=OFF \
+ -DLLAMA_BUILD_TOOLS=OFF
+
+ cmake --build $(LLAMA_BUILD) --config Release -j$$(sysctl -n hw.ncpu)
+
+ @echo "===> Installing .a files and headers into deps/..."
+ find $(LLAMA_BUILD) -type f -name "*.a" -exec cp {} deps/lib/ \;
+ cp -R $(LLAMA_SRC_DIR)/include/* deps/include/
+ cp -R $(LLAMA_SRC_DIR)/ggml/include/* deps/include/
+
+ @echo "===> Cleaning up build directory..."
+ rm -rf $(LLAMA_SRC_DIR)
+
+install-user:
+ @if ! id -u $(SERVICE_USER) >/dev/null 2>&1; then \
+ echo "===> Creating service user..."; \
+ groupadd $(SERVICE_GROUP) 2>/dev/null || true; \
+ useradd -g $(SERVICE_GROUP) -s /sbin/nologin -m -c "victor daemon user" $(SERVICE_USER); \
+ fi
+
+install: install-user
+ @if [ ! -f $(TARGET) ]; then \
+ echo "Error: $(TARGET) executable not found. Please build it first or provide the binary." >&2; \
+ exit 1; \
+ fi
+ @$(MKDIR_P) $(BINDIR)
+ @echo "===> Installing executable to $(BINDIR)/$(TARGET)..."
+ @$(INSTALL_PROGRAM) $(TARGET) $(BINDIR)/$(TARGET)
+ @echo "===> Installing RC script to $(RCDIR)/$(TARGET)..."
+ @$(MKDIR_P) $(RCDIR)
+ @$(INSTALL_SCRIPT) $(TARGET).rc $(RCDIR)/$(TARGET)
+ @echo "===> Creating data directory $(VARDIR)..."
+ @$(MKDIR_P) $(VARDIR)
+ @chown $(SERVICE_USER):$(SERVICE_GROUP) $(VARDIR)
+ @chmod 750 $(VARDIR)
+ @echo "===> Installation complete."
+
+uninstall:
+ @echo "===> Stopping service..."
+ @-rcctl stop $(TARGET) 2>/dev/null || true
+ @rm -f $(BINDIR)/$(TARGET)
+ @rm -f $(RCDIR)/$(TARGET)
+ @echo "Uninstall complete."
+ @echo "Note: The data directory and service accounts were preserved."
+ @echo "To remove all remaining data, run:"
+ @echo " # rm -rf $(VARDIR)"
+ @echo " # userdel -r $(SERVICE_USER)"
+ @echo " # groupdel $(SERVICE_GROUP)"
+
+clean:
+ rm -f $(TARGET) $(OBJS)
+
+distclean: clean
+ rm -rf deps