@@ -3,6 +3,79 @@ 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+
27+ WOLFSSL_PREFIX? =$(shell brew --prefix wolfssl 2>/dev/null)
28+ ifeq ($(filter command\ line environment,$(origin WOLFSSL_PREFIX ) ) ,)
29+ ifeq ($(UNAME_M ) ,arm64)
30+ ARM_WOLFSSL_PREFIX: =$(shell /opt/homebrew/bin/brew --prefix wolfssl 2>/dev/null)
31+ ifneq ($(ARM_WOLFSSL_PREFIX ) ,)
32+ WOLFSSL_PREFIX: =$(ARM_WOLFSSL_PREFIX )
33+ endif
34+ endif
35+ endif
36+ ifneq ($(WOLFSSL_PREFIX ) ,)
37+ CFLAGS+ =-I$(WOLFSSL_PREFIX ) /include
38+ LDFLAGS+ =-L$(WOLFSSL_PREFIX ) /lib
39+ endif
40+ CHECK_PREFIX? =$(shell brew --prefix check 2>/dev/null)
41+ ifeq ($(filter command\ line environment,$(origin CHECK_PREFIX ) ) ,)
42+ ifeq ($(UNAME_M ) ,arm64)
43+ ARM_CHECK_PREFIX: =$(shell /opt/homebrew/bin/brew --prefix check 2>/dev/null)
44+ ifneq ($(ARM_CHECK_PREFIX ) ,)
45+ CHECK_PREFIX: =$(ARM_CHECK_PREFIX )
46+ endif
47+ endif
48+ endif
49+ ifeq ($(CHECK_PREFIX ) ,)
50+ CHECK_PREFIX: =$(BREW_PREFIX )
51+ endif
52+ ifneq ($(CHECK_PREFIX ) ,)
53+ UNIT_CFLAGS+ =-I$(CHECK_PREFIX ) /include
54+ UNIT_LDFLAGS+ =-L$(CHECK_PREFIX ) /lib
55+ endif
56+ endif
57+ TAP_SRC: =src/port/posix/tap_$(UNAME_LC ) .c
58+ ifeq ($(wildcard $(TAP_SRC ) ) ,)
59+ TAP_SRC: =src/port/posix/tap_linux.c
60+ endif
61+ TAP_OBJ: =$(patsubst src/% .c,build/% .o,$(TAP_SRC ) )
62+ TAP_PIE_OBJ: =$(patsubst src/% .c,build/pie/% .o,$(TAP_SRC ) )
63+
64+ ifeq ($(UNAME_S ) ,Darwin)
65+ BEGIN_GROUP: =
66+ END_GROUP: =
67+ else
68+ BEGIN_GROUP: =-Wl,--start-group
69+ END_GROUP: =-Wl,--end-group
70+ endif
71+
72+ CHECK_PKG_CFLAGS: =$(shell pkg-config --cflags check 2>/dev/null)
73+ CHECK_PKG_LIBS: =$(shell pkg-config --libs check 2>/dev/null)
74+
75+ ifneq ($(CHECK_PKG_CFLAGS ) ,)
76+ UNIT_CFLAGS+ =$(CHECK_PKG_CFLAGS )
77+ endif
78+
679CPPCHECK =cppcheck
780CPPCHECK_FLAGS=--enable =warning,performance,portability,missingInclude \
881 --suppress=missingIncludeSystem \
@@ -21,11 +94,27 @@ CPPCHECK_FLAGS=--enable=warning,performance,portability,missingInclude \
2194 --error-exitcode=1 --xml --xml-version=2
2295
2396OBJ =build/wolfip.o \
24- build/port/posix/linux_tap.o
97+ $(TAP_OBJ )
98+
99+ 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)
100+
101+ # Require wolfSSL unless the requested goals are wolfSSL-independent (unit/cppcheck/clean).
102+ REQ_WOLFSSL_GOALS: =$(filter-out unit cppcheck clean,$(MAKECMDGOALS ) )
103+ ifeq ($(strip $(MAKECMDGOALS ) ) ,)
104+ ifeq ($(HAVE_WOLFSSL),)
105+ $(warning wolfSSL headers not found. Skipping wolfSSL-dependent targets)
106+ endif
107+ else
108+ ifneq ($(REQ_WOLFSSL_GOALS),)
109+ ifeq ($(HAVE_WOLFSSL),)
110+ $(error wolfSSL headers not found. Please install wolfSSL or adjust include paths)
111+ endif
112+ endif
113+ endif
25114
26115EXE =build/tcpecho build/tcp_netcat_poll build/tcp_netcat_select \
27116 build/test-evloop build/test-dns build/test-wolfssl-forwarding \
28- build/test-ttl-expired build/test-wolfssl
117+ build/test-ttl-expired build/test-wolfssl build/test-httpd
29118LIB =libwolfip.so
30119
31120PREFIX =/usr/local
@@ -44,10 +133,10 @@ libtcpip.a: $(OBJ)
44133
45134libwolfip.so:CFLAGS+ =-fPIC
46135libwolfip.so : build/pie/port/posix/bsd_socket.o build/pie/wolfip.o \
47- build/pie/port/posix/linux_tap.o
136+ $( TAP_PIE_OBJ )
48137 @mkdir -p ` dirname $@ ` || true
49138 @echo " [LD] $@ "
50- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -shared -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
139+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -shared -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
51140
52141
53142clean :
@@ -61,40 +150,50 @@ asan:LDFLAGS+=-static-libasan
61150
62151# Test
63152
64- unit:LDFLAGS+ =-lcheck -lm -lpthread -lrt -ldl -lsubunit
65- build/test-evloop : $(OBJ ) build/test/test_linux_eventloop.o
153+ ifeq ($(CHECK_PKG_LIBS ) ,)
154+ UNIT_LIBS =-lcheck -lm -lpthread -lrt -ldl -lsubunit
155+ ifeq ($(UNAME_S ) ,Darwin)
156+ UNIT_LIBS =-lcheck -lm -lpthread
157+ else ifeq ($(UNAME_S),FreeBSD)
158+ UNIT_LIBS =-lcheck -lm -lpthread
159+ endif
160+ else
161+ UNIT_LIBS =$(CHECK_PKG_LIBS )
162+ endif
163+
164+ unit:LDFLAGS+ =$(UNIT_LIBS )
165+ build/test-evloop : $(OBJ ) build/test/test_eventloop.o
66166 @echo " [LD] $@ "
67- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
167+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
68168
69- build/test-dns : $(OBJ ) build/test/test_linux_dhcp_dns .o
169+ build/test-dns : $(OBJ ) build/test/test_dhcp_dns .o
70170 @echo " [LD] $@ "
71- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
171+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
72172
73173build/tcpecho : $(OBJ ) build/port/posix/bsd_socket.o build/test/tcp_echo.o
74174 @echo " [LD] $@ "
75- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
175+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
76176
77177build/tcp_netcat_poll : $(OBJ ) build/port/posix/bsd_socket.o build/test/tcp_netcat_poll.o
78178 @echo " [LD] $@ "
79- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
179+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
80180
81181build/tcp_netcat_select : $(OBJ ) build/port/posix/bsd_socket.o build/test/tcp_netcat_select.o
82182 @echo " [LD] $@ "
83- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
183+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
84184
85185
86186build/test-wolfssl:CFLAGS+ =-Wno-cpp -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP
87187build/test-httpd:CFLAGS+ =-Wno-cpp -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP -Isrc/http
88188build/test-wolfssl-forwarding:CFLAGS+ =-Wno-cpp -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP -DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1
89189
90-
91190build/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
92191 @echo " [LD] $@ "
93- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -lwolfssl -Wl,--end-group
192+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) -lwolfssl $( END_GROUP )
94193
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
194+ 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
96195 @echo " [LD] $@ "
97- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -lwolfssl -Wl,--end-group
196+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) -lwolfssl $( END_GROUP )
98197
99198build/test/test_wolfssl_forwarding.o : CFLAGS+=-DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1
100199
@@ -106,11 +205,11 @@ build/test/wolfip_forwarding.o: src/wolfip.c
106205build/test/test_ttl_expired.o : CFLAGS+=-DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1
107206build/test-ttl-expired : build/test/test_ttl_expired.o build/test/wolfip_forwarding.o
108207 @echo " [LD] $@ "
109- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -Wl,--end-group
208+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) $( END_GROUP )
110209
111210build/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
112211 @echo " [LD] $@ "
113- @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ -Wl,--start-group $(^ ) -lwolfssl -Wl,--end-group
212+ @$(CC ) $(CFLAGS ) $(LDFLAGS ) -o $@ $( BEGIN_GROUP ) $(^ ) -lwolfssl $( END_GROUP )
114213
115214build/% .o : src/% .c
116215 @mkdir -p ` dirname $@ ` || true
@@ -154,9 +253,9 @@ unit: build/test/unit
154253build/test/unit :
155254 @mkdir -p build/test/
156255 @echo " [CC] unit.c"
157- @$(CC ) $(CFLAGS ) -c src/test/unit/unit.c -o build/test/unit.o
256+ @$(CC ) $(CFLAGS ) $( UNIT_CFLAGS ) -c src/test/unit/unit.c -o build/test/unit.o
158257 @echo " [LD] $@ "
159- @$(CC ) -o build/test/unit build/test/unit.o $(LDFLAGS )
258+ @$(CC ) build/test/unit.o -o build/test/unit $( UNIT_LDFLAGS ) $(LDFLAGS )
160259
161260# Install dynamic library to re-link linux applications
162261#
0 commit comments