From 8b08f394385c83a68bcab402e5548a45270dac70 Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Thu, 30 Apr 2026 18:30:04 +0300 Subject: [PATCH] Link PCRE statically --- CMakeLists.txt | 9 +++++ Makefile.FreeBSD | 3 +- Makefile.Linux | 3 +- Makefile.Solaris | 14 +++++++- Makefile.msvc | 1 + Makefile.unix | 3 +- Makefile.watcom | 1 + Makefile.win | 1 + src/plugins/PCREPlugin/CMakeLists.txt | 50 +++++++++++++++++++++++---- src/plugins/PCREPlugin/Makefile.inc | 2 +- 10 files changed, 75 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b553b4a..635c664 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -385,6 +385,9 @@ 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(OpenSSL_FOUND) + target_include_directories(3proxy_crypt_obj PRIVATE ${OPENSSL_INCLUDE_DIR}) +endif() # ============================================================================ # Main 3proxy executable @@ -411,6 +414,9 @@ target_include_directories(3proxy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/libs ) +if(OpenSSL_FOUND) + target_include_directories(3proxy PRIVATE ${OPENSSL_INCLUDE_DIR}) +endif() target_link_libraries(3proxy PRIVATE Threads::Threads) @@ -446,6 +452,9 @@ target_include_directories(3proxy_crypt PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/libs ) +if(OpenSSL_FOUND) + target_include_directories(3proxy_crypt PRIVATE ${OPENSSL_INCLUDE_DIR}) +endif() target_link_libraries(3proxy_crypt PRIVATE Threads::Threads) if(OpenSSL_FOUND) target_link_libraries(3proxy_crypt PRIVATE OpenSSL::SSL OpenSSL::Crypto) diff --git a/Makefile.FreeBSD b/Makefile.FreeBSD index 06f9f9f..6d3c3f9 100644 --- a/Makefile.FreeBSD +++ b/Makefile.FreeBSD @@ -39,9 +39,10 @@ ifeq ($(OPENSSL_CHECK), true) CFLAGS += -DWITH_SSL SSL_OBJS = ssllib$(OBJSUFFICS) ssl$(OBJSUFFICS) endif -PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) -lpcre2-8 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) +PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) -Wl,-Bstatic -lpcre2-8 -Wl,-Bdynamic 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) ifeq ($(PCRE_CHECK), true) PLUGINS += PCREPlugin + PCRE_LIBS = -Wl,-Bstatic -lpcre2-8 -Wl,-Bdynamic endif PAM_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpam.o - 2>/dev/null && $(CC) $(LDFLAGS) -o testpam testpam.o -lpam 2>/dev/null && rm testpam testpam.o && echo true||echo false) ifeq ($(PAM_CHECK), true) diff --git a/Makefile.Linux b/Makefile.Linux index 2811045..9d98336 100644 --- a/Makefile.Linux +++ b/Makefile.Linux @@ -41,9 +41,10 @@ ifeq ($(OPENSSL_CHECK), true) CFLAGS += -DWITH_SSL SSL_OBJS = ssllib$(OBJSUFFICS) ssl$(OBJSUFFICS) endif -PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) -lpcre2-8 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) +PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) -Wl,-Bstatic -lpcre2-8 -Wl,-Bdynamic 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) ifeq ($(PCRE_CHECK), true) PLUGINS += PCREPlugin + PCRE_LIBS = -Wl,-Bstatic -lpcre2-8 -Wl,-Bdynamic endif PAM_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpam.o - 2>/dev/null && $(CC) $(LDFLAGS) -o testpam testpam.o -lpam 2>/dev/null && rm testpam testpam.o && echo true||echo false) ifeq ($(PAM_CHECK), true) diff --git a/Makefile.Solaris b/Makefile.Solaris index e75658c..54636c8 100644 --- a/Makefile.Solaris +++ b/Makefile.Solaris @@ -27,7 +27,19 @@ AFTERCLEAN = (find . -type f -name "*.o" -delete && find src/ -type f -name "Mak TYPECOMMAND = cat COMPATLIBS = MAKEFILE = Makefile.Solaris -PLUGINS = StringsPlugin TrafficPlugin +PLUGINS = StringsPlugin TrafficPlugin TransparentPlugin FilePlugin + +OPENSSL_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testssl.o - 2>/dev/null && $(CC) $(LDFLAGS) -o testssl testssl.o -lcrypto -lssl 2>/dev/null && rm testssl testssl.o && echo true||echo false) +ifeq ($(OPENSSL_CHECK), true) + LIBS += -l crypto -l ssl + CFLAGS += -DWITH_SSL + SSL_OBJS = ssllib$(OBJSUFFICS) ssl$(OBJSUFFICS) +endif +PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) -Wl,-Bstatic -lpcre2-8 -Wl,-Bdynamic 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) +ifeq ($(PCRE_CHECK), true) + PLUGINS += PCREPlugin + PCRE_LIBS = -Wl,-Bstatic -lpcre2-8 -Wl,-Bdynamic +endif include Makefile.inc diff --git a/Makefile.msvc b/Makefile.msvc index 1070cc6..283fed0 100644 --- a/Makefile.msvc +++ b/Makefile.msvc @@ -29,6 +29,7 @@ COMPATLIBS = MAKEFILE = Makefile.msvc PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin FilePlugin PCREPlugin SSL_OBJS = ssllib$(OBJSUFFICS) ssl$(OBJSUFFICS) +PCRE_LIBS = pcre2-8.lib VERFILE = 3proxy.res $(VERFILE) VERSIONDEP = 3proxy.res $(VERSIONDEP) AFTERCLEAN = if exist src\*.res (del src\*.res) && if exist src\*.err (del src\*.err) diff --git a/Makefile.unix b/Makefile.unix index e0d679a..2440b91 100644 --- a/Makefile.unix +++ b/Makefile.unix @@ -41,9 +41,10 @@ ifeq ($(OPENSSL_CHECK), true) CFLAGS += -DWITH_SSL SSL_OBJS = ssllib$(OBJSUFFICS) ssl$(OBJSUFFICS) endif -PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) -lpcre2-8 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) +PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) -Wl,-Bstatic -lpcre2-8 -Wl,-Bdynamic 2>/dev/null && rm testpcre testpcre.o && echo true||echo false) ifeq ($(PCRE_CHECK), true) PLUGINS += PCREPlugin + PCRE_LIBS = -Wl,-Bstatic -lpcre2-8 -Wl,-Bdynamic endif PAM_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpam.o - 2>/dev/null && $(CC) $(LDFLAGS) -o testpam testpam.o -lpam 2>/dev/null && rm testpam testpam.o && echo true||echo false) ifeq ($(PAM_CHECK), true) diff --git a/Makefile.watcom b/Makefile.watcom index 5df122e..c9c501d 100644 --- a/Makefile.watcom +++ b/Makefile.watcom @@ -27,6 +27,7 @@ TYPECOMMAND = type COMPATLIBS = MAKEFILE = Makefile.watcom PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin +PCRE_LIBS = pcre2-8.lib VERFILE = $(VERFILE) VERSION = $(VERSION) VERSIONDEP = 3proxy.res $(VERSIONDEP) diff --git a/Makefile.win b/Makefile.win index c4debb1..ba8995e 100644 --- a/Makefile.win +++ b/Makefile.win @@ -47,6 +47,7 @@ endif PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n#include \\n int main(){return 0;}" | tr -d '\\\\' | cc -x c $(CFLAGS) $(LDFLAGS) -lpcre2-8 -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false) ifeq ($(PCRE_CHECK), true) PLUGINS += PCREPlugin + PCRE_LIBS = -lpcre2-8 endif endif diff --git a/src/plugins/PCREPlugin/CMakeLists.txt b/src/plugins/PCREPlugin/CMakeLists.txt index f93725c..1632f3b 100644 --- a/src/plugins/PCREPlugin/CMakeLists.txt +++ b/src/plugins/PCREPlugin/CMakeLists.txt @@ -10,11 +10,47 @@ add_3proxy_plugin(PCREPlugin COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8 ) -if(TARGET PCRE2::PCRE2) - target_link_libraries(PCREPlugin PRIVATE PCRE2::PCRE2) -else() - target_link_libraries(PCREPlugin PRIVATE ${PCRE2_LIBRARIES}) - if(PCRE2_INCLUDE_DIRS) - target_include_directories(PCREPlugin PRIVATE ${PCRE2_INCLUDE_DIRS}) +# Helper function to link PCRE2 with static linking on Linux/FreeBSD +function(link_pcre2_static TARGET_NAME) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR + CMAKE_SYSTEM_NAME MATCHES "FreeBSD|OpenBSD|NetBSD" OR + CMAKE_SYSTEM_NAME STREQUAL "Unix") + # Try to find static PCRE2 library + find_library(PCRE2_STATIC_LIBRARY + NAMES pcre2-8 libpcre2-8.a pcre2-8.a + PATHS ${PC_PCRE2_LIBRARY_DIRS} + /usr/lib + /usr/local/lib + /lib + ) + if(PCRE2_STATIC_LIBRARY) + # Use static linking with GNU ld + target_link_libraries(${TARGET_NAME} PRIVATE + -Wl,-Bstatic + ${PCRE2_STATIC_LIBRARY} + -Wl,-Bdynamic + ) + message(STATUS "Using static PCRE2: ${PCRE2_STATIC_LIBRARY}") + else() + # Fallback to dynamic linking if static library not found + if(TARGET PCRE2::PCRE2) + target_link_libraries(${TARGET_NAME} PRIVATE PCRE2::PCRE2) + else() + target_link_libraries(${TARGET_NAME} PRIVATE ${PCRE2_LIBRARIES}) + endif() + message(STATUS "Static PCRE2 not found, using dynamic linking") + endif() + else() + # Other platforms (macOS, Windows) - use standard linking + if(TARGET PCRE2::PCRE2) + target_link_libraries(${TARGET_NAME} PRIVATE PCRE2::PCRE2) + else() + target_link_libraries(${TARGET_NAME} PRIVATE ${PCRE2_LIBRARIES}) + if(PCRE2_INCLUDE_DIRS) + target_include_directories(${TARGET_NAME} PRIVATE ${PCRE2_INCLUDE_DIRS}) + endif() + endif() endif() -endif() +endfunction() + +link_pcre2_static(PCREPlugin) diff --git a/src/plugins/PCREPlugin/Makefile.inc b/src/plugins/PCREPlugin/Makefile.inc index 455ee34..00dc0f6 100644 --- a/src/plugins/PCREPlugin/Makefile.inc +++ b/src/plugins/PCREPlugin/Makefile.inc @@ -4,5 +4,5 @@ pcre_plugin$(OBJSUFFICS): pcre_plugin.c $(CC) $(DCFLAGS) $(CFLAGS) pcre_plugin.c $(BUILDDIR)PCREPlugin$(DLSUFFICS): pcre_plugin$(OBJSUFFICS) - $(LN) $(LNOUT)../../$(BUILDDIR)PCREPlugin$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) pcre_plugin$(OBJSUFFICS) $(LIBSPREFIX)pcre2-8$(LIBSSUFFIX) + $(LN) $(LNOUT)../../$(BUILDDIR)PCREPlugin$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) pcre_plugin$(OBJSUFFICS) $(PCRE_LIBS)