CMakeLists.txt 51 KB

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