mirror of
https://github.com/3proxy/3proxy.git
synced 2026-11-16 06:05:50 +08:00
Some checks are pending
C/C++ CI Linux / ${{ matrix.target }} (ubuntu-24.04-arm) (push) Waiting to run
C/C++ CI Linux / ${{ matrix.target }} (ubuntu-latest) (push) Waiting to run
C/C++ CI MacOS / ${{ matrix.target }} (macos-15) (push) Waiting to run
C/C++ CI Windows / ${{ matrix.target }} (windows-2022) (push) Waiting to run
C/C++ CI cmake / ${{ matrix.target }} (macos-15) (push) Waiting to run
C/C++ CI cmake / ${{ matrix.target }} (ubuntu-24.04-arm) (push) Waiting to run
C/C++ CI cmake / ${{ matrix.target }} (ubuntu-latest) (push) Waiting to run
C/C++ CI cmake / ${{ matrix.target }} (windows-2022) (push) Waiting to run
C/C++ CI cmake / ubuntu-latest (wolfSSL) (push) Waiting to run
Datagrams on a TCP connection, each with a two byte length in network order in front of it, which is how udptunnel (the rfc1036 one) and ProxyGuard (eduVPN) put them there, the framing alone or after a handshake: udptunnel's 32 bytes, or ProxyGuard's HTTP Upgrade for UoTLV/1 answered with 101 Switching Protocols. tcptoudp takes the connections, a UDP socket of its own to the target for each, the handshake a client speaks recognised by its first bytes and answered; a parent the ACL gives is a SOCKS5 UDP relay, as for udppm. udptotcp takes the datagrams, each client a session of the service's with a TCP connection of its own, connected as the service's loop sees it writable (dnspr asks a name server over TCP the same way); -m sends udptunnel's handshake to the target, -m2 ProxyGuard's, -m0 (the default) none, so both ends of either tool are stood in for. The service names take two places of the string table, the default configuration path moving two later (stringtable[27]). Built by the Makefiles and CMake, with the standalone binaries, and installed by them; a case of the test suite speaks all three handshakes.
1011 lines
34 KiB
CMake
1011 lines
34 KiB
CMake
#
|
|
# 3proxy CMake build system
|
|
#
|
|
|
|
cmake_minimum_required(VERSION 3.16)
|
|
|
|
# Read the version. A release branch carries RELEASE, a development branch
|
|
# DEVEL, whose version may have a suffix that project() will not take.
|
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/RELEASE")
|
|
file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/RELEASE" PROJECT_VERSION_FULL LIMIT_COUNT 1)
|
|
elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/DEVEL")
|
|
file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/DEVEL" PROJECT_VERSION_FULL LIMIT_COUNT 1)
|
|
else()
|
|
message(FATAL_ERROR "Neither RELEASE nor DEVEL found: cannot tell the version")
|
|
endif()
|
|
string(STRIP "${PROJECT_VERSION_FULL}" PROJECT_VERSION_FULL)
|
|
string(REGEX MATCH "^[0-9]+(\\.[0-9]+)*" PROJECT_VERSION "${PROJECT_VERSION_FULL}")
|
|
if(NOT PROJECT_VERSION)
|
|
message(FATAL_ERROR "No version number in '${PROJECT_VERSION_FULL}'")
|
|
endif()
|
|
|
|
project(3proxy
|
|
VERSION ${PROJECT_VERSION}
|
|
LANGUAGES C
|
|
DESCRIPTION "3proxy - tiny free proxy server"
|
|
)
|
|
|
|
# Include GNUInstallDirs for standard installation directories
|
|
include(GNUInstallDirs)
|
|
|
|
# Add cmake module path
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
|
|
|
# Detect compiler
|
|
if(CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
|
|
set(COMPILER_IS_CLANG TRUE)
|
|
if(WIN32 AND CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
|
set(COMPILER_IS_CLANG_CL TRUE)
|
|
else()
|
|
set(COMPILER_IS_CLANG_CL FALSE)
|
|
endif()
|
|
else()
|
|
set(COMPILER_IS_CLANG FALSE)
|
|
set(COMPILER_IS_CLANG_CL FALSE)
|
|
endif()
|
|
|
|
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
|
set(COMPILER_IS_GCC TRUE)
|
|
else()
|
|
set(COMPILER_IS_GCC FALSE)
|
|
endif()
|
|
|
|
if(MSVC AND NOT COMPILER_IS_CLANG_CL)
|
|
set(COMPILER_IS_MSVC TRUE)
|
|
else()
|
|
set(COMPILER_IS_MSVC FALSE)
|
|
endif()
|
|
|
|
# Options
|
|
option(3PROXY_BUILD_SHARED "Build shared libraries for plugins" ON)
|
|
option(3PROXY_USE_WOLFSSL "Enable TLS/SSL support via wolfSSL (preferred when detected)" ON)
|
|
option(3PROXY_USE_OPENSSL "Enable TLS/SSL support via OpenSSL (fallback when wolfSSL unavailable)" 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 "Build Linux splice() support, used by services given -s (Linux only)" ON)
|
|
option(3PROXY_USE_NETFILTER "Enable Linux netfilter support (Linux only)" ON)
|
|
option(3PROXY_USE_TRANSPARENT "Build transparent proxying support (Linux and BSD only)" ON)
|
|
option(3PROXY_USE_UNIX_SOCKETS "Enable Unix domain socket support (Unix only)" ON)
|
|
option(3PROXY_USE_HTTPSRV "Build the HTTP server and the admin interface on top of it" ON)
|
|
option(3PROXY_USE_MAILPROXY "Build the pop3p, imapp and smtpp proxies" OFF)
|
|
option(3PROXY_USE_FTP "Build FTP support: the ftppr service and ftp:// in the HTTP proxy" OFF)
|
|
|
|
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")
|
|
|
|
# Standalone module build options (ON by default)
|
|
option(3PROXY_BUILD_NONE "Do not build standalone binaries" OFF)
|
|
option(3PROXY_BUILD_PROXY "Build standalone proxy binary" ON)
|
|
option(3PROXY_BUILD_SOCKS "Build standalone socks binary" ON)
|
|
# The mail proxies and FTP are asked for rather than assumed: without them
|
|
# pop3p, imapp and smtpp are the STARTTLS proxy under those names, and ftp
|
|
# is not spoken at all. A standalone binary needs the support it is made of.
|
|
option(3PROXY_BUILD_POP3P "Build standalone pop3p binary" OFF)
|
|
option(3PROXY_BUILD_IMAPP "Build standalone imapp binary" OFF)
|
|
option(3PROXY_BUILD_SMTPP "Build standalone smtpp binary" OFF)
|
|
option(3PROXY_BUILD_FTPPR "Build standalone ftppr binary" OFF)
|
|
option(3PROXY_BUILD_TCPPM "Build standalone tcppm binary" ON)
|
|
option(3PROXY_BUILD_UDPPM "Build standalone udppm binary" ON)
|
|
option(3PROXY_BUILD_TCPTOUDP "Build standalone tcptoudp binary" ON)
|
|
option(3PROXY_BUILD_UDPTOTCP "Build standalone udptotcp binary" ON)
|
|
option(3PROXY_BUILD_TLSPR "Build standalone tlspr binary" ON)
|
|
|
|
if(3PROXY_BUILD_NONE)
|
|
foreach(_M PROXY SOCKS POP3P IMAPP SMTPP FTPPR TCPPM UDPPM TCPTOUDP UDPTOTCP TLSPR)
|
|
set(3PROXY_BUILD_${_M} OFF)
|
|
endforeach()
|
|
endif()
|
|
|
|
# Output directory
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
|
|
|
# Find threads library (cross-platform pthread equivalent)
|
|
find_package(Threads REQUIRED)
|
|
|
|
# Set default build type if not specified
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
|
|
endif()
|
|
|
|
# Platform-independent position independent code for shared libraries
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
|
|
# Platform detection and configuration
|
|
if(WIN32)
|
|
# Windows-specific configuration
|
|
add_compile_definitions(
|
|
WIN32
|
|
_WIN32
|
|
_MBCS
|
|
_CONSOLE
|
|
)
|
|
|
|
if(COMPILER_IS_MSVC)
|
|
# MSVC-specific settings
|
|
add_compile_definitions(
|
|
MSVC
|
|
)
|
|
# Use static runtime library
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
# MSVC compiler options
|
|
add_compile_options(
|
|
/W3 # Warning level 3
|
|
/GS # Buffer security check
|
|
/GA # Optimize for Windows applications
|
|
/GF # Enable string pooling
|
|
)
|
|
# Optimization flags per build type
|
|
set(CMAKE_C_FLAGS_RELEASE "/O2")
|
|
|
|
elseif(COMPILER_IS_CLANG_CL)
|
|
# clang-cl (Clang with MSVC frontend)
|
|
add_compile_definitions(
|
|
MSVC
|
|
)
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
add_compile_options(
|
|
-W3
|
|
-fno-strict-aliasing
|
|
)
|
|
|
|
elseif(COMPILER_IS_CLANG OR COMPILER_IS_GCC)
|
|
# Clang or GCC on Windows (MinGW-like)
|
|
add_compile_definitions(WITH_STD_MALLOC)
|
|
add_compile_options(-fno-strict-aliasing)
|
|
endif()
|
|
|
|
# Windows libraries
|
|
set(WINDOWS_LIBS ws2_32 mswsock advapi32 user32 kernel32 gdi32 crypt32)
|
|
|
|
# Windows plugins (always built)
|
|
set(DEFAULT_PLUGINS
|
|
utf8tocp1251
|
|
WindowsAuthentication
|
|
TrafficPlugin
|
|
StringsPlugin
|
|
FilePlugin
|
|
)
|
|
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
# Linux-specific configuration
|
|
add_compile_definitions(
|
|
_GNU_SOURCE
|
|
_THREAD_SAFE
|
|
_REENTRANT
|
|
)
|
|
|
|
if(COMPILER_IS_CLANG OR COMPILER_IS_GCC)
|
|
# Clang/GCC on Linux
|
|
add_compile_options(-fno-strict-aliasing)
|
|
endif()
|
|
|
|
if(3PROXY_USE_SPLICE)
|
|
add_compile_definitions(WITHSPLICE)
|
|
endif()
|
|
|
|
if(3PROXY_USE_NETFILTER)
|
|
add_compile_definitions(WITH_NETFILTER)
|
|
endif()
|
|
|
|
if(3PROXY_USE_UNIX_SOCKETS)
|
|
add_compile_definitions(WITH_UN)
|
|
endif()
|
|
|
|
set(DEFAULT_PLUGINS
|
|
StringsPlugin
|
|
TrafficPlugin
|
|
FilePlugin
|
|
)
|
|
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD|Darwin|OpenBSD|NetBSD")
|
|
# BSD/macOS-specific configuration
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
|
# macOS-specific
|
|
add_compile_definitions(_DARWIN_UNLIMITED_SELECT)
|
|
endif()
|
|
|
|
if(COMPILER_IS_CLANG OR COMPILER_IS_GCC)
|
|
add_compile_options(-fno-strict-aliasing)
|
|
endif()
|
|
|
|
if(3PROXY_USE_UNIX_SOCKETS)
|
|
add_compile_definitions(WITH_UN)
|
|
endif()
|
|
|
|
set(DEFAULT_PLUGINS
|
|
StringsPlugin
|
|
TrafficPlugin
|
|
FilePlugin
|
|
)
|
|
|
|
else()
|
|
# Generic Unix configuration
|
|
if(COMPILER_IS_CLANG OR COMPILER_IS_GCC)
|
|
add_compile_options(-fno-strict-aliasing)
|
|
endif()
|
|
|
|
if(3PROXY_USE_UNIX_SOCKETS)
|
|
add_compile_definitions(WITH_UN)
|
|
endif()
|
|
|
|
set(DEFAULT_PLUGINS
|
|
StringsPlugin
|
|
TrafficPlugin
|
|
FilePlugin
|
|
)
|
|
endif()
|
|
|
|
if(3PROXY_USE_MAILPROXY)
|
|
add_compile_definitions(WITH_POP3P WITH_IMAPP WITH_SMTPP)
|
|
endif()
|
|
|
|
if(3PROXY_USE_FTP)
|
|
add_compile_definitions(WITH_FTP)
|
|
endif()
|
|
|
|
if(3PROXY_USE_HTTPSRV)
|
|
add_compile_definitions(WITH_HTTPSRV)
|
|
endif()
|
|
|
|
# Transparent proxying needs a redirection that leaves the original
|
|
# destination where 3proxy reads it: the kernel on Linux, the socket on the
|
|
# BSDs. That means netfilter, OpenBSD divert-to or FreeBSD ipfw fwd. NetBSD
|
|
# and macOS rewrite the destination instead and are left out.
|
|
if(3PROXY_USE_TRANSPARENT AND (CMAKE_SYSTEM_NAME STREQUAL "Linux"
|
|
OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD|OpenBSD|NetBSD"))
|
|
add_compile_definitions(WITH_TRANSPARENT)
|
|
set(3PROXY_TRANSPARENT_BUILT ON)
|
|
# pf keeps the original destination in its state table, which is read
|
|
# through /dev/pf. macOS has the device but ships no header for it.
|
|
include(CheckIncludeFiles)
|
|
check_include_files("sys/types.h;sys/socket.h;net/if.h;net/pfvar.h" HAVE_PFVAR_H)
|
|
if(HAVE_PFVAR_H)
|
|
add_compile_definitions(WITH_PF)
|
|
endif()
|
|
else()
|
|
set(3PROXY_TRANSPARENT_BUILT OFF)
|
|
endif()
|
|
|
|
# Unix domain sockets off: NO_UN also undefines WITH_UN if it arrives from
|
|
# elsewhere, e.g. CFLAGS
|
|
if(NOT 3PROXY_USE_UNIX_SOCKETS)
|
|
add_compile_definitions(NO_UN)
|
|
endif()
|
|
|
|
# Find dependencies
|
|
|
|
# TLS/SSL backend: prefer wolfSSL when detected, fall back to OpenSSL.
|
|
set(3PROXY_SSL_ENABLED FALSE)
|
|
set(3PROXY_SSL_WOLFSSL FALSE)
|
|
set(OPENSSL_FOUND FALSE)
|
|
set(WOLFSSL_FOUND FALSE)
|
|
|
|
if(3PROXY_USE_WOLFSSL)
|
|
find_path(WOLFSSL_INCLUDE_DIR NAMES wolfssl/options.h wolfssl/ssl.h)
|
|
find_library(WOLFSSL_LIBRARIES NAMES wolfssl)
|
|
if(WOLFSSL_INCLUDE_DIR AND WOLFSSL_LIBRARIES)
|
|
set(WOLFSSL_FOUND TRUE)
|
|
set(3PROXY_SSL_ENABLED TRUE)
|
|
set(3PROXY_SSL_WOLFSSL TRUE)
|
|
add_compile_definitions(WITH_SSL WITH_WOLFSSL)
|
|
message(STATUS "wolfSSL found: ${WOLFSSL_LIBRARIES} (preferred backend)")
|
|
else()
|
|
message(STATUS "wolfSSL not found, falling back to OpenSSL if enabled")
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT 3PROXY_SSL_ENABLED AND 3PROXY_USE_OPENSSL)
|
|
find_package(OpenSSL REQUIRED)
|
|
if(OpenSSL_FOUND)
|
|
set(OPENSSL_FOUND TRUE)
|
|
set(3PROXY_SSL_ENABLED TRUE)
|
|
add_compile_definitions(WITH_SSL)
|
|
message(STATUS "OpenSSL found: ${OPENSSL_VERSION}")
|
|
endif()
|
|
elseif(NOT 3PROXY_SSL_ENABLED)
|
|
message(STATUS "SSL disabled (neither wolfSSL nor OpenSSL enabled/found)")
|
|
elseif(3PROXY_SSL_WOLFSSL)
|
|
message(STATUS "OpenSSL skipped (wolfSSL in use)")
|
|
endif()
|
|
|
|
# PCRE2
|
|
set(PCRE2_FOUND FALSE)
|
|
if(3PROXY_USE_PCRE2)
|
|
find_package(PCRE2 QUIET)
|
|
if(PCRE2_FOUND)
|
|
add_compile_definitions(WITH_PCRE)
|
|
message(STATUS "PCRE2 found: ${PCRE2_VERSION}")
|
|
else()
|
|
message(STATUS "PCRE2 not found, PCRE support will not be built")
|
|
endif()
|
|
endif()
|
|
|
|
# PAM (Unix only)
|
|
set(PAM_FOUND FALSE)
|
|
if(3PROXY_USE_PAM AND NOT WIN32)
|
|
find_package(PAM QUIET)
|
|
if(PAM_FOUND)
|
|
message(STATUS "PAM found")
|
|
else()
|
|
message(STATUS "PAM not found, PamAuth will not be built")
|
|
endif()
|
|
endif()
|
|
|
|
# ODBC (always enabled on Windows)
|
|
set(ODBC_FOUND FALSE)
|
|
if(WIN32 OR 3PROXY_USE_ODBC)
|
|
find_package(ODBC QUIET)
|
|
if(ODBC_FOUND)
|
|
message(STATUS "ODBC found")
|
|
else()
|
|
message(STATUS "ODBC not found, building without ODBC support")
|
|
endif()
|
|
endif()
|
|
|
|
# Define WITH_ODBC when ODBC is available
|
|
if(ODBC_FOUND)
|
|
add_compile_definitions(WITH_ODBC)
|
|
endif()
|
|
|
|
# Set NORADIUS if no SSL backend is available (RADIUS MD5 uses bundled md5, but
|
|
# keep the historical gate tied to SSL availability).
|
|
if(NOT 3PROXY_SSL_ENABLED)
|
|
add_compile_definitions(NORADIUS)
|
|
endif()
|
|
|
|
# Source files for 3proxy core
|
|
set(3PROXY_CORE_SOURCES
|
|
src/3proxy.c
|
|
src/loop.c
|
|
src/fiber.c
|
|
src/auth.c
|
|
src/acl.c
|
|
src/limiter.c
|
|
src/redirect.c
|
|
src/authradius.c
|
|
src/hash.c
|
|
src/hashtables.c
|
|
src/resolve.c
|
|
src/sql.c
|
|
src/conf.c
|
|
src/datatypes.c
|
|
src/plugins.c
|
|
src/stringtable.c
|
|
)
|
|
|
|
# Bundled hash implementations (md4.c, md5.c, blake2b-ref.c) self-disable
|
|
# via preprocessor guards when wolfSSL provides them natively.
|
|
|
|
# ============================================================================
|
|
# Object libraries for common sources (shared between executables)
|
|
# ============================================================================
|
|
|
|
# Common object library (sockmap, sockgetchar, common, sem, log)
|
|
add_library(common_obj OBJECT
|
|
src/sockmap.c
|
|
src/sockgetchar.c
|
|
src/common.c
|
|
src/sem.c
|
|
src/log.c
|
|
)
|
|
target_include_directories(common_obj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
|
|
# base64 object library
|
|
add_library(base64_obj OBJECT src/base64.c)
|
|
target_include_directories(base64_obj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
|
|
# mdhash object library. md4.c/md5.c self-disable via NO_MD4/NO_MD5 guards
|
|
# when wolfSSL provides them; always compiled for fallback.
|
|
add_library(mdhash_obj OBJECT src/mdhash.c src/libs/md4.c src/libs/md5.c src/libs/blake2b-ref.c)
|
|
target_include_directories(mdhash_obj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
if(3PROXY_SSL_WOLFSSL)
|
|
target_include_directories(mdhash_obj PRIVATE ${WOLFSSL_INCLUDE_DIR})
|
|
endif()
|
|
|
|
# ============================================================================
|
|
# Object libraries for 3proxy (compiled WITHOUT WITHMAIN)
|
|
# These are used by the main 3proxy executable
|
|
# ============================================================================
|
|
|
|
# Server modules object library (without WITHMAIN, without UDP)
|
|
add_library(srv_modules OBJECT
|
|
src/proxy.c
|
|
src/pop3p.c
|
|
src/imapp.c
|
|
src/smtpp.c
|
|
src/ftppr.c
|
|
src/tcppm.c
|
|
src/tcptoudp.c
|
|
src/tlspr.c
|
|
src/auto.c
|
|
src/socks.c
|
|
src/webadmin.c
|
|
src/httpsrv.c
|
|
src/dnspr.c
|
|
)
|
|
|
|
target_include_directories(srv_modules PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
# UDP port mapper server module (without WITHMAIN)
|
|
add_library(srvudppm_obj OBJECT src/udppm.c)
|
|
target_include_directories(srvudppm_obj PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
|
|
# UDP to TCP tunnel server module (without WITHMAIN)
|
|
add_library(srvudptotcp_obj OBJECT src/udptotcp.c)
|
|
target_include_directories(srvudptotcp_obj PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
|
|
# UDP socket relay (used by 3proxy, socks, udppm)
|
|
add_library(udpsockmap_obj OBJECT src/udpsockmap.c)
|
|
target_include_directories(udpsockmap_obj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
|
|
# mainfunc object (proxymain.c compiled with MODULEMAINFUNC=mainfunc for 3proxy)
|
|
add_library(mainfunc OBJECT src/proxymain.c)
|
|
target_include_directories(mainfunc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
target_compile_definitions(mainfunc PRIVATE MODULEMAINFUNC=mainfunc)
|
|
|
|
# ftp object (used only by 3proxy and ftppr)
|
|
add_library(ftp_obj OBJECT src/ftp.c)
|
|
target_include_directories(ftp_obj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
|
|
# 3proxy_crypt object for 3proxy (without WITHMAIN)
|
|
add_library(3proxy_crypt_obj OBJECT src/3proxy_crypt.c)
|
|
target_include_directories(3proxy_crypt_obj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
if(3PROXY_SSL_ENABLED)
|
|
if(3PROXY_SSL_WOLFSSL)
|
|
target_include_directories(3proxy_crypt_obj PRIVATE ${WOLFSSL_INCLUDE_DIR})
|
|
else()
|
|
target_include_directories(3proxy_crypt_obj PRIVATE ${OPENSSL_INCLUDE_DIR})
|
|
endif()
|
|
endif()
|
|
|
|
# ============================================================================
|
|
# Main 3proxy executable
|
|
# Uses srv_* object files (without WITHMAIN)
|
|
# ============================================================================
|
|
|
|
add_executable(3proxy
|
|
${3PROXY_CORE_SOURCES}
|
|
$<TARGET_OBJECTS:srv_modules>
|
|
$<TARGET_OBJECTS:srvudppm_obj>
|
|
$<TARGET_OBJECTS:srvudptotcp_obj>
|
|
$<TARGET_OBJECTS:mainfunc>
|
|
$<TARGET_OBJECTS:common_obj>
|
|
$<TARGET_OBJECTS:udpsockmap_obj>
|
|
$<TARGET_OBJECTS:base64_obj>
|
|
$<TARGET_OBJECTS:mdhash_obj>
|
|
$<TARGET_OBJECTS:ftp_obj>
|
|
$<TARGET_OBJECTS:3proxy_crypt_obj>
|
|
)
|
|
|
|
if(3PROXY_SSL_ENABLED)
|
|
target_sources(3proxy PRIVATE src/ssllib.c src/ssl.c)
|
|
endif()
|
|
|
|
if(PCRE2_FOUND)
|
|
target_sources(3proxy PRIVATE src/pcre.c)
|
|
endif()
|
|
|
|
if(3PROXY_TRANSPARENT_BUILT)
|
|
target_sources(3proxy PRIVATE src/transparent.c)
|
|
endif()
|
|
|
|
target_include_directories(3proxy PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/libs
|
|
)
|
|
if(3PROXY_SSL_ENABLED)
|
|
if(3PROXY_SSL_WOLFSSL)
|
|
target_include_directories(3proxy PRIVATE ${WOLFSSL_INCLUDE_DIR})
|
|
else()
|
|
target_include_directories(3proxy PRIVATE ${OPENSSL_INCLUDE_DIR})
|
|
endif()
|
|
endif()
|
|
if(PCRE2_FOUND)
|
|
target_include_directories(3proxy PRIVATE ${PCRE2_INCLUDE_DIRS})
|
|
endif()
|
|
|
|
target_link_libraries(3proxy PRIVATE Threads::Threads)
|
|
|
|
if(ODBC_FOUND)
|
|
if(TARGET ODBC::ODBC)
|
|
target_link_libraries(3proxy PRIVATE ODBC::ODBC)
|
|
else()
|
|
target_link_libraries(3proxy PRIVATE ${ODBC_LIBRARIES})
|
|
endif()
|
|
endif()
|
|
|
|
# SSL linking
|
|
if(3PROXY_SSL_ENABLED)
|
|
if(3PROXY_SSL_WOLFSSL)
|
|
if(3PROXY_STATIC_LINK)
|
|
# Will be linked statically below (if static library is found)
|
|
else()
|
|
target_link_libraries(3proxy PRIVATE ${WOLFSSL_LIBRARIES})
|
|
endif()
|
|
elseif(3PROXY_STATIC_LINK)
|
|
# OpenSSL static linking handled below
|
|
else()
|
|
target_link_libraries(3proxy PRIVATE OpenSSL::SSL OpenSSL::Crypto)
|
|
endif()
|
|
endif()
|
|
|
|
# PCRE2 linking
|
|
if(PCRE2_FOUND)
|
|
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()
|
|
target_link_libraries(3proxy PRIVATE ${PCRE2_LIBRARIES})
|
|
endif()
|
|
endif()
|
|
|
|
# Static linking of SSL backend and PCRE2 (when option is enabled)
|
|
if(3PROXY_STATIC_LINK AND ((3PROXY_SSL_ENABLED AND NOT 3PROXY_SSL_WOLFSSL) OR (3PROXY_SSL_WOLFSSL) OR PCRE2_FOUND))
|
|
set(_saved_cmake_find_library_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
|
|
|
set(_static_libs "")
|
|
|
|
if(3PROXY_SSL_WOLFSSL)
|
|
find_library(_wolfssl_static_lib NAMES wolfssl)
|
|
if(_wolfssl_static_lib)
|
|
list(APPEND _static_libs ${_wolfssl_static_lib})
|
|
endif()
|
|
elseif(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 SSL backend/PCRE2")
|
|
else()
|
|
message(WARNING "3PROXY_STATIC_LINK is ON but static libraries not found, falling back to dynamic")
|
|
if(3PROXY_SSL_WOLFSSL)
|
|
target_link_libraries(3proxy PRIVATE ${WOLFSSL_LIBRARIES})
|
|
elseif(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)
|
|
target_sources(3proxy PRIVATE 3proxy.rc)
|
|
endif()
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
target_link_libraries(3proxy PRIVATE dl)
|
|
endif()
|
|
|
|
# The event loop and fibers on their own, for tests/cases/units.py: not
|
|
# installed
|
|
add_executable(looptest tests/looptest.c src/loop.c)
|
|
add_executable(fibertest tests/fibertest.c src/fiber.c src/loop.c)
|
|
foreach(unit looptest fibertest)
|
|
target_include_directories(${unit} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
target_link_libraries(${unit} PRIVATE Threads::Threads)
|
|
if(WIN32)
|
|
target_link_libraries(${unit} PRIVATE ${WINDOWS_LIBS})
|
|
endif()
|
|
endforeach()
|
|
|
|
# Build 3proxy_crypt utility
|
|
add_executable(3proxy_crypt
|
|
src/3proxy_crypt.c
|
|
$<TARGET_OBJECTS:base64_obj>
|
|
$<TARGET_OBJECTS:mdhash_obj>
|
|
)
|
|
target_compile_definitions(3proxy_crypt PRIVATE WITHMAIN)
|
|
target_include_directories(3proxy_crypt PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/libs
|
|
)
|
|
if(3PROXY_SSL_ENABLED)
|
|
if(3PROXY_SSL_WOLFSSL)
|
|
target_include_directories(3proxy_crypt PRIVATE ${WOLFSSL_INCLUDE_DIR})
|
|
else()
|
|
target_include_directories(3proxy_crypt PRIVATE ${OPENSSL_INCLUDE_DIR})
|
|
endif()
|
|
endif()
|
|
target_link_libraries(3proxy_crypt PRIVATE Threads::Threads)
|
|
if(3PROXY_SSL_ENABLED)
|
|
if(3PROXY_SSL_WOLFSSL)
|
|
if(3PROXY_STATIC_LINK)
|
|
set(_saved_cmake_find_library_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
|
find_library(_wolfssl_static_lib_c NAMES wolfssl)
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_saved_cmake_find_library_suffixes})
|
|
if(_wolfssl_static_lib_c)
|
|
target_link_libraries(3proxy_crypt PRIVATE -Wl,-Bstatic ${_wolfssl_static_lib_c} -Wl,-Bdynamic)
|
|
message(STATUS "3proxy_crypt: static wolfSSL")
|
|
else()
|
|
message(WARNING "3PROXY_STATIC_LINK is ON but static wolfSSL not found, using dynamic")
|
|
target_link_libraries(3proxy_crypt PRIVATE ${WOLFSSL_LIBRARIES})
|
|
endif()
|
|
else()
|
|
target_link_libraries(3proxy_crypt PRIVATE ${WOLFSSL_LIBRARIES})
|
|
endif()
|
|
else()
|
|
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()
|
|
endif()
|
|
if("${3PROXY_BINARY_PREFIX}" STREQUAL "")
|
|
set_target_properties(3proxy_crypt PROPERTIES OUTPUT_NAME "mycrypt")
|
|
else()
|
|
set_target_properties(3proxy_crypt PROPERTIES OUTPUT_NAME "${3PROXY_BINARY_PREFIX}crypt")
|
|
endif()
|
|
|
|
# Build standalone proxy executables
|
|
foreach(PROXY_NAME proxy socks pop3p imapp smtpp ftppr tcppm udppm tcptoudp udptotcp tlspr)
|
|
string(TOUPPER "${PROXY_NAME}" _MODULE_OPT)
|
|
if(NOT 3PROXY_BUILD_${_MODULE_OPT})
|
|
continue()
|
|
endif()
|
|
|
|
# A binary of nothing: without the support built, these files hold the
|
|
# stand-in the main binary uses and no service of their own.
|
|
if(NOT 3PROXY_USE_MAILPROXY AND PROXY_NAME MATCHES "^(pop3p|imapp|smtpp)$")
|
|
continue()
|
|
endif()
|
|
if(NOT 3PROXY_USE_FTP AND PROXY_NAME STREQUAL "ftppr")
|
|
continue()
|
|
endif()
|
|
|
|
if(PROXY_NAME STREQUAL "ftppr" OR PROXY_NAME STREQUAL "proxy")
|
|
# ftppr and proxy use ftp_obj
|
|
add_executable(${PROXY_NAME}
|
|
src/${PROXY_NAME}.c
|
|
$<TARGET_OBJECTS:common_obj>
|
|
$<TARGET_OBJECTS:ftp_obj>
|
|
)
|
|
else()
|
|
add_executable(${PROXY_NAME}
|
|
src/${PROXY_NAME}.c
|
|
$<TARGET_OBJECTS:common_obj>
|
|
)
|
|
endif()
|
|
|
|
set_target_properties(${PROXY_NAME} PROPERTIES
|
|
OUTPUT_NAME "${3PROXY_BINARY_PREFIX}${PROXY_NAME}"
|
|
)
|
|
|
|
target_include_directories(${PROXY_NAME} PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
|
|
target_compile_definitions(${PROXY_NAME} PRIVATE WITHMAIN)
|
|
|
|
# each takes the main loop of its kind only: udppm and udptotcp UDP, the others TCP
|
|
if(PROXY_NAME STREQUAL "udppm" OR PROXY_NAME STREQUAL "udptotcp")
|
|
target_compile_definitions(${PROXY_NAME} PRIVATE NOTCPMAIN)
|
|
else()
|
|
target_compile_definitions(${PROXY_NAME} PRIVATE NOUDPMAIN)
|
|
endif()
|
|
|
|
target_link_libraries(${PROXY_NAME} PRIVATE Threads::Threads)
|
|
|
|
if(PROXY_NAME STREQUAL "proxy")
|
|
target_compile_definitions(${PROXY_NAME} PRIVATE ANONYMOUS)
|
|
endif()
|
|
|
|
# port mappers take port, host and port as arguments, the others options
|
|
# only; one of the two is defined, as in src/Makefile.inc
|
|
if(PROXY_NAME STREQUAL "tcppm" OR PROXY_NAME STREQUAL "udppm" OR PROXY_NAME STREQUAL "tcptoudp" OR PROXY_NAME STREQUAL "udptotcp" OR PROXY_NAME STREQUAL "tlspr")
|
|
target_compile_definitions(${PROXY_NAME} PRIVATE PORTMAP)
|
|
else()
|
|
target_compile_definitions(${PROXY_NAME} PRIVATE NOPORTMAP)
|
|
endif()
|
|
|
|
if(WIN32)
|
|
target_link_libraries(${PROXY_NAME} PRIVATE ${WINDOWS_LIBS})
|
|
endif()
|
|
|
|
if(PROXY_NAME STREQUAL "proxy" OR PROXY_NAME STREQUAL "smtpp" OR PROXY_NAME STREQUAL "imapp")
|
|
target_sources(${PROXY_NAME} PRIVATE $<TARGET_OBJECTS:base64_obj>)
|
|
endif()
|
|
|
|
if(PROXY_NAME STREQUAL "udppm" OR PROXY_NAME STREQUAL "udptotcp")
|
|
target_sources(${PROXY_NAME} PRIVATE src/hash.c src/loop.c)
|
|
endif()
|
|
|
|
if(PROXY_NAME STREQUAL "socks" OR PROXY_NAME STREQUAL "udppm" OR PROXY_NAME STREQUAL "tcptoudp")
|
|
target_sources(${PROXY_NAME} PRIVATE src/udpsockmap.c)
|
|
endif()
|
|
endforeach()
|
|
|
|
# Plugin output directory
|
|
set(PLUGIN_OUTPUT_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
|
|
if(WIN32)
|
|
set(PLUGIN_SUFFIX ".dll")
|
|
else()
|
|
set(PLUGIN_SUFFIX ".ld.so")
|
|
endif()
|
|
|
|
# Include plugin definitions
|
|
include(cmake/plugins.cmake)
|
|
|
|
# Build plugins
|
|
foreach(PLUGIN ${DEFAULT_PLUGINS})
|
|
add_subdirectory(src/plugins/${PLUGIN})
|
|
endforeach()
|
|
|
|
if(PAM_FOUND)
|
|
add_subdirectory(src/plugins/PamAuth)
|
|
endif()
|
|
|
|
# Build full list of plugins to be built
|
|
set(ALL_PLUGINS ${DEFAULT_PLUGINS})
|
|
if(PAM_FOUND)
|
|
list(APPEND ALL_PLUGINS PamAuth)
|
|
endif()
|
|
|
|
# Installation rules
|
|
install(TARGETS 3proxy 3proxy_crypt
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
)
|
|
|
|
foreach(PROXY_NAME proxy socks pop3p imapp smtpp ftppr tcppm udppm tcptoudp udptotcp tlspr)
|
|
string(TOUPPER "${PROXY_NAME}" _MODULE_OPT)
|
|
if(3PROXY_BUILD_${_MODULE_OPT})
|
|
install(TARGETS ${PROXY_NAME}
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
)
|
|
endif()
|
|
endforeach()
|
|
|
|
# Install plugins
|
|
# Use install(DIRECTORY ... FILES_MATCHING) so the glob resolves at install
|
|
# time, after plugin targets have been built. A configure-time file(GLOB)
|
|
# would run before any plugin exists and install nothing.
|
|
if(WIN32)
|
|
install(DIRECTORY ${PLUGIN_OUTPUT_DIR}/
|
|
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
FILES_MATCHING PATTERN "*${PLUGIN_SUFFIX}"
|
|
)
|
|
else()
|
|
install(DIRECTORY ${PLUGIN_OUTPUT_DIR}/
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/3proxy
|
|
FILES_MATCHING PATTERN "*${PLUGIN_SUFFIX}"
|
|
)
|
|
endif()
|
|
|
|
# Install configuration files
|
|
if(NOT WIN32)
|
|
set(CRYPT_PREFIX "${3PROXY_BINARY_PREFIX}")
|
|
set(3PROXY_CONFDIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}/3proxy/conf")
|
|
set(3PROXY_COUNTERDIR "/opt/3proxy")
|
|
install(DIRECTORY DESTINATION /opt/3proxy)
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/scripts/3proxy.cfg.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/3proxy.cfg
|
|
@ONLY
|
|
)
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/3proxy.cfg DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/3proxy)
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/scripts/add3proxyuser.sh.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/add3proxyuser
|
|
@ONLY
|
|
)
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/add3proxyuser
|
|
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
|
|
)
|
|
endif()
|
|
|
|
# Install service files (systemd, launchd, init.d, or rc.d)
|
|
if(NOT WIN32)
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
|
# macOS - install launchd plist
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/scripts/org.3proxy.3proxy.plist.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/org.3proxy.3proxy.plist
|
|
@ONLY
|
|
)
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.3proxy.3proxy.plist
|
|
DESTINATION /Library/LaunchDaemons
|
|
)
|
|
|
|
message(STATUS " launchd: YES (/Library/LaunchDaemons)")
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD|OpenBSD|NetBSD")
|
|
# BSD - install rc.d script
|
|
set(RCD_DIR "/usr/local/etc/rc.d")
|
|
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/scripts/rc.d/3proxy.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/3proxy.rc
|
|
@ONLY
|
|
)
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/3proxy.rc
|
|
DESTINATION ${RCD_DIR}
|
|
RENAME 3proxy
|
|
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
|
|
)
|
|
|
|
message(STATUS " rc.d: YES (${RCD_DIR})")
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
# Linux - check for systemd
|
|
find_package(PkgConfig QUIET)
|
|
if(PkgConfig_FOUND)
|
|
pkg_check_modules(SYSTEMD QUIET systemd)
|
|
endif()
|
|
|
|
if(SYSTEMD_FOUND)
|
|
# systemd is available - install systemd service
|
|
# Get systemd unit directory
|
|
pkg_get_variable(SYSTEMD_UNIT_DIR systemd systemdsystemunitdir)
|
|
if(NOT SYSTEMD_UNIT_DIR)
|
|
# Fallback to common location
|
|
set(SYSTEMD_UNIT_DIR "/lib/systemd/system")
|
|
endif()
|
|
|
|
# Configure and install systemd service file
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/scripts/3proxy.service.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/3proxy.service
|
|
@ONLY
|
|
)
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/3proxy.service
|
|
DESTINATION ${SYSTEMD_UNIT_DIR}
|
|
)
|
|
|
|
message(STATUS " systemd: YES (${SYSTEMD_UNIT_DIR})")
|
|
else()
|
|
# No systemd - install init.d script
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/scripts/init.d/3proxy.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/3proxy.init
|
|
@ONLY
|
|
)
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/3proxy.init
|
|
DESTINATION /etc/init.d
|
|
RENAME 3proxy
|
|
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
|
|
)
|
|
|
|
message(STATUS " systemd: NO (using init.d)")
|
|
endif()
|
|
else()
|
|
# Other Unix - install init.d script
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/scripts/init.d/3proxy.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/3proxy.init
|
|
@ONLY
|
|
)
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/3proxy.init
|
|
DESTINATION /etc/init.d
|
|
RENAME 3proxy
|
|
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
|
|
)
|
|
|
|
message(STATUS " init.d: YES (/etc/init.d)")
|
|
endif()
|
|
|
|
# Run postinstall only for direct installs (no DESTDIR)
|
|
install(CODE "
|
|
if(\"\$ENV{DESTDIR}\" STREQUAL \"\")
|
|
execute_process(
|
|
COMMAND ${CMAKE_COMMAND} -E env sh ${CMAKE_CURRENT_SOURCE_DIR}/scripts/postinstall.sh ${CMAKE_INSTALL_PREFIX}
|
|
RESULT_VARIABLE POSTINSTALL_RESULT
|
|
)
|
|
endif()
|
|
")
|
|
endif()
|
|
|
|
# Install man pages
|
|
if(NOT WIN32)
|
|
# Config man page (section 5) — no prefix
|
|
file(GLOB MAN5_FILES "${CMAKE_CURRENT_SOURCE_DIR}/man/*.5")
|
|
install(FILES ${MAN5_FILES} DESTINATION ${CMAKE_INSTALL_MANDIR}/man5)
|
|
# Main 3proxy man page — no prefix
|
|
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/man/3proxy.8"
|
|
DESTINATION ${CMAKE_INSTALL_MANDIR}/man8
|
|
)
|
|
# 3proxy_crypt man page — no prefix (already has 3proxy_)
|
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/man/3proxy_crypt.8")
|
|
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/man/3proxy_crypt.8"
|
|
DESTINATION ${CMAKE_INSTALL_MANDIR}/man8
|
|
)
|
|
endif()
|
|
# Module man pages — installed with binary prefix only if module is built
|
|
foreach(_MAN proxy socks pop3p imapp smtpp ftppr tcppm udppm tlspr)
|
|
string(TOUPPER "${_MAN}" _MODULE_OPT)
|
|
if(3PROXY_BUILD_${_MODULE_OPT})
|
|
set(_MAN_SRC "${CMAKE_CURRENT_SOURCE_DIR}/man/${_MAN}.8")
|
|
if(EXISTS "${_MAN_SRC}")
|
|
install(FILES "${_MAN_SRC}"
|
|
DESTINATION ${CMAKE_INSTALL_MANDIR}/man8
|
|
RENAME "${3PROXY_BINARY_PREFIX}${_MAN}.8"
|
|
)
|
|
endif()
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
|
|
# Summary
|
|
message(STATUS "")
|
|
message(STATUS "3proxy configuration summary:")
|
|
message(STATUS " Version: ${PROJECT_VERSION_FULL}")
|
|
message(STATUS " Platform: ${CMAKE_SYSTEM_NAME}")
|
|
message(STATUS " Compiler: ${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION}")
|
|
message(STATUS " Build type: ${CMAKE_BUILD_TYPE}")
|
|
message(STATUS "")
|
|
message(STATUS " Options:")
|
|
message(STATUS " BUILD_SHARED: ${3PROXY_BUILD_SHARED}")
|
|
message(STATUS " USE_WOLFSSL: ${3PROXY_USE_WOLFSSL}")
|
|
message(STATUS " USE_OPENSSL: ${3PROXY_USE_OPENSSL}")
|
|
message(STATUS " USE_PCRE2: ${3PROXY_USE_PCRE2}")
|
|
message(STATUS " TRANSPARENT: ${3PROXY_TRANSPARENT_BUILT}")
|
|
message(STATUS " USE_PAM: ${3PROXY_USE_PAM}")
|
|
message(STATUS " USE_ODBC: ${3PROXY_USE_ODBC}")
|
|
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()
|
|
message(STATUS "")
|
|
message(STATUS " Libraries found:")
|
|
message(STATUS " wolfSSL: ${WOLFSSL_FOUND}")
|
|
message(STATUS " OpenSSL: ${OPENSSL_FOUND}")
|
|
message(STATUS " PCRE2: ${PCRE2_FOUND}")
|
|
message(STATUS " PAM: ${PAM_FOUND}")
|
|
message(STATUS " ODBC: ${ODBC_FOUND}")
|
|
message(STATUS "")
|
|
message(STATUS " Plugins to build: ${ALL_PLUGINS}")
|
|
message(STATUS "")
|
|
message(STATUS " Standalone modules:")
|
|
message(STATUS " Binary prefix: \"${3PROXY_BINARY_PREFIX}\"")
|
|
foreach(_M proxy socks pop3p imapp smtpp ftppr tcppm udppm tlspr)
|
|
string(TOUPPER "${_M}" _MO)
|
|
message(STATUS " BUILD_${_MO}: ${3PROXY_BUILD_${_MO}}")
|
|
endforeach()
|
|
message(STATUS "")
|