mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-11-02 16:03:45 +00:00
* Modernize build: switch to CMake, add unit tests, fix man pages
Remove autotools (configure.ac, Makefile.am, m4/, autogen.sh) and make
CMake the sole build system. Enhance CMake with proper Find modules for
MbedTLS, libsodium, PCRE, and c-ares with version/feature detection.
Add support for connmarktos, nftables, stack protector, and MinGW.
Add 10 unit test suites (CTest) covering base64, buffer, cache, crypto,
jconf, json, netutils, ppbloom, rule, and utils modules. Add a Python
stress test measuring bandwidth per cipher with memory leak detection.
Fix man page typos ("Resovle" -> "Resolve"), document missing TCP buffer
options, fix ss-manager duplicate --executable entry, add example section
to ss-tunnel, and document --workdir and --nftables-sets options.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Migrate from PCRE to PCRE2
Replace legacy PCRE (libpcre3) with PCRE2 (libpcre2-8). PCRE1 has been
end-of-life since 2021.
- src/rule.h: use pcre2_code and pcre2_match_data types
- src/rule.c: pcre_compile -> pcre2_compile, pcre_exec -> pcre2_match,
pcre_free -> pcre2_code_free, with proper error message retrieval
- cmake/FindPCRE.cmake -> cmake/FindPCRE2.cmake: find libpcre2-8 via
pkg-config, pcre2-config, or manual search
- Update all CMakeLists.txt, config.h.cmake, configure.cmake, README.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Update Dockerfiles: use CMake build and pcre2-dev
The alpine Dockerfile still used autotools (autogen.sh/configure) which
were removed. Switch to cmake build and replace pcre-dev with pcre2-dev.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix Docker build: disable tests and remove git dep
The tests/ directory is excluded by .dockerignore, so pass
-DBUILD_TESTING=OFF to cmake. Submodules are already checked out
by actions/checkout, no need for git inside the container.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix Docker build: disable static libs (not available in alpine)
Alpine's mbedtls-dev only provides shared libraries. Disable static
build since Docker only needs shared binaries.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Rewrite GitHub Actions: build and test directly on runner
Replace Docker-based CI with direct cmake build on ubuntu-latest and
macos-latest. Install dependencies via apt/brew, build with cmake,
run unit tests with ctest.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix CI: use mbedtls@3 on macOS, disable static build
- macOS: brew's mbedtls is now v4 (incompatible), use mbedtls@3
- Disable static build since CI runners lack static lib packages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix test build on Linux: add stdint.h and link libm
- test_ppbloom.c: add missing #include <stdint.h> for uint8_t
- test_json: link against libm for pow() used in json.c
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix test_ppbloom link: add libm for bloom's log()
On Linux, libbloom uses log() which requires explicit -lm linkage.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix Linux build: link libm for test_buffer and test_crypto, fix warnings
Both test_buffer and test_crypto link libbloom.so which uses log() from
libm. Also fix unused variable warnings in test_json.c that would fail
with -Werror.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix Linux build: link libm for test_jconf (json.c uses pow)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* CI: add unit test and stress test steps to GitHub Actions
Split the Test step into separate "Unit tests" (ctest) and "Stress test"
(stress_test.py with 10MB transfer across all AEAD ciphers) steps for
better visibility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
209 lines
6.8 KiB
CMake
209 lines
6.8 KiB
CMake
cmake_minimum_required(VERSION 3.5)
|
|
|
|
set(PROJECT_NAME shadowsocks-libev)
|
|
set(RELEASE_DATE 2020-09-15)
|
|
set(PROJECT_VERSION "3.3.5")
|
|
set(PROJECT_DESC "a lightweight secured socks5 proxy")
|
|
set(PROJECT_URL "https://shadowsocks.org")
|
|
set(PROJECT_ISSUES_URL "https://github.com/shadowsocks/shadowsocks-libev")
|
|
project(${PROJECT_NAME} VERSION ${PROJECT_VERSION})
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
# Compiler flags matching autotools
|
|
# Note: -Werror is applied per-target in src/CMakeLists.txt to avoid
|
|
# breaking bundled submodules (libcork, libipset, libbloom)
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -D_GNU_SOURCE")
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O2 -Wall -Wno-deprecated-declarations -fno-strict-aliasing")
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
|
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake)
|
|
set(RUNTIME_SHARED_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/shared/bin)
|
|
|
|
set(CMAKE_MACOSX_RPATH TRUE)
|
|
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
|
|
if (NOT CMAKE_BUILD_TYPE)
|
|
set(CMAKE_BUILD_TYPE Debug)
|
|
endif ()
|
|
# Detect linux
|
|
if (UNIX AND NOT APPLE)
|
|
set(LINUX TRUE)
|
|
endif ()
|
|
|
|
message(STATUS "Running cmake version ${CMAKE_VERSION}")
|
|
|
|
option(WITH_STATIC "build with static libraries." ON)
|
|
option(WITH_EMBEDDED_SRC "build with embedded libcork, libipset, and libbloom source." ON)
|
|
option(ENABLE_CONNMARKTOS "Enable saved connmark to IP TOS QoS feature" OFF)
|
|
option(ENABLE_NFTABLES "Report malicious IP to nftables" OFF)
|
|
|
|
# When choose to not use embedded libcork, libipset and libbloom, use libs shipped by system
|
|
if (NOT WITH_EMBEDDED_SRC)
|
|
set(USE_SYSTEM_SHARED_LIB TRUE)
|
|
endif ()
|
|
|
|
# Find dependencies via Find modules
|
|
find_package(PCRE2 REQUIRED)
|
|
find_package(MbedTLS REQUIRED)
|
|
find_package(Sodium REQUIRED)
|
|
find_package(Cares REQUIRED)
|
|
|
|
# Connmarktos support
|
|
if(ENABLE_CONNMARKTOS)
|
|
if(NOT LINUX)
|
|
message(FATAL_ERROR "connmarktos is only supported on Linux")
|
|
endif()
|
|
find_library(NETFILTER_CONNTRACK_LIB netfilter_conntrack)
|
|
find_library(NFNETLINK_LIB nfnetlink)
|
|
if(NOT NETFILTER_CONNTRACK_LIB)
|
|
message(FATAL_ERROR "--enable-connmarktos specified but libnetfilter_conntrack not found")
|
|
endif()
|
|
set(USE_NFCONNTRACK_TOS 1)
|
|
message(STATUS "Connmarktos enabled")
|
|
endif()
|
|
|
|
# Nftables support
|
|
if(ENABLE_NFTABLES)
|
|
if(NOT LINUX)
|
|
message(FATAL_ERROR "nftables is only supported on Linux")
|
|
endif()
|
|
find_library(MNL_LIB mnl)
|
|
find_library(NFTNL_LIB nftnl)
|
|
if(NOT MNL_LIB OR NOT NFTNL_LIB)
|
|
message(FATAL_ERROR "--enable-nftables specified but libmnl or libnftnl not found")
|
|
endif()
|
|
set(USE_NFTABLES 1)
|
|
message(STATUS "Nftables enabled")
|
|
endif()
|
|
|
|
# Run platform tests
|
|
include(${PROJECT_SOURCE_DIR}/cmake/configure.cmake)
|
|
configure_file(${PROJECT_SOURCE_DIR}/cmake/config.h.cmake ${PROJECT_BINARY_DIR}/src/config.h)
|
|
add_definitions(-I${PROJECT_BINARY_DIR}/src)
|
|
add_definitions(-DHAVE_CONFIG_H)
|
|
|
|
# pkg-config
|
|
configure_file(
|
|
${PROJECT_SOURCE_DIR}/cmake/shadowsocks-libev.pc.cmake
|
|
${PROJECT_BINARY_DIR}/pkgconfig/shadowsocks-libev.pc
|
|
@ONLY
|
|
)
|
|
install(FILES
|
|
${PROJECT_BINARY_DIR}/pkgconfig/shadowsocks-libev.pc
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
|
|
)
|
|
|
|
if (WITH_EMBEDDED_SRC)
|
|
# We need libcork,libipset headers
|
|
include_directories(libcork/include)
|
|
include_directories(libipset/include)
|
|
include_directories(libbloom/murmur2)
|
|
include_directories(libbloom)
|
|
|
|
set(LIBCORK_SOURCE
|
|
libcork/src/libcork/cli/commands.c
|
|
libcork/src/libcork/core/allocator.c
|
|
libcork/src/libcork/core/error.c
|
|
libcork/src/libcork/core/gc.c
|
|
libcork/src/libcork/core/hash.c
|
|
libcork/src/libcork/core/ip-address.c
|
|
libcork/src/libcork/core/mempool.c
|
|
libcork/src/libcork/core/timestamp.c
|
|
libcork/src/libcork/core/u128.c
|
|
libcork/src/libcork/core/version.c
|
|
libcork/src/libcork/ds/array.c
|
|
libcork/src/libcork/ds/bitset.c
|
|
libcork/src/libcork/ds/buffer.c
|
|
libcork/src/libcork/ds/dllist.c
|
|
libcork/src/libcork/ds/file-stream.c
|
|
libcork/src/libcork/ds/hash-table.c
|
|
libcork/src/libcork/ds/managed-buffer.c
|
|
libcork/src/libcork/ds/ring-buffer.c
|
|
libcork/src/libcork/ds/slice.c
|
|
libcork/src/libcork/posix/directory-walker.c
|
|
libcork/src/libcork/posix/env.c
|
|
libcork/src/libcork/posix/exec.c
|
|
libcork/src/libcork/posix/files.c
|
|
libcork/src/libcork/posix/process.c
|
|
libcork/src/libcork/pthreads/thread.c
|
|
)
|
|
if (NOT MINGW)
|
|
set(LIBCORK_SOURCE ${LIBCORK_SOURCE} libcork/src/libcork/posix/subprocess.c)
|
|
else ()
|
|
set(LIBCORK_SOURCE ${LIBCORK_SOURCE} libcork/src/libcork/posix/mingw.c)
|
|
endif ()
|
|
|
|
if (WITH_STATIC)
|
|
add_library(cork STATIC ${LIBCORK_SOURCE})
|
|
target_compile_definitions(cork PUBLIC -DCORK_API=CORK_LOCAL)
|
|
endif ()
|
|
|
|
add_library(cork-shared SHARED ${LIBCORK_SOURCE})
|
|
target_compile_definitions(cork-shared PUBLIC -DCORK_API=CORK_EXPORT)
|
|
set_target_properties(cork-shared PROPERTIES OUTPUT_NAME cork)
|
|
if (MINGW)
|
|
target_link_libraries(cork-shared ws2_32)
|
|
endif ()
|
|
|
|
set(LIBIPSET_SOURCE
|
|
libipset/src/libipset/general.c
|
|
libipset/src/libipset/bdd/assignments.c
|
|
libipset/src/libipset/bdd/basics.c
|
|
libipset/src/libipset/bdd/bdd-iterator.c
|
|
libipset/src/libipset/bdd/expanded.c
|
|
libipset/src/libipset/bdd/reachable.c
|
|
libipset/src/libipset/bdd/read.c
|
|
libipset/src/libipset/bdd/write.c
|
|
libipset/src/libipset/map/allocation.c
|
|
libipset/src/libipset/map/inspection.c
|
|
libipset/src/libipset/map/ipv4_map.c
|
|
libipset/src/libipset/map/ipv6_map.c
|
|
libipset/src/libipset/map/storage.c
|
|
libipset/src/libipset/set/allocation.c
|
|
libipset/src/libipset/set/inspection.c
|
|
libipset/src/libipset/set/ipv4_set.c
|
|
libipset/src/libipset/set/ipv6_set.c
|
|
libipset/src/libipset/set/iterator.c
|
|
libipset/src/libipset/set/storage.c
|
|
)
|
|
|
|
if (WITH_STATIC)
|
|
add_library(ipset STATIC ${LIBIPSET_SOURCE})
|
|
endif ()
|
|
|
|
add_library(ipset-shared SHARED ${LIBIPSET_SOURCE})
|
|
set_target_properties(ipset-shared PROPERTIES OUTPUT_NAME ipset)
|
|
|
|
set(LIBBLOOM_SOURCE
|
|
libbloom/bloom.c
|
|
libbloom/murmur2/MurmurHash2.c
|
|
)
|
|
|
|
if (WITH_STATIC)
|
|
add_library(bloom STATIC ${LIBBLOOM_SOURCE})
|
|
target_link_libraries(ipset cork bloom)
|
|
endif ()
|
|
|
|
add_library(bloom-shared SHARED ${LIBBLOOM_SOURCE})
|
|
target_link_libraries(ipset-shared cork-shared bloom-shared)
|
|
set_target_properties(bloom-shared PROPERTIES OUTPUT_NAME bloom)
|
|
endif ()
|
|
|
|
add_subdirectory(src)
|
|
add_subdirectory(doc)
|
|
|
|
# Testing
|
|
include(CTest)
|
|
if(BUILD_TESTING)
|
|
add_subdirectory(tests)
|
|
endif()
|
|
|
|
# Install ss-nat on Linux
|
|
if(LINUX)
|
|
install(PROGRAMS src/ss-nat DESTINATION ${CMAKE_INSTALL_BINDIR})
|
|
endif()
|