CMakeLists.txt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. # The C API library
  2. set( LIB_TYPE "STATIC" )
  3. if (BUILD_SHARED_LIBS)
  4. set( LIB_TYPE "SHARED" )
  5. endif()
  6. add_library(civetweb-c-library ${LIB_TYPE} civetweb.c)
  7. set_target_properties(civetweb-c-library PROPERTIES
  8. OUTPUT_NAME "civetweb"
  9. EXPORT_NAME "civetweb"
  10. VERSION ${CIVETWEB_VERSION}
  11. SOVERSION ${CIVETWEB_VERSION}
  12. )
  13. if (BUILD_SHARED_LIBS)
  14. target_compile_definitions(civetweb-c-library PRIVATE CIVETWEB_DLL_EXPORTS INTERFACE CIVETWEB_DLL_IMPORTS)
  15. endif()
  16. target_include_directories(
  17. civetweb-c-library PUBLIC
  18. $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
  19. install(
  20. TARGETS civetweb-c-library
  21. EXPORT ${PROJECT_NAME}-targets
  22. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  23. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  24. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  25. COMPONENT civetweb-c-library
  26. INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  27. install(FILES
  28. ${PROJECT_SOURCE_DIR}/include/civetweb.h
  29. DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
  30. COMPONENT civetweb-c-library)
  31. # Need Windows sockets if available
  32. find_package(WinSock)
  33. if (WINSOCK_FOUND)
  34. target_link_libraries(civetweb-c-library WINSOCK::WINSOCK)
  35. endif()
  36. # We need threading
  37. find_package(Threads)
  38. target_link_libraries(civetweb-c-library ${CMAKE_THREAD_LIBS_INIT})
  39. # Need the realtime library if we're using timers
  40. find_package(LibRt)
  41. if (CIVETWEB_ENABLE_WEBSOCKETS AND CIVETWEB_ENABLE_LUA AND LIBRT_FOUND)
  42. target_link_libraries(civetweb-c-library LIBRT::LIBRT)
  43. endif()
  44. # We need to link OpenSSL if not dynamically loading
  45. if (CIVETWEB_ENABLE_SSL)
  46. if (CIVETWEB_ENBALE_MBEDTLS)
  47. find_package(MbedTLS)
  48. include_directories(${MbedTLS_INCLUDE_DIR})
  49. message(STATUS "MbedTLS include directory: {MbedTLS_INCLUDE_DIR}")
  50. target_link_libraries(civetweb-c-library ${MbedTLS_LIBRARIES})
  51. else()
  52. if (CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING)
  53. find_package(LibDl)
  54. if (LIBDL_FOUND)
  55. target_link_libraries(civetweb-c-library -ldl)
  56. endif()
  57. else()
  58. find_package(OpenSSL)
  59. include_directories(${OPENSSL_INCLUDE_DIR})
  60. message(STATUS "OpenSSL include directory: ${OPENSSL_INCLUDE_DIR}")
  61. target_link_libraries(civetweb-c-library ${OPENSSL_LIBRARIES})
  62. endif()
  63. endif()
  64. endif()
  65. # If Lua support is needed we build some extra Lua libraries
  66. if (CIVETWEB_ENABLE_LUA)
  67. include(ExternalProject)
  68. # Determine if we should print to the output
  69. if (CIVETWEB_ENABLE_THIRD_PARTY_OUTPUT)
  70. set(THIRD_PARTY_LOGGING 0)
  71. else()
  72. set(THIRD_PARTY_LOGGING 1)
  73. endif()
  74. # If Lua is static we must build it from source
  75. if (NOT CIVETWEB_ENABLE_LUA_SHARED)
  76. if (LINUX)
  77. set(LUA_MAKE_TARGET linux)
  78. elseif(DARWIN)
  79. set(LUA_MAKE_TARGET macosx)
  80. elseif(FREEBSD)
  81. set(LUA_MAKE_TARGET freebsd)
  82. elseif(WINDOWS)
  83. set(LUA_MAKE_TARGET mingw)
  84. elseif(UNIX)
  85. set(LUA_MAKE_TARGET posix)
  86. else()
  87. set(LUA_MAKE_TARGET generic)
  88. endif()
  89. set(LUA_BUILD_COMMAND "${CMAKE_MAKE_PROGRAM};${LUA_MAKE_TARGET}")
  90. if (BUILD_SHARED_LIBS)
  91. set(LUA_BUILD_COMMAND "${LUA_BUILD_COMMAND};MYCFLAGS=-fPIC")
  92. endif()
  93. ExternalProject_Add(lua
  94. URL "http://www.lua.org/ftp/lua-${CIVETWEB_LUA_VERSION}.tar.gz"
  95. URL_MD5 ${CIVETWEB_LUA_MD5_HASH}
  96. PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
  97. CONFIGURE_COMMAND ""
  98. BUILD_COMMAND ${LUA_BUILD_COMMAND}
  99. BUILD_IN_SOURCE 1
  100. INSTALL_COMMAND make install "INSTALL_TOP=<INSTALL_DIR>"
  101. LOG_DOWNLOAD ${THIRD_PARTY_LOGGING}
  102. LOG_UPDATE ${THIRD_PARTY_LOGGING}
  103. LOG_CONFIGURE ${THIRD_PARTY_LOGGING}
  104. LOG_BUILD ${THIRD_PARTY_LOGGING}
  105. LOG_TEST ${THIRD_PARTY_LOGGING}
  106. LOG_INSTALL ${THIRD_PARTY_LOGGING})
  107. ExternalProject_Get_Property(lua INSTALL_DIR)
  108. set(LUA_INSTALL_DIR ${INSTALL_DIR})
  109. unset(INSTALL_DIR)
  110. link_directories("${LUA_INSTALL_DIR}/lib")
  111. include_directories("${LUA_INSTALL_DIR}/include")
  112. set(LUA_LIBRARIES "${LUA_INSTALL_DIR}/lib/liblua.a")
  113. add_dependencies(civetweb-c-library lua)
  114. else()
  115. find_package(Lua)
  116. endif()
  117. # Lua Filesystem Support
  118. string(REPLACE "." "_" LUA_FILESYSTEM_VERSION_UNDERSCORE ${CIVETWEB_LUA_FILESYSTEM_VERSION})
  119. ExternalProject_Add(luafilesystem
  120. URL "https://github.com/keplerproject/luafilesystem/archive/v_${LUA_FILESYSTEM_VERSION_UNDERSCORE}.tar.gz"
  121. URL_MD5 ${CIVETWEB_LUA_FILESYSTEM_MD5_HASH}
  122. PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
  123. PATCH_COMMAND ${CMAKE_COMMAND} -E copy
  124. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/luafilesystem/CMakeLists.txt" <SOURCE_DIR>/CMakeLists.txt
  125. CMAKE_ARGS
  126. "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
  127. "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
  128. LOG_DOWNLOAD ${THIRD_PARTY_LOGGING}
  129. LOG_UPDATE ${THIRD_PARTY_LOGGING}
  130. LOG_CONFIGURE ${THIRD_PARTY_LOGGING}
  131. LOG_BUILD ${THIRD_PARTY_LOGGING}
  132. LOG_TEST ${THIRD_PARTY_LOGGING}
  133. LOG_INSTALL ${THIRD_PARTY_LOGGING})
  134. ExternalProject_Get_Property(luafilesystem INSTALL_DIR)
  135. set(LUA_FILESYSTEM_INSTALL_DIR ${INSTALL_DIR})
  136. unset(INSTALL_DIR)
  137. link_directories("${LUA_FILESYSTEM_INSTALL_DIR}/lib")
  138. include_directories("${LUA_FILESYSTEM_INSTALL_DIR}/include")
  139. set(LUA_LIBRARIES "${LUA_LIBRARIES};${LUA_FILESYSTEM_INSTALL_DIR}/lib/libluafilesystem.a")
  140. add_dependencies(civetweb-c-library luafilesystem)
  141. # Lua SQLite Support
  142. if (${CIVETWEB_LUA_SQLITE_VERSION} VERSION_EQUAL "0.9.3")
  143. set(LUA_SQLITE_FILENAME lsqlite3_fsl09w.zip)
  144. elseif (${CIVETWEB_LUA_SQLITE_VERSION} VERSION_EQUAL "0.9.2")
  145. set(LUA_SQLITE_FILENAME lsqlite3_fsl09v.zip)
  146. elseif (${CIVETWEB_LUA_SQLITE_VERSION} VERSION_EQUAL "0.9.1")
  147. set(LUA_SQLITE_FILENAME lsqlite3_fsl09t.zip)
  148. else()
  149. message(FATAL_ERROR "The Lua SQLite archive filename is unknown for version ${CIVETWEB_LUA_SQLITE_VERSION}")
  150. endif()
  151. ExternalProject_Add(luasqlite
  152. URL "http://lua.sqlite.org/index.cgi/zip/${LUA_SQLITE_FILENAME}"
  153. URL_MD5 ${CIVETWEB_LUA_SQLITE_MD5_HASH}
  154. PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
  155. PATCH_COMMAND ${CMAKE_COMMAND} -E copy
  156. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/luasqlite/CMakeLists.txt" <SOURCE_DIR>/CMakeLists.txt
  157. CMAKE_ARGS
  158. "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
  159. "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
  160. LOG_DOWNLOAD ${THIRD_PARTY_LOGGING}
  161. LOG_UPDATE ${THIRD_PARTY_LOGGING}
  162. LOG_CONFIGURE ${THIRD_PARTY_LOGGING}
  163. LOG_BUILD ${THIRD_PARTY_LOGGING}
  164. LOG_TEST ${THIRD_PARTY_LOGGING}
  165. LOG_INSTALL ${THIRD_PARTY_LOGGING})
  166. ExternalProject_Get_Property(luasqlite INSTALL_DIR)
  167. set(LUA_SQLITE_INSTALL_DIR ${INSTALL_DIR})
  168. unset(INSTALL_DIR)
  169. link_directories("${LUA_SQLITE_INSTALL_DIR}/lib")
  170. set(LUA_LIBRARIES "${LUA_LIBRARIES};${LUA_SQLITE_INSTALL_DIR}/lib/libluasqlite.a")
  171. add_dependencies(civetweb-c-library luasqlite)
  172. # Lua XML Support
  173. if (${CIVETWEB_LUA_XML_VERSION} VERSION_EQUAL "1.8.0")
  174. set(LUA_XML_FILENAME LuaXML_130610.zip)
  175. elseif (${CIVETWEB_LUA_XML_VERSION} VERSION_EQUAL "1.7.4")
  176. set(LUA_XML_FILENAME LuaXML_101012.zip)
  177. else()
  178. message(FATAL_ERROR "The Lua XML archive filename is unknown for version ${CIVETWEB_LUA_XML_VERSION}")
  179. endif()
  180. ExternalProject_Add(luaxml
  181. # Old:
  182. # URL "http://viremo.eludi.net/LuaXML/${LUA_XML_FILENAME}"
  183. # URL_MD5 ${CIVETWEB_LUA_XML_MD5_HASH}
  184. # PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
  185. #
  186. # TODO: find current sourde
  187. # viremo.eludi.net does no longer exist
  188. # An extended version is available at https://github.com/n1tehawk/LuaXML
  189. # but the last commit there was in 2015
  190. #
  191. URL "https://github.com/n1tehawk/LuaXML/archive/v1.8.0.zip"
  192. PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
  193. #
  194. # TODO: fix this patch command (needs someone with deeper CMake know how)
  195. PATCH_COMMAND ${CMAKE_COMMAND} -E copy
  196. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/luaxml/CMakeLists.txt" <SOURCE_DIR>/CMakeLists.txt
  197. CMAKE_ARGS
  198. "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
  199. "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
  200. LOG_DOWNLOAD ${THIRD_PARTY_LOGGING}
  201. LOG_UPDATE ${THIRD_PARTY_LOGGING}
  202. LOG_CONFIGURE ${THIRD_PARTY_LOGGING}
  203. LOG_BUILD ${THIRD_PARTY_LOGGING}
  204. LOG_TEST ${THIRD_PARTY_LOGGING}
  205. LOG_INSTALL ${THIRD_PARTY_LOGGING})
  206. ExternalProject_Get_Property(luaxml INSTALL_DIR)
  207. set(LUA_XML_INSTALL_DIR ${INSTALL_DIR})
  208. unset(INSTALL_DIR)
  209. link_directories("${LUA_XML_INSTALL_DIR}/lib")
  210. set(LUA_LIBRARIES "${LUA_LIBRARIES};${LUA_XML_INSTALL_DIR}/lib/libluaxml.a")
  211. add_dependencies(civetweb-c-library luaxml)
  212. # SQLite Support
  213. string (REGEX MATCHALL "[0-9]+" SQLITE_VERSION_MATCHES ${CIVETWEB_SQLITE_VERSION})
  214. list(GET SQLITE_VERSION_MATCHES 0 SQLITE_VERSION_MAJOR)
  215. list(GET SQLITE_VERSION_MATCHES 1 SQLITE_VERSION_MINOR)
  216. list(GET SQLITE_VERSION_MATCHES 2 SQLITE_VERSION_PATCH)
  217. set(SQLITE_FILE_VERSION ${SQLITE_VERSION_MAJOR}0${SQLITE_VERSION_MINOR}0${SQLITE_VERSION_PATCH}00)
  218. ExternalProject_Add(sqlite
  219. URL "http://www.sqlite.org/2015/sqlite-amalgamation-${SQLITE_FILE_VERSION}.zip"
  220. URL_MD5 ${CIVETWEB_SQLITE_MD5_HASH}
  221. PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
  222. PATCH_COMMAND ${CMAKE_COMMAND} -E copy
  223. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/sqlite/CMakeLists.txt" <SOURCE_DIR>/CMakeLists.txt
  224. CMAKE_ARGS
  225. "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
  226. "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
  227. LOG_DOWNLOAD ${THIRD_PARTY_LOGGING}
  228. LOG_UPDATE ${THIRD_PARTY_LOGGING}
  229. LOG_CONFIGURE ${THIRD_PARTY_LOGGING}
  230. LOG_BUILD ${THIRD_PARTY_LOGGING}
  231. LOG_TEST ${THIRD_PARTY_LOGGING}
  232. LOG_INSTALL ${THIRD_PARTY_LOGGING})
  233. ExternalProject_Get_Property(sqlite INSTALL_DIR)
  234. set(SQLITE_INSTALL_DIR ${INSTALL_DIR})
  235. unset(INSTALL_DIR)
  236. link_directories("${SQLITE_INSTALL_DIR}/lib")
  237. include_directories("${SQLITE_INSTALL_DIR}/include")
  238. set(LUA_LIBRARIES "${LUA_LIBRARIES};${SQLITE_INSTALL_DIR}/lib/libsqlite.a")
  239. add_dependencies(civetweb-c-library sqlite)
  240. # Link all the Lua libraries
  241. target_link_libraries(civetweb-c-library ${LUA_LIBRARIES})
  242. endif()
  243. if (CIVETWEB_ENABLE_ZLIB)
  244. find_package(ZLIB)
  245. include_directories(${ZLIB_INCLUDE_DIRS})
  246. target_link_libraries(civetweb-c-library ${ZLIB_LIBRARIES})
  247. endif()
  248. # The web server executable
  249. if (CIVETWEB_ENABLE_SERVER_EXECUTABLE)
  250. add_executable(civetweb-c-executable main.c)
  251. set_target_properties(civetweb-c-executable PROPERTIES
  252. EXPORT_NAME "server"
  253. OUTPUT_NAME "civetweb"
  254. )
  255. if (CIVETWEB_INSTALL_EXECUTABLE)
  256. install(
  257. TARGETS civetweb-c-executable
  258. EXPORT ${PROJECT_NAME}-targets
  259. DESTINATION ${CMAKE_INSTALL_BINDIR}
  260. COMPONENT server)
  261. endif()
  262. target_include_directories(
  263. civetweb-c-executable PUBLIC
  264. $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
  265. target_link_libraries(civetweb-c-executable civetweb-c-library)
  266. if (LIBRT_FOUND)
  267. target_link_libraries(civetweb-c-executable LIBRT::LIBRT)
  268. endif()
  269. endif()
  270. if (CIVETWEB_ENABLE_LUA)
  271. add_library(lua-library third_party/lfs.c third_party/lsqlite3.c third_party/LuaXML_lib.c third_party/sqlite3.c)
  272. set_target_properties(lua-library PROPERTIES
  273. OUTPUT_NAME "lua-library"
  274. VERSION ${CIVETWEB_VERSION}
  275. SOVERSION ${CIVETWEB_VERSION}
  276. )
  277. target_include_directories(
  278. lua-library PUBLIC
  279. $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/third_party/lua-5.2.4>)
  280. install(
  281. TARGETS lua-library
  282. EXPORT ${PROJECT_NAME}-targets
  283. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  284. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  285. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  286. COMPONENT lua-library
  287. INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  288. endif()
  289. # The C++ API library
  290. if (CIVETWEB_ENABLE_CXX)
  291. add_library(civetweb-cpp ${LIB_TYPE} CivetServer.cpp)
  292. set_target_properties(civetweb-cpp PROPERTIES
  293. EXPORT_NAME "civetweb-cpp"
  294. OUTPUT_NAME "civetweb-cpp"
  295. VERSION ${CIVETWEB_VERSION}
  296. SOVERSION ${CIVETWEB_VERSION}
  297. )
  298. if (BUILD_SHARED_LIBS)
  299. target_compile_definitions(civetweb-cpp PRIVATE CIVETWEB_CXX_DLL_EXPORTS INTERFACE CIVETWEB_CXX_DLL_IMPORTS)
  300. endif()
  301. target_link_libraries(
  302. civetweb-cpp PUBLIC
  303. civetweb-c-library)
  304. target_include_directories(
  305. civetweb-cpp PUBLIC
  306. $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
  307. install(
  308. TARGETS civetweb-cpp
  309. EXPORT ${PROJECT_NAME}-targets
  310. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  311. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  312. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  313. COMPONENT civetweb-cpp
  314. INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  315. install(FILES
  316. ${PROJECT_SOURCE_DIR}/include/CivetServer.h
  317. DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
  318. COMPONENT civetweb-cpp)
  319. endif()
  320. # Configure lookup behavior in civetweb config
  321. if(LIBDL_FOUND)
  322. set(LOOKUP_LIBDL TRUE PARENT_SCOPE)
  323. else()
  324. set(LOOKUP_LIBDL FALSE PARENT_SCOPE)
  325. endif()
  326. if(LIBRT_FOUND)
  327. set(LOOKUP_LIBRT TRUE PARENT_SCOPE)
  328. else()
  329. set(LOOKUP_LIBRT FALSE PARENT_SCOPE)
  330. endif()
  331. if(WINSOCK_FOUND)
  332. set(LOOKUP_WINSOCK TRUE PARENT_SCOPE)
  333. else()
  334. set(LOOKUP_WINSOCK FALSE PARENT_SCOPE)
  335. endif()