Skip to content
Open
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
CMAKE_C_COMPILER=clang
CMAKE_CXX_COMPILER=clang++
CMAKE_GENERATOR=Ninja
builtin_civetweb=ON
builtin_freetype=ON
builtin_gif=ON
builtin_gl2ps=ON
Expand Down
121 changes: 121 additions & 0 deletions builtins/civetweb/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
# Copyright (C) 1995-2019, Rene Brun and Fons Rademakers.
# All rights reserved.
#
# For the licensing terms see $ROOTSYS/LICENSE.
# For the list of contributors see $ROOTSYS/README/CREDITS.

# **PLEASE UPDATE ALSO THE FOLLOWING LINE WHEN UPDATING THE VERSION**
# 10 Apr 2023, https://github.com/civetweb/civetweb/releases/tag/v1.16
set(ROOT_CIVETWEB_VERSION 1.16)
set(ROOT_CIVETWEB_HASH "f0e471c1bf4e7804a6cfb41ea9d13e7d623b2bcc7bc1e2a4dd54951a24d60285")
set(ROOT_CIVETWEB_PREFIX ${CMAKE_BINARY_DIR}/builtins/CIVETWEB-prefix)
set(ROOT_CIVETWEB_LIBRARY ${ROOT_CIVETWEB_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}civetweb${CMAKE_STATIC_LIBRARY_SUFFIX})

if (NOT DEFINED GIT_EXECUTABLE)
set(GIT_EXECUTABLE "git")
endif()

include(ExternalProject)

# Clear cache variables set by find_package(CIVETWEB)
# to ensure that we use the builtin version
foreach(var CIVETWEB_LIBRARIES CIVETWEB_LIBRARY CIVETWEB_LIBRARY_DEBUG CIVETWEB_LIBRARY_RELEASE CIVETWEB_FOUND CIVETWEB_VERSION CIVETWEB_INCLUDE_DIR CIVETWEB_LIBRARY CIVETWEB_LIBRARIES)
unset(${var})
unset(${var} CACHE)
endforeach()

if(WIN32 AND NOT CMAKE_GENERATOR MATCHES Ninja)
if(winrtdebug)
set(ROOT_CIVETWEB_BUILD_COMMAND_FLAGS "--config Debug")
else()
set(ROOT_CIVETWEB_BUILD_COMMAND_FLAGS "--config $<IF:$<CONFIG:Debug,RelWithDebInfo>,RelWithDebInfo,Release>")
endif()
endif()

if(ssl)
if(OPENSSL_VERSION)
string(REPLACE "." ";" lst ${OPENSSL_VERSION})
list(GET lst 0 ssl_major)
list(GET lst 1 ssl_minor)
else()
MESSAGE(SEND_ERROR "No openSSL version defined.")
endif()

if((${ssl_major} EQUAL "1") AND (${ssl_minor} EQUAL "1"))
MESSAGE(STATUS "Use SSL API VERSION 1.1 for civetweb")
set(ROOT_SSL_API "-DCIVETWEB_SSL_OPENSSL_API_1_1=ON" "-DCIVETWEB_SSL_OPENSSL_API_3_0=OFF" "-DCIVETWEB_SSL_OPENSSL_API_1_0=OFF" "-DCIVETWEB_ENABLE_SSL=ON")
elseif((${ssl_major} EQUAL "3"))
MESSAGE(STATUS "Use SSL API VERSION 3.${ssl_minor} for civetweb")
set(ROOT_SSL_API "-DCIVETWEB_SSL_OPENSSL_API_3_0=ON" "-DCIVETWEB_SSL_OPENSSL_API_1_1=OFF" "-DCIVETWEB_SSL_OPENSSL_API_1_0=OFF" "-DCIVETWEB_ENABLE_SSL=ON")
elseif((${ssl_major} EQUAL "1") AND (${ssl_minor} EQUAL "0"))
MESSAGE(STATUS "Use SSL API VERSION 1.0 for civetweb")
set(ROOT_SSL_API "-DCIVETWEB_SSL_OPENSSL_API_1_0=ON" "-DCIVETWEB_SSL_OPENSSL_API_3_0=OFF" "-DCIVETWEB_SSL_OPENSSL_API_1_1=OFF" "-DCIVETWEB_ENABLE_SSL=ON")
else()
MESSAGE(WARNING "Not able to recognize SSL version ${OPENSSL_VERSION}, disable SSL")
set(ROOT_SSL_API "-DCIVETWEB_ENABLE_SSL=OFF")
endif()
else()
set(ROOT_SSL_API "")
endif()
if(NOT MSVC)
set(ROOT_SOCKET_FLAGS "-DUSE_X_DOM_SOCKET")
else()
set(ROOT_SOCKET_FLAGS "")
endif()

