From 179970a0d5ed4baee76bd72a2a4a16b3cecb0da5 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Thu, 29 Apr 2021 00:47:32 +0900 Subject: [PATCH] Behavior changes to CMakeLists.txt - Allows static library compilation - Links to MBedTLS/OpenSSL based on build option - Limits visibility of some defines and headers --- CMakeLists.txt | 61 ++++++++++++++++++++++++++++------------- cmake/FindMbedTLS.cmake | 21 ++++++++++++++ 2 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 cmake/FindMbedTLS.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 846eb8d..18efd6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,48 +2,71 @@ cmake_minimum_required(VERSION 3.1) project(moonlight-common-c LANGUAGES C) +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + option(USE_MBEDTLS "Use MbedTLS instead of OpenSSL" OFF) SET(CMAKE_C_STANDARD 11) -if(USE_MBEDTLS) - add_definitions(-DUSE_MBEDTLS) -else() - find_package(OpenSSL 1.0.2 REQUIRED) -endif() - aux_source_directory(src SRC_LIST) aux_source_directory(enet SRC_LIST) aux_source_directory(reedsolomon SRC_LIST) +# Build shared library by default, but allows user override +if (NOT DEFINED BUILD_SHARED_LIBS) + set(BUILD_SHARED_LIBS ON) + set(BUILD_SHARED_LIBS_OVERRIDE ON) +endif() + +add_library(moonlight-common-c ${SRC_LIST}) + +if (BUILD_SHARED_LIBS_OVERRIDE) + unset(BUILD_SHARED_LIBS) + unset(BUILD_SHARED_LIBS_OVERRIDE) +endif() + if(MSVC) - add_compile_options(/W4 /wd4100 /wd4232) - add_definitions(-D_CRT_SECURE_NO_WARNINGS=1 -D_CRT_NONSTDC_NO_DEPRECATE=1) - link_libraries(ws2_32.lib qwave.lib winmm.lib) + target_compile_options(moonlight-common-c PRIVATE /W4 /wd4100 /wd4232) + target_compile_definitions(moonlight-common-c PRIVATE -D_CRT_SECURE_NO_WARNINGS=1 -D_CRT_NONSTDC_NO_DEPRECATE=1) + target_link_libraries(moonlight-common-c PRIVATE ws2_32.lib qwave.lib winmm.lib) else() - add_compile_options(-Wall -Wextra -Wno-unused-parameter -Werror) + target_compile_options(moonlight-common-c PRIVATE -Wall -Wextra -Wno-unused-parameter -Werror) +endif() + +if (USE_MBEDTLS) + target_compile_definitions(moonlight-common-c PRIVATE USE_MBEDTLS) + find_package(MbedTLS QUIET) + if (MBEDTLS_FOUND) + target_link_libraries(moonlight-common-c PRIVATE ${MBEDCRYPTO_LIBRARY}) + target_include_directories(moonlight-common-c SYSTEM PRIVATE ${MBEDTLS_INCLUDE_DIRS}) + else() + # For sub project added via CMake + target_link_libraries(moonlight-common-c PRIVATE mbedtls) + endif() +else() + find_package(OpenSSL 1.0.2 REQUIRED) + target_link_libraries(moonlight-common-c PRIVATE ${OPENSSL_CRYPTO_LIBRARY}) + target_include_directories(moonlight-common-c SYSTEM PRIVATE ${OPENSSL_INCLUDE_DIR}) endif() string(TOUPPER "x${CMAKE_BUILD_TYPE}" BUILD_TYPE) if("${BUILD_TYPE}" STREQUAL "XDEBUG") - add_definitions(-DLC_DEBUG) + target_compile_definitions(moonlight-common-c PRIVATE LC_DEBUG) else() - add_definitions(-DNDEBUG) + target_compile_definitions(moonlight-common-c PRIVATE NDEBUG) # Avoid false "maybe uninitialized" warning generated by old GCC versions # when building with -O2 if(CMAKE_C_COMPILER_ID STREQUAL "GNU") - add_compile_options(-Wno-maybe-uninitialized) + target_compile_options(moonlight-common-c PRIVATE -Wno-maybe-uninitialized) endif() endif() -add_definitions(-DHAS_SOCKLEN_T) +target_include_directories(moonlight-common-c SYSTEM PUBLIC src) -include_directories( +target_include_directories(moonlight-common-c PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/enet/include ${CMAKE_CURRENT_SOURCE_DIR}/reedsolomon - ${OPENSSL_INCLUDE_DIR}) +) -link_libraries(${OPENSSL_CRYPTO_LIBRARY}) - -add_library(moonlight-common-c SHARED ${SRC_LIST}) +target_compile_definitions(moonlight-common-c PRIVATE HAS_SOCKLEN_T) \ No newline at end of file diff --git a/cmake/FindMbedTLS.cmake b/cmake/FindMbedTLS.cmake new file mode 100644 index 0000000..db5867a --- /dev/null +++ b/cmake/FindMbedTLS.cmake @@ -0,0 +1,21 @@ +find_path(MBEDTLS_INCLUDE_DIRS mbedtls/version.h) + +if (MBEDTLS_INCLUDE_DIRS AND EXISTS ${MBEDTLS_INCLUDE_DIRS}/mbedtls/version.h) + file(STRINGS "${MBEDTLS_INCLUDE_DIRS}/mbedtls/version.h" MBEDTLS_VERSION_STRING_LINE REGEX "^#define[ \t]+MBEDTLS_VERSION_STRING[ \t]+\"[0-9.]+\"$") + string(REGEX REPLACE "^#define[ \t]+MBEDTLS_VERSION_STRING[ \t]+\"([0-9.]+)\"$" "\\1" MBEDTLS_VERSION_STRING "${MBEDTLS_VERSION_STRING_LINE}") + unset(MBEDTLS_VERSION_STRING_LINE) +endif() + +find_library(MBEDTLS_LIBRARY mbedtls) +find_library(MBEDX509_LIBRARY mbedx509) +find_library(MBEDCRYPTO_LIBRARY mbedcrypto) + +set(MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARY}" "${MBEDX509_LIBRARY}" "${MBEDCRYPTO_LIBRARY}") + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MbedTLS + REQUIRED_VARS MBEDTLS_LIBRARIES MBEDTLS_INCLUDE_DIRS + VERSION_VAR MBEDTLS_VERSION_STRING +) + +mark_as_advanced(MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY)