CMakeLists.txt 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. # Determines what CMake APIs we can rely on
  2. cmake_minimum_required (VERSION 2.8.11)
  3. if (${CMAKE_VERSION} VERSION_GREATER 3.2.2)
  4. cmake_policy(VERSION 3.2.2)
  5. endif()
  6. if (${CMAKE_VERSION} VERSION_GREATER 3.1 OR
  7. ${CMAKE_VERSION} VERSION_EQUAL 3.1)
  8. cmake_policy(SET CMP0054 NEW)
  9. endif()
  10. # Do not allow in source builds
  11. set(CMAKE_DISABLE_SOURCE_CHANGES ON)
  12. set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
  13. # Make sure we can import out CMake functions
  14. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
  15. # Load in the needed CMake modules
  16. include(CheckIncludeFiles)
  17. include(CheckCCompilerFlag)
  18. include(CheckCXXCompilerFlag)
  19. include(AddCCompilerFlag)
  20. include(AddCXXCompilerFlag)
  21. include(DetermineTargetArchitecture)
  22. include(CMakeDependentOption)
  23. # Set up the project
  24. project (civetweb)
  25. set(CIVETWEB_VERSION "1.11.0" CACHE STRING "The version of the civetweb library")
  26. string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" CIVETWEB_VERSION_MATCH "${CIVETWEB_VERSION}")
  27. if ("${CIVETWEB_VERSION_MATCH}" STREQUAL "")
  28. message(FATAL_ERROR "Must specify a semantic version: major.minor.patch")
  29. endif()
  30. set(CIVETWEB_VERSION_MAJOR "${CMAKE_MATCH_1}")
  31. set(CIVETWEB_VERSION_MINOR "${CMAKE_MATCH_2}")
  32. set(CIVETWEB_VERSION_PATCH "${CMAKE_MATCH_3}")
  33. determine_target_architecture(CIVETWEB_ARCHITECTURE)
  34. include(GNUInstallDirs)
  35. # Detect the platform reliably
  36. if(NOT MACOSX AND ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
  37. SET(DARWIN YES)
  38. elseif(NOT BSD AND ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
  39. SET(FREEBSD YES)
  40. elseif(NOT LINUX AND ${CMAKE_SYSTEM_NAME} MATCHES "Linux")
  41. SET(LINUX YES)
  42. endif()
  43. # CTest automation
  44. option(CIVETWEB_BUILD_TESTING "Enable automated testing of civetweb" ON)
  45. message(STATUS "Enabling tests in the build - ${CIVETWEB_BUILD_TESTING}")
  46. # C++ wrappers
  47. option(CIVETWEB_ENABLE_THIRD_PARTY_OUTPUT "Shows the output of third party dependency processing" OFF)
  48. # Thread Stack Size
  49. set(CIVETWEB_THREAD_STACK_SIZE 102400 CACHE STRING
  50. "The stack size in bytes for each thread created")
  51. set_property(CACHE CIVETWEB_THREAD_STACK_SIZE PROPERTY VALUE ${CIVETWEB_THREAD_STACK_SIZE})
  52. message(STATUS "Thread Stack Size - ${CIVETWEB_THREAD_STACK_SIZE}")
  53. option(CIVETWEB_ENABLE_SERVER_EXECUTABLE "Enable building of the server executable" ON)
  54. message(STATUS "Enabling server executable - ${CIVETWEB_ENABLE_SERVER_EXECUTABLE}")
  55. # Serve no files from the web server
  56. option(CIVETWEB_SERVE_NO_FILES "Configures the server to serve no static files" OFF)
  57. message(STATUS "Serve no static files - ${CIVETWEB_SERVE_NO_FILES}")
  58. # Serve no files from the web server
  59. option(CIVETWEB_DISABLE_CGI "Disables CGI, so theserver will not execute CGI scripts" OFF)
  60. message(STATUS "Disable CGI support - ${CIVETWEB_DISABLE_CGI}")
  61. # Disable caching
  62. option(CIVETWEB_DISABLE_CACHING "Disables caching, so that no timegm is used." OFF)
  63. message(STATUS "Disable caching support - ${CIVETWEB_DISABLE_CACHING}")
  64. # C++ wrappers
  65. option(CIVETWEB_ENABLE_CXX "Enables the C++ wrapper library" OFF)
  66. message(STATUS "C++ wrappers - ${CIVETWEB_ENABLE_CXX}")
  67. # IP Version 6
  68. option(CIVETWEB_ENABLE_IPV6 "Enables the IP version 6 support" OFF)
  69. message(STATUS "IP Version 6 - ${CIVETWEB_ENABLE_IPV6}")
  70. # Websocket support
  71. option(CIVETWEB_ENABLE_WEBSOCKETS "Enable websockets connections" OFF)
  72. message(STATUS "Websockets support - ${CIVETWEB_ENABLE_WEBSOCKETS}")
  73. # Server statistics support
  74. option(CIVETWEB_ENABLE_SERVER_STATS "Enable server statistics" OFF)
  75. message(STATUS "Server statistics support - ${CIVETWEB_ENABLE_SERVER_STATS}")
  76. # Memory debugging
  77. option(CIVETWEB_ENABLE_MEMORY_DEBUGGING "Enable the memory debugging features" OFF)
  78. message(STATUS "Memory Debugging - ${CIVETWEB_ENABLE_MEMORY_DEBUGGING}")
  79. # ASAN in debug mode (-fsanitize=address, etc)
  80. option(CIVETWEB_ENABLE_ASAN "Enable ASAN in debug mode" ON)
  81. message(STATUS "ASAN in debug mode - ${CIVETWEB_ENABLE_ASAN}")
  82. # ARCH flag
  83. option(CIVETWEB_ARCH "Force 32/64 bit architecture" OFF)
  84. message(STATUS "Force x32 / x64 architecture - ${CIVETWEB_ARCH}")
  85. # LUA CGI support
  86. option(CIVETWEB_ENABLE_LUA "Enable Lua CGIs" OFF)
  87. message(STATUS "Lua CGI support - ${CIVETWEB_ENABLE_LUA}")
  88. # Enable installing CivetWeb executables
  89. option(CIVETWEB_INSTALL_EXECUTABLE "Enable installing CivetWeb executable" ON)
  90. mark_as_advanced(FORCE CIVETWEB_INSTALL_EXECUTABLE) # Advanced users can disable
  91. message(STATUS "Executable installation - ${CIVETWEB_INSTALL_EXECUTABLE}")
  92. # Allow builds to complete with warnings (do not set -Werror)
  93. # CivetWeb Linux support is stable:
  94. # Builds for GCC 4.6 and clang 3.4 are free from warnings.
  95. # However, GCC introduced a couple of new, partially idiotic warnings,
  96. # that can not be disabled using a #pragma directive.
  97. # It seems unreasonable to have all GCC versions warning free, but only
  98. # some selected ones.
  99. option(CIVETWEB_ALLOW_WARNINGS "Do not stop build if there are warnings" ON)
  100. message(STATUS "Build if there are warnings - ${CIVETWEB_ALLOW_WARNINGS}")
  101. if (NOT CIVETWEB_ALLOW_WARNINGS)
  102. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  103. message(FATAL_ERROR "Cannot compile with warning as errors, until this GCC bug is solved: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431")
  104. endif()
  105. endif()
  106. # Link to the shared LUA library
  107. cmake_dependent_option(
  108. CIVETWEB_ENABLE_LUA_SHARED "Link to the shared LUA system library" OFF
  109. CIVETWEB_ENABLE_LUA OFF)
  110. if (CIVETWEB_ENABLE_LUA)
  111. message(STATUS "Linking shared Lua library - ${CIVETWEB_ENABLE_LUA_SHARED}")
  112. endif()
  113. # Lua Third Party Settings
  114. if (CIVETWEB_ENABLE_LUA)
  115. if (NOT CIVETWEB_ENABLE_LUA_SHARED)
  116. # Lua Version
  117. set(CIVETWEB_LUA_VERSION 5.2.4 CACHE STRING
  118. "The version of Lua to build and include statically")
  119. set_property(CACHE CIVETWEB_LUA_VERSION PROPERTY VALUE ${CIVETWEB_LUA_VERSION})
  120. message(STATUS "Lua Version - ${CIVETWEB_LUA_VERSION}")
  121. mark_as_advanced(CIVETWEB_LUA_VERSION)
  122. # Lua Verification Hash
  123. set(CIVETWEB_LUA_MD5_HASH 913fdb32207046b273fdb17aad70be13 CACHE STRING
  124. "The hash of Lua archive to be downloaded")
  125. set_property(CACHE CIVETWEB_LUA_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_MD5_HASH})
  126. mark_as_advanced(CIVETWEB_LUA_MD5_HASH)
  127. endif()
  128. # Lua Filesystem Version
  129. set(CIVETWEB_LUA_FILESYSTEM_VERSION 1.6.3 CACHE STRING
  130. "The version of Lua Filesystem to build and include statically")
  131. set_property(CACHE CIVETWEB_LUA_FILESYSTEM_VERSION PROPERTY VALUE ${CIVETWEB_LUA_FILESYSTEM_VERSION})
  132. message(STATUS "Lua Filesystem Version - ${CIVETWEB_LUA_FILESYSTEM_VERSION}")
  133. mark_as_advanced(CIVETWEB_LUA_FILESYSTEM_VERSION)
  134. # Lua Filesystem Verification Hash
  135. set(CIVETWEB_LUA_FILESYSTEM_MD5_HASH d0552c7e5a082f5bb2865af63fb9dc95 CACHE STRING
  136. "The hash of Lua Filesystem archive to be downloaded")
  137. set_property(CACHE CIVETWEB_LUA_FILESYSTEM_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_FILESYSTEM_MD5_HASH})
  138. mark_as_advanced(CIVETWEB_LUA_FILESYSTEM_MD5_HASH)
  139. # Lua SQLite Version
  140. set(CIVETWEB_LUA_SQLITE_VERSION 0.9.3 CACHE STRING
  141. "The version of Lua SQLite to build and include statically")
  142. set_property(CACHE CIVETWEB_LUA_SQLITE_VERSION PROPERTY VALUE ${CIVETWEB_LUA_SQLITE_VERSION})
  143. message(STATUS "Lua SQLite Version - ${CIVETWEB_LUA_SQLITE_VERSION}")
  144. mark_as_advanced(CIVETWEB_LUA_SQLITE_VERSION)
  145. # Lua SQLite Verification Hash
  146. set(CIVETWEB_LUA_SQLITE_MD5_HASH 43234ae08197dfce6da02482ed14ec92 CACHE STRING
  147. "The hash of Lua SQLite archive to be downloaded")
  148. set_property(CACHE CIVETWEB_LUA_SQLITE_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_SQLITE_MD5_HASH})
  149. mark_as_advanced(CIVETWEB_LUA_SQLITE_MD5_HASH)
  150. # Lua XML Version
  151. set(CIVETWEB_LUA_XML_VERSION 1.8.0 CACHE STRING
  152. "The version of Lua XML to build and include statically")
  153. set_property(CACHE CIVETWEB_LUA_XML_VERSION PROPERTY VALUE ${CIVETWEB_LUA_XML_VERSION})
  154. message(STATUS "Lua XML Version - ${CIVETWEB_LUA_XML_VERSION}")
  155. mark_as_advanced(CIVETWEB_LUA_XML_VERSION)
  156. # Lua XML Verification Hash
  157. set(CIVETWEB_LUA_XML_MD5_HASH 25e4c276c5d8716af1de0c7853aec2b4 CACHE STRING
  158. "The hash of Lua XML archive to be downloaded")
  159. set_property(CACHE CIVETWEB_LUA_XML_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_XML_MD5_HASH})
  160. mark_as_advanced(CIVETWEB_LUA_XML_MD5_HASH)
  161. # SQLite Version
  162. set(CIVETWEB_SQLITE_VERSION 3.8.9 CACHE STRING
  163. "The version of SQLite to build and include statically")
  164. set_property(CACHE CIVETWEB_SQLITE_VERSION PROPERTY VALUE ${CIVETWEB_SQLITE_VERSION})
  165. message(STATUS "SQLite Version - ${CIVETWEB_SQLITE_VERSION}")
  166. mark_as_advanced(CIVETWEB_SQLITE_VERSION)
  167. # SQLite Verification Hash
  168. set(CIVETWEB_SQLITE_MD5_HASH 02e9c3a6daa8b8587cf6bef828c2e33f CACHE STRING
  169. "The hash of SQLite archive to be downloaded")
  170. set_property(CACHE CIVETWEB_SQLITE_MD5_HASH PROPERTY VALUE ${CIVETWEB_SQLITE_MD5_HASH})
  171. mark_as_advanced(CIVETWEB_SQLITE_MD5_HASH)
  172. endif()
  173. # Duktape CGI support
  174. option(CIVETWEB_ENABLE_DUKTAPE "Enable Duktape CGIs" OFF)
  175. message(STATUS "Duktape CGI support - ${CIVETWEB_ENABLE_DUKTAPE}")
  176. # SSL support
  177. option(CIVETWEB_ENABLE_SSL "Enables the secure socket layer" ON)
  178. message(STATUS "SSL support - ${CIVETWEB_ENABLE_SSL}")
  179. # OpenSSL 1.1 API
  180. option(CIVETWEB_SSL_OPENSSL_API_1_1 "Use the OpenSSL 1.1 API" OFF)
  181. message(STATUS "Compile for OpenSSL 1.1 API - ${CIVETWEB_SSL_OPENSSL_API_1_1}")
  182. # Dynamically load or link the SSL libraries
  183. cmake_dependent_option(
  184. CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING "Dynamically loads the SSL library rather than linking it" ON
  185. CIVETWEB_ENABLE_SSL OFF)
  186. if (CIVETWEB_ENABLE_SSL)
  187. message(STATUS "Dynamically load SSL libraries - ${CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING}")
  188. endif()
  189. # Third Party Download location
  190. set(CIVETWEB_THIRD_PARTY_DIR "${CMAKE_BINARY_DIR}/third_party" CACHE STRING
  191. "The location that third party code is downloaded, built and installed")
  192. set_property(CACHE CIVETWEB_THIRD_PARTY_DIR PROPERTY VALUE ${CIVETWEB_THIRD_PARTY_DIR})
  193. # Unix systems can define the dynamic library names to load
  194. if (CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING AND NOT DARWIN AND UNIX)
  195. # SSL library name
  196. set(CIVETWEB_SSL_SSL_LIB "libssl.so" CACHE STRING
  197. "The name of the SSL library to load")
  198. set_property(CACHE CIVETWEB_SSL_SSL_LIB PROPERTY VALUE ${CIVETWEB_SSL_SSL_LIB})
  199. message(STATUS "SSL Library Name - ${CIVETWEB_SSL_SSL_LIB}")
  200. # Crytography library name
  201. set(CIVETWEB_SSL_CRYPTO_LIB "libcrypto.so" CACHE STRING
  202. "The name of the SSL Cryptography library to load")
  203. set_property(CACHE CIVETWEB_SSL_CRYPTO_LIB PROPERTY VALUE ${CIVETWEB_SSL_CRYPTO_LIB})
  204. message(STATUS "SSL Cryptography Library Name - ${CIVETWEB_SSL_CRYPTO_LIB}")
  205. endif()
  206. # Allow warnings in 3rd party components
  207. if (CIVETWEB_ENABLE_LUA OR CIVETWEB_ENABLE_DUKTAPE)
  208. SET(CIVETWEB_ALLOW_WARNINGS YES)
  209. endif()
  210. # The C and C++ standards to use
  211. set(CIVETWEB_C_STANDARD auto CACHE STRING
  212. "The C standard to use; auto determines the latest supported by the compiler")
  213. set_property(CACHE CIVETWEB_C_STANDARD PROPERTY STRINGS auto c11 c99 c89)
  214. set(CIVETWEB_CXX_STANDARD auto CACHE STRING
  215. "The C++ standard to use; auto determines the latest supported by the compiler")
  216. set_property(CACHE CIVETWEB_CXX_STANDARD PROPERTY STRINGS auto c++14 c++11 c++98)
  217. # Configure the linker
  218. if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
  219. find_program(GCC_AR gcc-ar)
  220. if (GCC_AR)
  221. set(CMAKE_AR ${GCC_AR})
  222. endif()
  223. find_program(GCC_RANLIB gcc-ranlib)
  224. if (GCC_RANLIB)
  225. set(CMAKE_RANLIB ${GCC_RANLIB})
  226. endif()
  227. endif()
  228. # Configure the C compiler
  229. message(STATUS "Configuring C Compiler")
  230. if ("${CIVETWEB_C_STANDARD}" STREQUAL "auto")
  231. add_c_compiler_flag(-std=c11)
  232. if (NOT HAVE_C_FLAG_STD_C11)
  233. add_c_compiler_flag(-std=c99)
  234. if (NOT HAVE_C_FLAG_STD_C99)
  235. add_c_compiler_flag(-std=c89)
  236. endif()
  237. endif()
  238. else()
  239. add_c_compiler_flag(-std=${CIVETWEB_C_STANDARD})
  240. endif()
  241. #Warnings: enable everything
  242. add_c_compiler_flag(-Wall)
  243. add_c_compiler_flag(-Wextra)
  244. add_c_compiler_flag(-Wshadow)
  245. add_c_compiler_flag(-Wconversion)
  246. add_c_compiler_flag(-Wmissing-prototypes)
  247. add_c_compiler_flag(-Weverything)
  248. add_c_compiler_flag(-Wparentheses)
  249. add_c_compiler_flag(/W4) # VisualStudio highest warning level
  250. #Warnings: Disable some warnings
  251. add_c_compiler_flag(-Wno-padded) # padding in structures by compiler
  252. add_c_compiler_flag(-Wno-unused-macros) # so what?
  253. Check_C_Compiler_Flag( HAVE_NO_RESERVED_ID_MACROS -Wno-reserved-id-macros)
  254. if (HAVE_NO_RESERVED_ID_MACROS)
  255. add_c_compiler_flag(-Wno-reserved-id-macros) # for system headers
  256. endif (HAVE_NO_RESERVED_ID_MACROS)
  257. add_c_compiler_flag(-Wno-format-nonliteral) # printf(myFormatStringVar, ...)
  258. add_c_compiler_flag(-Wno-cast-qual) # const cast
  259. add_c_compiler_flag(/Wd4820) # padding
  260. if (MINGW)
  261. add_c_compiler_flag(-Wno-format)
  262. endif()
  263. if (NOT CIVETWEB_ALLOW_WARNINGS)
  264. add_c_compiler_flag(-Werror)
  265. add_c_compiler_flag(/WX)
  266. endif()
  267. add_c_compiler_flag(-pedantic-errors)
  268. add_c_compiler_flag(-fvisibility=hidden)
  269. add_c_compiler_flag(-fstack-protector-strong RELEASE)
  270. #add_c_compiler_flag(-flto RELEASE)
  271. if (${CIVETWEB_ENABLE_ASAN})
  272. add_c_compiler_flag(-fsanitize=undefined DEBUG)
  273. add_c_compiler_flag(-fsanitize=address DEBUG)
  274. if (HAVE_C_FLAG_FSANITIZE_ADDRESS)
  275. add_c_compiler_flag(-static-asan DEBUG)
  276. endif()
  277. endif()
  278. add_c_compiler_flag(-fstack-protector-all DEBUG)
  279. if (MINGW)
  280. add_c_compiler_flag(-mwindows)
  281. endif()
  282. # Coverage build type
  283. set(CMAKE_C_FLAGS_COVERAGE "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING
  284. "Flags used by the C compiler during coverage builds."
  285. FORCE)
  286. set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
  287. "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING
  288. "Flags used for linking binaries during coverage builds."
  289. FORCE)
  290. set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
  291. "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING
  292. "Flags used by the shared libraries linker during coverage builds."
  293. FORCE)
  294. mark_as_advanced(
  295. CMAKE_CXX_FLAGS_COVERAGE
  296. CMAKE_C_FLAGS_COVERAGE
  297. CMAKE_EXE_LINKER_FLAGS_COVERAGE
  298. CMAKE_SHARED_LINKER_FLAGS_COVERAGE)
  299. set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
  300. "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage."
  301. FORCE)
  302. add_c_compiler_flag(--coverage COVERAGE)
  303. # Configure the C++ compiler
  304. if (CIVETWEB_ENABLE_CXX)
  305. message(STATUS "Configuring C++ Compiler")
  306. if ("${CIVETWEB_CXX_STANDARD}" STREQUAL "auto")
  307. add_cxx_compiler_flag(-std=c++14)
  308. if (NOT HAVE_CXX_FLAG_STD_CXX14)
  309. add_cxx_compiler_flag(-std=c++11)
  310. if (NOT HAVE_CXX_FLAG_STD_CXX11)
  311. add_cxx_compiler_flag(-std=c++98)
  312. endif()
  313. endif()
  314. else()
  315. add_cxx_compiler_flag(-std=${CIVETWEB_CXX_STANDARD})
  316. endif()
  317. add_cxx_compiler_flag(-Wall)
  318. add_cxx_compiler_flag(-Wextra)
  319. add_cxx_compiler_flag(-Wshadow)
  320. add_cxx_compiler_flag(-Wmissing-prototypes)
  321. add_cxx_compiler_flag(-Weverything)
  322. add_cxx_compiler_flag(/W4)
  323. add_cxx_compiler_flag(-Wno-padded)
  324. add_cxx_compiler_flag(/Wd4820) # padding
  325. add_cxx_compiler_flag(-Wno-unused-macros)
  326. add_cxx_compiler_flag(-Wno-format-nonliteral)
  327. if (MINGW)
  328. add_cxx_compiler_flag(-Wno-format)
  329. endif()
  330. if (NOT CIVETWEB_ALLOW_WARNINGS)
  331. add_cxx_compiler_flag(-Werror)
  332. add_cxx_compiler_flag(/WX)
  333. endif()
  334. add_cxx_compiler_flag(-pedantic-errors)
  335. add_cxx_compiler_flag(-fvisibility=hidden)
  336. add_cxx_compiler_flag(-fstack-protector-strong RELEASE)
  337. if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
  338. "${BUILD_SHARED_LIBS}" STREQUAL "SHARED" OR
  339. ${CMAKE_CXX_COMPILER_VERSION} GREATER 5)
  340. add_cxx_compiler_flag(-flto RELEASE)
  341. endif()
  342. if (${CIVETWEB_ENABLE_ASAN})
  343. add_cxx_compiler_flag(-fsanitize=undefined DEBUG)
  344. add_cxx_compiler_flag(-fsanitize=address DEBUG)
  345. if (HAVE_CXX_FLAG_FSANITIZE_ADDRESS)
  346. add_cxx_compiler_flag(-static-asan DEBUG)
  347. endif()
  348. endif()
  349. add_cxx_compiler_flag(-fstack-protector-all DEBUG)
  350. if (MINGW)
  351. add_cxx_compiler_flag(-mwindows)
  352. endif()
  353. set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING
  354. "Flags used by the C++ compiler during coverage builds."
  355. FORCE)
  356. add_cxx_compiler_flag(--coverage COVERAGE)
  357. endif()
  358. # Set up the definitions
  359. if (${CMAKE_BUILD_TYPE} MATCHES "[Dd]ebug")
  360. add_definitions(-DDEBUG)
  361. add_definitions(-O0)
  362. add_definitions(-g)
  363. endif()
  364. if (CIVETWEB_ENABLE_IPV6)
  365. add_definitions(-DUSE_IPV6)
  366. endif()
  367. if (CIVETWEB_ENABLE_WEBSOCKETS)
  368. add_definitions(-DUSE_WEBSOCKET)
  369. endif()
  370. if (CIVETWEB_ENABLE_SERVER_STATS)
  371. add_definitions(-DUSE_SERVER_STATS)
  372. endif()
  373. if (CIVETWEB_SERVE_NO_FILES)
  374. add_definitions(-DNO_FILES)
  375. endif()
  376. if (CIVETWEB_DISABLE_CGI)
  377. add_definitions(-DNO_CGI)
  378. endif()
  379. if (CIVETWEB_DISABLE_CACHING)
  380. add_definitions(-DNO_CACHING)
  381. endif()
  382. if (CIVETWEB_ENABLE_LUA)
  383. add_definitions(-DUSE_LUA)
  384. endif()
  385. if (CIVETWEB_ENABLE_DUKTAPE)
  386. add_definitions(-DUSE_DUKTAPE)
  387. endif()
  388. if (CIVETWEB_ENABLE_MEMORY_DEBUGGING)
  389. add_definitions(-DMEMORY_DEBUGGING)
  390. endif()
  391. if (NOT CIVETWEB_ENABLE_SSL)
  392. add_definitions(-DNO_SSL)
  393. elseif (NOT CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING)
  394. add_definitions(-DNO_SSL_DL)
  395. else()
  396. if(CIVETWEB_SSL_SSL_LIB)
  397. add_definitions(-DSSL_LIB="${CIVETWEB_SSL_SSL_LIB}")
  398. endif()
  399. if(CIVETWEB_SSL_CRYPTO_LIB)
  400. add_definitions(-DCRYPTO_LIB="${CIVETWEB_SSL_CRYPTO_LIB}")
  401. endif()
  402. endif()
  403. if(CIVETWEB_SSL_OPENSSL_API_1_1)
  404. add_definitions(-DOPENSSL_API_1_1)
  405. endif()
  406. add_definitions(-DUSE_STACK_SIZE=${CIVETWEB_THREAD_STACK_SIZE})
  407. # Set 32 or 64 bit environment
  408. if (${CMAKE_ARCH} MATCHES "[Xx]86")
  409. add_c_compiler_flag(-m32)
  410. endif()
  411. if (${CMAKE_ARCH} MATCHES "[Xx]64")
  412. add_c_compiler_flag(-m64)
  413. endif()
  414. # TODO: add support for -march
  415. # Build the targets
  416. add_subdirectory(src)
  417. # Enable the testing of the library/executable
  418. include(CTest)
  419. if (CIVETWEB_BUILD_TESTING)
  420. # Check unit testing framework Version
  421. set(CIVETWEB_CHECK_VERSION 0.11.0 CACHE STRING
  422. "The version of Check unit testing framework to build and include statically")
  423. set_property(CACHE CIVETWEB_CHECK_VERSION PROPERTY VALUE ${CIVETWEB_CHECK_VERSION})
  424. message(STATUS "Check Unit Testing Framework Version - ${CIVETWEB_CHECK_VERSION}")
  425. mark_as_advanced(CIVETWEB_CHECK_VERSION)
  426. # Check unit testing framework Verification Hash
  427. # Hash for Check 0.10.0: 67a34c40b5bc888737f4e5ae82e9939f
  428. # Hash for Check 0.11.0: 1b14ee307dca8e954a8219c34484d7c4
  429. set(CIVETWEB_CHECK_MD5_HASH 1b14ee307dca8e954a8219c34484d7c4 CACHE STRING
  430. "The hash of Check unit testing framework archive to be downloaded")
  431. set_property(CACHE CIVETWEB_CHECK_MD5_HASH PROPERTY VALUE ${CIVETWEB_CHECK_MD5_HASH})
  432. mark_as_advanced(CIVETWEB_CHECK_MD5_HASH)
  433. # Build the testing
  434. add_subdirectory(unittest)
  435. endif()
  436. # cmake config file
  437. include(CMakePackageConfigHelpers)
  438. install(
  439. EXPORT ${PROJECT_NAME}-targets
  440. NAMESPACE ${PROJECT_NAME}::
  441. FILE ${PROJECT_NAME}-targets.cmake
  442. DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
  443. COMPONENT civetweb-cmake-config
  444. )
  445. configure_package_config_file(
  446. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}-config.cmake.in"
  447. ${PROJECT_NAME}-config.cmake
  448. INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
  449. NO_CHECK_REQUIRED_COMPONENTS_MACRO
  450. PATH_VARS CMAKE_INSTALL_INCLUDEDIR
  451. )
  452. write_basic_package_version_file(${PROJECT_NAME}-config-version.cmake
  453. VERSION ${CIVETWEB_VERSION}
  454. COMPATIBILITY AnyNewerVersion
  455. )
  456. install(
  457. FILES
  458. "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
  459. "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
  460. DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
  461. COMPONENT civetweb-cmake-config
  462. )
  463. # Set up CPack
  464. include(InstallRequiredSystemLibraries)
  465. set(CPACK_PACKAGE_VENDOR "civetweb Contributors")
  466. set(CPACK_PACKAGE_CONTACT "civetweb@users.noreply.github.com")
  467. set(CPACK_PACKAGE_VERSION_MAJOR "${CIVETWEB_VERSION_MAJOR}")
  468. set(CPACK_PACKAGE_VERSION_MINOR "${CIVETWEB_VERSION_MINOR}")
  469. set(CPACK_PACKAGE_VERSION_PATCH "${CIVETWEB_VERSION_PATCH}")
  470. set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A HTTP library and server")
  471. set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
  472. set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md")
  473. set(CPACK_STRIP_FILES TRUE)
  474. set(CPACK_PACKAGE_DEPENDS "openssl")
  475. if (CIVETWEB_ENABLE_LUA_SHARED)
  476. set(CPACK_PACKAGE_DEPENDS "lua, ${CPACK_PACKAGE_DEPENDS}")
  477. endif()
  478. # RPM Packaging
  479. set(CPACK_RPM_PACKAGE_GROUP "Development/Libraries")
  480. set(CPACK_RPM_PACKAGE_LICENSE "MIT")
  481. set(CPACK_RPM_PACKAGE_ARCHITECTURE "${CIVETWEB_ARCHITECTURE}")
  482. set(CPACK_RPM_PACKAGE_REQUIRES "${CPACK_PACKAGE_DEPENDS}")
  483. # Debian Packaging
  484. set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${CIVETWEB_ARCHITECTURE}")
  485. set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/civetweb/civetweb")
  486. set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_PACKAGE_DEPENDS}")
  487. # WiX Packaging
  488. # TODO: www.cmake.org/cmake/help/v3.0/module/CPackWIX.html
  489. # Finalize CPack settings
  490. include(CPack)