ExternalProject_Add(BUILTIN_CIVETWEB
PREFIX ${ROOT_CIVETWEB_PREFIX}
# URL ${lcgpackages}/civetweb-${ROOT_CIVETWEB_VERSION}.tar.gz
URL https://github.com/civetweb/civetweb/archive/refs/tags/v${ROOT_CIVETWEB_VERSION}.tar.gz # TODO move to LCG
URL_HASH SHA256=${ROOT_CIVETWEB_HASH}

LOG_DOWNLOAD TRUE
LOG_CONFIGURE TRUE
LOG_BUILD TRUE
LOG_INSTALL TRUE
LOG_OUTPUT_ON_FAILURE TRUE
INSTALL_DIR ${ROOT_CIVETWEB_PREFIX}
CMAKE_ARGS -G ${CMAKE_GENERATOR}
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
-DCMAKE_INSTALL_LIBDIR:PATH=<INSTALL_DIR>/lib
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
-DCMAKE_C_FLAGS:STRING=${ROOT_SOCKET_FLAGS}
-DCMAKE_CXX_FLAGS:STRING=${ROOT_SOCKET_FLAGS}
-DBUILD_SHARED_LIBS:BOOL=FALSE
-DBUILD_TESTING=FALSE
-DCIVETWEB_ENABLE_ASAN=OFF # If set to ON, you need to set below link_library interface to UBSAN libs
-DCIVETWEB_BUILD_TESTING=FALSE
-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=TRUE
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
-DCIVETWEB_ENABLE_WEBSOCKETS=ON
-DOpenSSL_DIR=${OPENSSL_ROOT} # TODO check if it correctly picks up builtin if simultaneous to system-wide. Maybe we need to pass explicit OpenSSL_DIR
${ROOT_SSL_API}
BUILD_COMMAND ${CMAKE_COMMAND} --build . ${ROOT_CIVETWEB_BUILD_COMMAND_FLAGS}
INSTALL_COMMAND ${CMAKE_COMMAND} --build . ${ROOT_CIVETWEB_BUILD_COMMAND_FLAGS} --target install
BUILD_BYPRODUCTS
${ROOT_CIVETWEB_LIBRARY}
TIMEOUT 600
)

file(MAKE_DIRECTORY ${ROOT_CIVETWEB_PREFIX}/include)
add_library(civetweb::civetweb IMPORTED STATIC GLOBAL)
add_dependencies(civetweb::civetweb BUILTIN_CIVETWEB)
if(builtin_ssl)
add_dependencies(BUILTIN_CIVETWEB BUILTIN_SSL)
endif()
set_target_properties(civetweb::civetweb PROPERTIES
IMPORTED_LOCATION ${ROOT_CIVETWEB_LIBRARY}
INTERFACE_INCLUDE_DIRECTORIES ${ROOT_CIVETWEB_PREFIX}/include)
target_compile_definitions(civetweb::civetweb INTERFACE CIVETWEB_LIBRARY_STATIC) # needed for Win32 since public flag is not correctly propagated to parent scope (BUILD_SHARED_LIBS works fine for building but when installing, flag info is lost)
#~ if (NOT ROOT_SSL_API STREQUAL "DCIVETWEB_ENABLE_SSL=OFF")
#~ target_link_libraries(civetweb::civetweb INTERFACE OpenSSL::SSL)
#~ endif()

