CMakeLists.txt 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728
  1. cmake_minimum_required(VERSION 2.8.9)
  2. if(NOT DEFINED CMAKE_BUILD_TYPE)
  3. set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type")
  4. endif()
  5. project(libwebsockets C)
  6. set(PACKAGE "libwebsockets")
  7. set(CPACK_PACKAGE_NAME "${PACKAGE}")
  8. set(CPACK_PACKAGE_VERSION_MAJOR "2")
  9. set(CPACK_PACKAGE_VERSION_MINOR "2")
  10. set(CPACK_PACKAGE_VERSION_PATCH "2")
  11. set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
  12. set(CPACK_PACKAGE_VENDOR "andy@warmcat.com")
  13. set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PACKAGE} ${PACKAGE_VERSION}")
  14. set(SOVERSION "10")
  15. if(NOT CPACK_GENERATOR)
  16. if(UNIX)
  17. set(CPACK_GENERATOR "TGZ")
  18. else()
  19. set(CPACK_GENERATOR "ZIP")
  20. endif()
  21. endif()
  22. set(CPACK_SOURCE_GENERATOR "TGZ")
  23. set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
  24. set(VERSION "${CPACK_PACKAGE_VERSION}")
  25. set(LWS_LIBRARY_VERSION ${CPACK_PACKAGE_VERSION})
  26. set(LWS_LIBRARY_VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR})
  27. set(LWS_LIBRARY_VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR})
  28. set(LWS_LIBRARY_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH})
  29. set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/")
  30. message(STATUS "CMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'")
  31. # Try to find the current Git hash.
  32. find_package(Git)
  33. if(GIT_EXECUTABLE)
  34. execute_process(
  35. WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
  36. COMMAND "${GIT_EXECUTABLE}" describe
  37. OUTPUT_VARIABLE GIT_HASH
  38. OUTPUT_STRIP_TRAILING_WHITESPACE
  39. )
  40. execute_process(
  41. WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
  42. COMMAND "whoami"
  43. OUTPUT_VARIABLE GIT_USER
  44. OUTPUT_STRIP_TRAILING_WHITESPACE
  45. )
  46. execute_process(
  47. WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
  48. COMMAND "hostname"
  49. OUTPUT_VARIABLE GIT_HOST
  50. OUTPUT_STRIP_TRAILING_WHITESPACE
  51. )
  52. string(REGEX REPLACE "([^\\])[\\]([^\\])" "\\1\\\\\\\\\\2" GIT_USER ${GIT_USER})
  53. set(LWS_BUILD_HASH ${GIT_USER}@${GIT_HOST}-${GIT_HASH})
  54. message("Git commit hash: ${LWS_BUILD_HASH}")
  55. endif()
  56. set(LWS_USE_BUNDLED_ZLIB_DEFAULT OFF)
  57. if(WIN32)
  58. set(LWS_USE_BUNDLED_ZLIB_DEFAULT ON)
  59. endif()
  60. option(LWS_WITH_STATIC "Build the static version of the library" ON)
  61. option(LWS_WITH_SHARED "Build the shared version of the library" ON)
  62. option(LWS_WITH_SSL "Include SSL support (default OpenSSL, wolfSSL if LWS_USE_WOLFSSL is set)" ON)
  63. option(LWS_USE_BORINGSSL "Use BoringSSL replacement for OpenSSL" OFF)
  64. option(LWS_USE_CYASSL "Use CyaSSL replacement for OpenSSL. When setting this, you also need to specify LWS_CYASSL_LIBRARIES and LWS_CYASSL_INCLUDE_DIRS" OFF)
  65. option(LWS_USE_WOLFSSL "Use wolfSSL replacement for OpenSSL. When setting this, you also need to specify LWS_WOLFSSL_LIBRARIES and LWS_WOLFSSL_INCLUDE_DIRS" OFF)
  66. option(LWS_WITH_ZLIB "Include zlib support (required for extensions)" ON)
  67. option(LWS_WITH_LIBEV "Compile with support for libev" OFF)
  68. option(LWS_WITH_LIBUV "Compile with support for libuv" OFF)
  69. option(LWS_USE_BUNDLED_ZLIB "Use bundled zlib version (Windows only)" ${LWS_USE_BUNDLED_ZLIB_DEFAULT})
  70. option(LWS_SSL_CLIENT_USE_OS_CA_CERTS "SSL support should make use of the OS-installed CA root certs" ON)
  71. option(LWS_WITHOUT_BUILTIN_GETIFADDRS "Don't use the BSD getifaddrs implementation from libwebsockets if it is missing (this will result in a compilation error) ... The default is to assume that your libc provides it. On some systems such as uclibc it doesn't exist." OFF)
  72. option(LWS_WITHOUT_BUILTIN_SHA1 "Don't build the lws sha-1 (eg, because openssl will provide it" OFF)
  73. option(LWS_WITHOUT_CLIENT "Don't build the client part of the library" OFF)
  74. option(LWS_WITHOUT_SERVER "Don't build the server part of the library" OFF)
  75. option(LWS_LINK_TESTAPPS_DYNAMIC "Link the test apps to the shared version of the library. Default is to link statically" OFF)
  76. option(LWS_WITHOUT_TESTAPPS "Don't build the libwebsocket-test-apps" OFF)
  77. option(LWS_WITHOUT_TEST_SERVER "Don't build the test server" OFF)
  78. option(LWS_WITHOUT_TEST_SERVER_EXTPOLL "Don't build the test server version that uses external poll" OFF)
  79. option(LWS_WITHOUT_TEST_PING "Don't build the ping test application" OFF)
  80. option(LWS_WITHOUT_TEST_ECHO "Don't build the echo test application" OFF)
  81. option(LWS_WITHOUT_TEST_CLIENT "Don't build the client test application" OFF)
  82. option(LWS_WITHOUT_TEST_FRAGGLE "Don't build the ping test application" OFF)
  83. option(LWS_WITHOUT_EXTENSIONS "Don't compile with extensions" OFF)
  84. option(LWS_WITH_LATENCY "Build latency measuring code into the library" OFF)
  85. option(LWS_WITHOUT_DAEMONIZE "Don't build the daemonization api" ON)
  86. option(LWS_IPV6 "Compile with support for ipv6" OFF)
  87. option(LWS_UNIX_SOCK "Compile with support for UNIX domain socket" OFF)
  88. option(LWS_WITH_HTTP2 "Compile with support for http2" OFF)
  89. option(LWS_SSL_SERVER_WITH_ECDH_CERT "Include SSL server use ECDH certificate" OFF)
  90. option(LWS_WITH_CGI "Include CGI (spawn process with network-connected stdin/out/err) APIs" OFF)
  91. option(LWS_WITH_HTTP_PROXY "Support for rewriting HTTP proxying" OFF)
  92. option(LWS_WITH_LWSWS "Libwebsockets Webserver" OFF)
  93. option(LWS_WITH_PLUGINS "Support plugins for protocols and extensions" OFF)
  94. option(LWS_WITH_ACCESS_LOG "Support generating Apache-compatible access logs" OFF)
  95. option(LWS_WITH_SERVER_STATUS "Support json + jscript server monitoring" OFF)
  96. option(LWS_WITH_LEJP "With the Lightweight JSON Parser" OFF)
  97. option(LWS_WITH_LEJP_CONF "With LEJP configuration parser as used by lwsws" OFF)
  98. option(LWS_WITH_GENERIC_SESSIONS "With the Generic Sessions plugin" OFF)
  99. option(LWS_WITH_SQLITE3 "Require SQLITE3 support" OFF)
  100. option(LWS_WITH_SMTP "Provide SMTP support" OFF)
  101. option(LWS_WITH_ESP8266 "Build for ESP8266" OFF)
  102. option(LWS_WITH_ESP32 "Build for ESP32" OFF)
  103. option(LWS_PLAT_OPTEE "Build for OPTEE" OFF)
  104. option(LWS_WITH_NO_LOGS "Disable all logging from being compiled in" OFF)
  105. option(LWS_STATIC_PIC "Build the static version of the library with position-independent code" OFF)
  106. option(LWS_WITH_RANGES "Support http ranges (RFC7233)" ON)
  107. option(LWS_FALLBACK_GETHOSTBYNAME "Also try to do dns resolution using gethostbyname if getaddrinfo fails" OFF)
  108. option(LWS_WITH_ZIP_FOPS "Support serving pre-zipped files" ON)
  109. if (LWS_WITH_LWSWS)
  110. message(STATUS "LWS_WITH_LWSWS --> Enabling LWS_WITH_PLUGINS and LWS_WITH_LIBUV")
  111. set(LWS_WITH_PLUGINS 1)
  112. set(LWS_WITH_LIBUV 1)
  113. set(LWS_WITH_ACCESS_LOG 1)
  114. set(LWS_WITH_SERVER_STATUS 1)
  115. set(LWS_WITH_LEJP 1)
  116. set(LWS_WITH_LEJP_CONF 1)
  117. endif()
  118. if (LWS_WITH_PLUGINS AND NOT LWS_WITH_LIBUV)
  119. message(STATUS "LWS_WITH_PLUGINS --> Enabling LWS_WITH_LIBUV")
  120. set(LWS_WITH_LIBUV 1)
  121. endif()
  122. if (LWS_WITH_SMTP AND NOT LWS_WITH_LIBUV)
  123. message(STATUS "LWS_WITH_SMTP --> Enabling LWS_WITH_LIBUV")
  124. set(LWS_WITH_LIBUV 1)
  125. endif()
  126. if (LWS_WITH_GENERIC_SESSIONS)
  127. set(LWS_WITH_SQLITE3 1)
  128. set(LWS_WITH_SMTP 1)
  129. endif()
  130. if (LWS_WITH_SMTP AND NOT LWS_WITH_LIBUV)
  131. message(STATUS "LWS_WITH_SMTP --> Enabling LWS_WITH_LIBUV")
  132. set(LWS_WITH_LIBUV 1)
  133. endif()
  134. if (LWS_WITH_ESP8266)
  135. set(LWS_WITH_SHARED OFF)
  136. set(LWS_WITH_SSL OFF)
  137. set(LWS_WITH_ZLIB OFF)
  138. set(LWS_WITHOUT_CLIENT ON)
  139. set(LWS_WITHOUT_TESTAPPS ON)
  140. set(LWS_WITHOUT_EXTENSIONS ON)
  141. set(LWS_WITH_PLUGINS OFF)
  142. set(LWS_WITH_RANGES OFF)
  143. # this implies no pthreads in the lib
  144. set(LWS_MAX_SMP 1)
  145. set(LWS_HAVE_MALLOC 1)
  146. set(LWS_HAVE_REALLOC 1)
  147. set(LWS_HAVE_GETIFADDRS 1)
  148. set(LWS_WITH_ZIP_FOPS 0)
  149. endif()
  150. if (LWS_WITH_ESP32)
  151. set(LWS_WITH_SHARED OFF)
  152. set(LWS_WITH_SSL OFF)
  153. set(LWS_WITH_ZLIB OFF)
  154. # set(LWS_WITHOUT_CLIENT ON)
  155. set(LWS_WITHOUT_TESTAPPS ON)
  156. set(LWS_WITHOUT_EXTENSIONS ON)
  157. set(LWS_WITHOUT_CLIENT ON)
  158. set(LWS_WITH_PLUGINS OFF)
  159. set(LWS_WITH_RANGES ON)
  160. # this implies no pthreads in the lib
  161. set(LWS_MAX_SMP 1)
  162. set(LWS_HAVE_MALLOC 1)
  163. set(LWS_HAVE_REALLOC 1)
  164. set(LWS_HAVE_GETIFADDRS 1)
  165. set(LWS_WITH_ZIP_FOPS 0)
  166. endif()
  167. if (WIN32)
  168. # this implies no pthreads in the lib
  169. set(LWS_MAX_SMP 1)
  170. endif()
  171. if (LWS_WITHOUT_SERVER)
  172. set(LWS_WITH_LWSWS OFF)
  173. endif()
  174. if (LWS_WITH_HTTP_PROXY AND (LWS_WITHOUT_CLIENT OR LWS_WITHOUT_SERVER))
  175. message(FATAL_ERROR "You have to enable both client and server for http proxy")
  176. endif()
  177. # Allow the user to override installation directories.
  178. set(LWS_INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
  179. set(LWS_INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
  180. set(LWS_INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")
  181. set(LWS_INSTALL_EXAMPLES_DIR bin CACHE PATH "Installation directory for example files")
  182. # Allow the user to use the old CyaSSL options/library in stead of wolfSSL
  183. if (LWS_USE_CYASSL AND LWS_USE_WOLFSSL)
  184. message(FATAL_ERROR "LWS_USE_CYASSL and LWS_USE_WOLFSSL are mutually exclusive!")
  185. endif()
  186. if (LWS_USE_CYASSL)
  187. # Copy CyaSSL options to the wolfSSL options
  188. set(LWS_USE_WOLFSSL ${LWS_USE_CYASSL} CACHE BOOL "Use wolfSSL/CyaSSL instead of OpenSSL" FORCE)
  189. set(LWS_WOLFSSL_LIBRARIES ${LWS_CYASSL_LIBRARIES} CACHE PATH "Path to wolfSSL/CyaSSL libraries" FORCE)
  190. set(LWS_WOLFSSL_INCLUDE_DIRS ${LWS_CYASSL_INCLUDE_DIRS} CACHE PATH "Path to wolfSSL/CyaSSL header files" FORCE)
  191. endif()
  192. if (LWS_WITHOUT_CLIENT AND LWS_WITHOUT_SERVER)
  193. message(FATAL_ERROR "Makes no sense to compile with neither client nor server.")
  194. endif()
  195. if (NOT (LWS_WITH_STATIC OR LWS_WITH_SHARED))
  196. message(FATAL_ERROR "Makes no sense to compile with neither static nor shared libraries.")
  197. endif()
  198. if (NOT LWS_WITHOUT_EXTENSIONS)
  199. if (NOT LWS_WITH_ZLIB)
  200. message(FATAL_ERROR "zlib is required for extensions.")
  201. endif()
  202. endif()
  203. set(LWS_ZLIB_LIBRARIES CACHE PATH "Path to the zlib library")
  204. set(LWS_ZLIB_INCLUDE_DIRS CACHE PATH "Path to the zlib include directory")
  205. set(LWS_OPENSSL_LIBRARIES CACHE PATH "Path to the OpenSSL library")
  206. set(LWS_OPENSSL_INCLUDE_DIRS CACHE PATH "Path to the OpenSSL include directory")
  207. set(LWS_WOLFSSL_LIBRARIES CACHE PATH "Path to the wolfSSL library")
  208. set(LWS_WOLFSSL_INCLUDE_DIRS CACHE PATH "Path to the wolfSSL include directory")
  209. set( CACHE PATH "Path to the libev library")
  210. set(LWS_LIBEV_INCLUDE_DIRS CACHE PATH "Path to the libev include directory")
  211. set(LWS_LIBUV_LIBRARIES CACHE PATH "Path to the libuv library")
  212. set(LWS_LIBUV_INCLUDE_DIRS CACHE PATH "Path to the libuv include directory")
  213. set(LWS_SQLITE3_LIBRARIES CACHE PATH "Path to the sqlite3 library")
  214. set(LWS_SQLITE3_INCLUDE_DIRS CACHE PATH "Path to the sqlite3 include directory")
  215. if (NOT LWS_WITH_SSL)
  216. set(LWS_WITHOUT_BUILTIN_SHA1 OFF)
  217. endif()
  218. if (LWS_WITH_SSL AND NOT LWS_USE_WOLFSSL)
  219. if ("${LWS_OPENSSL_LIBRARIES}" STREQUAL "" OR "${LWS_OPENSSL_INCLUDE_DIRS}" STREQUAL "")
  220. else()
  221. if (NOT LWS_WITH_ESP32)
  222. set(OPENSSL_LIBRARIES ${LWS_OPENSSL_LIBRARIES})
  223. endif()
  224. set(OPENSSL_INCLUDE_DIRS ${LWS_OPENSSL_INCLUDE_DIRS})
  225. set(OPENSSL_FOUND 1)
  226. endif()
  227. endif()
  228. if (LWS_WITH_SSL AND LWS_USE_WOLFSSL)
  229. if ("${LWS_WOLFSSL_LIBRARIES}" STREQUAL "" OR "${LWS_WOLFSSL_INCLUDE_DIRS}" STREQUAL "")
  230. if (NOT WOLFSSL_FOUND)
  231. if (LWS_USE_CYASSL)
  232. message(FATAL_ERROR "You must set LWS_CYASSL_LIBRARIES and LWS_CYASSL_INCLUDE_DIRS when LWS_USE_CYASSL is turned on.")
  233. else()
  234. message(FATAL_ERROR "You must set LWS_WOLFSSL_LIBRARIES and LWS_WOLFSSL_INCLUDE_DIRS when LWS_USE_WOLFSSL is turned on.")
  235. endif()
  236. endif()
  237. else()
  238. set(WOLFSSL_LIBRARIES ${LWS_WOLFSSL_LIBRARIES})
  239. set(WOLFSSL_INCLUDE_DIRS ${LWS_WOLFSSL_INCLUDE_DIRS})
  240. set(WOLFSSL_FOUND 1)
  241. endif()
  242. set(USE_WOLFSSL 1)
  243. if (LWS_USE_CYASSL)
  244. set(USE_OLD_CYASSL 1)
  245. endif()
  246. endif()
  247. if (LWS_WITH_ZLIB AND NOT LWS_USE_BUNDLED_ZLIB)
  248. if ("${LWS_ZLIB_LIBRARIES}" STREQUAL "" OR "${LWS_ZLIB_INCLUDE_DIRS}" STREQUAL "")
  249. else()
  250. set(ZLIB_LIBRARIES ${LWS_ZLIB_LIBRARIES})
  251. set(ZLIB_INCLUDE_DIRS ${LWS_ZLIB_INCLUDE_DIRS})
  252. set(ZLIB_FOUND 1)
  253. endif()
  254. endif()
  255. if (LWS_WITH_LIBEV)
  256. if ("${LWS_LIBEV_LIBRARIES}" STREQUAL "" OR "${LWS_LIBEV_INCLUDE_DIRS}" STREQUAL "")
  257. else()
  258. set(LIBEV_LIBRARIES ${LWS_LIBEV_LIBRARIES})
  259. set(LIBEV_INCLUDE_DIRS ${LWS_LIBEV_INCLUDE_DIRS})
  260. set(LIBEV_FOUND 1)
  261. endif()
  262. endif()
  263. if (LWS_WITH_LIBUV)
  264. if ("${LWS_LIBUV_LIBRARIES}" STREQUAL "" OR "${LWS_LIBUV_INCLUDE_DIRS}" STREQUAL "")
  265. else()
  266. set(LIBUV_LIBRARIES ${LWS_LIBUV_LIBRARIES})
  267. set(LIBUV_INCLUDE_DIRS ${LWS_LIBUV_INCLUDE_DIRS})
  268. set(LIBUV_FOUND 1)
  269. endif()
  270. endif()
  271. if (LWS_WITH_SQLITE3)
  272. if ("${LWS_SQLITE3_LIBRARIES}" STREQUAL "" OR "${LWS_SQLITE3_INCLUDE_DIRS}" STREQUAL "")
  273. else()
  274. set(SQLITE3_LIBRARIES ${LWS_SQLITE3_LIBRARIES})
  275. set(SQLITE3_INCLUDE_DIRS ${LWS_SQLITE3_INCLUDE_DIRS})
  276. set(SQLITE3_FOUND 1)
  277. endif()
  278. endif()
  279. # The base dir where the test-apps look for the SSL certs.
  280. set(LWS_OPENSSL_CLIENT_CERTS ../share CACHE PATH "Server SSL certificate directory")
  281. if (WIN32)
  282. set(LWS_OPENSSL_CLIENT_CERTS . CACHE PATH "Client SSL certificate directory")
  283. if (LWS_UNIX_SOCK)
  284. set(LWS_UNIX_SOCK OFF)
  285. message(WARNING "Windows does not support UNIX domain sockets")
  286. endif()
  287. else()
  288. set(LWS_OPENSSL_CLIENT_CERTS /etc/pki/tls/certs/ CACHE PATH "Client SSL certificate directory")
  289. endif()
  290. if (LWS_WITHOUT_EXTENSIONS)
  291. set(LWS_NO_EXTENSIONS 1)
  292. endif()
  293. if (LWS_WITH_SSL)
  294. set(LWS_OPENSSL_SUPPORT 1)
  295. endif()
  296. if (LWS_SSL_CLIENT_USE_OS_CA_CERTS)
  297. set(LWS_SSL_CLIENT_USE_OS_CA_CERTS 1)
  298. endif()
  299. if (LWS_WITH_LATENCY)
  300. set(LWS_LATENCY 1)
  301. endif()
  302. if (LWS_WITHOUT_DAEMONIZE OR WIN32)
  303. set(LWS_NO_DAEMONIZE 1)
  304. endif()
  305. if (LWS_WITHOUT_SERVER)
  306. set(LWS_NO_SERVER 1)
  307. endif()
  308. if (LWS_WITHOUT_CLIENT)
  309. set(LWS_NO_CLIENT 1)
  310. endif()
  311. if (LWS_WITH_LIBEV)
  312. set(LWS_USE_LIBEV 1)
  313. endif()
  314. if (LWS_WITH_LIBUV)
  315. set(LWS_USE_LIBUV 1)
  316. endif()
  317. if (LWS_IPV6)
  318. set(LWS_USE_IPV6 1)
  319. endif()
  320. if (LWS_UNIX_SOCK)
  321. set(LWS_USE_UNIX_SOCK 1)
  322. endif()
  323. if (LWS_WITH_HTTP2)
  324. set(LWS_USE_HTTP2 1)
  325. endif()
  326. if ("${LWS_MAX_SMP}" STREQUAL "")
  327. set(LWS_MAX_SMP 32)
  328. endif()
  329. if (LWS_WITH_ESP8266)
  330. set(CMAKE_C_FLAGS "-nostdlib ${CMAKE_C_FLAGS}")
  331. endif()
  332. if (MINGW)
  333. set(LWS_MINGW_SUPPORT 1)
  334. set(CMAKE_C_FLAGS "-D__USE_MINGW_ANSI_STDIO ${CMAKE_C_FLAGS}")
  335. endif()
  336. if (LWS_SSL_SERVER_WITH_ECDH_CERT)
  337. set(LWS_SSL_SERVER_WITH_ECDH_CERT 1)
  338. endif()
  339. include_directories("${PROJECT_BINARY_DIR}")
  340. include(CheckCSourceCompiles)
  341. # Check for different inline keyword versions.
  342. foreach(KEYWORD "inline" "__inline__" "__inline")
  343. set(CMAKE_REQUIRED_DEFINITIONS "-DKEYWORD=${KEYWORD}")
  344. CHECK_C_SOURCE_COMPILES(
  345. "
  346. #include <stdio.h>
  347. static KEYWORD void a() {}
  348. int main(int argc, char **argv) { a(); return 0; }
  349. " LWS_HAVE_${KEYWORD})
  350. endforeach()
  351. if (NOT LWS_HAVE_inline)
  352. if (LWS_HAVE___inline__)
  353. set(inline __inline__)
  354. elseif(LWS_HAVE___inline)
  355. set(inline __inline)
  356. endif()
  357. endif()
  358. # Put the libraries and binaries that get built into directories at the
  359. # top of the build tree rather than in hard-to-find leaf directories.
  360. SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
  361. SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
  362. SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
  363. SET(LWS_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}")
  364. # Put absolute path of dynamic libraries into the object code. Some
  365. # architectures, notably Mac OS X, need this.
  366. SET(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}")
  367. include(CheckFunctionExists)
  368. include(CheckSymbolExists)
  369. include(CheckIncludeFile)
  370. include(CheckIncludeFiles)
  371. include(CheckLibraryExists)
  372. include(CheckTypeSize)
  373. if (LWS_WITHOUT_BUILTIN_SHA1)
  374. set(LWS_SHA1_USE_OPENSSL_NAME 1)
  375. endif()
  376. CHECK_FUNCTION_EXISTS(bzero LWS_HAVE_BZERO)
  377. CHECK_FUNCTION_EXISTS(fork LWS_HAVE_FORK)
  378. CHECK_FUNCTION_EXISTS(getenv LWS_HAVE_GETENV)
  379. CHECK_FUNCTION_EXISTS(malloc LWS_HAVE_MALLOC)
  380. CHECK_FUNCTION_EXISTS(memset LWS_HAVE_MEMSET)
  381. CHECK_FUNCTION_EXISTS(realloc LWS_HAVE_REALLOC)
  382. CHECK_FUNCTION_EXISTS(socket LWS_HAVE_SOCKET)
  383. CHECK_FUNCTION_EXISTS(strerror LWS_HAVE_STRERROR)
  384. CHECK_FUNCTION_EXISTS(vfork LWS_HAVE_VFORK)
  385. CHECK_FUNCTION_EXISTS(execvpe LWS_HAVE_EXECVPE)
  386. CHECK_FUNCTION_EXISTS(getifaddrs LWS_HAVE_GETIFADDRS)
  387. CHECK_FUNCTION_EXISTS(snprintf LWS_HAVE_SNPRINTF)
  388. CHECK_FUNCTION_EXISTS(_snprintf LWS_HAVE__SNPRINTF)
  389. CHECK_FUNCTION_EXISTS(_vsnprintf LWS_HAVE__VSNPRINTF)
  390. CHECK_FUNCTION_EXISTS(getloadavg LWS_HAVE_GETLOADAVG)
  391. if (NOT LWS_HAVE_GETIFADDRS)
  392. if (LWS_WITHOUT_BUILTIN_GETIFADDRS)
  393. message(FATAL_ERROR "No getifaddrs was found on the system. Turn off the LWS_WITHOUT_BUILTIN_GETIFADDRS compile option to use the supplied BSD version.")
  394. endif()
  395. set(LWS_BUILTIN_GETIFADDRS 1)
  396. endif()
  397. CHECK_INCLUDE_FILE(dlfcn.h LWS_HAVE_DLFCN_H)
  398. CHECK_INCLUDE_FILE(fcntl.h LWS_HAVE_FCNTL_H)
  399. CHECK_INCLUDE_FILE(in6addr.h LWS_HAVE_IN6ADDR_H)
  400. CHECK_INCLUDE_FILE(inttypes.h LWS_HAVE_INTTYPES_H)
  401. CHECK_INCLUDE_FILE(memory.h LWS_HAVE_MEMORY_H)
  402. CHECK_INCLUDE_FILE(netinet/in.h LWS_HAVE_NETINET_IN_H)
  403. CHECK_INCLUDE_FILE(stdint.h LWS_HAVE_STDINT_H)
  404. CHECK_INCLUDE_FILE(stdlib.h LWS_HAVE_STDLIB_H)
  405. CHECK_INCLUDE_FILE(strings.h LWS_HAVE_STRINGS_H)
  406. CHECK_INCLUDE_FILE(string.h LWS_HAVE_STRING_H)
  407. CHECK_INCLUDE_FILE(sys/prctl.h LWS_HAVE_SYS_PRCTL_H)
  408. CHECK_INCLUDE_FILE(sys/socket.h LWS_HAVE_SYS_SOCKET_H)
  409. CHECK_INCLUDE_FILE(sys/sockio.h LWS_HAVE_SYS_SOCKIO_H)
  410. CHECK_INCLUDE_FILE(sys/stat.h LWS_HAVE_SYS_STAT_H)
  411. CHECK_INCLUDE_FILE(sys/types.h LWS_HAVE_SYS_TYPES_H)
  412. CHECK_INCLUDE_FILE(unistd.h LWS_HAVE_UNISTD_H)
  413. CHECK_INCLUDE_FILE(vfork.h LWS_HAVE_VFORK_H)
  414. if (LWS_WITH_LIBUV)
  415. CHECK_INCLUDE_FILE(uv-version.h LWS_HAVE_UV_VERSION_H)
  416. endif()
  417. if (LWS_WITH_ZLIB AND NOT LWS_USE_BUNDLED_ZLIB)
  418. CHECK_INCLUDE_FILE(zlib.h LWS_HAVE_ZLIB_H)
  419. endif()
  420. # TODO: These can also be tested to see whether they actually work...
  421. set(LWS_HAVE_WORKING_FORK LWS_HAVE_FORK)
  422. set(LWS_HAVE_WORKING_VFORK LWS_HAVE_VFORK)
  423. CHECK_INCLUDE_FILES("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS)
  424. # These don't work Cross...
  425. #CHECK_TYPE_SIZE(pid_t PID_T_SIZE)
  426. #CHECK_TYPE_SIZE(size_t SIZE_T_SIZE)
  427. #CHECK_TYPE_SIZE("void *" LWS_SIZEOFPTR LANGUAGE C)
  428. if (NOT PID_T_SIZE)
  429. set(pid_t int)
  430. endif()
  431. if (NOT SIZE_T_SIZE)
  432. set(size_t "unsigned int")
  433. endif()
  434. if (NOT LWS_HAVE_MALLOC)
  435. set(malloc rpl_malloc)
  436. endif()
  437. if (NOT LWS_HAVE_REALLOC)
  438. set(realloc rpl_realloc)
  439. endif()
  440. if (MSVC)
  441. # Turn off stupid microsoft security warnings.
  442. add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
  443. endif(MSVC)
  444. include_directories("${PROJECT_SOURCE_DIR}/lib")
  445. # Group headers and sources.
  446. # Some IDEs use this for nicer file structure.
  447. set(HDR_PRIVATE
  448. lib/private-libwebsockets.h)
  449. set(HDR_PUBLIC
  450. "${PROJECT_SOURCE_DIR}/lib/libwebsockets.h"
  451. "${PROJECT_BINARY_DIR}/lws_config.h")
  452. set(SOURCES
  453. lib/base64-decode.c
  454. lib/handshake.c
  455. lib/libwebsockets.c
  456. lib/service.c
  457. lib/pollfd.c
  458. lib/output.c
  459. lib/parsers.c
  460. lib/context.c
  461. lib/alloc.c
  462. lib/header.c)
  463. if (NOT LWS_WITHOUT_CLIENT)
  464. list(APPEND SOURCES
  465. lib/client.c
  466. lib/client-handshake.c
  467. lib/client-parser.c)
  468. endif()
  469. if (LWS_WITH_SSL)
  470. list(APPEND SOURCES
  471. lib/ssl.c)
  472. if (NOT LWS_WITHOUT_SERVER)
  473. list(APPEND SOURCES
  474. lib/ssl-server.c)
  475. endif()
  476. if (NOT LWS_WITHOUT_CLIENT)
  477. list(APPEND SOURCES
  478. lib/ssl-client.c)
  479. endif()
  480. endif()
  481. if (NOT LWS_WITHOUT_BUILTIN_SHA1)
  482. list(APPEND SOURCES
  483. lib/sha-1.c)
  484. endif()
  485. if (LWS_WITH_HTTP2)
  486. list(APPEND SOURCES
  487. lib/http2.c
  488. lib/hpack.c
  489. lib/ssl-http2.c)
  490. endif()
  491. # select the active platform files
  492. if (WIN32)
  493. list(APPEND SOURCES
  494. lib/lws-plat-win.c)
  495. else()
  496. if (LWS_WITH_ESP8266)
  497. list(APPEND SOURCES
  498. lib/lws-plat-esp8266.c)
  499. else()
  500. if (LWS_PLAT_OPTEE)
  501. list(APPEND SOURCES
  502. lib/lws-plat-optee.c)
  503. else()
  504. if (LWS_WITH_ESP32)
  505. list(APPEND SOURCES
  506. lib/lws-plat-esp32.c
  507. lib/romfs.c)
  508. else()
  509. list(APPEND SOURCES
  510. lib/lws-plat-unix.c)
  511. endif()
  512. endif()
  513. endif()
  514. endif()
  515. if (NOT LWS_WITHOUT_SERVER)
  516. list(APPEND SOURCES
  517. lib/server.c
  518. lib/server-handshake.c)
  519. endif()
  520. if (NOT LWS_WITHOUT_EXTENSIONS)
  521. list(APPEND HDR_PRIVATE
  522. lib/extension-permessage-deflate.h)
  523. list(APPEND SOURCES
  524. lib/extension.c
  525. lib/extension-permessage-deflate.c)
  526. endif()
  527. if (LWS_WITH_HTTP_PROXY)
  528. list(APPEND SOURCES
  529. lib/rewrite.c)
  530. endif()
  531. if (LWS_WITH_LIBEV)
  532. list(APPEND SOURCES
  533. lib/libev.c)
  534. endif()
  535. if (LWS_WITH_LIBUV)
  536. list(APPEND SOURCES
  537. lib/libuv.c)
  538. endif()
  539. if (LWS_WITH_LEJP)
  540. list(APPEND SOURCES
  541. lib/lejp.c)
  542. list(APPEND HDR_PUBLIC
  543. lib/lejp.h)
  544. endif()
  545. if (LWS_WITH_LEJP_CONF)
  546. list(APPEND SOURCES
  547. "lib/lejp-conf.c"
  548. )
  549. endif()
  550. if (LWS_WITH_SMTP)
  551. list(APPEND SOURCES
  552. lib/smtp.c)
  553. endif()
  554. if (LWS_WITH_RANGES)
  555. list(APPEND SOURCES
  556. lib/ranges.c)
  557. endif()
  558. if (LWS_WITH_ZIP_FOPS)
  559. if (LWS_WITH_ZLIB)
  560. list(APPEND SOURCES
  561. lib/fops-zip.c)
  562. else()
  563. message(FATAL_ERROR "Pre-zipped file support (LWS_WITH_ZIP_FOPS) requires ZLIB (LWS_WITH_ZLIB)")
  564. endif()
  565. endif()
  566. # Add helper files for Windows.
  567. if (WIN32)
  568. set(WIN32_HELPERS_PATH win32port/win32helpers)
  569. include_directories(${WIN32_HELPERS_PATH})
  570. if (WIN32)
  571. list(APPEND SOURCES
  572. ${WIN32_HELPERS_PATH}/gettimeofday.c
  573. )
  574. list(APPEND HDR_PRIVATE
  575. ${WIN32_HELPERS_PATH}/gettimeofday.h
  576. )
  577. endif(WIN32)
  578. else()
  579. # Unix.
  580. if (NOT LWS_WITHOUT_DAEMONIZE)
  581. list(APPEND SOURCES
  582. lib/daemonize.c)
  583. endif()
  584. endif()
  585. if (UNIX)
  586. if (NOT LWS_HAVE_GETIFADDRS)
  587. list(APPEND HDR_PRIVATE lib/getifaddrs.h)
  588. list(APPEND SOURCES lib/getifaddrs.c)
  589. endif()
  590. endif()
  591. if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  592. include (CheckCCompilerFlag)
  593. CHECK_C_COMPILER_FLAG(-fvisibility=hidden LWS_HAVE_VISIBILITY)
  594. if (LWS_HAVE_VISIBILITY)
  595. set(VISIBILITY_FLAG -fvisibility=hidden)
  596. endif()
  597. if (UNIX OR LWS_WITH_ESP8266)
  598. set(CMAKE_C_FLAGS "-Wall -Werror ${VISIBILITY_FLAG} ${CMAKE_C_FLAGS}" )
  599. else()
  600. set(CMAKE_C_FLAGS "-Wall ${VISIBILITY_FLAG} ${CMAKE_C_FLAGS}" )
  601. endif()
  602. endif ()
  603. if ((CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) AND NOT LWS_WITHOUT_TESTAPPS)
  604. if (UNIX)
  605. # jeez clang understands -pthread but dies if he sees it at link time!
  606. # http://stackoverflow.com/questions/2391194/what-is-gs-pthread-equiv-in-clang
  607. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread" )
  608. endif()
  609. endif()
  610. if ((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  611. # otherwise osx blows a bunch of openssl deprecated api errors
  612. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations" )
  613. endif()
  614. source_group("Headers Private" FILES ${HDR_PRIVATE})
  615. source_group("Headers Public" FILES ${HDR_PUBLIC})
  616. source_group("Sources" FILES ${SOURCES})
  617. #
  618. # Create the lib.
  619. #
  620. set(LWS_LIBRARIES)
  621. if (LWS_WITH_STATIC)
  622. if (LWS_STATIC_PIC)
  623. set(CMAKE_POSITION_INDEPENDENT_CODE ON)
  624. endif()
  625. add_library(websockets STATIC
  626. ${HDR_PRIVATE}
  627. ${HDR_PUBLIC}
  628. ${SOURCES})
  629. list(APPEND LWS_LIBRARIES websockets)
  630. if (WIN32)
  631. # Windows uses the same .lib ending for static libraries and shared
  632. # library linker files, so rename the static library.
  633. set_target_properties(websockets
  634. PROPERTIES
  635. OUTPUT_NAME websockets_static)
  636. endif()
  637. add_custom_command(
  638. TARGET websockets
  639. COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/lib/libwebsockets.h
  640. ${CMAKE_CURRENT_BINARY_DIR}/include/libwebsockets.h
  641. )
  642. add_custom_command(
  643. TARGET websockets
  644. COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/lws_config.h
  645. ${CMAKE_CURRENT_BINARY_DIR}/include/lws_config.h
  646. )
  647. endif()
  648. if (LWS_WITH_SHARED)
  649. add_library(websockets_shared SHARED
  650. ${HDR_PRIVATE}
  651. ${HDR_PUBLIC}
  652. ${SOURCES})
  653. list(APPEND LWS_LIBRARIES websockets_shared)
  654. # We want the shared lib to be named "libwebsockets"
  655. # not "libwebsocket_shared".
  656. set_target_properties(websockets_shared
  657. PROPERTIES
  658. OUTPUT_NAME websockets)
  659. if (WIN32)
  660. # Compile as DLL (export function declarations)
  661. set_property(
  662. TARGET websockets_shared
  663. PROPERTY COMPILE_DEFINITIONS
  664. LWS_DLL
  665. LWS_INTERNAL)
  666. endif()
  667. if (APPLE)
  668. set_property(TARGET websockets_shared PROPERTY MACOSX_RPATH YES)
  669. endif()
  670. add_custom_command(
  671. TARGET websockets_shared
  672. COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/lib/libwebsockets.h
  673. ${CMAKE_CURRENT_BINARY_DIR}/include/libwebsockets.h
  674. )
  675. add_custom_command(
  676. TARGET websockets_shared
  677. COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/lws_config.h
  678. ${CMAKE_CURRENT_BINARY_DIR}/include/lws_config.h
  679. )
  680. endif()
  681. # Set the so version of the lib.
  682. # Equivalent to LDFLAGS=-version-info x:x:x
  683. if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  684. foreach(lib ${LWS_LIBRARIES})
  685. set_target_properties(${lib}
  686. PROPERTIES
  687. SOVERSION ${SOVERSION})
  688. endforeach()
  689. endif()
  690. set(LIB_LIST)
  691. #
  692. # Find libraries.
  693. #
  694. #
  695. # ZLIB (Only needed for deflate extensions).
  696. #
  697. if (LWS_WITH_ZLIB)
  698. if (LWS_USE_BUNDLED_ZLIB)
  699. if (WIN32)
  700. set(WIN32_ZLIB_PATH "win32port/zlib")
  701. set(ZLIB_SRCS
  702. ${WIN32_ZLIB_PATH}/adler32.c
  703. ${WIN32_ZLIB_PATH}/compress.c
  704. ${WIN32_ZLIB_PATH}/crc32.c
  705. ${WIN32_ZLIB_PATH}/deflate.c
  706. ${WIN32_ZLIB_PATH}/gzclose.c
  707. ${WIN32_ZLIB_PATH}/gzio.c
  708. ${WIN32_ZLIB_PATH}/gzlib.c
  709. ${WIN32_ZLIB_PATH}/gzread.c
  710. ${WIN32_ZLIB_PATH}/gzwrite.c
  711. ${WIN32_ZLIB_PATH}/infback.c
  712. ${WIN32_ZLIB_PATH}/inffast.c
  713. ${WIN32_ZLIB_PATH}/inflate.c
  714. ${WIN32_ZLIB_PATH}/inftrees.c
  715. ${WIN32_ZLIB_PATH}/trees.c
  716. ${WIN32_ZLIB_PATH}/uncompr.c
  717. ${WIN32_ZLIB_PATH}/zutil.c)
  718. add_library(zlib_internal STATIC ${ZLIB_SRCS})
  719. set(ZLIB_INCLUDE_DIRS ${WIN32_ZLIB_PATH})
  720. get_property(ZLIB_LIBRARIES TARGET zlib_internal PROPERTY LOCATION)
  721. set(ZLIB_FOUND 1)
  722. # Make sure zlib_internal is compiled before the libs.
  723. foreach (lib ${LWS_LIBRARIES})
  724. add_dependencies(${lib} zlib_internal)
  725. endforeach()
  726. else()
  727. message(FATAL_ERROR "Don't have bundled zlib for that platform")
  728. endif()
  729. elseif (NOT ZLIB_FOUND)
  730. find_package(ZLIB REQUIRED)
  731. endif()
  732. message("zlib include dirs: ${ZLIB_INCLUDE_DIRS}")
  733. message("zlib libraries: ${ZLIB_LIBRARIES}")
  734. include_directories(${ZLIB_INCLUDE_DIRS})
  735. list(APPEND LIB_LIST ${ZLIB_LIBRARIES})
  736. endif()
  737. #
  738. # OpenSSL
  739. #
  740. if (LWS_WITH_SSL)
  741. message("Compiling with SSL support")
  742. set(chose_ssl 0)
  743. if (LWS_USE_WOLFSSL)
  744. # Use wolfSSL as OpenSSL replacement.
  745. # TODO: Add a find_package command for this also.
  746. message("wolfSSL include dir: ${WOLFSSL_INCLUDE_DIRS}")
  747. message("wolfSSL libraries: ${WOLFSSL_LIBRARIES}")
  748. # Additional to the root directory we need to include
  749. # the wolfssl/ subdirectory which contains the OpenSSL
  750. # compatibility layer headers.
  751. if (LWS_USE_CYASSL)
  752. foreach(inc ${WOLFSSL_INCLUDE_DIRS})
  753. include_directories("${inc}" "${inc}/cyassl")
  754. endforeach()
  755. else()
  756. foreach(inc ${WOLFSSL_INCLUDE_DIRS})
  757. include_directories("${inc}" "${inc}/wolfssl")
  758. endforeach()
  759. endif()
  760. list(APPEND LIB_LIST "${WOLFSSL_LIBRARIES}")
  761. set(chose_ssl 1)
  762. endif()
  763. if (NOT chose_ssl)
  764. if (NOT OPENSSL_FOUND AND NOT LWS_USE_BORINGSSL)
  765. # TODO: Add support for STATIC also.
  766. if (NOT LWS_WITH_ESP32)
  767. find_package(OpenSSL REQUIRED)
  768. endif()
  769. set(OPENSSL_INCLUDE_DIRS "${OPENSSL_INCLUDE_DIR}")
  770. endif()
  771. message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIRS}")
  772. if (NOT LWS_WITH_ESP32)
  773. message("OpenSSL libraries: ${OPENSSL_LIBRARIES}")
  774. endif()
  775. include_directories("${OPENSSL_INCLUDE_DIRS}")
  776. if (NOT LWS_WITH_ESP32)
  777. list(APPEND LIB_LIST ${OPENSSL_LIBRARIES})
  778. endif()
  779. # older (0.98) Openssl lacks this
  780. set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIRS})
  781. check_include_file(openssl/ecdh.h LWS_HAVE_OPENSSL_ECDH_H)
  782. if (LWS_SSL_SERVER_WITH_ECDH_CERT AND NOT LWS_HAVE_OPENSSL_ECDH_H)
  783. message(FATAL_ERROR "Missing openssl/ecdh.h, so cannot use LWS_SSL_SERVER_WITH_ECDH_CERT")
  784. endif()
  785. endif()
  786. endif(LWS_WITH_SSL)
  787. if (LWS_WITH_LIBEV)
  788. if (NOT LIBEV_FOUND)
  789. find_path(LIBEV_INCLUDE_DIRS NAMES ev.h)
  790. find_library(LIBEV_LIBRARIES NAMES ev)
  791. if(LIBEV_INCLUDE_DIRS AND LIBEV_LIBRARIES)
  792. set(LIBEV_FOUND 1)
  793. endif()
  794. endif()
  795. message("libev include dir: ${LIBEV_INCLUDE_DIRS}")
  796. message("libev libraries: ${LIBEV_LIBRARIES}")
  797. include_directories("${LIBEV_INCLUDE_DIRS}")
  798. list(APPEND LIB_LIST ${LIBEV_LIBRARIES})
  799. endif(LWS_WITH_LIBEV)
  800. if (LWS_WITH_LIBUV)
  801. if (NOT LIBUV_FOUND)
  802. find_path(LIBUV_INCLUDE_DIRS NAMES uv.h)
  803. find_library(LIBUV_LIBRARIES NAMES uv)
  804. if(LIBUV_INCLUDE_DIRS AND LIBUV_LIBRARIES)
  805. set(LIBUV_FOUND 1)
  806. endif()
  807. endif()
  808. message("libuv include dir: ${LIBUV_INCLUDE_DIRS}")
  809. message("libuv libraries: ${LIBUV_LIBRARIES}")
  810. include_directories("${LIBUV_INCLUDE_DIRS}")
  811. list(APPEND LIB_LIST ${LIBUV_LIBRARIES})
  812. endif()
  813. if (LWS_WITH_SQLITE3)
  814. if (NOT SQLITE3_FOUND)
  815. find_path(SQLITE3_INCLUDE_DIRS NAMES sqlite3.h)
  816. find_library(SQLITE3_LIBRARIES NAMES sqlite3)
  817. if(SQLITE3_INCLUDE_DIRS AND SQLITE3_LIBRARIES)
  818. set(SQLITE3_FOUND 1)
  819. endif()
  820. endif()
  821. message("sqlite3 include dir: ${SQLITE3_INCLUDE_DIRS}")
  822. message("sqlite3 libraries: ${SQLITE3_LIBRARIES}")
  823. include_directories("${SQLITE3_INCLUDE_DIRS}")
  824. list(APPEND LIB_LIST ${SQLITE3_LIBRARIES})
  825. endif()
  826. if (LWS_WITH_HTTP_PROXY)
  827. find_library(LIBHUBBUB_LIBRARIES NAMES hubbub)
  828. list(APPEND LIB_LIST ${LIBHUBBUB_LIBRARIES} )
  829. endif()
  830. #
  831. # Platform specific libs.
  832. #
  833. if (WINCE)
  834. list(APPEND LIB_LIST ws2.lib)
  835. elseif (WIN32)
  836. list(APPEND LIB_LIST ws2_32.lib userenv.lib psapi.lib iphlpapi.lib)
  837. endif()
  838. if (UNIX)
  839. list(APPEND LIB_LIST m)
  840. endif()
  841. # Setup the linking for all libs.
  842. foreach (lib ${LWS_LIBRARIES})
  843. target_link_libraries(${lib} ${LIB_LIST})
  844. endforeach()
  845. set (temp ${CMAKE_REQUIRED_LIBRARIES})
  846. set(CMAKE_REQUIRED_LIBRARIES ${LIB_LIST})
  847. CHECK_FUNCTION_EXISTS(SSL_CTX_set1_param LWS_HAVE_SSL_CTX_set1_param)
  848. CHECK_FUNCTION_EXISTS(X509_VERIFY_PARAM_set1_host LWS_HAVE_X509_VERIFY_PARAM_set1_host)
  849. CHECK_FUNCTION_EXISTS(TLS_client_method LWS_HAVE_TLS_CLIENT_METHOD)
  850. CHECK_FUNCTION_EXISTS(TLSv1_2_client_method LWS_HAVE_TLSV1_2_CLIENT_METHOD)
  851. set(CMAKE_REQUIRED_LIBRARIES ${temp})
  852. # Generate the lws_config.h that includes all the public compilation settings.
  853. configure_file(
  854. "${PROJECT_SOURCE_DIR}/lws_config.h.in"
  855. "${PROJECT_BINARY_DIR}/lws_config.h")
  856. # Generate the lws_config.h that includes all the private compilation settings.
  857. configure_file(
  858. "${PROJECT_SOURCE_DIR}/lws_config_private.h.in"
  859. "${PROJECT_BINARY_DIR}/lws_config_private.h")
  860. # Generate self-signed SSL certs for the test-server.
  861. if (LWS_WITH_SSL AND NOT LWS_USE_WOLFSSL)
  862. message("Searching for OpenSSL executable and dlls")
  863. find_package(OpenSSLbins)
  864. message("OpenSSL executable: ${OPENSSL_EXECUTABLE}")
  865. if (OPENSSL_EXECUTABLE MATCHES "^$")
  866. set(OPENSSL_EXECUTABLE openssl)
  867. endif()
  868. if (NOT OPENSSL_EXECUTABLE)
  869. set(OPENSSL_EXECUTABLE openssl)
  870. endif()
  871. endif()
  872. set(GENCERTS 0)
  873. if (LWS_WITH_SSL AND OPENSSL_EXECUTABLE AND NOT LWS_WITHOUT_TEST_SERVER)
  874. set(GENCERTS 1)
  875. endif()
  876. if (LWS_WITH_ESP32)
  877. set(GENCERTS 1)
  878. endif()
  879. message(" GENCERTS = ${GENCERTS}")
  880. if (GENCERTS)
  881. message("Generating SSL Certificates for the test-server...")
  882. set(TEST_SERVER_SSL_KEY "${PROJECT_BINARY_DIR}/libwebsockets-test-server.key.pem")
  883. set(TEST_SERVER_SSL_CERT "${PROJECT_BINARY_DIR}/libwebsockets-test-server.pem")
  884. if (WIN32)
  885. if (MINGW)
  886. message("cmd = \"${OPENSSL_EXECUTABLE}\" req -new -newkey rsa:1024 -days 10000 -nodes -x509 -subj \"/C=GB/ST=Erewhon/L=All around/O=libwebsockets-test/CN=localhost\" -keyout \"${TEST_SERVER_SSL_KEY}\" -out \"${TEST_SERVER_SSL_CERT}\"")
  887. execute_process(
  888. COMMAND "${OPENSSL_EXECUTABLE}" req -new -newkey rsa:1024 -days 10000 -nodes -x509 -subj "/C=GB/ST=Erewhon/L=All around/O=libwebsockets-test/CN=localhost" -keyout "${TEST_SERVER_SSL_KEY}" -out "${TEST_SERVER_SSL_CERT}"
  889. RESULT_VARIABLE OPENSSL_RETURN_CODE)
  890. else()
  891. file(WRITE "${PROJECT_BINARY_DIR}/openssl_input.txt"
  892. "GB\n"
  893. "Erewhon\n"
  894. "All around\n"
  895. "libwebsockets-test\n"
  896. "localhost\n"
  897. "none@invalid.org\n\n"
  898. )
  899. # The "type" command is a bit picky with paths.
  900. file(TO_NATIVE_PATH "${PROJECT_BINARY_DIR}/openssl_input.txt" OPENSSL_INPUT_WIN_PATH)
  901. message("OPENSSL_INPUT_WIN_PATH = ${OPENSSL_INPUT_WIN_PATH}")
  902. message("cmd = \"${OPENSSL_EXECUTABLE}\" req -new -newkey rsa:1024 -days 10000 -nodes -x509 -keyout \"${TEST_SERVER_SSL_KEY}\" -out \"${TEST_SERVER_SSL_CERT}\"")
  903. execute_process(
  904. COMMAND cmd /c type "${OPENSSL_INPUT_WIN_PATH}"
  905. COMMAND "${OPENSSL_EXECUTABLE}" req -new -newkey rsa:1024 -days 10000 -nodes -x509 -keyout "${TEST_SERVER_SSL_KEY}" -out "${TEST_SERVER_SSL_CERT}"
  906. RESULT_VARIABLE OPENSSL_RETURN_CODE
  907. OUTPUT_QUIET ERROR_QUIET)
  908. message("\n")
  909. endif()
  910. if (OPENSSL_RETURN_CODE)
  911. message(WARNING "!!! Failed to generate SSL certificate for Test Server using cmd.exe !!!:\nOpenSSL return code = ${OPENSSL_RETURN_CODE}")
  912. else()
  913. message("SUCCSESFULLY generated SSL certificate")
  914. endif()
  915. else()
  916. # Unix.
  917. execute_process(
  918. COMMAND printf "GB\\nErewhon\\nAll around\\nlibwebsockets-test\\n\\nlocalhost\\nnone@invalid.org\\n"
  919. COMMAND "${OPENSSL_EXECUTABLE}"
  920. req -new -newkey rsa:1024 -days 10000 -nodes -x509 -keyout "${TEST_SERVER_SSL_KEY}" -out "${TEST_SERVER_SSL_CERT}"
  921. RESULT_VARIABLE OPENSSL_RETURN_CODE
  922. OUTPUT_QUIET ERROR_QUIET)
  923. if (OPENSSL_RETURN_CODE)
  924. message(WARNING "!!! Failed to generate SSL certificate for Test Server!!!:\nOpenSSL return code = ${OPENSSL_RETURN_CODE}")
  925. else()
  926. message("SUCCESSFULLY generated SSL certificate")
  927. endif()
  928. endif()
  929. list(APPEND TEST_SERVER_DATA
  930. "${TEST_SERVER_SSL_KEY}"
  931. "${TEST_SERVER_SSL_CERT}")
  932. endif()
  933. #
  934. # Test applications
  935. #
  936. set(TEST_APP_LIST)
  937. if (NOT LWS_WITHOUT_TESTAPPS)
  938. #
  939. # Helper function for adding a test app.
  940. #
  941. macro(create_test_app TEST_NAME MAIN_SRC S2 S3 S4 S5 S6)
  942. set(TEST_SRCS ${MAIN_SRC})
  943. set(TEST_HDR)
  944. if ("${S2}" STREQUAL "")
  945. else()
  946. list(APPEND TEST_SRCS ${S2})
  947. endif()
  948. if ("${S3}" STREQUAL "")
  949. else()
  950. list(APPEND TEST_SRCS ${S3})
  951. endif()
  952. if ("${S4}" STREQUAL "")
  953. else()
  954. list(APPEND TEST_SRCS ${S4})
  955. endif()
  956. if ("${S5}" STREQUAL "")
  957. else()
  958. list(APPEND TEST_SRCS ${S5})
  959. endif()
  960. if ("${S6}" STREQUAL "")
  961. else()
  962. list(APPEND TEST_SRCS ${S6})
  963. endif()
  964. if (WIN32)
  965. list(APPEND TEST_SRCS
  966. ${WIN32_HELPERS_PATH}/getopt.c
  967. ${WIN32_HELPERS_PATH}/getopt_long.c
  968. ${WIN32_HELPERS_PATH}/gettimeofday.c
  969. )
  970. list(APPEND TEST_HDR
  971. ${WIN32_HELPERS_PATH}/getopt.h
  972. ${WIN32_HELPERS_PATH}/gettimeofday.h
  973. )
  974. endif(WIN32)
  975. source_group("Headers Private" FILES ${TEST_HDR})
  976. source_group("Sources" FILES ${TEST_SRCS})
  977. add_executable(${TEST_NAME} ${TEST_SRCS} ${TEST_HDR})
  978. if (LWS_LINK_TESTAPPS_DYNAMIC)
  979. if (NOT LWS_WITH_SHARED)
  980. message(FATAL_ERROR "Build of the shared library is disabled. LWS_LINK_TESTAPPS_DYNAMIC must be combined with LWS_WITH_SHARED.")
  981. endif()
  982. target_link_libraries(${TEST_NAME} websockets_shared)
  983. add_dependencies(${TEST_NAME} websockets_shared)
  984. else()
  985. if (NOT LWS_WITH_STATIC)
  986. message(FATAL_ERROR "Build of the static library is disabled. Disabled LWS_LINK_TESTAPPS_DYNAMIC must be combined with LWS_WITH_STATIC.")
  987. endif()
  988. target_link_libraries(${TEST_NAME} websockets)
  989. add_dependencies(${TEST_NAME} websockets)
  990. endif()
  991. # Set test app specific defines.
  992. set_property(TARGET ${TEST_NAME}
  993. PROPERTY COMPILE_DEFINITIONS
  994. INSTALL_DATADIR="${CMAKE_INSTALL_PREFIX}/share"
  995. )
  996. # Prefix the binary names with libwebsockets.
  997. set_target_properties(${TEST_NAME}
  998. PROPERTIES
  999. OUTPUT_NAME libwebsockets-${TEST_NAME})
  1000. # Add to the list of tests.
  1001. list(APPEND TEST_APP_LIST ${TEST_NAME})
  1002. endmacro()
  1003. if (UNIX AND LWS_WITH_PLUGINS)
  1004. set(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}")
  1005. if(NOT(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD"))
  1006. target_link_libraries(websockets dl)
  1007. endif()
  1008. endif()
  1009. if (NOT LWS_WITHOUT_SERVER)
  1010. #
  1011. # test-server
  1012. #
  1013. if (NOT LWS_WITHOUT_TEST_SERVER)
  1014. create_test_app(test-server "test-server/test-server.c"
  1015. "test-server/test-server-http.c"
  1016. "test-server/test-server-dumb-increment.c"
  1017. "test-server/test-server-mirror.c"
  1018. "test-server/test-server-status.c"
  1019. "test-server/test-server-echogen.c")
  1020. if (UNIX)
  1021. create_test_app(test-fuzxy "test-server/fuzxy.c"
  1022. ""
  1023. ""
  1024. ""
  1025. ""
  1026. "")
  1027. endif()
  1028. if (UNIX AND NOT ((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang")))
  1029. create_test_app(test-server-pthreads
  1030. "test-server/test-server-pthreads.c"
  1031. "test-server/test-server-http.c"
  1032. "test-server/test-server-dumb-increment.c"
  1033. "test-server/test-server-mirror.c"
  1034. "test-server/test-server-status.c"
  1035. "test-server/test-server-echogen.c")
  1036. endif()
  1037. if (NOT ((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  1038. AND LWS_WITH_LIBEV)
  1039. create_test_app(test-server-libev
  1040. "test-server/test-server-libev.c"
  1041. "test-server/test-server-http.c"
  1042. "test-server/test-server-dumb-increment.c"
  1043. "test-server/test-server-mirror.c"
  1044. "test-server/test-server-status.c"
  1045. "test-server/test-server-echogen.c")
  1046. endif()
  1047. if (NOT ((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  1048. AND LWS_WITH_LIBUV)
  1049. create_test_app(test-server-libuv
  1050. "test-server/test-server-libuv.c"
  1051. "test-server/test-server-http.c"
  1052. "test-server/test-server-dumb-increment.c"
  1053. "test-server/test-server-mirror.c"
  1054. "test-server/test-server-status.c"
  1055. "test-server/test-server-echogen.c")
  1056. endif()
  1057. endif()
  1058. #
  1059. # test-server-extpoll
  1060. #
  1061. if (NOT LWS_WITHOUT_TEST_SERVER_EXTPOLL)
  1062. create_test_app(test-server-extpoll "test-server/test-server.c"
  1063. "test-server/test-server-http.c"
  1064. "test-server/test-server-dumb-increment.c"
  1065. "test-server/test-server-mirror.c"
  1066. "test-server/test-server-status.c"
  1067. "test-server/test-server-echogen.c")
  1068. # Set defines for this executable only.
  1069. set_property(
  1070. TARGET test-server-extpoll
  1071. PROPERTY COMPILE_DEFINITIONS
  1072. EXTERNAL_POLL
  1073. INSTALL_DATADIR="${CMAKE_INSTALL_PREFIX}/share"
  1074. )
  1075. # We need to link against winsock code.
  1076. if (WIN32)
  1077. target_link_libraries(test-server-extpoll ws2_32.lib)
  1078. endif(WIN32)
  1079. endif()
  1080. #
  1081. # test-server-v2.0
  1082. #
  1083. if (LWS_WITH_PLUGINS)
  1084. create_test_app(
  1085. test-server-v2.0
  1086. "test-server/test-server-v2.0.c"
  1087. ""
  1088. ""
  1089. ""
  1090. ""
  1091. "")
  1092. endif()
  1093. # Data files for running the test server.
  1094. set(TEST_SERVER_DATA
  1095. "${PROJECT_SOURCE_DIR}/test-server/favicon.ico"
  1096. "${PROJECT_SOURCE_DIR}/test-server/leaf.jpg"
  1097. "${PROJECT_SOURCE_DIR}/test-server/candide.zip"
  1098. "${PROJECT_SOURCE_DIR}/test-server/libwebsockets.org-logo.png"
  1099. "${PROJECT_SOURCE_DIR}/test-server/lws-common.js"
  1100. "${PROJECT_SOURCE_DIR}/test-server/test.html")
  1101. add_custom_command(TARGET test-server
  1102. POST_BUILD
  1103. COMMAND "${CMAKE_COMMAND}" -E make_directory "$<TARGET_FILE_DIR:test-server>/../share/libwebsockets-test-server")
  1104. # Copy the file needed to run the server so that the test apps can
  1105. # reach them from their default output location
  1106. foreach (TEST_FILE ${TEST_SERVER_DATA})
  1107. if (EXISTS ${TEST_FILE})
  1108. add_custom_command(TARGET test-server
  1109. POST_BUILD
  1110. COMMAND "${CMAKE_COMMAND}" -E copy "${TEST_FILE}" "$<TARGET_FILE_DIR:test-server>/../share/libwebsockets-test-server" VERBATIM)
  1111. endif()
  1112. endforeach()
  1113. endif(NOT LWS_WITHOUT_SERVER)
  1114. if (NOT LWS_WITHOUT_CLIENT)
  1115. #
  1116. # test-client
  1117. #
  1118. if (NOT LWS_WITHOUT_TEST_CLIENT)
  1119. create_test_app(test-client "test-server/test-client.c" "" "" "" "" "")
  1120. endif()
  1121. #
  1122. # test-fraggle
  1123. #
  1124. if (NOT LWS_WITHOUT_TEST_FRAGGLE)
  1125. create_test_app(test-fraggle "test-server/test-fraggle.c" "" "" "" "" "")
  1126. endif()
  1127. #
  1128. # test-ping
  1129. #
  1130. if (NOT LWS_WITHOUT_TEST_PING)
  1131. create_test_app(test-ping "test-server/test-ping.c" "" "" "" "" "")
  1132. endif()
  1133. #
  1134. # test-echo
  1135. #
  1136. if (NOT LWS_WITHOUT_TEST_ECHO)
  1137. create_test_app(test-echo "test-server/test-echo.c" "" "" "" "" "")
  1138. endif()
  1139. endif(NOT LWS_WITHOUT_CLIENT)
  1140. if (LWS_WITH_PLUGINS AND LWS_WITH_SHARED)
  1141. macro(create_plugin PLUGIN_NAME MAIN_SRC S2 S3)
  1142. set(PLUGIN_SRCS ${MAIN_SRC})
  1143. if ("${S2}" STREQUAL "")
  1144. else()
  1145. list(APPEND PLUGIN_SRCS ${S2})
  1146. endif()
  1147. if ("${S3}" STREQUAL "")
  1148. else()
  1149. list(APPEND PLUGIN_SRCS ${S3})
  1150. endif()
  1151. if (WIN32)
  1152. list(APPEND PLUGIN_SRCS
  1153. ${WIN32_HELPERS_PATH}/getopt.c
  1154. ${WIN32_HELPERS_PATH}/getopt_long.c
  1155. ${WIN32_HELPERS_PATH}/gettimeofday.c
  1156. )
  1157. list(APPEND PLUGIN_HDR
  1158. ${WIN32_HELPERS_PATH}/getopt.h
  1159. ${WIN32_HELPERS_PATH}/gettimeofday.h
  1160. )
  1161. endif(WIN32)
  1162. source_group("Headers Private" FILES ${PLUGIN_HDR})
  1163. source_group("Sources" FILES ${PLUGIN_SRCS})
  1164. add_library(${PLUGIN_NAME} SHARED ${PLUGIN_SRCS} ${PLUGIN_HDR})
  1165. target_link_libraries(${PLUGIN_NAME} websockets_shared)
  1166. add_dependencies(${PLUGIN_NAME} websockets_shared)
  1167. # Set test app specific defines.
  1168. set_property(TARGET ${PLUGIN_NAME}
  1169. PROPERTY COMPILE_DEFINITIONS
  1170. INSTALL_DATADIR="${CMAKE_INSTALL_PREFIX}/plugins"
  1171. )
  1172. # set_target_properties(${PLUGIN_NAME}
  1173. # PROPERTIES
  1174. # OUTPUT_NAME ${PLUGIN_NAME})
  1175. list(APPEND PLUGINS_LIST ${PLUGIN_NAME})
  1176. endmacro()
  1177. create_plugin(protocol_dumb_increment
  1178. "plugins/protocol_dumb_increment.c" "" "")
  1179. create_plugin(protocol_lws_mirror
  1180. "plugins/protocol_lws_mirror.c" "" "")
  1181. create_plugin(protocol_lws_status
  1182. "plugins/protocol_lws_status.c" "" "")
  1183. create_plugin(protocol_post_demo
  1184. "plugins/protocol_post_demo.c" "" "")
  1185. create_plugin(protocol_lws_table_dirlisting
  1186. "plugins/generic-table/protocol_table_dirlisting.c" "" "")
  1187. if (NOT WIN32)
  1188. create_plugin(protocol_lws_raw_test
  1189. "plugins/protocol_lws_raw_test.c" "" "")
  1190. endif()
  1191. if (LWS_WITH_SERVER_STATUS)
  1192. create_plugin(protocol_lws_server_status
  1193. "plugins/protocol_lws_server_status.c" "" "")
  1194. endif()
  1195. if (NOT LWS_WITHOUT_CLIENT)
  1196. create_plugin(protocol_client_loopback_test
  1197. "plugins/protocol_client_loopback_test.c" "" "")
  1198. endif(NOT LWS_WITHOUT_CLIENT)
  1199. if (LWS_WITH_GENERIC_SESSIONS)
  1200. create_plugin(protocol_generic_sessions
  1201. "plugins/generic-sessions/protocol_generic_sessions.c"
  1202. "plugins/generic-sessions/utils.c"
  1203. "plugins/generic-sessions/handlers.c")
  1204. if (WIN32)
  1205. target_link_libraries(protocol_generic_sessions ${LWS_SQLITE3_LIBRARIES})
  1206. else()
  1207. target_link_libraries(protocol_generic_sessions sqlite3 )
  1208. endif(WIN32)
  1209. create_plugin(protocol_lws_messageboard
  1210. "plugins/generic-sessions/protocol_lws_messageboard.c" "" "")
  1211. if (WIN32)
  1212. target_link_libraries(protocol_lws_messageboard ${LWS_SQLITE3_LIBRARIES})
  1213. else()
  1214. target_link_libraries(protocol_lws_messageboard sqlite3 )
  1215. endif(WIN32)
  1216. endif(LWS_WITH_GENERIC_SESSIONS)
  1217. endif(LWS_WITH_PLUGINS AND LWS_WITH_SHARED)
  1218. #
  1219. # Copy OpenSSL dlls to the output directory on Windows.
  1220. # (Otherwise we'll get an error when trying to run)
  1221. #
  1222. if (WIN32 AND LWS_WITH_SSL AND NOT LWS_USE_WOLFSSL)
  1223. if(OPENSSL_BIN_FOUND)
  1224. message("OpenSSL dlls found:")
  1225. message(" Libeay: ${LIBEAY_BIN}")
  1226. message(" SSLeay: ${SSLEAY_BIN}")
  1227. foreach(TARGET_BIN ${TEST_APP_LIST})
  1228. add_custom_command(TARGET ${TARGET_BIN}
  1229. POST_BUILD
  1230. COMMAND "${CMAKE_COMMAND}" -E copy "${LIBEAY_BIN}" "$<TARGET_FILE_DIR:${TARGET_BIN}>" VERBATIM)
  1231. add_custom_command(TARGET ${TARGET_BIN}
  1232. POST_BUILD
  1233. COMMAND "${CMAKE_COMMAND}" -E copy "${SSLEAY_BIN}" "$<TARGET_FILE_DIR:${TARGET_BIN}>" VERBATIM)
  1234. endforeach()
  1235. endif()
  1236. endif()
  1237. endif(NOT LWS_WITHOUT_TESTAPPS)
  1238. if (LWS_WITH_LWSWS)
  1239. list(APPEND LWSWS_SRCS
  1240. "lwsws/main.c"
  1241. )
  1242. if (WIN32)
  1243. list(APPEND LWSWS_SRCS
  1244. ${WIN32_HELPERS_PATH}/getopt.c
  1245. ${WIN32_HELPERS_PATH}/getopt_long.c
  1246. ${WIN32_HELPERS_PATH}/gettimeofday.c
  1247. )
  1248. list(APPEND LWSWS_HDR
  1249. ${WIN32_HELPERS_PATH}/getopt.h
  1250. ${WIN32_HELPERS_PATH}/gettimeofday.h
  1251. )
  1252. endif(WIN32)
  1253. source_group("Headers Private" FILES ${LWSWS_HDR})
  1254. source_group("Sources" FILES ${LWSWS_SRCS})
  1255. add_executable("lwsws" ${LWSWS_SRCS} ${LWSWS_HDR})
  1256. target_link_libraries("lwsws" websockets_shared)
  1257. add_dependencies("lwsws" websockets_shared)
  1258. # Set test app specific defines.
  1259. set_property(TARGET "lwsws"
  1260. PROPERTY COMPILE_DEFINITIONS
  1261. INSTALL_DATADIR="${CMAKE_INSTALL_PREFIX}/share"
  1262. )
  1263. endif (LWS_WITH_LWSWS)
  1264. if (UNIX)
  1265. # Generate and install pkgconfig.
  1266. # (This is not indented, because the tabs will be part of the output)
  1267. file(WRITE "${PROJECT_BINARY_DIR}/libwebsockets.pc"
  1268. "prefix=\"${CMAKE_INSTALL_PREFIX}\"
  1269. exec_prefix=\${prefix}
  1270. libdir=\${exec_prefix}/lib${LIB_SUFFIX}
  1271. includedir=\${prefix}/include
  1272. Name: libwebsockets
  1273. Description: Websockets server and client library
  1274. Version: ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}
  1275. Libs: -L\${libdir} -lwebsockets
  1276. Cflags: -I\${includedir}"
  1277. )
  1278. install(FILES "${PROJECT_BINARY_DIR}/libwebsockets.pc"
  1279. DESTINATION lib${LIB_SUFFIX}/pkgconfig)
  1280. endif(UNIX)
  1281. #
  1282. # Installation preparations.
  1283. #
  1284. if(WIN32 AND NOT CYGWIN)
  1285. set(DEF_INSTALL_CMAKE_DIR cmake)
  1286. else()
  1287. set(DEF_INSTALL_CMAKE_DIR lib${LIB_SUFFIX}/cmake/libwebsockets)
  1288. endif()
  1289. set(LWS_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files")
  1290. # Export targets (This is used for other CMake projects to easily find the libraries and include files).
  1291. export(TARGETS ${LWS_LIBRARIES}
  1292. FILE "${PROJECT_BINARY_DIR}/LibwebsocketsTargets.cmake")
  1293. export(PACKAGE libwebsockets)
  1294. # Generate the config file for the build-tree.
  1295. set(LWS__INCLUDE_DIRS
  1296. "${PROJECT_SOURCE_DIR}/lib"
  1297. "${PROJECT_BINARY_DIR}")
  1298. set(LIBWEBSOCKETS_INCLUDE_DIRS ${LWS__INCLUDE_DIRS} CACHE PATH "Libwebsockets include directories")
  1299. configure_file(${PROJECT_SOURCE_DIR}/cmake/LibwebsocketsConfig.cmake.in
  1300. ${PROJECT_BINARY_DIR}/LibwebsocketsConfig.cmake
  1301. @ONLY)
  1302. # Generate the config file for the installation tree.
  1303. get_filename_component(LWS_ABSOLUTE_INSTALL_CMAKE_DIR ${LWS_INSTALL_CMAKE_DIR} ABSOLUTE)
  1304. get_filename_component(LWS_ABSOLUTE_INSTALL_INCLUDE_DIR ${LWS_INSTALL_INCLUDE_DIR} ABSOLUTE)
  1305. file(RELATIVE_PATH
  1306. REL_INCLUDE_DIR
  1307. "${LWS_ABSOLUTE_INSTALL_CMAKE_DIR}"
  1308. "${LWS_ABSOLUTE_INSTALL_INCLUDE_DIR}") # Calculate the relative directory from the cmake dir.
  1309. # Note the EVENT_CMAKE_DIR is defined in JanssonConfig.cmake.in,
  1310. # we escape it here so it's evaluated when it is included instead
  1311. # so that the include dirs are given relative to where the
  1312. # config file is located.
  1313. set(LWS__INCLUDE_DIRS
  1314. "\${LWS_CMAKE_DIR}/${REL_INCLUDE_DIR}")
  1315. configure_file(${PROJECT_SOURCE_DIR}/cmake/LibwebsocketsConfig.cmake.in
  1316. ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/LibwebsocketsConfig.cmake
  1317. @ONLY)
  1318. # Generate version info for both build-tree and install-tree.
  1319. configure_file(${PROJECT_SOURCE_DIR}/cmake/LibwebsocketsConfigVersion.cmake.in
  1320. ${PROJECT_BINARY_DIR}/LibwebsocketsConfigVersion.cmake
  1321. @ONLY)
  1322. set_target_properties(${LWS_LIBRARIES}
  1323. PROPERTIES PUBLIC_HEADER "${HDR_PUBLIC}")
  1324. #
  1325. # Installation.
  1326. #
  1327. # Install libs and headers.
  1328. install(TARGETS ${LWS_LIBRARIES}
  1329. EXPORT LibwebsocketsTargets
  1330. LIBRARY DESTINATION "${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}" COMPONENT libraries
  1331. ARCHIVE DESTINATION "${LWS_INSTALL_LIB_DIR}${LIB_SUFFIX}" COMPONENT libraries
  1332. RUNTIME DESTINATION "${LWS_INSTALL_BIN_DIR}" COMPONENT libraries # Windows DLLs
  1333. PUBLIC_HEADER DESTINATION "${LWS_INSTALL_INCLUDE_DIR}" COMPONENT dev)
  1334. set(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME "Libraries")
  1335. set(CPACK_COMPONENT_DEV_DISPLAY_NAME "Development files")
  1336. # Install test apps.
  1337. if (NOT LWS_WITHOUT_TESTAPPS AND NOT LWS_WITHOUT_CLIENT)
  1338. install(TARGETS test-client ${TEST_APP_LIST}
  1339. RUNTIME DESTINATION ${LWS_INSTALL_EXAMPLES_DIR}
  1340. COMPONENT examples)
  1341. set(CPACK_COMPONENT_EXAMPLES_DISPLAY_NAME "Example files")
  1342. endif()
  1343. # lwsws
  1344. if (LWS_WITH_LWSWS)
  1345. install(TARGETS lwsws
  1346. RUNTIME DESTINATION "${LWS_INSTALL_BIN_DIR}" COMPONENT lwsws )
  1347. endif()
  1348. # Programs shared files used by the test-server.
  1349. if (NOT LWS_WITHOUT_TESTAPPS AND NOT LWS_WITHOUT_SERVER)
  1350. install(FILES ${TEST_SERVER_DATA}
  1351. DESTINATION share/libwebsockets-test-server
  1352. COMPONENT examples)
  1353. install(FILES "${PROJECT_SOURCE_DIR}/test-server/private/index.html"
  1354. DESTINATION share/libwebsockets-test-server/private
  1355. COMPONENT examples)
  1356. if (LWS_WITH_CGI)
  1357. set(CGI_TEST_SCRIPT "${PROJECT_SOURCE_DIR}/test-server/lws-cgi-test.sh")
  1358. install(FILES ${CGI_TEST_SCRIPT}
  1359. PERMISSIONS OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE OWNER_READ GROUP_READ WORLD_READ
  1360. DESTINATION share/libwebsockets-test-server
  1361. COMPONENT examples)
  1362. endif()
  1363. endif()
  1364. # plugins
  1365. if (LWS_WITH_PLUGINS)
  1366. install(TARGETS ${PLUGINS_LIST}
  1367. PERMISSIONS OWNER_WRITE OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE OWNER_READ GROUP_READ WORLD_READ
  1368. DESTINATION share/libwebsockets-test-server/plugins
  1369. COMPONENT plugins)
  1370. if (LWS_WITH_SERVER_STATUS)
  1371. install(FILES plugins/server-status.html;plugins/lwsws-logo.png
  1372. DESTINATION share/libwebsockets-test-server/server-status
  1373. COMPONENT examples)
  1374. endif()
  1375. if (LWS_WITH_GENERIC_SESSIONS)
  1376. install(FILES
  1377. plugins/generic-sessions/assets/lwsgs-logo.png
  1378. plugins/generic-sessions/assets/seats.jpg
  1379. plugins/generic-sessions/assets/failed-login.html
  1380. plugins/generic-sessions/assets/lwsgs.js
  1381. plugins/generic-sessions/assets/post-register-fail.html
  1382. plugins/generic-sessions/assets/post-register-ok.html
  1383. plugins/generic-sessions/assets/post-verify-ok.html
  1384. plugins/generic-sessions/assets/post-verify-fail.html
  1385. plugins/generic-sessions/assets/sent-forgot-ok.html
  1386. plugins/generic-sessions/assets/sent-forgot-fail.html
  1387. plugins/generic-sessions/assets/post-forgot-ok.html
  1388. plugins/generic-sessions/assets/post-forgot-fail.html
  1389. plugins/generic-sessions/assets/index.html
  1390. DESTINATION share/libwebsockets-test-server/generic-sessions
  1391. COMPONENT examples)
  1392. install(FILES plugins/generic-sessions/assets/successful-login.html
  1393. DESTINATION share/libwebsockets-test-server/generic-sessions/needauth
  1394. COMPONENT examples)
  1395. install(FILES plugins/generic-sessions/assets/admin-login.html
  1396. DESTINATION share/libwebsockets-test-server/generic-sessions/needadmin
  1397. COMPONENT examples)
  1398. endif()
  1399. install(FILES
  1400. plugins/generic-table/assets/lwsgt.js
  1401. plugins/generic-table/assets/index.html
  1402. DESTINATION share/libwebsockets-test-server/generic-table
  1403. COMPONENT examples)
  1404. endif()
  1405. # Install the LibwebsocketsConfig.cmake and LibwebsocketsConfigVersion.cmake
  1406. install(FILES
  1407. "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/LibwebsocketsConfig.cmake"
  1408. "${PROJECT_BINARY_DIR}/LibwebsocketsConfigVersion.cmake"
  1409. DESTINATION "${LWS_INSTALL_CMAKE_DIR}" COMPONENT dev)
  1410. # Install exports for the install-tree.
  1411. install(EXPORT LibwebsocketsTargets
  1412. DESTINATION "${LWS_INSTALL_CMAKE_DIR}" COMPONENT dev)
  1413. # build subdir is not part of sources
  1414. set(CPACK_SOURCE_IGNORE_FILES $(CPACK_SOURCE_IGNORE_FILES) ".git" "build" "tgz" "tar.gz")
  1415. # Most people are more used to "make dist" compared to "make package_source"
  1416. add_custom_target(dist COMMAND "${CMAKE_MAKE_PROGRAM}" package_source)
  1417. include(UseRPMTools)
  1418. if (RPMTools_FOUND)
  1419. RPMTools_ADD_RPM_TARGETS(libwebsockets libwebsockets.spec)
  1420. endif()
  1421. message("---------------------------------------------------------------------")
  1422. message(" Settings: (For more help do cmake -LH <srcpath>)")
  1423. message("---------------------------------------------------------------------")
  1424. message(" LWS_WITH_STATIC = ${LWS_WITH_STATIC}")
  1425. message(" LWS_WITH_SHARED = ${LWS_WITH_SHARED}")
  1426. message(" LWS_WITH_SSL = ${LWS_WITH_SSL} (SSL Support)")
  1427. message(" LWS_SSL_CLIENT_USE_OS_CA_CERTS = ${LWS_SSL_CLIENT_USE_OS_CA_CERTS}")
  1428. message(" LWS_USE_WOLFSSL = ${LWS_USE_WOLFSSL} (wolfSSL/CyaSSL replacement for OpenSSL)")
  1429. if (LWS_USE_WOLFSSL)
  1430. message(" LWS_WOLFSSL_LIBRARIES = ${LWS_WOLFSSL_LIBRARIES}")
  1431. message(" LWS_WOLFSSL_INCLUDE_DIRS = ${LWS_WOLFSSL_INCLUDE_DIRS}")
  1432. endif()
  1433. message(" LWS_WITHOUT_BUILTIN_SHA1 = ${LWS_WITHOUT_BUILTIN_SHA1}")
  1434. message(" LWS_WITHOUT_BUILTIN_GETIFADDRS = ${LWS_WITHOUT_BUILTIN_GETIFADDRS}")
  1435. message(" LWS_WITHOUT_CLIENT = ${LWS_WITHOUT_CLIENT}")
  1436. message(" LWS_WITHOUT_SERVER = ${LWS_WITHOUT_SERVER}")
  1437. message(" LWS_LINK_TESTAPPS_DYNAMIC = ${LWS_LINK_TESTAPPS_DYNAMIC}")
  1438. message(" LWS_WITHOUT_TESTAPPS = ${LWS_WITHOUT_TESTAPPS}")
  1439. message(" LWS_WITHOUT_TEST_SERVER = ${LWS_WITHOUT_TEST_SERVER}")
  1440. message(" LWS_WITHOUT_TEST_SERVER_EXTPOLL = ${LWS_WITHOUT_TEST_SERVER_EXTPOLL}")
  1441. message(" LWS_WITHOUT_TEST_PING = ${LWS_WITHOUT_TEST_PING}")
  1442. message(" LWS_WITHOUT_TEST_ECHO = ${LWS_WITHOUT_TEST_ECHO}")
  1443. message(" LWS_WITHOUT_TEST_CLIENT = ${LWS_WITHOUT_TEST_CLIENT}")
  1444. message(" LWS_WITHOUT_TEST_FRAGGLE = ${LWS_WITHOUT_TEST_FRAGGLE}")
  1445. message(" LWS_WITHOUT_EXTENSIONS = ${LWS_WITHOUT_EXTENSIONS}")
  1446. message(" LWS_WITH_LATENCY = ${LWS_WITH_LATENCY}")
  1447. message(" LWS_WITHOUT_DAEMONIZE = ${LWS_WITHOUT_DAEMONIZE}")
  1448. message(" LWS_USE_LIBEV = ${LWS_USE_LIBEV}")
  1449. message(" LWS_USE_LIBUV = ${LWS_USE_LIBUV}")
  1450. message(" LWS_IPV6 = ${LWS_IPV6}")
  1451. message(" LWS_UNIX_SOCK = ${LWS_UNIX_SOCK}")
  1452. message(" LWS_WITH_HTTP2 = ${LWS_WITH_HTTP2}")
  1453. message(" LWS_SSL_SERVER_WITH_ECDH_CERT = ${LWS_SSL_SERVER_WITH_ECDH_CERT}")
  1454. message(" LWS_MAX_SMP = ${LWS_MAX_SMP}")
  1455. message(" LWS_WITH_CGI = ${LWS_WITH_CGI}")
  1456. message(" LWS_HAVE_OPENSSL_ECDH_H = ${LWS_HAVE_OPENSSL_ECDH_H}")
  1457. message(" LWS_HAVE_SSL_CTX_set1_param = ${LWS_HAVE_SSL_CTX_set1_param}")
  1458. message(" LWS_WITH_HTTP_PROXY = ${LWS_WITH_HTTP_PROXY}")
  1459. message(" LIBHUBBUB_LIBRARIES = ${LIBHUBBUB_LIBRARIES}")
  1460. message(" PLUGINS = ${PLUGINS_LIST}")
  1461. message(" LWS_WITH_ACCESS_LOG = ${LWS_WITH_ACCESS_LOG}")
  1462. message(" LWS_WITH_SERVER_STATUS = ${LWS_WITH_SERVER_STATUS}")
  1463. message(" LWS_WITH_LEJP = ${LWS_WITH_LEJP}")
  1464. message(" LWS_WITH_LEJP_CONF = ${LWS_WITH_LEJP_CONF}")
  1465. message(" LWS_WITH_SMTP = ${LWS_WITH_SMTP}")
  1466. message(" LWS_WITH_GENERIC_SESSIONS = ${LWS_WITH_GENERIC_SESSIONS}")
  1467. message(" LWS_STATIC_PIC = ${LWS_STATIC_PIC}")
  1468. message(" LWS_WITH_RANGES = ${LWS_WITH_RANGES}")
  1469. message(" LWS_PLAT_OPTEE = ${LWS_PLAT_OPTEE}")
  1470. message(" LWS_WITH_ESP32 = ${LWS_WITH_ESP32}")
  1471. message(" LWS_WITH_ZIP_FOPS = ${LWS_WITH_ZIP_FOPS}")
  1472. message("---------------------------------------------------------------------")
  1473. # These will be available to parent projects including libwebsockets using add_subdirectory()
  1474. set(LIBWEBSOCKETS_LIBRARIES ${LWS_LIBRARIES} CACHE STRING "Libwebsocket libraries")
  1475. if (LWS_WITH_STATIC)
  1476. set(LIBWEBSOCKETS_LIBRARIES_STATIC websockets CACHE STRING "Libwebsocket static library")
  1477. endif()
  1478. if (LWS_WITH_SHARED)
  1479. set(LIBWEBSOCKETS_LIBRARIES_SHARED websockets_shared CACHE STRING "Libwebsocket shared library")
  1480. endif()
  1481. # This must always be last!
  1482. include(CPack)