зеркало из https://github.com/microsoft/msquic.git
228 строки
9.5 KiB
CMake
228 строки
9.5 KiB
CMake
# Copyright (c) Microsoft Corporation.
|
|
# Licensed under the MIT License.
|
|
|
|
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
|
|
|
|
message(STATUS "Source Dir: ${CMAKE_CURRENT_SOURCE_DIR}")
|
|
message(STATUS "Host System name: ${CMAKE_HOST_SYSTEM_NAME}")
|
|
if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")
|
|
set(CMAKE_SYSTEM_VERSION 10.0.18362.0 CACHE STRING INTERNAL FORCE)
|
|
set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 10.0.18362.0 CACHE STRING INTERNAL FORCE)
|
|
endif()
|
|
|
|
if (QUIC_TLS STREQUAL "mitls")
|
|
message(WARNING "Policy 0091 unsupported for miTLS.")
|
|
else()
|
|
if(POLICY CMP0091)
|
|
cmake_policy(SET CMP0091 NEW)
|
|
message(STATUS "Setting policy 0091")
|
|
else()
|
|
message(WARNING "CMake version too old to support Policy 0091; CRT static linking won't work")
|
|
endif()
|
|
endif()
|
|
|
|
project(msquic)
|
|
|
|
message(STATUS "System name: ${CMAKE_SYSTEM_NAME}")
|
|
message(STATUS "System version: ${CMAKE_SYSTEM_VERSION}")
|
|
message(STATUS "Platform version: ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}")
|
|
|
|
enable_testing()
|
|
|
|
# Set the default TLS method for each platform.
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
|
set(QUIC_TLS "schannel" CACHE STRING "TLS Library to use")
|
|
else()
|
|
set(QUIC_TLS "openssl" CACHE STRING "TLS Library to use")
|
|
endif()
|
|
|
|
option(QUIC_BUILD_TOOLS "Builds the tools code" ON)
|
|
option(QUIC_BUILD_TEST "Builds the test code" ON)
|
|
option(QUIC_ENABLE_LOGGING "Enables logging" ON)
|
|
option(QUIC_SANITIZE_ADDRESS "Enables address sanitizer" OFF)
|
|
option(QUIC_STATIC_LINK_CRT "Statically links the C runtime" ON)
|
|
|
|
if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")
|
|
set(QUIC_PLATFORM "windows")
|
|
else()
|
|
set(QUIC_PLATFORM "linux")
|
|
endif()
|
|
|
|
set(QUIC_ARCH "x64" CACHE STRING "CPU architecture to build for")
|
|
|
|
set(QUIC_BUILD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/bld/${QUIC_PLATFORM}/${QUIC_ARCH}_${QUIC_TLS})
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${QUIC_BUILD_DIR}/obj)
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/artifacts/${QUIC_PLATFORM}/${QUIC_ARCH}_$<IF:$<CONFIG:Debug>,Debug,Release>_${QUIC_TLS})
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/artifacts/${QUIC_PLATFORM}/${QUIC_ARCH}_$<IF:$<CONFIG:Debug>,Debug,Release>_${QUIC_TLS})
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/artifacts/${QUIC_PLATFORM}/${QUIC_ARCH}_Release_${QUIC_TLS})
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/artifacts/${QUIC_PLATFORM}/${QUIC_ARCH}_Release_${QUIC_TLS})
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/artifacts/${QUIC_PLATFORM}/${QUIC_ARCH}_Debug_${QUIC_TLS})
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/artifacts/${QUIC_PLATFORM}/${QUIC_ARCH}_Debug_${QUIC_TLS})
|
|
|
|
set(CLANG_GCC_WARNING_FLAGS -Werror -Wall -Wextra -Wformat=2 -Wno-type-limits -Wno-unknown-pragmas -Wno-unused-value CACHE INTERNAL "")
|
|
set(MSVC_WARNING_FLAGS /WX /W4 /sdl CACHE INTERNAL "")
|
|
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
|
# Generate the MsQuicEtw header file.
|
|
file(MAKE_DIRECTORY ${QUIC_BUILD_DIR}/inc)
|
|
file(WRITE ${QUIC_BUILD_DIR}/inc/MsQuicEtw.rc)
|
|
include_directories(${QUIC_BUILD_DIR}/inc)
|
|
add_custom_command(
|
|
OUTPUT ${QUIC_BUILD_DIR}/inc/MsQuicEtw.h
|
|
OUTPUT ${QUIC_BUILD_DIR}/inc/MsQuicEtw.rc
|
|
COMMAND mc.exe -um -h ${QUIC_BUILD_DIR}/inc -r ${QUIC_BUILD_DIR}/inc ${CMAKE_CURRENT_SOURCE_DIR}/src/manifest/MsQuicEtw.man)
|
|
add_custom_target(MsQuicEtw
|
|
DEPENDS ${QUIC_BUILD_DIR}/inc/MsQuicEtw.h
|
|
DEPENDS ${QUIC_BUILD_DIR}/inc/MsQuicEtw.rc)
|
|
|
|
# Custom build flags.
|
|
set(QUIC_COMMON_FLAGS "-DWIN32_LEAN_AND_MEAN -DSECURITY_WIN32 /MP")
|
|
if(QUIC_ENABLE_LOGGING)
|
|
message(STATUS "Configuring for manifested ETW events and logging")
|
|
set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -DQUIC_EVENTS_MANIFEST_ETW -DQUIC_LOGS_MANIFEST_ETW")
|
|
else()
|
|
message(STATUS "Disabling events and logging")
|
|
set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -DQUIC_EVENTS_STUB -DQUIC_LOGS_STUB")
|
|
endif()
|
|
|
|
if(QUIC_TLS STREQUAL "openssl")
|
|
# OpenSSL doesn't support session resumption yet.
|
|
message(STATUS "Disabling session resumption support")
|
|
set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -DQUIC_DISABLE_RESUMPTION")
|
|
endif()
|
|
|
|
if(QUIC_TLS STREQUAL "openssl" OR QUIC_TLS STREQUAL "schannel")
|
|
# OpenSSL and SChannel don't support 0-RTT yet.
|
|
message(STATUS "Disabling 0-RTT support")
|
|
set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -DQUIC_DISABLE_0RTT_TESTS")
|
|
endif()
|
|
|
|
if(QUIC_TLS STREQUAL "stub")
|
|
set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -DQUIC_TLS_STUB")
|
|
endif()
|
|
|
|
if(QUIC_SANITIZE_ADDRESS)
|
|
message(STATUS "Address sanitizer unsupported on this platform.")
|
|
endif()
|
|
|
|
set(QUIC_C_FLAGS "${QUIC_COMMON_FLAGS}")
|
|
set(QUIC_CXX_FLAGS "${QUIC_COMMON_FLAGS} /std:c++17 /EHsc")
|
|
|
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Zi")
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
|
|
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
|
|
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
|
|
if(QUIC_STATIC_LINK_CRT)
|
|
message(STATUS "Configuring for statically-linked CRT")
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
endif()
|
|
|
|
else()
|
|
# Custom build flags.
|
|
set(QUIC_COMMON_FLAGS "-DQUIC_PLATFORM_LINUX -fms-extensions -fPIC -pthread -Wl,--no-as-needed -ldl")
|
|
|
|
#if(QUIC_TLS STREQUAL "x64")
|
|
# set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -m64")
|
|
#else()
|
|
# set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -m32")
|
|
#endif()
|
|
|
|
if(QUIC_ENABLE_LOGGING)
|
|
include(FindLTTngUST)
|
|
message(STATUS "Configuring for LTTng events and disabling logging")
|
|
set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -DQUIC_EVENTS_LTTNG -DQUIC_LOGS_STUB")
|
|
else()
|
|
message(STATUS "Disabling events and logging")
|
|
set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -DQUIC_EVENTS_STUB -DQUIC_LOGS_STUB")
|
|
list(APPEND CLANG_GCC_WARNING_FLAGS -Wno-unused-parameter -Wno-unused-variable)
|
|
endif()
|
|
|
|
if(QUIC_TLS STREQUAL "openssl")
|
|
# OpenSSL doesn't support session resumption yet.
|
|
message(STATUS "Disabling session resumption support")
|
|
set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -DQUIC_DISABLE_RESUMPTION")
|
|
# OpenSSL doesn't support 0-RTT yet.
|
|
message(STATUS "Disabling 0-RTT support")
|
|
set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -DQUIC_DISABLE_0RTT_TESTS")
|
|
endif()
|
|
|
|
if(QUIC_SANITIZE_ADDRESS)
|
|
message(STATUS "Configuring address sanitizer")
|
|
set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -fsanitize=address -fno-omit-frame-pointer -Wno-maybe-uninitialized -O0 -Og -g")
|
|
endif()
|
|
|
|
if(QUIC_TLS STREQUAL "stub")
|
|
set(QUIC_COMMON_FLAGS "${QUIC_COMMON_FLAGS} -DQUIC_TLS_STUB")
|
|
endif()
|
|
|
|
set(QUIC_C_FLAGS "${QUIC_COMMON_FLAGS}")
|
|
set(QUIC_CXX_FLAGS "${QUIC_COMMON_FLAGS} --std=c++17 -g -Wno-reorder -Wno-sign-compare -Wno-format")
|
|
endif()
|
|
|
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/inc)
|
|
|
|
if(QUIC_TLS STREQUAL "openssl")
|
|
# Configure and build OpenSSL.
|
|
add_custom_command(
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/submodules/openssl
|
|
OUTPUT ${QUIC_BUILD_DIR}/openssl/include
|
|
OUTPUT ${QUIC_BUILD_DIR}/openssl/lib/libcrypto.so
|
|
OUTPUT ${QUIC_BUILD_DIR}/openssl/lib/libssl.so
|
|
COMMAND ./Configure linux-x86_64 enable-tls1_3 --prefix=${QUIC_BUILD_DIR}/openssl
|
|
COMMAND make -j$(nproc)
|
|
COMMAND make install_sw)
|
|
add_custom_target(OpenSSL
|
|
DEPENDS ${QUIC_BUILD_DIR}/openssl/include
|
|
DEPENDS ${QUIC_BUILD_DIR}/openssl/lib/libcrypto.so
|
|
DEPENDS ${QUIC_BUILD_DIR}/openssl/lib/libssl.so)
|
|
endif()
|
|
|
|
if(QUIC_TLS STREQUAL "mitls")
|
|
# Build Everest.
|
|
add_subdirectory(submodules/everest/msquic/msvc/kremlib)
|
|
add_subdirectory(submodules/everest/msquic/msvc/evercrypt)
|
|
add_subdirectory(submodules/everest/msquic/msvc/mitls)
|
|
add_subdirectory(submodules/everest/msquic/msvc/quiccrypto)
|
|
endif()
|
|
|
|
# Product code
|
|
add_subdirectory(src/core)
|
|
add_subdirectory(src/platform)
|
|
add_subdirectory(src/bin)
|
|
|
|
# Tool code
|
|
if(QUIC_BUILD_TOOLS)
|
|
add_subdirectory(src/tools/attack)
|
|
add_subdirectory(src/tools/interop)
|
|
add_subdirectory(src/tools/interopserver)
|
|
add_subdirectory(src/tools/ping)
|
|
add_subdirectory(src/tools/post)
|
|
add_subdirectory(src/tools/reach)
|
|
add_subdirectory(src/tools/sample)
|
|
add_subdirectory(src/tools/siduck)
|
|
add_subdirectory(src/tools/spin)
|
|
add_subdirectory(src/tools/void)
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
|
add_subdirectory(src/tools/etwlib)
|
|
add_subdirectory(src/tools/etw)
|
|
endif()
|
|
endif()
|
|
|
|
# Test code
|
|
if(QUIC_BUILD_TEST)
|
|
# Build the googletest framework.
|
|
set(BUILD_GMOCK OFF CACHE BOOL "Builds the googlemock subproject")
|
|
set(INSTALL_GTEST OFF CACHE BOOL "Enable installation of googletest. (Projects embedding googletest may want to turn this OFF.)")
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
|
option(gtest_force_shared_crt "Use shared (DLL) run-time lib even when Google Test is built as static lib." ON)
|
|
endif()
|
|
enable_testing()
|
|
add_subdirectory(submodules/googletest)
|
|
|
|
add_subdirectory(src/core/unittest)
|
|
add_subdirectory(src/platform/unittest)
|
|
add_subdirectory(src/test/lib)
|
|
add_subdirectory(src/test/bin)
|
|
endif()
|