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