@@ -3,6 +3,80 @@ CFLAGS:=-Wall -Werror -Wextra -I. -D_GNU_SOURCE
33CFLAGS+ =-g -ggdb -Wdeclaration-after-statement
44LDFLAGS+ =-pthread
55
6+ UNAME_S: =$(shell uname -s)
7+ UNAME_M: =$(shell uname -m)
8+ UNAME_LC: =$(shell echo $(UNAME_S ) | tr 'A-Z' 'a-z')
9+ ifeq ($(UNAME_S ) ,FreeBSD)
10+ CFLAGS+ =-I/usr/local/include
11+ LDFLAGS+ =-L/usr/local/lib
12+ endif
13+ ifeq ($(UNAME_S ) ,Darwin)
14+ BREW_PREFIX? =$(shell brew --prefix 2>/dev/null)
15+ ifeq ($(filter command\ line environment,$(origin BREW_PREFIX)),)
16+ ifeq ($(UNAME_M),arm64)
17+ ARM_BREW_PREFIX: =$(shell /opt/homebrew/bin/brew --prefix 2>/dev/null)
18+ ifneq ($(ARM_BREW_PREFIX),)
19+ BREW_PREFIX: =$(ARM_BREW_PREFIX )
20+ endif
21+ endif
22+ endif
23+ ifeq ($(BREW_PREFIX),)
24+ BREW_PREFIX: =/opt/homebrew
25+ endif
26+ WOLFSSL_PREFIX? =$(shell brew --prefix wolfssl 2>/dev/null)
27+ ifeq ($(filter command\ line environment,$(origin WOLFSSL_PREFIX)),)
28+ ifeq ($(UNAME_M),arm64)
29+ ARM_WOLFSSL_PREFIX: =$(shell /opt/homebrew/bin/brew --prefix wolfssl 2>/dev/null)
30+ ifneq ($(ARM_WOLFSSL_PREFIX),)
31+ WOLFSSL_PREFIX: =$(ARM_WOLFSSL_PREFIX )
32+ endif
33+ endif
34+ endif
35+ ifneq ($(WOLFSSL_PREFIX),)
36+ CFLAGS+ =-I$(WOLFSSL_PREFIX ) /include
37+ LDFLAGS+ =-L$(WOLFSSL_PREFIX ) /lib
38+ endif
39+ CHECK_PREFIX? =$(shell brew --prefix check 2>/dev/null)
40+ ifeq ($(filter command\ line environment,$(origin CHECK_PREFIX)),)
41+ ifeq ($(UNAME_M),arm64)
42+ ARM_CHECK_PREFIX: =$(shell /opt/homebrew/bin/brew --prefix check 2>/dev/null)
43+ ifneq ($(ARM_CHECK_PREFIX),)
44+ CHECK_PREFIX: =$(ARM_CHECK_PREFIX )
45+ endif
46+ endif
47+ endif
48+ ifeq ($(CHECK_PREFIX),)
49+ CHECK_PREFIX: =$(BREW_PREFIX )
50+ endif
51+ ifneq ($(CHECK_PREFIX),)
52+ UNIT_CFLAGS+ =-I$(CHECK_PREFIX ) /include
53+ UNIT_LDFLAGS+ =-L$(CHECK_PREFIX ) /lib
54+ endif
55+ endif
56+
57+
58+ TAP_SRC: =src/port/posix/tap_$(UNAME_LC ) .c
59+ ifeq ($(wildcard $(TAP_SRC ) ) ,)
60+ TAP_SRC: =src/port/posix/tap_linux.c
61+ endif
62+ TAP_OBJ: =$(patsubst src/% .c,build/% .o,$(TAP_SRC ) )
63+ TAP_PIE_OBJ: =$(patsubst src/% .c,build/pie/% .o,$(TAP_SRC ) )
64+
65+ ifeq ($(UNAME_S ) ,Darwin)
66+ BEGIN_GROUP: =
67+ END_GROUP: =
68+ else
69+ BEGIN_GROUP: =-Wl,--start-group
70+ END_GROUP: =-Wl,--end-group
71+ endif
72+
73+ CHECK_PKG_CFLAGS: =$(shell pkg-config --cflags check 2>/dev/null)
74+ CHECK_PKG_LIBS: =$(shell pkg-config --libs check 2>/dev/null)
75+
76+ ifneq ($(CHECK_PKG_CFLAGS ) ,)
77+ UNIT_CFLAGS+ =$(CHECK_PKG_CFLAGS )
78+ endif
79+
680CPPCHECK =cppcheck
781CPPCHECK_FLAGS=--enable =warning,performance,portability,missingInclude \
882 --suppress=missingIncludeSystem \
@@ -21,11 +95,27 @@ CPPCHECK_FLAGS=--enable=warning,performance,portability,missingInclude \
2195 --error-exitcode=1 --xml --xml-version=2
2296
2397OBJ =build/wolfip.o \
24- build/port/posix/linux_tap.o
98+ $(TAP_OBJ )
99+
100+ HAVE_WOLFSSL: =$(shell printf "#include <wolfssl/options.h>\nint main(void) {return 0;}\n" | $(CC ) $(CFLAGS ) -x c - -c -o /dev/null 2>/dev/null && echo 1)
101+
102+ # Require wolfSSL unless the requested goals are wolfSSL-independent (unit/cppcheck/clean).
103+ REQ_WOLFSSL_GOALS: =$(filter-out unit cppcheck clean,$(MAKECMDGOALS ) )
104+ ifeq ($(strip $(MAKECMDGOALS ) ) ,)
105+ ifeq ($(HAVE_WOLFSSL),)
106+ $(warning wolfSSL headers not found. Skipping wolfSSL-dependent targets)
107+ endif
108+ else
109+ ifneq ($(REQ_WOLFSSL_GOALS),)
110+ ifeq ($(HAVE_WOLFSSL),)
111+ $(error wolfSSL headers not found. Please install wolfSSL or adjust include paths)
112+ endif
113+ endif
114+ endif
25115
26116EXE =build/tcpecho build/tcp_netcat_poll build/tcp_netcat_select \
27117 build/test-evloop build/test-dns build/test-wolfssl-forwarding \
28- build/test-ttl-expired build/test-wolfssl
118+ build/test-ttl-expired build/test-wolfssl build/test-httpd
29119LIB =libwolfip.so
30120
31121PREFIX =/usr/local
@@ -44,10 +134,10 @@ libtcpip.a: $(OBJ)
44134
45135libwolfip.so:CFLAGS+ =-fPIC
46136libwolfip.so : build/pie/port/posix/bsd_socket.o build/pie/wolfip.o \
47- build/pie/port/posix/linux_tap.o
137+ $( TAP_PIE_OBJ )
48138 @mkdir -p ` dirname $@ ` || true
49139 @echo " [LD] $@ "
50- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -shared -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
140+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -shared -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
51141
52142
53143clean :
@@ -61,40 +151,50 @@ asan:LDFLAGS+=-static-libasan
61151
62152# Test
63153
64- unit:LDFLAGS+ =-lcheck -lm -lpthread -lrt -ldl -lsubunit
65- build/test-evloop : $(OBJ ) build/test/test_linux_eventloop.o
154+ ifeq ($(CHECK_PKG_LIBS ) ,)
155+ UNIT_LIBS =-lcheck -lm -lpthread -lrt -ldl -lsubunit
156+ ifeq ($(UNAME_S),Darwin)
157+ UNIT_LIBS =-lcheck -lm -lpthread
158+ else ifeq ($(UNAME_S),FreeBSD)
159+ UNIT_LIBS =-lcheck -lm -lpthread
160+ endif
161+ else
162+ UNIT_LIBS =$(CHECK_PKG_LIBS )
163+ endif
164+
165+ unit:LDFLAGS+ =$(UNIT_LIBS )
166+ build/test-evloop : $(OBJ ) build/test/test_eventloop.o
66167 @echo " [LD] $@ "
67- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
168+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
68169
69- build/test-dns : $(OBJ ) build/test/test_linux_dhcp_dns .o
170+ build/test-dns : $(OBJ ) build/test/test_dhcp_dns .o
70171 @echo " [LD] $@ "
71- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
172+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
72173
73174build/tcpecho : $(OBJ ) build/port/posix/bsd_socket.o build/test/tcp_echo.o
74175 @echo " [LD] $@ "
75- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
176+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
76177
77178build/tcp_netcat_poll : $(OBJ ) build/port/posix/bsd_socket.o build/test/tcp_netcat_poll.o
78179 @echo " [LD] $@ "
79- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
180+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
80181
81182build/tcp_netcat_select : $(OBJ ) build/port/posix/bsd_socket.o build/test/tcp_netcat_select.o
82183 @echo " [LD] $@ "
83- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
184+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
84185
85186
86187build/test-wolfssl:CFLAGS+ =-Wno-cpp -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP
87188build/test-httpd:CFLAGS+ =-Wno-cpp -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP -Isrc/http
88189build/test-wolfssl-forwarding:CFLAGS+ =-Wno-cpp -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP -DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1
89190
90-
91191build/test-wolfssl : $(OBJ ) build/test/test_native_wolfssl.o build/port/wolfssl_io.o build/certs/server_key.o build/certs/ca_cert.o build/certs/server_cert.o
92192 @echo " [LD] $@ "
93- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -lwolfssl -Wl,--end-group
193+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) -lwolfssl $( END_GROUP )
94194
95- build/test-wolfssl-forwarding : build/test/test_wolfssl_forwarding.o build/test/wolfip_forwarding.o build/port/posix/linux_tap.o build/port/wolfssl_io.o build/certs/server_key.o build/certs/ca_cert.o build/certs/server_cert.o
195+ build/test-wolfssl-forwarding : build/test/test_wolfssl_forwarding.o build/test/wolfip_forwarding.o $( TAP_OBJ ) build/port/wolfssl_io.o build/certs/server_key.o build/certs/ca_cert.o build/certs/server_cert.o
96196 @echo " [LD] $@ "
97- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -lwolfssl -Wl,--end-group
197+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) -lwolfssl $( END_GROUP )
98198
99199build/test/test_wolfssl_forwarding.o : CFLAGS+=-DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1
100200
@@ -106,11 +206,11 @@ build/test/wolfip_forwarding.o: src/wolfip.c
106206build/test/test_ttl_expired.o : CFLAGS+=-DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1
107207build/test-ttl-expired : build/test/test_ttl_expired.o build/test/wolfip_forwarding.o
108208 @echo " [LD] $@ "
109- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
209+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
110210
111211build/test-httpd : $(OBJ ) build/test/test_httpd.o build/port/wolfssl_io.o build/certs/server_key.o build/certs/server_cert.o build/http/httpd.o
112212 @echo " [LD] $@ "
113- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -lwolfssl -Wl,--end-group
213+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) -lwolfssl $( END_GROUP )
114214
115215build/% .o : src/% .c
116216 @mkdir -p ` dirname $@ ` || true
@@ -154,9 +254,9 @@ unit: build/test/unit
154254build/test/unit :
155255 @mkdir -p build/test/
156256 @echo " [CC] unit.c"
157- @$(CC ) $(CFLAGS ) -c src/test/unit/unit.c -o build/test/unit.o
257+ @$(CC ) $(CFLAGS ) $( UNIT_CFLAGS ) -c src/test/unit/unit.c -o build/test/unit.o
158258 @echo " [LD] $@ "
159- @$(CC ) -o build/test/unit build/test/unit.o $(LDFLAGS )
259+ @$(CC ) build/test/unit.o -o build/test/unit $( UNIT_LDFLAGS ) $(LDFLAGS )
160260
161261# Install dynamic library to re-link linux applications
162262#
0 commit comments