Browse Source

Improvements to CMake support based on feedback from users.

David Garske 3 years ago
parent
commit
8b25b48621
2 changed files with 89 additions and 63 deletions
  1. 83 63
      CMakeLists.txt
  2. 6 0
      INSTALL

+ 83 - 63
CMakeLists.txt

@@ -4,7 +4,18 @@
 #
 # This file is part of wolfSSL. (formerly known as CyaSSL)
 #
-#
+# Usage:
+# $ mkdir build
+# $ cd build
+# $ cmake ..
+# $ make
+
+# To build library only and not build examples and test apps use:
+# $ cmake .. -DBUILD_TESTS=NO
+
+# To build with debugging use:
+# $ cmake .. -DCMAKE_BUILD_TYPE=Debug
+
 
 cmake_minimum_required (VERSION 2.6)
 
@@ -17,31 +28,41 @@ find_package (Threads)
 ####################################################
 # Compiler
 ####################################################
-set(CMAKE_C_COMPILER gcc)
-set(CMAKE_CXX_COMPILER gcc)
+# Let CMake choose default compiler
+
+# Silence ranlib warning "has no symbols"
+SET(CMAKE_C_ARCHIVE_CREATE   "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
+SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
+SET(CMAKE_C_ARCHIVE_FINISH   "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
+SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
+
+####################################################
+# Cross Compile Example
+####################################################
 
-# Example for cross-compile
 #set(CMAKE_SYSTEM_NAME Linux)
 #set(CMAKE_SYSTEM_PROCESSOR arm)
 #set(CMAKE_C_COMPILER "/opt/arm-linux-musleabihf-cross/bin/arm-linux-musleabihf-gcc")
 #set(CMAKE_CXX_COMPILER "/opt/arm-linux-musleabihf-cross/bin/arm-linux-musleabihf-g++")
 #set(CMAKE_SYSROOT "/opt/arm-linux-musleabihf-cross/arm-linux-musleabihf/")
+# Example for setting CFLAGS
+#set(CMAKE_C_FLAGS "-std=gnu89 ${CMAKE_C_FLAGS}")
+# Example for map file and custom linker script
+#set(CMAKE_EXE_LINKER_FLAGS " -Xlinker -Map=output.map -T\"${CMAKE_CURRENT_SOURCE_DIR}/linker.ld\"")
 
 ####################################################
 # Build Options
 ####################################################
+SET(BUILD_TESTS YES CACHE BOOL "Build test applications")
+
 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/options.h")
     # Copy generated ./options.h
-    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/options.h
-         DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
-    file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/options.h
-                ${CMAKE_CURRENT_BINARY_DIR}/user_settings.h)
+    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/options.h 
+                   ${CMAKE_CURRENT_BINARY_DIR}/user_settings.h)
 else()
    # Use template
-   file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/options.h.in
-        DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
-   file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/options.h.in
-               ${CMAKE_CURRENT_BINARY_DIR}/user_settings.h)
+   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/options.h.in 
+                  ${CMAKE_CURRENT_BINARY_DIR}/user_settings.h)
 endif()
 
 add_definitions(-DWOLFSSL_USER_SETTINGS)
@@ -51,18 +72,11 @@ if(CMAKE_HAVE_PTHREAD_H)
 endif()
 
 ####################################################
-# Build flags
+# Source Files
 ####################################################
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/.)
 include_directories(${CMAKE_CURRENT_BINARY_DIR}/.)
 
