123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- # The C API library
- set( LIB_TYPE "STATIC" )
- if (BUILD_SHARED_LIBS)
- set( LIB_TYPE "SHARED" )
- endif()
- add_library(civetweb-c-library ${LIB_TYPE} civetweb.c)
- set_target_properties(civetweb-c-library PROPERTIES
- OUTPUT_NAME "civetweb"
- EXPORT_NAME "civetweb"
- VERSION ${CIVETWEB_VERSION}
- SOVERSION ${CIVETWEB_VERSION}
- )
- if (BUILD_SHARED_LIBS)
- target_compile_definitions(civetweb-c-library PRIVATE CIVETWEB_DLL_EXPORTS INTERFACE CIVETWEB_DLL_IMPORTS)
- endif()
- target_include_directories(
- civetweb-c-library PUBLIC
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
- install(
- TARGETS civetweb-c-library
- EXPORT ${PROJECT_NAME}-targets
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
- COMPONENT civetweb-c-library
- INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
- install(FILES
- ${PROJECT_SOURCE_DIR}/include/civetweb.h
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT civetweb-c-library)
- # Need Windows sockets if available
- find_package(WinSock)
- if (WINSOCK_FOUND)
- target_link_libraries(civetweb-c-library WINSOCK::WINSOCK)
- endif()
- # We need threading
- find_package(Threads)
- target_link_libraries(civetweb-c-library ${CMAKE_THREAD_LIBS_INIT})
- # Need the realtime library if we're using timers
- find_package(LibRt)
- if (CIVETWEB_ENABLE_WEBSOCKETS AND CIVETWEB_ENABLE_LUA AND LIBRT_FOUND)
- target_link_libraries(civetweb-c-library LIBRT::LIBRT)
- endif()
- # We need to link OpenSSL if not dynamically loading
- if (CIVETWEB_ENABLE_SSL)
- if (CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING)
- find_package(LibDl)
- if (LIBDL_FOUND)
- target_link_libraries(civetweb-c-library -ldl)
- endif()
- else()
- find_package(OpenSSL)
- include_directories(${OPENSSL_INCLUDE_DIR})
- message(STATUS "OpenSSL include directory: ${OPENSSL_INCLUDE_DIR}")
- target_link_libraries(civetweb-c-library ${OPENSSL_LIBRARIES})
- endif()
- endif()
- # If Lua support is needed we build some extra Lua libraries
- if (CIVETWEB_ENABLE_LUA)
- include(ExternalProject)
- # Determine if we should print to the output
- if (CIVETWEB_ENABLE_THIRD_PARTY_OUTPUT)
- set(THIRD_PARTY_LOGGING 0)
- else()
- set(THIRD_PARTY_LOGGING 1)
- endif()
- # If Lua is static we must build it from source
- if (NOT CIVETWEB_ENABLE_LUA_SHARED)
- if (LINUX)
- set(LUA_MAKE_TARGET linux)
- elseif(DARWIN)
- set(LUA_MAKE_TARGET macosx)
- elseif(FREEBSD)
- set(LUA_MAKE_TARGET freebsd)
- elseif(WINDOWS)
- set(LUA_MAKE_TARGET mingw)
- elseif(UNIX)
- set(LUA_MAKE_TARGET posix)
- else()
- set(LUA_MAKE_TARGET generic)
- endif()
- set(LUA_BUILD_COMMAND "${CMAKE_MAKE_PROGRAM};${LUA_MAKE_TARGET}")
- if (BUILD_SHARED_LIBS)
- set(LUA_BUILD_COMMAND "${LUA_BUILD_COMMAND};MYCFLAGS=-fPIC")
- endif()
- ExternalProject_Add(lua
- URL "http://www.lua.org/ftp/lua-${CIVETWEB_LUA_VERSION}.tar.gz"
- URL_MD5 ${CIVETWEB_LUA_MD5_HASH}
- PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
- CONFIGURE_COMMAND ""
- BUILD_COMMAND ${LUA_BUILD_COMMAND}
- BUILD_IN_SOURCE 1
- INSTALL_COMMAND make install "INSTALL_TOP=<INSTALL_DIR>"
- LOG_DOWNLOAD ${THIRD_PARTY_LOGGING}
- LOG_UPDATE ${THIRD_PARTY_LOGGING}
- LOG_CONFIGURE ${THIRD_PARTY_LOGGING}
- LOG_BUILD ${THIRD_PARTY_LOGGING}
- LOG_TEST ${THIRD_PARTY_LOGGING}
- LOG_INSTALL ${THIRD_PARTY_LOGGING})
- ExternalProject_Get_Property(lua INSTALL_DIR)
- set(LUA_INSTALL_DIR ${INSTALL_DIR})
- unset(INSTALL_DIR)
- link_directories("${LUA_INSTALL_DIR}/lib")
- include_directories("${LUA_INSTALL_DIR}/include")
- set(LUA_LIBRARIES "${LUA_INSTALL_DIR}/lib/liblua.a")
- add_dependencies(civetweb-c-library lua)
- else()
- find_package(Lua)
- endif()
- # Lua Filesystem Support
- string(REPLACE "." "_" LUA_FILESYSTEM_VERSION_UNDERSCORE ${CIVETWEB_LUA_FILESYSTEM_VERSION})
- ExternalProject_Add(luafilesystem
- URL "https://github.com/keplerproject/luafilesystem/archive/v_${LUA_FILESYSTEM_VERSION_UNDERSCORE}.tar.gz"
- URL_MD5 ${CIVETWEB_LUA_FILESYSTEM_MD5_HASH}
- PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
- PATCH_COMMAND ${CMAKE_COMMAND} -E copy
- "${CMAKE_CURRENT_SOURCE_DIR}/cmake/luafilesystem/CMakeLists.txt" <SOURCE_DIR>/CMakeLists.txt
- CMAKE_ARGS
- "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
- "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
- LOG_DOWNLOAD ${THIRD_PARTY_LOGGING}
- LOG_UPDATE ${THIRD_PARTY_LOGGING}
- LOG_CONFIGURE ${THIRD_PARTY_LOGGING}
- LOG_BUILD ${THIRD_PARTY_LOGGING}
- LOG_TEST ${THIRD_PARTY_LOGGING}
- LOG_INSTALL ${THIRD_PARTY_LOGGING})
- ExternalProject_Get_Property(luafilesystem INSTALL_DIR)
- set(LUA_FILESYSTEM_INSTALL_DIR ${INSTALL_DIR})
- unset(INSTALL_DIR)
- link_directories("${LUA_FILESYSTEM_INSTALL_DIR}/lib")
- include_directories("${LUA_FILESYSTEM_INSTALL_DIR}/include")
- set(LUA_LIBRARIES "${LUA_LIBRARIES};${LUA_FILESYSTEM_INSTALL_DIR}/lib/libluafilesystem.a")
- add_dependencies(civetweb-c-library luafilesystem)
- # Lua SQLite Support
- if (${CIVETWEB_LUA_SQLITE_VERSION} VERSION_EQUAL "0.9.3")
- set(LUA_SQLITE_FILENAME lsqlite3_fsl09w.zip)
- elseif (${CIVETWEB_LUA_SQLITE_VERSION} VERSION_EQUAL "0.9.2")
- set(LUA_SQLITE_FILENAME lsqlite3_fsl09v.zip)
- elseif (${CIVETWEB_LUA_SQLITE_VERSION} VERSION_EQUAL "0.9.1")
- set(LUA_SQLITE_FILENAME lsqlite3_fsl09t.zip)
- else()
- message(FATAL_ERROR "The Lua SQLite archive filename is unknown for version ${CIVETWEB_LUA_SQLITE_VERSION}")
- endif()
- ExternalProject_Add(luasqlite
- URL "http://lua.sqlite.org/index.cgi/zip/${LUA_SQLITE_FILENAME}"
- URL_MD5 ${CIVETWEB_LUA_SQLITE_MD5_HASH}
- PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
- PATCH_COMMAND ${CMAKE_COMMAND} -E copy
- "${CMAKE_CURRENT_SOURCE_DIR}/cmake/luasqlite/CMakeLists.txt" <SOURCE_DIR>/CMakeLists.txt
- CMAKE_ARGS
- "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
- "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
- LOG_DOWNLOAD ${THIRD_PARTY_LOGGING}
- LOG_UPDATE ${THIRD_PARTY_LOGGING}
- LOG_CONFIGURE ${THIRD_PARTY_LOGGING}
- LOG_BUILD ${THIRD_PARTY_LOGGING}
- LOG_TEST ${THIRD_PARTY_LOGGING}
- LOG_INSTALL ${THIRD_PARTY_LOGGING})
- ExternalProject_Get_Property(luasqlite INSTALL_DIR)
- set(LUA_SQLITE_INSTALL_DIR ${INSTALL_DIR})
- unset(INSTALL_DIR)
- link_directories("${LUA_SQLITE_INSTALL_DIR}/lib")
- set(LUA_LIBRARIES "${LUA_LIBRARIES};${LUA_SQLITE_INSTALL_DIR}/lib/libluasqlite.a")
- add_dependencies(civetweb-c-library luasqlite)
- # Lua XML Support
- if (${CIVETWEB_LUA_XML_VERSION} VERSION_EQUAL "1.8.0")
- set(LUA_XML_FILENAME LuaXML_130610.zip)
- elseif (${CIVETWEB_LUA_XML_VERSION} VERSION_EQUAL "1.7.4")
- set(LUA_XML_FILENAME LuaXML_101012.zip)
- else()
- message(FATAL_ERROR "The Lua XML archive filename is unknown for version ${CIVETWEB_LUA_XML_VERSION}")
- endif()
- ExternalProject_Add(luaxml
- # Old:
- # URL "http://viremo.eludi.net/LuaXML/${LUA_XML_FILENAME}"
- # URL_MD5 ${CIVETWEB_LUA_XML_MD5_HASH}
- # PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
- #
- # TODO: find current sourde
- # viremo.eludi.net does no longer exist
- # An extended version is available at https://github.com/n1tehawk/LuaXML
- # but the last commit there was in 2015
- #
- URL "https://github.com/n1tehawk/LuaXML/archive/v1.8.0.zip"
- PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
- #
- # TODO: fix this patch command (needs someone with deeper CMake know how)
- PATCH_COMMAND ${CMAKE_COMMAND} -E copy
- "${CMAKE_CURRENT_SOURCE_DIR}/cmake/luaxml/CMakeLists.txt" <SOURCE_DIR>/CMakeLists.txt
- CMAKE_ARGS
- "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
- "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
- LOG_DOWNLOAD ${THIRD_PARTY_LOGGING}
- LOG_UPDATE ${THIRD_PARTY_LOGGING}
- LOG_CONFIGURE ${THIRD_PARTY_LOGGING}
- LOG_BUILD ${THIRD_PARTY_LOGGING}
- LOG_TEST ${THIRD_PARTY_LOGGING}
- LOG_INSTALL ${THIRD_PARTY_LOGGING})
- ExternalProject_Get_Property(luaxml INSTALL_DIR)
- set(LUA_XML_INSTALL_DIR ${INSTALL_DIR})
- unset(INSTALL_DIR)
- link_directories("${LUA_XML_INSTALL_DIR}/lib")
- set(LUA_LIBRARIES "${LUA_LIBRARIES};${LUA_XML_INSTALL_DIR}/lib/libluaxml.a")
- add_dependencies(civetweb-c-library luaxml)
- # SQLite Support
- string (REGEX MATCHALL "[0-9]+" SQLITE_VERSION_MATCHES ${CIVETWEB_SQLITE_VERSION})
- list(GET SQLITE_VERSION_MATCHES 0 SQLITE_VERSION_MAJOR)
- list(GET SQLITE_VERSION_MATCHES 1 SQLITE_VERSION_MINOR)
- list(GET SQLITE_VERSION_MATCHES 2 SQLITE_VERSION_PATCH)
- set(SQLITE_FILE_VERSION ${SQLITE_VERSION_MAJOR}0${SQLITE_VERSION_MINOR}0${SQLITE_VERSION_PATCH}00)
- ExternalProject_Add(sqlite
- URL "http://www.sqlite.org/2015/sqlite-amalgamation-${SQLITE_FILE_VERSION}.zip"
- URL_MD5 ${CIVETWEB_SQLITE_MD5_HASH}
- PREFIX "${CIVETWEB_THIRD_PARTY_DIR}"
- PATCH_COMMAND ${CMAKE_COMMAND} -E copy
- "${CMAKE_CURRENT_SOURCE_DIR}/cmake/sqlite/CMakeLists.txt" <SOURCE_DIR>/CMakeLists.txt
- CMAKE_ARGS
- "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
- "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
- LOG_DOWNLOAD ${THIRD_PARTY_LOGGING}
- LOG_UPDATE ${THIRD_PARTY_LOGGING}
- LOG_CONFIGURE ${THIRD_PARTY_LOGGING}
- LOG_BUILD ${THIRD_PARTY_LOGGING}
- LOG_TEST ${THIRD_PARTY_LOGGING}
- LOG_INSTALL ${THIRD_PARTY_LOGGING})
- ExternalProject_Get_Property(sqlite INSTALL_DIR)
- set(SQLITE_INSTALL_DIR ${INSTALL_DIR})
- unset(INSTALL_DIR)
- link_directories("${SQLITE_INSTALL_DIR}/lib")
- include_directories("${SQLITE_INSTALL_DIR}/include")
- set(LUA_LIBRARIES "${LUA_LIBRARIES};${SQLITE_INSTALL_DIR}/lib/libsqlite.a")
- add_dependencies(civetweb-c-library sqlite)
- # Link all the Lua libraries
- target_link_libraries(civetweb-c-library ${LUA_LIBRARIES})
- endif()
- # The web server executable
- if (CIVETWEB_ENABLE_SERVER_EXECUTABLE)
- add_executable(civetweb-c-executable main.c)
- set_target_properties(civetweb-c-executable PROPERTIES
- EXPORT_NAME "server"
- OUTPUT_NAME "civetweb"
- )
- if (CIVETWEB_INSTALL_EXECUTABLE)
- install(
- TARGETS civetweb-c-executable
- EXPORT ${PROJECT_NAME}-targets
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
- COMPONENT server)
- endif()
- target_include_directories(
- civetweb-c-executable PUBLIC
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
- target_link_libraries(civetweb-c-executable civetweb-c-library)
- if (LIBRT_FOUND)
- target_link_libraries(civetweb-c-executable LIBRT::LIBRT)
- endif()
- endif()
- if (CIVETWEB_ENABLE_LUA)
- add_library(lua-library third_party/lfs.c third_party/lsqlite3.c third_party/LuaXML_lib.c third_party/sqlite3.c)
- set_target_properties(lua-library PROPERTIES
- OUTPUT_NAME "lua-library"
- VERSION ${CIVETWEB_VERSION}
- SOVERSION ${CIVETWEB_VERSION}
- )
- target_include_directories(
- lua-library PUBLIC
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/third_party/lua-5.2.4>)
- install(
- TARGETS lua-library
- EXPORT ${PROJECT_NAME}-targets
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
- COMPONENT lua-library
- INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
- endif()
- # The C++ API library
- if (CIVETWEB_ENABLE_CXX)
- add_library(civetweb-cpp ${LIB_TYPE} CivetServer.cpp)
- set_target_properties(civetweb-cpp PROPERTIES
- EXPORT_NAME "civetweb-cpp"
- OUTPUT_NAME "civetweb-cpp"
- VERSION ${CIVETWEB_VERSION}
- SOVERSION ${CIVETWEB_VERSION}
- )
- if (BUILD_SHARED_LIBS)
- target_compile_definitions(civetweb-cpp PRIVATE CIVETWEB_CXX_DLL_EXPORTS INTERFACE CIVETWEB_CXX_DLL_IMPORTS)
- endif()
- target_link_libraries(
- civetweb-cpp PUBLIC
- civetweb-c-library)
- target_include_directories(
- civetweb-cpp PUBLIC
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
- install(
- TARGETS civetweb-cpp
- EXPORT ${PROJECT_NAME}-targets
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
- COMPONENT civetweb-cpp
- INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
- install(FILES
- ${PROJECT_SOURCE_DIR}/include/CivetServer.h
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT civetweb-cpp)
- endif()
- # Configure lookup behavior in civetweb config
- if(LIBDL_FOUND)
- set(LOOKUP_LIBDL TRUE PARENT_SCOPE)
- else()
- set(LOOKUP_LIBDL FALSE PARENT_SCOPE)
- endif()
- if(LIBRT_FOUND)
- set(LOOKUP_LIBRT TRUE PARENT_SCOPE)
- else()
- set(LOOKUP_LIBRT FALSE PARENT_SCOPE)
- endif()
- if(WINSOCK_FOUND)
- set(LOOKUP_WINSOCK TRUE PARENT_SCOPE)
- else()
- set(LOOKUP_WINSOCK FALSE PARENT_SCOPE)
- endif()
|