1# 2# Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com) 3# 4# Distributed under the Boost Software License, Version 1.0. (See accompanying 5# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6# 7# Official repository: https://github.com/boostorg/beast 8# 9 10cmake_minimum_required (VERSION 3.5.1) 11 12if (POLICY CMP0074) 13 cmake_policy (SET CMP0074 NEW) 14endif() 15 16#------------------------------------------------------------------------------- 17 18function (DoGroupSources curdir rootdir folder) 19 file (GLOB children RELATIVE ${PROJECT_SOURCE_DIR}/${curdir} ${PROJECT_SOURCE_DIR}/${curdir}/*) 20 foreach (child ${children}) 21 if (IS_DIRECTORY ${PROJECT_SOURCE_DIR}/${curdir}/${child}) 22 DoGroupSources (${curdir}/${child} ${rootdir} ${folder}) 23 elseif (${child} STREQUAL "CMakeLists.txt") 24 source_group("" FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child}) 25 else() 26 string (REGEX REPLACE ^${rootdir} ${folder} groupname ${curdir}) 27 string (REPLACE "/" "\\" groupname ${groupname}) 28 source_group (${groupname} FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child}) 29 endif() 30 endforeach() 31endfunction() 32 33function (GroupSources curdir folder) 34 DoGroupSources (${curdir} ${curdir} ${folder}) 35endfunction() 36 37#------------------------------------------------------------------------------- 38# 39# Beast 40# 41#------------------------------------------------------------------------------- 42 43project (Beast VERSION 300) 44 45set_property (GLOBAL PROPERTY USE_FOLDERS ON) 46option (Beast_BUILD_EXAMPLES "Build examples" ON) 47option (Beast_BUILD_TESTS "Build tests" ON) 48 49if (MSVC) 50 set (CMAKE_VERBOSE_MAKEFILE FALSE) 51 52 add_definitions ( 53 -D_WIN32_WINNT=0x0601 54 -D_SCL_SECURE_NO_WARNINGS=1 55 -D_CRT_SECURE_NO_WARNINGS=1 56 -D_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING 57 -D_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING 58 ) 59 60 add_compile_options( 61 /bigobj # large object file format 62 /permissive- # strict C++ 63 #/wd4503 # decorated name length exceeded, name was truncated 64 /W4 # enable all warnings 65 /MP # Multi-processor compilation 66 ) 67 68 set (Boost_USE_STATIC_LIBS ON) 69 set (Boost_USE_STATIC_RUNTIME ON) 70 71 set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") 72 set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ob2 /Oi /Ot /GL /MT") 73 set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Oi /Ot /MT") 74 75 set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO") 76 set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG") 77 78 # for RelWithDebInfo builds, disable incremental linking 79 # since CMake sets it ON by default for that build type and it 80 # causes warnings 81 # 82 string (REPLACE "/INCREMENTAL" "/INCREMENTAL:NO" replacement_flags 83 ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}) 84 set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO ${replacement_flags}) 85 86else() 87 set (THREADS_PREFER_PTHREAD_FLAG ON) 88 find_package (Threads) 89 link_libraries(Threads::Threads) 90 91 92 set( CMAKE_CXX_FLAGS 93 "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -Wpedantic -Wno-unused-parameter") 94 95 if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 96 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wrange-loop-analysis") 97 endif () 98endif() 99 100# Must come before Boost includes, otherwise the 101# IDE sees the wrong file due to boost/ symlinks. 102include_directories (include) 103 104#------------------------------------------------------------------------------- 105# 106# OpenSSL 107# 108#------------------------------------------------------------------------------- 109 110if (APPLE AND NOT DEFINED ENV{OPENSSL_ROOT_DIR}) 111 find_program(HOMEBREW brew) 112 if (NOT HOMEBREW STREQUAL "HOMEBREW-NOTFOUND") 113 execute_process(COMMAND brew --prefix openssl 114 OUTPUT_VARIABLE OPENSSL_ROOT_DIR 115 OUTPUT_STRIP_TRAILING_WHITESPACE) 116 endif() 117endif() 118 119find_package(OpenSSL) 120if (NOT MSVC) 121 link_libraries(${OPENSSL_LIBRARIES}) 122endif() 123 124#------------------------------------------------------------------------------- 125# 126# Boost 127# 128#------------------------------------------------------------------------------- 129 130get_filename_component (BOOST_ROOT ../../ ABSOLUTE) 131 132# VFALCO I want static but "b2 stage" builds a minimal set which excludes static 133add_definitions (-DBOOST_ALL_STATIC_LINK=1) 134 135add_definitions (-DBOOST_ASIO_NO_DEPRECATED=1) 136add_definitions (-DBOOST_ASIO_DISABLE_BOOST_ARRAY=1) 137add_definitions (-DBOOST_ASIO_DISABLE_BOOST_BIND=1) 138add_definitions (-DBOOST_ASIO_DISABLE_BOOST_DATE_TIME=1) 139add_definitions (-DBOOST_ASIO_DISABLE_BOOST_REGEX=1) 140add_definitions (-DBOOST_COROUTINES_NO_DEPRECATION_WARNING=1) 141 142if (MSVC) 143include_directories (${BOOST_ROOT}) 144else() 145 set(BOOST_INCLUDEDIR ${BOOST_ROOT}) 146 set(BOOST_LIBRARYDIR ${BOOST_ROOT}/stage/lib) 147 find_package(Boost COMPONENTS coroutine filesystem system REQUIRED) 148 link_libraries(Boost::coroutine Boost::filesystem Boost::system) 149endif() 150 151link_directories(${BOOST_ROOT}/stage/lib) 152 153if (MINGW) 154 link_libraries(ws2_32 mswsock) 155endif() 156 157#------------------------------------------------------------------------------- 158 159if ("${VARIANT}" STREQUAL "coverage") 160 if (MSVC) 161 else() 162 set (CMAKE_BUILD_TYPE DEBUG) 163 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 --coverage") 164 set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") 165 endif() 166 167elseif ("${VARIANT}" STREQUAL "ubasan") 168 if (MSVC) 169 else() 170 set (CMAKE_BUILD_TYPE RELWITHDEBINFO) 171 set (CMAKE_CXX_FLAGS 172 "${CMAKE_CXX_FLAGS} -DBOOST_BEAST_NO_SLOW_TESTS=1 -msse4.2 -funsigned-char -fno-omit-frame-pointer -fsanitize=address,undefined -fno-sanitize-recover=address,undefined -fsanitize-blacklist=${PROJECT_SOURCE_DIR}/tools/blacklist.supp") 173 set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address,undefined -fno-sanitize-recover=address,undefined") 174 endif() 175 176elseif ("${VARIANT}" STREQUAL "debug") 177 set (CMAKE_BUILD_TYPE DEBUG) 178 179elseif ("${VARIANT}" STREQUAL "release") 180 set (CMAKE_BUILD_TYPE RELEASE) 181 182endif() 183 184#------------------------------------------------------------------------------- 185# 186# Static Libraries 187# 188#------------------------------------------------------------------------------- 189 190add_definitions (-DBOOST_ASIO_SEPARATE_COMPILATION=1) 191add_definitions (-DBOOST_BEAST_SEPARATE_COMPILATION=1) 192 193GroupSources (test "/") 194 195add_library ( 196 lib-asio STATIC 197 test/lib_asio.cpp 198) 199 200set_property(TARGET lib-asio PROPERTY FOLDER "static-libs") 201 202add_library ( 203 lib-asio-ssl STATIC 204 test/lib_asio_ssl.cpp 205) 206 207set_property(TARGET lib-asio-ssl PROPERTY FOLDER "static-libs") 208 209add_library ( 210 lib-beast STATIC 211 test/lib_beast.cpp 212) 213 214set_property(TARGET lib-beast PROPERTY FOLDER "static-libs") 215 216target_link_libraries(lib-beast lib-asio) 217 218#------------------------------------------------------------------------------- 219# 220# Tests and examples 221# 222 223include_directories (.) 224 225if (OPENSSL_FOUND) 226 include_directories (${OPENSSL_INCLUDE_DIR}) 227endif() 228 229file (GLOB_RECURSE BOOST_BEAST_FILES 230 ${PROJECT_SOURCE_DIR}/include/boost/beast/*.hpp 231 ${PROJECT_SOURCE_DIR}/include/boost/beast/*.ipp 232) 233 234file (GLOB_RECURSE BOOST_BEAST_EXPERIMENTAL_FILES 235 ${PROJECT_SOURCE_DIR}/include/boost/beast/_experimental/*.hpp 236 ${PROJECT_SOURCE_DIR}/include/boost/beast/_experimental/*.ipp 237) 238 239file (GLOB_RECURSE COMMON_FILES 240 ${PROJECT_SOURCE_DIR}/example/common/*.hpp 241 ) 242 243if (Beast_BUILD_EXAMPLES AND 244 (NOT "${VARIANT}" STREQUAL "coverage") AND 245 (NOT "${VARIANT}" STREQUAL "ubasan")) 246 add_subdirectory (example) 247endif() 248 249if (Beast_BUILD_TESTS) 250 add_subdirectory (test) 251endif() 252