-# Example for map file and custom linker script
-set(CMAKE_C_FLAGS "-std=gnu89 ${CMAKE_C_FLAGS}")
-#set(CMAKE_EXE_LINKER_FLAGS " -Xlinker -Map=output.map -T\"${CMAKE_CURRENT_SOURCE_DIR}/linker.ld\"")
-
-####################################################
-# Source Files
-####################################################
 file(GLOB LIB_SOURCE_FILES
     ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c
     ${CMAKE_CURRENT_SOURCE_DIR}/wolfcrypt/src/*.c)
@@ -75,48 +89,54 @@ file(GLOB TEST_SOURCE_FILES
 ####################################################
 # Output Files
 ####################################################
-# Build library
-add_library(wolfssl ${LIB_SOURCE_FILES})
-
-# Build wolfCrypt test
-add_executable(wolfcrypttest
-    ${CMAKE_CURRENT_SOURCE_DIR}/wolfcrypt/test/test.c)
-target_link_libraries(wolfcrypttest wolfssl)
+# DH requires math (m) library
+link_libraries(m)
 
-# Build wolfCrypt benchmark
-add_executable(wolfcryptbench
-    ${CMAKE_CURRENT_SOURCE_DIR}/wolfcrypt/benchmark/benchmark.c)
-target_link_libraries(wolfcryptbench wolfssl)
+# Build wolfssl library
+add_library(wolfssl ${LIB_SOURCE_FILES})
 
-# Build wolfSSL Client example
-add_executable(client
-    ${CMAKE_CURRENT_SOURCE_DIR}/examples/client/client.c)
-target_link_libraries(client wolfssl)
-
-# Build wolfSSL Server example
-add_executable(server
-    ${CMAKE_CURRENT_SOURCE_DIR}/examples/server/server.c)
-target_link_libraries(server wolfssl)
-
-# Build Echo Client Example
-add_executable(echoclient
-    ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoclient/echoclient.c)
-target_link_libraries(echoclient wolfssl)
-
-# Build Echo Server Example
-add_executable(echoserver
-    ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoserver/echoserver.c)
-target_link_libraries(echoserver wolfssl)
-
-# Build TLS benchmark example
-add_executable(tls_bench
-    ${CMAKE_CURRENT_SOURCE_DIR}/examples/benchmark/tls_bench.c)
-target_link_libraries(tls_bench wolfssl)
-target_link_libraries(tls_bench Threads::Threads)
-
-# Build Unit Tests
-add_executable(unit_test
-    ${TEST_SOURCE_FILES})
-set_target_properties( unit_test PROPERTIES COMPILE_FLAGS "-DNO_MAIN_DRIVER" )
-target_link_libraries(unit_test wolfssl)
-target_link_libraries(unit_test Threads::Threads)
+# Optionally build example and test applications
+if(BUILD_TESTS)
+    # Build wolfCrypt test
+    add_executable(wolfcrypttest
+        ${CMAKE_CURRENT_SOURCE_DIR}/wolfcrypt/test/test.c)
+    target_link_libraries(wolfcrypttest wolfssl)
+
+    # Build wolfCrypt benchmark
+    add_executable(wolfcryptbench
+        ${CMAKE_CURRENT_SOURCE_DIR}/wolfcrypt/benchmark/benchmark.c)
+    target_link_libraries(wolfcryptbench wolfssl)
+
+    # Build wolfSSL Client example
+    add_executable(client
+        ${CMAKE_CURRENT_SOURCE_DIR}/examples/client/client.c)
+    target_link_libraries(client wolfssl)
+
+    # Build wolfSSL Server example
+    add_executable(server
+        ${CMAKE_CURRENT_SOURCE_DIR}/examples/server/server.c)
+    target_link_libraries(server wolfssl)
+
+    # Build Echo Client Example
+    add_executable(echoclient
+        ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoclient/echoclient.c)
+    target_link_libraries(echoclient wolfssl)
+
+    # Build Echo Server Example
+    add_executable(echoserver
+        ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoserver/echoserver.c)
+    target_link_libraries(echoserver wolfssl)
+
+    # Build TLS benchmark example
+    add_executable(tls_bench
+        ${CMAKE_CURRENT_SOURCE_DIR}/examples/benchmark/tls_bench.c)
+    target_link_libraries(tls_bench wolfssl)
+    target_link_libraries(tls_bench Threads::Threads)
+
+    # Build Unit Tests
+    add_executable(unit_test
+        ${TEST_SOURCE_FILES})
+    set_target_properties( unit_test PROPERTIES COMPILE_FLAGS "-DNO_MAIN_DRIVER" )
+    target_link_libraries(unit_test wolfssl)
+    target_link_libraries(unit_test Threads::Threads)
+endif()

+ 6 - 0
INSTALL

@@ -88,4 +88,10 @@
     $ make
     $ sudo make install
 
+    To build library only and not build examples and test apps use:
+    $ cmake .. -DBUILD_TESTS=NO
+
+    To build with debugging use:
+    $ cmake .. -DCMAKE_BUILD_TYPE=Debug
+
     Make sure and run the built examples and test from the wolfssl-root to properly find the ./certs directory.