summaryrefslogtreecommitdiffstats
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile77
1 files changed, 77 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..32e3b89
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,77 @@
+CC = cc
+CXX = c++
+CFLAGS = -march=native -O2 -std=c11 -Wall -Wextra
+CXXFLAGS = -march=native -O2 -w
+INCLUDES = -I. -Ideps/include
+
+TARGET = app
+SRC = main.c
+OBJS = $(SRC:.c=.o)
+
+NCNN_TAG = 20261020
+NCNN_URL = https://github.com/Tencent/ncnn/archive/refs/tags/$(NCNN_TAG).tar.gz
+NCNN_TAR = deps/$(NCNN_TAG).tar.gz
+NCNN_SRC_DIR = deps/ncnn-src
+NCNN_BUILD = $(NCNN_SRC_DIR)/build
+
+STATIC_LIBS = deps/lib/libncnn.a
+
+# System flags required for static linking llama on OpenBSD
+SYS_LIBS = -static -pthread -lm -lc++ -lc++abi
+
+.PHONY: all clean distclean
+
+all: $(TARGET)
+
+# Link order: libncnn
+$(TARGET): deps/lib/libncnn.a $(OBJS)
+ $(CXX) $(CXXFLAGS) $(OBJS) \
+ -Wl,--start-group \
+ deps/lib/libncnn.a \
+ -Wl,--end-group \
+ $(SYS_LIBS) -o $@
+
+# BSD suffix rule: compiles any .c file into .o
+.c.o:
+ $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
+
+# Download ncnn source and build statically
+deps/lib/libncnn.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 ncnn $(NCNN_TAG) source..."
+ ftp -o $(NCNN_TAR) $(NCNN_URL)
+
+ @echo "===> Extracting source archive..."
+ tar -xzf $(NCNN_TAR) -C deps
+ rm -rf $(NCNN_SRC_DIR)
+ mv deps/ncnn-$(NCNN_TAG) $(NCNN_SRC_DIR)
+ rm -f $(NCNN_TAR)
+
+ @echo "===> Compiling ncnn..."
+ cmake -S $(NCNN_SRC_DIR) -B $(NCNN_BUILD) \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DBUILD_SHARED_LIBS=OFF \
+ -DCMAKE_INSTALL_PREFIX=$(PWD)/deps \
+ -DCMAKE_CXX_FLAGS="$(CXXFLAGS)" \
+ -DNCNN_OPENMP=OFF \
+ -DNCNN_VULKAN=OFF \
+ -DNCNN_BUILD_TESTS=OFF \
+ -DNCNN_COVERAGE=OFF \
+ -DNCNN_BUILD_BENCHMARK=OFF \
+ -DNCNN_PYTHON=OFF \
+ -DNCNN_BUILD_TOOLS=OFF
+
+ cmake --build $(NCNN_BUILD) --config Release -j$$(sysctl -n hw.ncpu)
+
+ @echo "===> Installing library and headers into deps/..."
+ cmake --install $(NCNN_BUILD)
+
+ @echo "===> Cleaning up build directory..."
+ rm -rf $(NCNN_SRC_DIR)
+
+clean:
+ rm -f $(TARGET) $(OBJS)
+
+distclean: clean
+ rm -rf deps