# Set the canonical output of find_package according to
# https://cmake.org/cmake/help/latest/manual/cmake-developer.7.html#standard-variable-names
set(civetweb_INCLUDE_DIRS ${ROOT_CIVETWEB_PREFIX}/include PARENT_SCOPE)
set(civetweb_LIBRARIES ${ROOT_CIVETWEB_LIBRARY} PARENT_SCOPE)
set(civetweb_FOUND TRUE PARENT_SCOPE)
set(civetweb_VERSION ${ROOT_CIVETWEB_VERSION} PARENT_SCOPE)
2 changes: 2 additions & 0 deletions builtins/openssl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -86,3 +86,5 @@ find_package_handle_standard_args(OpenSSL
)

set_property(GLOBAL APPEND PROPERTY ROOT_BUILTIN_TARGETS OPENSSL)
set(OPENSSL_VERSION ${OPENSSL_VERSION} PARENT_SCOPE) # CMake 4.2 changes to small case
set(OPENSSL_ROOT ${OPENSSL_ROOT} PARENT_SCOPE)
7 changes: 7 additions & 0 deletions cmake/modules/FindFastCGI.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,11 @@ if(FASTCGI_FOUND)
if(NOT FASTCGI_LIBRARIES)
set(FASTCGI_LIBRARIES ${FASTCGI_LIBRARY})
endif()

if(NOT TARGET FastCGI::FastCGI)
add_library(FastCGI::FastCGI UNKNOWN IMPORTED)
set_target_properties(FastCGI::FastCGI PROPERTIES
IMPORTED_LOCATION "${FASTCGI_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${FASTCGI_INCLUDE_DIR}")
endif()
endif()
45 changes: 23 additions & 22 deletions cmake/modules/SearchInstalledSoftware.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -208,28 +208,6 @@ if(builtin_nlohmannjson)
add_subdirectory(builtins/nlohmann)
endif()

#--- Check for civetweb ---------------------------------------------------------
if(http AND NOT builtin_civetweb)
message(STATUS "Looking for civetweb")
if(NOT "$ENV{CIVETWEB_BUILD}" STREQUAL "" AND NOT "$ENV{CIVETWEB_SRC}" STREQUAL "")
set(civetweb_LIBRARIES $ENV{CIVETWEB_BUILD}/src/libcivetweb.so)
set(civetweb_INCLUDE_DIR $ENV{CIVETWEB_SRC}/include)
message(STATUS "Use civetweb ${civetweb_LIBRARIES} and ${civetweb_INCLUDE_DIR}")
else()
if(fail-on-missing)
find_package(civetweb 1.15 REQUIRED)
else()
find_package(civetweb 1.15 QUIET)
if(civetweb_FOUND)
message(STATUS "Found civetweb version ${civetweb_VERSION}")
else()
message(STATUS "civetweb not found. Switching on builtin_civetweb option")
set(builtin_civetweb ON CACHE BOOL "Enabled because civetweb not found" FORCE)
endif()
endif()
endif()
endif()

#---Check for Unuran ------------------------------------------------------------------
if(unuran AND NOT builtin_unuran)
message(STATUS "Looking for Unuran")
Expand Down Expand Up @@ -604,6 +582,29 @@ if(fcgi)
endif()
endif()

#--- Check for civetweb - (has to after SSL) ------------------------------------------
if(http AND NOT builtin_civetweb)
message(STATUS "Looking for civetweb")
if(fail-on-missing)
find_package(civetweb 1.15 REQUIRED)
else()
find_package(civetweb 1.15 QUIET)
if(civetweb_FOUND)
message(STATUS "Found civetweb version ${civetweb_VERSION}")
else()
message(STATUS "civetweb not found. Switching on builtin_civetweb option")
set(builtin_civetweb ON CACHE BOOL "Enabled because civetweb not found" FORCE)
endif()
endif()
if (NOT builtin_civetweb)
target_compile_definitions(civetweb::civetweb INTERFACE _EXTERNAL_CIVETWEB) # temporary hack for: with external civetweb one gets failure R__memcompress
endif()
endif()
if(http AND builtin_civetweb)
list(APPEND ROOT_BUILTINS BUILTIN_CIVETWEB)
add_subdirectory(builtins/civetweb)
endif()

#---Check for SQLite-------------------------------------------------------------------
if(sqlite)
message(STATUS "Looking for SQLite")
Expand Down
73 changes: 3 additions & 70 deletions net/http/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,6 @@ if(NOT FASTCGI_FOUND)
set(FASTCGI_LIBRARY "")
endif()

