Skip to content

Commit 5be024a

Browse files
committed
Add support for CMake
CMakeLists.txt is added trying to resemble the behavior of Makefile as close as possible, where it makes sense. mkcerts.sh updated to support customization of output directory in order to support separate source and binary directories. CMakeLists supports compiling static and shared WolfIP library and generates various test binaries. If -DBUILD_TESTING=ON is passed to CMake, then tests are build automatically and `test` target is available to run tests. Otherwise test binary targets are generated but are not built by default. If wolfssl is NOT found in the system, then tests relying on its presence are disabled completely. Same applies for xxd and openssl which are required for certificate generation step. CMakeLists will try to detect check library used by the unit test suite. If not found then unit tests driver build is disabled. If -DBUILD_TESTING is passed to CMake, then any of above missing will cause the build to fail as it is not possible to build all tests. Install step is provided that installs shared library. So far only native Linux build is tested. ASAN support is not implemented yet.
1 parent 0879fc2 commit 5be024a

File tree

2 files changed

+187
-4
lines changed

2 files changed

+187
-4
lines changed

CMakeLists.txt

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
cmake_minimum_required(VERSION 3.16)
2+
3+
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
4+
5+
set(CMAKE_C_FLAGS "-Wall -Werror -Wextra -Wdeclaration-after-statement")
6+
set(CMAKE_C_FLAGS_Debug "-g -ggdb")
7+
set(CMAKE_C_FLAGS_Release "-O3")
8+
9+
project(wolfip LANGUAGES C)
10+
11+
if (BUILD_TESTING)
12+
enable_testing()
13+
set(TESTS_REQUIRED "REQUIRED")
14+
set(EXCLUDE_TEST_BINARY )
15+
else()
16+
set(EXCLUDE_TEST_BINARY EXCLUDE_FROM_ALL)
17+
endif()
18+
19+
find_package(wolfssl ${TESTS_REQUIRED})
20+
find_package(Check ${TESTS_REQUIRED})
21+
find_program(XXD_EXE xxd ${TESTS_REQUIRED})
22+
find_program(OPENSSL_EXE openssl ${TESTS_REQUIRED})
23+
24+
if (NOT wolfssl_FOUND)
25+
message(STATUS "WolfSSL NOT found! Tests depending on WolfSSL are disabled")
26+
endif()
27+
28+
if (XXD_EXE STREQUAL "XXD_EXE-NOTFOUND")
29+
message(STATUS "xxd NOT found! Tests depending on certificate support are disabled!")
30+
set(XXD_FOUND FALSE)
31+
else()
32+
set(XXD_FOUND TRUE)
33+
endif()
34+
35+
if (OPENSSL_EXE STREQUAL "OPENSSL_EXE-NOTFOUND")
36+
message(STATUS "openssl NOT found! Tests depending on certificate support are disabled!")
37+
set(OPENSSL_FOUND FALSE)
38+
else()
39+
set(OPENSSL_FOUND TRUE)
40+
endif()
41+
42+
string(TOLOWER "${CMAKE_SYSTEM_NAME}" CMAKE_SYSTEM_NAME_LC)
43+
44+
set(WOLFIP_TAP_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/port/posix/tap_${CMAKE_SYSTEM_NAME_LC}.c")
45+
46+
if (NOT EXISTS "${WOLFIP_TAP_SRC}")
47+
message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")
48+
endif()
49+
50+
set(WOLFIP_SRCS src/wolfip.c ${WOLFIP_TAP_SRC})
51+
52+
set(CERT_SRCS
53+
${CMAKE_BINARY_DIR}/certs/server_cert.c
54+
${CMAKE_BINARY_DIR}/certs/server_key.c
55+
${CMAKE_BINARY_DIR}/certs/ca_cert.c
56+
)
57+
58+
add_custom_command(
59+
OUTPUT ${CERT_SRCS}
60+
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/certs/mkcerts.sh ${CMAKE_BINARY_DIR}/certs
61+
BYPRODUCTS
62+
${CMAKE_BINARY_DIR}/certs/ca.crt
63+
${CMAKE_BINARY_DIR}/certs/ca.der
64+
${CMAKE_BINARY_DIR}/certs/ca.srl
65+
${CMAKE_BINARY_DIR}/certs/ca.key
66+
${CMAKE_BINARY_DIR}/certs/server.crt
67+
${CMAKE_BINARY_DIR}/certs/server.der
68+
${CMAKE_BINARY_DIR}/certs/server.csr
69+
${CMAKE_BINARY_DIR}/certs/server.key
70+
${CMAKE_BINARY_DIR}/certs/server.key.der
71+
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
72+
)
73+
74+
add_library(wolfip SHARED ${WOLFIP_SRCS} src/port/posix/bsd_socket.c)
75+
target_include_directories(wolfip PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
76+
77+
add_library(tcpip STATIC ${WOLFIP_SRCS})
78+
target_link_libraries(tcpip wolfip-core)
79+
target_include_directories(tcpip PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
80+
81+
add_executable(test-evloop ${EXCLUDE_TEST_BINARY}
82+
src/test/test_eventloop.c
83+
${WOLFIP_SRCS}
84+
)
85+
add_test(NAME evloop COMMAND test-evloop)
86+
87+
add_executable(test-dns ${EXCLUDE_TEST_BINARY}
88+
src/test/test_dhcp_dns.c
89+
${WOLFIP_SRCS}
90+
)
91+
add_test(NAME dns COMMAND test-dns)
92+
93+
add_executable(tcpecho ${EXCLUDE_TEST_BINARY}
94+
src/test/tcp_echo.c
95+
src/port/posix/bsd_socket.c
96+
${WOLFIP_SRCS}
97+
)
98+
add_test(NAME tcpecho COMMAND tcpecho)
99+
100+
add_executable(tcp_netcat_poll ${EXCLUDE_TEST_BINARY}
101+
src/test/tcp_netcat_poll.c
102+
src/port/posix/bsd_socket.c
103+
${WOLFIP_SRCS}
104+
)
105+
add_test(NAME tcp_netcat_poll COMMAND tcp_netcat_poll)
106+
107+
add_executable(tcp_netcat_select ${EXCLUDE_TEST_BINARY}
108+
src/test/tcp_netcat_select.c
109+
src/port/posix/bsd_socket.c
110+
${WOLFIP_SRCS}
111+
)
112+
add_test(NAME tcp_netcat_select COMMAND tcp_netcat_select)
113+
114+
115+
if (wolfssl_FOUND AND XXD_FOUND AND OPENSSL_FOUND)
116+
add_executable(test-wolfssl ${EXCLUDE_TEST_BINARY}
117+
src/test/test_native_wolfssl.c
118+
${WOLFIP_SRCS}
119+
src/port/wolfssl_io.c
120+
${CERT_SRCS}
121+
)
122+
target_compile_definitions(test-wolfssl PRIVATE -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP)
123+
target_compile_options(test-wolfssl PRIVATE -Wno-cpp)
124+
target_link_libraries(test-wolfssl wolfssl)
125+
add_test(NAME wolfssl COMMAND test-wolfssl)
126+
127+
add_executable(ipfilter-logger ${EXCLUDE_TEST_BINARY}
128+
${WOLFIP_SRCS}
129+
src/port/wolfssl_io.c
130+
src/port/posix/bsd_socket.c
131+
src/test/ipfilter_logger.c
132+
${CERT_SRCS}
133+
)
134+
target_include_directories(ipfilter-logger PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
135+
target_compile_definitions(ipfilter-logger PRIVATE -DCONFIG_IPFILTER=1 -DWOLFSSL_WOLFIP)
136+
target_link_libraries(ipfilter-logger wolfssl)
137+
add_test(NAME ipfilter-logger COMMAND ipfilter-logger)
138+
139+
add_executable(test-wolfssl-forwarding ${EXCLUDE_TEST_BINARY}
140+
src/test/test_wolfssl_forwarding.c
141+
${WOLFIP_SRCS}
142+
src/port/wolfssl_io.c
143+
${CERT_SRCS}
144+
)
145+
target_compile_definitions(test-wolfssl-forwarding PRIVATE -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP -DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1)
146+
target_compile_options(test-wolfssl-forwarding PRIVATE -Wno-cpp)
147+
target_link_libraries(test-wolfssl-forwarding wolfssl)
148+
add_test(NAME wolfssl-forwarding COMMAND test-wolfssl-forwarding)
149+
150+
add_executable(test-httpd ${EXCLUDE_TEST_BINARY}
151+
src/test/test_httpd.c
152+
${WOLFIP_SRCS}
153+
src/port/wolfssl_io.c
154+
${CMAKE_BINARY_DIR}/certs/server_key.c
155+
${CMAKE_BINARY_DIR}/certs/server_cert.c
156+
src/http/httpd.c
157+
)
158+
target_include_directories(test-httpd PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/http)
159+
target_compile_definitions(test-httpd PRIVATE -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP)
160+
target_compile_options(test-httpd PRIVATE -Wno-cpp)
161+
target_link_libraries(test-httpd wolfssl)
162+
add_test(NAME httpd COMMAND test-httpd)
163+
endif()
164+
165+
add_executable(test-ttl-expired ${EXCLUDE_TEST_BINARY}
166+
src/test/test_ttl_expired.c
167+
src/wolfip.c
168+
)
169+
target_compile_definitions(test-ttl-expired PRIVATE -DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1)
170+
add_test(NAME ttl-expired COMMAND test-ttl-expired)
171+
172+
if (NOT Check_FOUND)
173+
add_executable(unit ${EXCLUDE_TEST_BINARY}
174+
src/test/unit/unit.c
175+
)
176+
target_link_libraries(unit PRIVATE check)
177+
add_test(NAME unit COMMAND unit)
178+
endif()
179+
180+
install(TARGETS wolfip RUNTIME DESTINATION bin)

tools/certs/mkcerts.sh

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#!/bin/sh
22
#
3-
OUT_DIR=build/certs
3+
OUT_DIR=${1:=build/certs}
4+
OUT_DIR_CVAR=$(echo $OUT_DIR | sed -e 's/\//_/g')
5+
6+
echo ${OUT_DIR_CVAR}
47

58
: "${COUNTRY:=US}"
69
: "${STATE:=State}"
@@ -26,7 +29,7 @@ openssl req -x509 -new -key "$OUT_DIR/ca.key" -sha256 -days "$DAYS_CA" -out "$OU
2629
# 3. Convert CA certificate to DER format
2730
openssl x509 -in "$OUT_DIR/ca.crt" -outform DER -out "$OUT_DIR/ca.der"
2831

29-
xxd -i "$OUT_DIR/ca.der" |sed -e "s/unsigned/const unsigned/g" | sed -e "s/build_certs_//g" > "$OUT_DIR/ca_cert.c"
32+
xxd -i "$OUT_DIR/ca.der" |sed -e "s/unsigned/const unsigned/g" | sed -e "s/${OUT_DIR_CVAR}_//g" > "$OUT_DIR/ca_cert.c"
3033

3134

3235
echo "==== Generating server private key ===="
@@ -37,7 +40,7 @@ openssl ecparam -name "$ECC_CURVE" -genkey -noout -out "$OUT_DIR/server.key"
3740
# 5. Convert server private key to DER format
3841
openssl pkcs8 -topk8 -nocrypt -in "$OUT_DIR/server.key" -outform DER -out "$OUT_DIR/server.key.der"
3942

40-
xxd -i "$OUT_DIR/server.key.der" |sed -e "s/unsigned/const unsigned/g" | sed -e "s/build_certs_//g" > "$OUT_DIR/server_key.c"
43+
xxd -i "$OUT_DIR/server.key.der" |sed -e "s/unsigned/const unsigned/g" | sed -e "s/${OUT_DIR_CVAR}_//g" > "$OUT_DIR/server_key.c"
4144

4245

4346
echo "==== Generating server Certificate Signing Request (CSR) ===="
@@ -55,6 +58,6 @@ openssl x509 -req -in "$OUT_DIR/server.csr" -CA "$OUT_DIR/ca.crt" -CAkey "$OUT_D
5558
# 8. Convert server certificate to DER format
5659
openssl x509 -in "$OUT_DIR/server.crt" -outform DER -out "$OUT_DIR/server.der"
5760

58-
xxd -i "$OUT_DIR/server.der" |sed -e "s/unsigned/const unsigned/g" | sed -e "s/build_certs_//g" > "$OUT_DIR/server_cert.c"
61+
xxd -i "$OUT_DIR/server.der" |sed -e "s/unsigned/const unsigned/g" | sed -e "s/${OUT_DIR_CVAR}_//g" > "$OUT_DIR/server_cert.c"
5962

6063
echo "==== Done ===="

0 commit comments

Comments
 (0)