summaryrefslogtreecommitdiffstats
path: root/Makefile
blob: 32e3b89ba309fbd640a842ae5d24a3ccd7025503 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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