# look for the realtime extensions library and use it if it exists
find_library(RT_LIBRARY rt)
if(RT_LIBRARY)
set(RT_LIBRARIES ${RT_LIBRARY})
endif()

if(builtin_civetweb)
set(_civetweb_src civetweb/civetweb.c)
set(_civetweb_libs ${RT_LIBRARIES})
endif()

ROOT_STANDARD_LIBRARY_PACKAGE(RHTTP
HEADERS
THttpCallArg.h
Expand All @@ -48,72 +37,16 @@ ROOT_STANDARD_LIBRARY_PACKAGE(RHTTP
src/THttpWSHandler.cxx
src/TRootSniffer.cxx
src/TRootSnifferStore.cxx
${_civetweb_src}
LIBRARIES
ZLIB::ZLIB
${_civetweb_libs}
${FASTCGI_LIBRARY}
${CMAKE_DL_LIBS}
civetweb::civetweb
DEPENDENCIES
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TO-DO: discuss if builtin_civetweb=OFF should be discouraged, by emitting a warning or better describing ROotBuildOptions text.

See discussion root-project/root-ci-images#110 (comment)

RIO
Thread
)

if(builtin_civetweb)
target_include_directories(RHTTP PRIVATE civetweb)

if(ssl)
target_include_directories(RHTTP SYSTEM PRIVATE ${OPENSSL_INCLUDE_DIR})
endif()

target_compile_definitions(RHTTP PRIVATE -DUSE_WEBSOCKET)

if(NOT MSVC)
target_compile_definitions(RHTTP PRIVATE -DUSE_X_DOM_SOCKET)
endif()

if(ssl)
if(OPENSSL_VERSION)
string(REPLACE "." ";" lst ${OPENSSL_VERSION})
list(GET lst 0 ssl_major)
list(GET lst 1 ssl_minor)
endif()

if((${ssl_major} EQUAL "1") AND (${ssl_minor} EQUAL "1"))
MESSAGE(STATUS "Use SSL API VERSION 1.1 for civetweb")
target_compile_definitions(RHTTP PUBLIC -DOPENSSL_API_1_1)
set(link_ssl ON)
elseif((${ssl_major} EQUAL "3"))
MESSAGE(STATUS "Use SSL API VERSION 3.${ssl_minor} for civetweb")
target_compile_definitions(RHTTP PUBLIC -DOPENSSL_API_3_0)
set(link_ssl ON)
elseif((${ssl_major} EQUAL "1") AND (${ssl_minor} EQUAL "0"))
MESSAGE(STATUS "Use SSL API VERSION 1.0 for civetweb")
target_compile_definitions(RHTTP PUBLIC -DOPENSSL_API_1_0)
set(link_ssl ON)
else()
MESSAGE(WARNING "Not able to recognize SSL version ${OPENSSL_VERSION}, disable SSL")
target_compile_definitions(RHTTP PUBLIC -DNO_SSL)
endif()
if(link_ssl)
target_compile_definitions(RHTTP PUBLIC -DNO_SSL_DL)
target_link_libraries(RHTTP PRIVATE ${OPENSSL_LIBRARIES})
endif()
else()
target_compile_definitions(RHTTP PUBLIC -DNO_SSL)
endif()

else()

target_include_directories(RHTTP SYSTEM PRIVATE ${civetweb_INCLUDE_DIR})
target_link_libraries(RHTTP PRIVATE ${civetweb_LIBRARIES})
# workaround for R__memcompress failure with external civetweb
target_compile_definitions(RHTTP PRIVATE -D_EXTERNAL_CIVETWEB)

endif(builtin_civetweb)

if(FASTCGI_FOUND)
target_include_directories(RHTTP PRIVATE ${FASTCGI_INCLUDE_DIR})
if(TARGET FastCGI::FastCGI)
target_link_libraries(RHTTP PRIVATE FastCGI::FastCGI)
else()
target_compile_definitions(RHTTP PUBLIC -DHTTP_WITHOUT_FASTCGI)
endif()
Loading
Loading