diff --git a/.gitignore b/.gitignore index 84079e1d..6e0a48ab 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ m4/ltsugar.m4 m4/ltversion.m4 m4/lt~obsolete.m4 src/Makefile.in +src/config.h # Ignore files generated by configure build/ diff --git a/.travis.yml b/.travis.yml index ed2e3a80..d635f14a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,8 @@ before_install: - make - sudo make install - popd + # Load cached docker images + - if [[ -d $HOME/docker ]]; then ls $HOME/docker/*.tar.gz | xargs -I {file} sh -c "zcat {file} | docker load"; fi addons: apt: packages: @@ -32,6 +34,9 @@ addons: script: - ./autogen.sh - ./configure && make + # Test cmake using our builder + - cd docker/build && docker build -f builder.Dockerfile -t builder . && cd - + - docker run --rm -it -v $PWD:/src -w /src builder sh -c /src/docker/build/dockerbuild.sh branches: only: - master @@ -41,3 +46,19 @@ notifications: email: on_success: change on_failure: always + +# Use cache to speedup next build +services: + - docker + +before_cache: + # Save tagged docker images + - > + mkdir -p $HOME/docker && docker images -a --filter='dangling=false' --format '{{.Repository}}:{{.Tag}} {{.ID}}' + | xargs -n 2 -t sh -c 'test -e $HOME/docker/$1.tar.gz || docker save $0 | gzip -2 > $HOME/docker/$1.tar.gz' + +cache: + bundler: true + directories: + - $HOME/docker + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..6de7bd6c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,131 @@ +cmake_minimum_required(VERSION 2.8) + +set(PROJECT_NAME shadowsocks-libev) +set(RELEASE_DATE 2017-2-17) +set(PROJECT_VERSION "3.0.2") +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}) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") + +#set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/out) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake) +set(CMAKE_MACOSX_RPATH TRUE) + +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}") + +# Will set GIT_EXECUTABLE and GIT_FOUND +# find_package(Git) + +# Run platform tests +include(${CMAKE_SOURCE_DIR}/cmake/configure.cmake) +configure_file(${CMAKE_SOURCE_DIR}/cmake/config.h.cmake ${CMAKE_SOURCE_DIR}/src/config.h) +add_definitions(-DHAVE_CONFIG_H) + +# pkg-config +configure_file( + "${CMAKE_SOURCE_DIR}/cmake/shadowsocks-libev.pc.cmake" + "${CMAKE_BINARY_DIR}/pkgconfig/shadowsocks-libev.pc" + @ONLY +) +install(FILES + "${CMAKE_BINARY_DIR}/pkgconfig/shadowsocks-libev.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" + ) + +# 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/posix/subprocess.c + libcork/src/libcork/pthreads/thread.c + ) + +add_library(cork STATIC ${LIBCORK_SOURCE}) +target_compile_definitions(cork PUBLIC -DCORK_API=CORK_LOCAL) + +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) + +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 + ) + +add_library(ipset STATIC ${LIBIPSET_SOURCE}) + +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 + ) + +add_library(bloom STATIC ${LIBBLOOM_SOURCE}) +target_link_libraries(ipset cork bloom) + +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) + +add_subdirectory(src) + diff --git a/build/.gitkeep b/build/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/cmake/config.h.cmake b/cmake/config.h.cmake new file mode 100644 index 00000000..3b7b6ff3 --- /dev/null +++ b/cmake/config.h.cmake @@ -0,0 +1,295 @@ +#ifndef _SHADOWSOCKS_CONFIG_H +#define _SHADOWSOCKS_CONFIG_H + +/* Define if building universal (internal helper macro) */ +#cmakedefine AC_APPLE_UNIVERSAL_BUILD + +/* errno for incomplete non-blocking connect(2) */ +#cmakedefine CONNECT_IN_PROGRESS @CONNECT_IN_PROGRESS@ + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ARPA_INET_H 1 + +/* Define to 1 if you have the declaration of `inet_ntop', and to 0 if you + don't. */ +#cmakedefine HAVE_DECL_INET_NTOP 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_EV_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `fork' function. */ +#cmakedefine HAVE_FORK 1 + +/* Define to 1 if you have the `getpwnam_r' function. */ +#cmakedefine HAVE_GETPWNAM_R 1 + +/* Define to 1 if you have the `inet_ntop' function. */ +#cmakedefine HAVE_INET_NTOP 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_INTTYPES_H 1 + +/* Enable IPv6 support in libudns */ +#cmakedefine HAVE_IPv6 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LANGINFO_H 1 + +/* Compiling with pcre support */ +#cmakedefine HAVE_LIBPCRE 1 + +/* Define to 1 if you have the `socket' library (-lsocket). */ +#cmakedefine HAVE_LIBSOCKET 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_IF_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_NETFILTER_IPV4_H 1 + +/* Define to 1 if you have the header + file. */ +#cmakedefine HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LOCALE_H 1 + +/* Define to 1 if you have the `malloc' function. */ +#cmakedefine HAVE_MALLOC 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#cmakedefine HAVE_MEMSET 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETDB_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETINET_IN_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NET_IF_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_PCRE_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_PCRE_PCRE_H 1 + +/* Have PTHREAD_PRIO_INHERIT. */ +#cmakedefine HAVE_PTHREAD_PRIO_INHERIT 1 + +/* Define to 1 if you have the `select' function. */ +#cmakedefine HAVE_SELECT 1 + +/* Define to 1 if you have the `setresuid' function. */ +#cmakedefine HAVE_SETRESUID 1 + +/* Define to 1 if you have the `setreuid' function. */ +#cmakedefine HAVE_SETREUID 1 + +/* Define to 1 if you have the `setrlimit' function. */ +#cmakedefine HAVE_SETRLIMIT 1 + +/* Define to 1 if you have the `socket' function. */ +#cmakedefine HAVE_SOCKET 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strerror' function. */ +#cmakedefine HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#cmakedefine HAVE_SYS_WAIT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_UDNS_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `vfork' function. */ +#cmakedefine HAVE_VFORK 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_VFORK_H 1 + +/* Define to 1 if `fork' works. */ +#cmakedefine HAVE_WORKING_FORK 1 + +/* Define to 1 if `vfork' works. */ +#cmakedefine HAVE_WORKING_VFORK 1 + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#cmakedefine LT_OBJDIR "@LT_OBJDIR@" + +/* Define to 1 if assertions should be disabled. */ +#cmakedefine NDEBUG 1 + +/* Name of package */ +#define PACKAGE "@PROJECT_NAME@" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "@PROJECT_NAME@" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "@PROJECT_NAME@ @PROJECT_VERSION@" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "@PROJECT_NAME@" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "@PACKAGE_URL@" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "@PROJECT_VERSION@" + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#cmakedefine PTHREAD_CREATE_JOINABLE 1 + +/* Define as the return type of signal handlers (`int' or `void'). */ +#cmakedefine RETSIGTYPE @RETSIGTYPE@ + +/* Define to the type of arg 1 for `select'. */ +#cmakedefine SELECT_TYPE_ARG1 @SELECT_TYPE_ARG1@ + +/* Define to the type of args 2, 3 and 4 for `select'. */ +#cmakedefine SELECT_TYPE_ARG234 @SELECT_TYPE_ARG234@ + +/* Define to the type of arg 5 for `select'. */ +#cmakedefine SELECT_TYPE_ARG5 @SELECT_TYPE_ARG5@ + +/* Define to 1 if you have the ANSI C header files. */ +#cmakedefine STDC_HEADERS 1 + +/* Define to 1 if you can safely include both and . */ +#cmakedefine TIME_WITH_SYS_TIME 1 + +/* If the compiler supports a TLS storage class define it to that here */ +#cmakedefine TLS @TLS@ + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +#cmakedefine _ALL_SOURCE 1 +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +#cmakedefine _GNU_SOURCE 1 +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +#cmakedefine _POSIX_PTHREAD_SEMANTICS 1 +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +#cmakedefine _TANDEM_SOURCE 1 +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +#cmakedefine __EXTENSIONS__ 1 +#endif + + +/* Define if use system shared lib. */ +#cmakedefine USE_SYSTEM_SHARED_LIB 1 + +/* Version number of package */ +#define VERSION "@PROJECT_VERSION@" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +#cmakedefine WORDS_BIGENDIAN 1 +# endif +#endif + +/* Define to 1 if on MINIX. */ +#cmakedefine _MINIX 1 + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#cmakedefine _POSIX_1_SOURCE 1 + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#cmakedefine _POSIX_SOURCE 1 + +/* Define for Solaris 2.5.1 so the uint8_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#cmakedefine _UINT8_T 1 + +/* Define to empty if `const' does not conform to ANSI C. */ +#cmakedefine const 1 + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#cmakedefine inline 1 +#endif + +/* Define to `int' if does not define. */ +#cmakedefine pid_t @pid_t@ + +/* Define to `unsigned int' if does not define. */ +#cmakedefine size_t unsigned int + +/* Define to `int' if does not define. */ +#cmakedefine ssize_t int + +/* Define to the type of an unsigned integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ +#cmakedefine uint16_t @uint16_t@ + +/* Define to the type of an unsigned integer type of width exactly 8 bits if + such a type exists and the standard includes do not define it. */ +#cmakedefine uint8_t @uint8_t@ + +/* Define as `fork' if `vfork' does not work. */ +#cmakedefine vfork + +#endif diff --git a/cmake/configure.cmake b/cmake/configure.cmake new file mode 100644 index 00000000..693b1e57 --- /dev/null +++ b/cmake/configure.cmake @@ -0,0 +1,191 @@ + +# ------------------------------------------------------------- +# config.h + +# If we generate config.h by automake +#include_directories(.) + +# Use cmake to generate config.h +include(CheckIncludeFiles) +include(CheckFunctionExists) +include(CheckSymbolExists) +include(CheckLibraryExists) +include(CheckTypeSize) +include(CheckCSourceCompiles) + +# Define if building universal (internal helper macro) +# AC_APPLE_UNIVERSAL_BUILD +set(CONNECT_IN_PROGRESS "EINPROGRESS") +set(CONNECT_IN_PROGRESS "EINPROGRESS" CACHE STRING "") + + +check_include_files(dlfcn.h HAVE_DLFCN_H) +check_include_files(ev.h HAVE_EV_H) +check_include_files(fcntl.h HAVE_FCNTL_H) +check_function_exists(fork HAVE_FORK) +check_function_exists(getpwnam_r HAVE_GETPWNAM_R) +check_function_exists(inet_ntop HAVE_INET_NTOP) +check_include_files(inttypes.h HAVE_INTTYPES_H) +set(HAVE_IPv6 1) +check_include_files(langinfo.h HAVE_LANGINFO_H) +set(HAVE_LIBPCRE 1) +check_library_exists(socket socket "" HAVE_LIBSOCKET) +check_include_files(limits.h HAVE_LIMITS_H) +check_include_files(linux/if.h HAVE_LINUX_IF_H) +check_include_files(linux/netfilter_ipv4.h HAVE_LINUX_NETFILTER_IPV4_H) +check_include_files(linux/netfilter_ipv6/ip6_tables.h HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H) +check_include_files(locale.h HAVE_LOCALE_H) + + +check_function_exists(malloc HAVE_MALLOC) +check_include_files(memory.h HAVE_MEMORY_H) +check_function_exists(memset HAVE_MEMSET) + +check_include_files(netdb.h HAVE_NETDB_H) +check_include_files(netinet/in.h HAVE_NETINET_IN_H) +check_include_files(net/if.h HAVE_NET_IF_H) +check_include_files(pcre.h HAVE_PCRE_H) +check_include_files(pcre/pcre.h HAVE_PCRE_PCRE_H) +check_symbol_exists(PTHREAD_PRIO_INHERIT pthread.h HAVE_PTHREAD_PRIO_INHERIT) + +check_function_exists(select HAVE_SELECT) +check_function_exists(setresuid HAVE_SETRESUID) +check_function_exists(setreuid HAVE_SETREUID) +check_function_exists(setrlimit HAVE_SETRLIMIT) +check_function_exists(socket HAVE_SOCKET) + +check_include_files(stdint.h HAVE_STDINT_H) +check_include_files(stdlib.h HAVE_STDLIB_H) + +check_function_exists(strerror HAVE_STRERROR) + +check_include_files(strings.h HAVE_STRINGS_H) +check_include_files(string.h HAVE_STRING_H) +check_include_files(sys/ioctl.h HAVE_SYS_IOCTL_H) +check_include_files(sys/select.h HAVE_SYS_SELECT_H) +check_include_files(sys/socket.h HAVE_SYS_SOCKET_H) +check_include_files(sys/stat.h HAVE_SYS_STAT_H) +check_include_files(sys/types.h HAVE_SYS_TYPES_H) +check_include_files(sys/wait.h HAVE_SYS_WAIT_H) +check_include_files(udns.h HAVE_UDNS_H) +check_include_files(unistd.h HAVE_UNISTD_H) + +check_function_exists(fork HAVE_FORK) +check_function_exists(vfork HAVE_VFORK) +check_include_files(vfork.h HAVE_VFORK_H) +if (HAVE_VFORK) + set(HAVE_WORKING_VFORK 1) +endif () +if (HAVE_FORK) + set(HAVE_WORKING_FORK 1) +endif () + + +# Define to the sub-directory where libtool stores uninstalled libraries. +set(LT_OBJDIR ".libs/") +set(NDEBUG 1) +set(PACKAGE ${PROJECT_NAME}) +set(PACKAGE_BUGREPORT max.c.lv@gmail.com) +set(PACKAGE_NAME ${PROJECT_NAME}) +#set(PACKAGE_VERSION ${PROJECT_VERSION}) +set(PACKAGE_VERSION 3.0.2) +set(PACKAGE_STRING "${PROJECT_NAME} ${PACKAGE_VERSION}") +set(PACKAGE_TARNAME ${PROJECT_NAME}) +set(PACKAGE_URL "") + +#message(${PACKAGE_NAME} - v${PACKAGE_VERSION} - v${PROJECT_VERSION}) + +# PTHREAD_CREATE_JOINABLE + +# Define as the return type of signal handlers (`int' or `void'). +set(RETSIGTYPE void) + +# Define to the type of arg 1 for `select'. +set(SELECT_TYPE_ARG1 int) + +# Define to the type of args 2, 3 and 4 for `select'. +set(SELECT_TYPE_ARG234 "(fd_set *)") + +# Define to the type of arg 5 for `select'. +set(SELECT_TYPE_ARG5 "(struct timeval *)") + +# Define to 1 if you have the ANSI C header files. +set(STDC_HEADERS 1) + + +check_include_files(sys/time.h time.h TIME_WITH_SYS_TIME) + + +# If the compiler supports a TLS storage class define it to that here +check_c_source_compiles(" + __thread int tls; + int main(void) { return 0; }" + HAVE_GCC_THREAD_LOCAL_STORAGE) +if (HAVE_GCC_THREAD_LOCAL_STORAGE) + set(TLS __thread) +endif () + +set(_ALL_SOURCE 1) +set(_GNU_SOURCE 1) +set(_POSIX_PTHREAD_SEMANTICS 1) +set(_TANDEM_SOURCE 1) +set(__EXTENSIONS__ 1) +# USE_SYSTEM_SHARED_LIB +set(VERSION ${PACKAGE_VERSION}) +# TODO WORDS_BIGENDIAN +# _MINIX +# _POSIX_1_SOURCE +# _POSIX_SOURCE +# _UINT8_T + +# Define to empty if `const' does not conform to ANSI C. +# undef const + +# Define to `__inline__' or `__inline' if that's what the C compiler +# calls it, or to nothing if 'inline' is not supported under any name. +#ifndef __cplusplus +#undef inline +#endif +# TODO Assume we got inline support +# https://cmake.org/Wiki/CMakeTestInline + +# Define to `int' if does not define. +# undef pid_t +# Define to the type of an unsigned integer type of width exactly 16 bits if +# such a type exists and the standard includes do not define it. +# undef uint16_t +# Define to the type of an unsigned integer type of width exactly 8 bits if +# such a type exists and the standard includes do not define it. +# undef uint8_t +set(CMAKE_EXTRA_INCLUDE_FILES sys/types.h) +check_type_size(pid_t PID_T) +check_type_size(size_t SIZE_T) +check_type_size(ssize_t SSIZE_T) +set(CMAKE_EXTRA_INCLUDE_FILES) + +check_type_size(uint16_t UINT16_T) +check_type_size(uint8_t UINT8_T) + +## Inverse +if (NOT HAVE_PID_T) + set(pid_t int) +endif () +if (NOT HAVE_SIZE_T) + set(size_t "unsigned int") +endif () +if (NOT HAVE_SSIZE_T) + set(ssize_t int) +endif () + +if (NOT HAVE_UINT8_T) + set(uint8_t "unsigned char") +endif () +if (NOT HAVE_UINT16_T) + set(uint16_t "unsigned short") +endif () + + +# Define as `fork' if `vfork' does not work. +if (NOT HAVE_WORKING_VFORK) + set(vfork fork) +endif () diff --git a/cmake/shadowsocks-libev.pc.cmake b/cmake/shadowsocks-libev.pc.cmake new file mode 100644 index 00000000..a8f6f1bd --- /dev/null +++ b/cmake/shadowsocks-libev.pc.cmake @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=${prefix}/@CMAKE_INSTALL_BINDIR@ +libdir=${exec_prefix}/@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ +sharedir=${prefix}/@CMAKE_INSTALL_DATAROOTDIR@ +mandir=${prefix}/@CMAKE_INSTALL_MANDIR@ + +Name: @PROJECT_NAME@ +Description: @PROJECT_DESC@ +URL: @PROJECT_URL@ +Version: @PROJECT_VERSION@ +Requires: +Cflags: -I${includedir} +Libs: -L${libdir} -lshadowsocks-libev -lcrypto diff --git a/docker/build/builder.Dockerfile b/docker/build/builder.Dockerfile new file mode 100644 index 00000000..a1402c57 --- /dev/null +++ b/docker/build/builder.Dockerfile @@ -0,0 +1,8 @@ +# Alpine with China mirror +FROM alpine +MAINTAINER wener + +# Better for cache and dev +RUN apk add --no-cache --virtual .build-deps \ + alpine-sdk cmake \ + linux-headers libev-dev libsodium-dev mbedtls-static mbedtls-dev pcre-dev udns-dev diff --git a/docker/build/dockerbuild.sh b/docker/build/dockerbuild.sh new file mode 100755 index 00000000..2b61cc60 --- /dev/null +++ b/docker/build/dockerbuild.sh @@ -0,0 +1,5 @@ +#!/bin/sh +set -e +set -o xtrace + +cmake -DBUILD_STATIC=OFF . && make && make install \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 00000000..c9aae696 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,185 @@ +# redir need linux/* stuff +if (LINUX) + option(WITH_SS_REDIR "Build ss-redir" ON) +else () + option(WITH_SS_REDIR "Build ss-redir" OFF) +endif () + + +set(SS_SNI_SOURCE + http.c + tls.c + rule.c + ) + +set(SS_CRYPTO_SOURCE + crypto.c + aead.c + stream.c + base64.c + ) + +set(SS_PLUGIN_SOURCE + plugin.c + ) + +set(SS_SHARED_SOURCES + ppbloom.c + utils.c + jconf.c + json.c + netutils.c + ) + +set(LIBSHADOWSOCKS_LIBEV_SOURCE + ${SS_SHARED_SOURCES} + udprelay.c + cache.c + acl.c + local.c + ${SS_CRYPTO_SOURCE} + ${SS_PLUGIN_SOURCE} + ${SS_SNI_SOURCE}) + +set(SS_LOCAL_SOURCE + ${LIBSHADOWSOCKS_LIBEV_SOURCE} + + ) + +set(SS_TUNNEL_SOURCE + ${SS_SHARED_SOURCES} + udprelay.c + cache.c + tunnel.c + ${SS_CRYPTO_SOURCE} + ${SS_PLUGIN_SOURCE} + ) + +set(SS_SERVER_SOURCE + ${SS_SHARED_SOURCES} + udprelay.c + cache.c + acl.c + resolv.c + server.c + ${SS_CRYPTO_SOURCE} + ${SS_PLUGIN_SOURCE} + ${SS_SNI_SOURCE} + ) + +set(SS_MANAGER_SOURCE + ${SS_SHARED_SOURCES} + manager.c + ) + +set(SS_REDIR_SOURCE + ${SS_SHARED_SOURCES} + udprelay.c + cache.c + redir.c + ${SS_CRYPTO_SOURCE} + ${SS_PLUGIN_SOURCE} + ${SS_SNI_SOURCE} + ) + + +find_library(LIBSODIUM libsodium.a) +find_library(LIBMBEDTLS libmbedtls.a) +find_library(LIBMBEDCRYPTO libmbedcrypto.a) +find_library(LIBEV libev.a) +find_library(LIBUDNS libudns.a) +find_library(LIBPCRE libpcre.a) + +find_library(LIBSODIUM_SHARED sodium) +find_library(LIBMBEDTLS_SHARED mbedtls) +find_library(LIBMBEDCRYPTO_SHARED mbedcrypto) +find_library(LIBEV_SHARED ev) +find_library(LIBUDNS_SHARED udns) +find_library(LIBPCRE_SHARED pcre) + +list(APPEND DEPS bloom m ${LIBEV} ${LIBUDNS} ${LIBPCRE} ${LIBSODIUM} ${LIBMBEDTLS} ${LIBMBEDCRYPTO}) +list(APPEND DEPS_SHARED bloom-shared m ${LIBEV_SHARED} ${LIBUDNS_SHARED} ${LIBPCRE_SHARED} ${LIBSODIUM_SHARED} +${LIBMBEDTLS_SHARED} ${LIBMBEDCRYPTO_SHARED}) + +find_package (Threads) + +# Add our targets +add_executable(ss-server ${SS_SERVER_SOURCE}) +add_executable(ss-tunnel ${SS_TUNNEL_SOURCE}) +add_executable(ss-manager ${SS_MANAGER_SOURCE}) +add_executable(ss-local ${SS_LOCAL_SOURCE}) +if (WITH_SS_REDIR) + add_executable(ss-redir ${SS_REDIR_SOURCE}) +else () + add_executable(ss-redir EXCLUDE_FROM_ALL ${SS_REDIR_SOURCE}) +endif () +add_library(shadowsocks-libev STATIC ${LIBSHADOWSOCKS_LIBEV_SOURCE}) + + +target_compile_definitions(ss-server PUBLIC -DMODULE_REMOTE) +target_compile_definitions(ss-tunnel PUBLIC -DMODULE_TUNNEL) +target_compile_definitions(ss-manager PUBLIC -DMODULE_MANAGER) +target_compile_definitions(ss-local PUBLIC -DMODULE_LOCAL) +target_compile_definitions(ss-redir PUBLIC -DMODULE_REDIR) +target_compile_definitions(shadowsocks-libev PUBLIC -DMODULE_LOCAL) + +target_link_libraries(ss-server cork ipset ${DEPS}) +target_link_libraries(ss-tunnel cork ${DEPS}) +target_link_libraries(ss-manager m bloom cork ${LIBEV} ${LIBUDNS}) +target_link_libraries(ss-local cork ipset ${DEPS}) +target_link_libraries(ss-redir cork ipset ${DEPS}) +target_link_libraries(shadowsocks-libev cork ipset ${DEPS}) + +# ------------------------------------------------------------------ +# Shared +add_executable(ss-server-shared ${SS_SERVER_SOURCE}) +add_executable(ss-tunnel-shared ${SS_TUNNEL_SOURCE}) +add_executable(ss-manager-shared ${SS_MANAGER_SOURCE}) +add_executable(ss-local-shared ${SS_LOCAL_SOURCE}) +if (WITH_SS_REDIR) + add_executable(ss-redir-shared ${SS_REDIR_SOURCE}) +else () + add_executable(ss-redir-shared EXCLUDE_FROM_ALL ${SS_REDIR_SOURCE}) +endif () +add_library(shadowsocks-libev-shared SHARED ${LIBSHADOWSOCKS_LIBEV_SOURCE}) + +target_compile_definitions(ss-server-shared PUBLIC -DMODULE_REMOTE) +target_compile_definitions(ss-tunnel-shared PUBLIC -DMODULE_TUNNEL) +target_compile_definitions(ss-manager-shared PUBLIC -DMODULE_MANAGER) +target_compile_definitions(ss-local-shared PUBLIC -DMODULE_LOCAL) +target_compile_definitions(ss-redir-shared PUBLIC -DMODULE_REDIR) +target_compile_definitions(shadowsocks-libev-shared PUBLIC -DMODULE_LOCAL) + +target_link_libraries(ss-server-shared cork-shared ipset-shared ${DEPS_SHARED}) +target_link_libraries(ss-tunnel-shared cork-shared ${DEPS_SHARED}) +target_link_libraries(ss-manager-shared m bloom-shared cork-shared ${CMAKE_THREAD_LIBS_INIT} ${LIBEV_SHARED} ${LIBUDNS_SHARED}) +target_link_libraries(ss-local-shared cork-shared ipset-shared ${DEPS_SHARED}) +target_link_libraries(ss-redir-shared cork-shared ipset-shared ${DEPS_SHARED}) +target_link_libraries(shadowsocks-libev-shared cork-shared ipset-shared ${DEPS_SHARED}) + +set_target_properties(ss-server-shared PROPERTIES OUTPUT_NAME ss-server) +set_target_properties(ss-tunnel-shared PROPERTIES OUTPUT_NAME ss-tunnel) +set_target_properties(ss-manager-shared PROPERTIES OUTPUT_NAME ss-manager) +set_target_properties(ss-local-shared PROPERTIES OUTPUT_NAME ss-local) +set_target_properties(ss-redir-shared PROPERTIES OUTPUT_NAME ss-redir) + +set_target_properties(ss-server-shared ss-tunnel-shared ss-manager-shared ss-local-shared ss-redir-shared + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/shared/bin" + ) + +set_target_properties(shadowsocks-libev-shared PROPERTIES OUTPUT_NAME shadowsocks-libev) +target_compile_definitions(shadowsocks-libev-shared PUBLIC -DMODULE_LOCAL) +target_link_libraries(shadowsocks-libev-shared cork-shared ipset-shared ${DEPS_SHARED}) + + +install(DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + DESTINATION bin + FILES_MATCHING PATTERN "ss-*") + + +add_custom_target(distclean + COMMAND ${CMAKE_COMMAND} -E echo WARNING: distclean target is not functional + COMMAND ${CMAKE_COMMAND} -E echo Use 'git clean -fdx' instead + VERBATIM + )