diff --git a/CMakeLists.txt b/CMakeLists.txt index f8150be..0d06342 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,8 +46,8 @@ endif() # Options option(3PROXY_BUILD_SHARED "Build shared libraries for plugins" ON) -option(3PROXY_USE_OPENSSL "Enable OpenSSL/SSLPlugin" ON) -option(3PROXY_USE_PCRE2 "Enable PCRE2/PCREPlugin" ON) +option(3PROXY_USE_OPENSSL "Enable TLS/SSL support (requires OpenSSL)" ON) +option(3PROXY_USE_PCRE2 "Enable PCRE2 regex filtering" ON) option(3PROXY_USE_PAM "Enable PAM/PamAuth" ON) option(3PROXY_USE_ODBC "Enable ODBC support (Unix only, always ON on Windows)" OFF) option(3PROXY_USE_SPLICE "Use Linux splice() for zero-copy (Linux only)" ON) @@ -56,6 +56,10 @@ option(3PROXY_USE_WSAPOLL "Use WSAPoll instead of select() (Windows only)" ON) option(3PROXY_USE_NETFILTER "Enable Linux netfilter support (Linux only)" ON) option(3PROXY_USE_UNIX_SOCKETS "Enable Unix domain socket support (Unix only)" ON) +if(NOT WIN32 AND NOT APPLE) + option(3PROXY_STATIC_LINK "Statically link libraries using -Wl,-Bstatic (Linux/Unix only)" OFF) +endif() + # Binary name prefix for standalone modules and crypt (default: 3proxy_) # For crypt: if prefix is empty, "my" is used instead (→ mycrypt) set(3PROXY_BINARY_PREFIX "3proxy_" CACHE STRING "Prefix for standalone module and crypt binary names") @@ -441,38 +445,19 @@ if(ODBC_FOUND) endif() endif() +# OpenSSL linking if(OpenSSL_FOUND) - target_link_libraries(3proxy PRIVATE OpenSSL::SSL OpenSSL::Crypto) + if(3PROXY_STATIC_LINK) + # Will be linked statically below (if static libraries are found) + else() + target_link_libraries(3proxy PRIVATE OpenSSL::SSL OpenSSL::Crypto) + endif() endif() -# PCRE2 linking (try static first on Linux/FreeBSD, fallback to dynamic) +# PCRE2 linking if(PCRE2_FOUND) - if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR - CMAKE_SYSTEM_NAME MATCHES "FreeBSD|OpenBSD|NetBSD" OR - CMAKE_SYSTEM_NAME STREQUAL "Unix") - # Try static linking for Linux/BSD - find_library(PCRE2_STATIC_LIB - NAMES pcre2-8-static libpcre2-8.a pcre2-8.a - PATHS ${PC_PCRE2_LIBRARY_DIRS} - /usr/lib/x86_64-linux-gnu - /usr/lib - /usr/local/lib - /lib - ) - if(PCRE2_STATIC_LIB AND PCRE2_STATIC_LIB MATCHES "\\.a$") - target_link_libraries(3proxy PRIVATE - -Wl,-Bstatic - ${PCRE2_STATIC_LIB} - -Wl,-Bdynamic - ) - message(STATUS "Using static PCRE2: ${PCRE2_STATIC_LIB}") - elseif(TARGET PCRE2::PCRE2) - target_link_libraries(3proxy PRIVATE PCRE2::PCRE2) - message(STATUS "Using dynamic PCRE2 (PCRE2::PCRE2)") - else() - target_link_libraries(3proxy PRIVATE ${PCRE2_LIBRARIES}) - message(STATUS "Using dynamic PCRE2: ${PCRE2_LIBRARIES}") - endif() + if(3PROXY_STATIC_LINK) + # Will be linked statically below (if static libraries are found) elseif(TARGET PCRE2::PCRE2) target_link_libraries(3proxy PRIVATE PCRE2::PCRE2) else() @@ -480,6 +465,48 @@ if(PCRE2_FOUND) endif() endif() +# Static linking of OpenSSL and PCRE2 (when option is enabled) +if(3PROXY_STATIC_LINK AND (OpenSSL_FOUND OR PCRE2_FOUND)) + set(_saved_cmake_find_library_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES}) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + + set(_static_libs "") + + if(OpenSSL_FOUND) + find_library(_ssl_static_lib ssl) + find_library(_crypto_static_lib crypto) + if(_ssl_static_lib AND _crypto_static_lib) + list(APPEND _static_libs ${_ssl_static_lib} ${_crypto_static_lib}) + endif() + endif() + + if(PCRE2_FOUND) + find_library(_pcre2_static_lib NAMES pcre2-8) + if(_pcre2_static_lib) + list(APPEND _static_libs ${_pcre2_static_lib}) + endif() + endif() + + set(CMAKE_FIND_LIBRARY_SUFFIXES ${_saved_cmake_find_library_suffixes}) + + if(_static_libs) + target_link_libraries(3proxy PRIVATE -Wl,-Bstatic ${_static_libs} -Wl,-Bdynamic) + message(STATUS "Static linking enabled for OpenSSL/PCRE2") + else() + message(WARNING "3PROXY_STATIC_LINK is ON but static libraries not found, falling back to dynamic") + if(OpenSSL_FOUND) + target_link_libraries(3proxy PRIVATE OpenSSL::SSL OpenSSL::Crypto) + endif() + if(PCRE2_FOUND) + if(TARGET PCRE2::PCRE2) + target_link_libraries(3proxy PRIVATE PCRE2::PCRE2) + else() + target_link_libraries(3proxy PRIVATE ${PCRE2_LIBRARIES}) + endif() + endif() + endif() +endif() + if(WIN32) target_link_libraries(3proxy PRIVATE ${WINDOWS_LIBS}) if(COMPILER_IS_MSVC AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/3proxy.rc) @@ -505,7 +532,22 @@ if(OpenSSL_FOUND) endif() target_link_libraries(3proxy_crypt PRIVATE Threads::Threads) if(OpenSSL_FOUND) - target_link_libraries(3proxy_crypt PRIVATE OpenSSL::SSL OpenSSL::Crypto) + if(3PROXY_STATIC_LINK) + set(_saved_cmake_find_library_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES}) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + find_library(_ssl_static_lib ssl) + find_library(_crypto_static_lib crypto) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${_saved_cmake_find_library_suffixes}) + if(_ssl_static_lib AND _crypto_static_lib) + target_link_libraries(3proxy_crypt PRIVATE -Wl,-Bstatic ${_ssl_static_lib} ${_crypto_static_lib} -Wl,-Bdynamic) + message(STATUS "3proxy_crypt: static OpenSSL") + else() + message(WARNING "3PROXY_STATIC_LINK is ON but static OpenSSL not found, using dynamic") + target_link_libraries(3proxy_crypt PRIVATE OpenSSL::SSL OpenSSL::Crypto) + endif() + else() + target_link_libraries(3proxy_crypt PRIVATE OpenSSL::SSL OpenSSL::Crypto) + endif() endif() if("${3PROXY_BINARY_PREFIX}" STREQUAL "") set_target_properties(3proxy_crypt PROPERTIES OUTPUT_NAME "mycrypt") @@ -798,6 +840,9 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") message(STATUS " USE_SPLICE: ${3PROXY_USE_SPLICE}") message(STATUS " USE_NETFILTER: ${3PROXY_USE_NETFILTER}") endif() +if(NOT WIN32 AND NOT APPLE) + message(STATUS " STATIC_LINK: ${3PROXY_STATIC_LINK}") +endif() if(WIN32) message(STATUS " USE_WSAPOLL: ${3PROXY_USE_WSAPOLL}") endif() diff --git a/src/plugins/PamAuth/CMakeLists.txt b/src/plugins/PamAuth/CMakeLists.txt index 6143bab..9149718 100644 --- a/src/plugins/PamAuth/CMakeLists.txt +++ b/src/plugins/PamAuth/CMakeLists.txt @@ -9,11 +9,18 @@ add_3proxy_plugin(PamAuth SOURCES pamauth.c ) -if(TARGET PAM::PAM) - target_link_libraries(PamAuth PRIVATE PAM::PAM) -else() - target_link_libraries(PamAuth PRIVATE ${PAM_LIBRARIES}) - if(PAM_INCLUDE_DIRS) - target_include_directories(PamAuth PRIVATE ${PAM_INCLUDE_DIRS}) +if(3PROXY_STATIC_LINK) + set(_saved_cmake_find_library_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES}) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + find_library(_pam_static_lib pam) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${_saved_cmake_find_library_suffixes}) + if(_pam_static_lib) + target_link_libraries(PamAuth PRIVATE -Wl,-Bstatic ${_pam_static_lib} -Wl,-Bdynamic) + message(STATUS "PamAuth: static PAM") + else() + message(WARNING "3PROXY_STATIC_LINK is ON but static PAM not found, using dynamic") + target_link_libraries(PamAuth PRIVATE PAM::PAM) endif() +else() + target_link_libraries(PamAuth PRIVATE PAM::PAM) endif()