ShadowsocksR-Live / shadowsocksr-native

翻墙 从容穿越党国敏感日 ShadowsocksR (SSRoT) native implementation for all platforms, GFW terminator
https://github.com/ShadowsocksR-Live/shadowsocksr-native/wiki
GNU General Public License v3.0
2.74k stars 763 forks source link

请问能编译一个适合openwrt的客户端吗? #109

Closed yonheng closed 3 years ago

yonheng commented 4 years ago

请问能编译一个适合openwrt的客户端吗?

openwrtssrn commented 4 years ago

谢谢ssrlive的源代码

我编译成功了。分享一下我的过程供大家参考

Makefile 参考的shadowsocks-libev openwrt https://github.com/shadowsocks/openwrt-shadowsocks

大体流程 下载sdk 获取依赖feeds 创建Makefile 修改Cmakefiles 编译

前往openwrt 下载sdk

以 ar71xx 平台为例

tar xjf OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2 cd OpenWrt-SDK-ar71xx-*

添加 feeds 安装依赖

./scripts/feeds update -a ./scripts/feeds install libuv libmbedtls libsodium libjson-c

创建 shadowsocksr-native Makefile

mkdir package/shadowsocksr-native vi package/shadowsocks-native/Makefile

include $(TOPDIR)/rules.mk

PKG_NAME:=shadowsocksr-native
PKG_VERSION:=0.4
PKG_RELEASE:=1

#PKG_SOURCE_PROTO:=git
#PKG_SOURCE_URL:=https://github.com/ShadowsocksR-Live/shadowsocksr-native.git
#PKG_SOURCE_VERSION:=6b528cff7d46c6fc42df7f992e6402d9e7cec6d4
#PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION)
#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz

PKG_LICENSE:=GPLv3
PKG_LICENSE_FILES:=LICENSE

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(BUILD_VARIANT)/

PKG_INSTALL:=1
PKG_FIXUP:=autoreconf
PKG_USE_MIPS16:=0
PKG_BUILD_PARALLEL:=1

include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk

define Package/shadowsocksr-native
    SECTION:=net
    CATEGORY:=Network
    TITLE:=Lightweight Secured Socks5 Proxy
    URL:=https://github.com/ShadowsocksR-Live/shadowsocksr-native
    DEPENDS:=+libuv +libmbedtls +libsodium +libjson-c 
    #+libev +libpcre +zlib +libpthread 
endef

#Package/shadowsocksr-native-server = $(Package/shadowsocksr-native)

define Package/shadowsocksr-native/description
Shadowsocksr-libev-native is a lightweight secured socks5 proxy for embedded devices and low end boxes.
endef

#Package/shadowsocksr-native-server/description = $(Package/shadowsocksr-native/description)

CMAKE_OPTIONS += -DBUILD_SHARED_AND_STATIC_LIBS=On\
    -DCMAKE_INSTALL_PREFIX=/usr/bin

#CONFIGURE_ARGS += --disable-ssp --disable-documentation --disable-assert

define Package/shadowsocksr-native/install
    $(INSTALL_DIR) $(1)/usr/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ssr-client $(1)/usr/bin
endef

#define Package/shadowsocksr-native-server/install
#   $(INSTALL_DIR) $(1)/usr/bin
#   $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ssr-server $(1)/usr/bin
#endef

$(eval $(call BuildPackage,shadowsocksr-native))
#$(eval $(call BuildPackage,shadowsocksr-native-server))

删除mbedtls的path文件

源文件的uv-mbed使用了debug的mbedtls_debug_set_threshold函数

建议在源代码中改用其他的定义。 这样就可以使用openwrt源中的mbedtls库

删除mbedtls的path文件 不删除会报错

uv-mbed.c undefined reference to `mbedtls_test_cas_pem_len'
uv-mbed.c:(.text+0x3f8): undefined reference to `mbedtls_test_cas_pem'

mv package/feeds/base/mbedtls/patches package/feeds/base/mbedtls/patchesbak #或者 rm -rf package/feeds/base/mbedtls/patches

选择要编译的包 Network -> shadowsocks-libev 和 Libraries->SSL->Enable debug

make menuconfig

在menuconfig 中将mbedtls增加debug选项。不加后续会报错 Libraries->SSL->Enable debug

uv-mbed.c:(.text+0x36c): undefined reference to `mbedtls_debug_set_threshold'

下载源文件(必须重命名为src文件夹)

cd package/shadowsocksr-native git clone https://github.com/ShadowsocksR-Live/shadowsocksr-native.git mv shadowsocksr-native src # rename shadowsocksr-native to src 自动编译时会选择这个源文件 cd src # enter ssr-n directory. git submodule update --init 需要下载libcork libipset depends/uv-mbed libudns git submodule foreach -q 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'

修改src目录下Cmakefiles.txt package/shadowsocksr-native/src/CMakeLists.txt

pwd #在package/shadowsocksr-native/src/ mv CMakeLists.txt CMakeLists.txtbak vi ./CMakeLists.txt

# -*- coding: utf-8 -*-
# ----------------------------------------------------------------------
# Copyright © 2011-2015, RedJack, LLC.
# All rights reserved.
#
# Please see the COPYING file in this distribution for license details.
# ----------------------------------------------------------------------

set(CMAKE_LEGACY_CYGWIN_WIN32 0)

cmake_minimum_required(VERSION 3.0)
set(PROJECT_NAME shadowsocksr-native)
set(RELEASE_DATE 2015-09-03)
project(${PROJECT_NAME} VERSION 0.6.0 LANGUAGES C)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

set(with_crypto_library "mbedtls" CACHE STRING "build with the given crypto library, TYPE=mbedtls")

IF(MSVC)
  include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/win32/include )
ENDIF(MSVC)

#add_subdirectory(depends/mbedtls)

include ( cmake/dist.cmake )
include ( configure )

configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h )
ADD_DEFINITIONS(-DHAVE_CONFIG_H)

#add_subdirectory(depends/libsodium)
#add_subdirectory(depends/libuv)
#add_subdirectory(depends/json-c/staticbuild)
add_subdirectory(depends/uv-mbed/win32)

include_directories( ${CMAKE_CURRENT_BINARY_DIR} )

add_subdirectory(src)

修改src/src目录下Cmakefiles.txt package/shadowsocksr-native/src/src/CMakeLists.txt

注意两个src 注意两个src 注意两个src

cd src pwd # package/shadowsocksr-native/src/src/ mv CMakeLists.txt CMakeLists.txtbak vi ./CMakeLists.txt

set(SSR_MAIN_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "SSR main directory" FORCE)

add_definitions (-Wno-type-limits)

option(ENABLE_DUMP_INFO "Out put the stage info." OFF)
if (ENABLE_DUMP_INFO)
    add_definitions("-D__PRINT_INFO__")
endif()

set(SOURCE_FILES_SNI
        shadowsocks.h
        socks5.h
        socks5.c
        http.c
        tls.c
        )

set(SOURCE_FILES_OBFS
        ssr_cipher_names.c
        ssr_cipher_names.h
        obfs/auth.c
        obfs/auth_chain.c
        obfs/base64.c
        obfs/crc32.c
        obfs/cstl_lib.c
        obfs/http_simple.c
        obfs/obfs.c
        obfs/obfsutil.c
        obfs/tls1.2_ticket.c
        obfs/tls1.2_ticket.h
        obfs/verify.c)

set(SOURCE_FILES_LOCAL
        ssrbuffer.c
        ssrbuffer.h
        ssr_executive.c
        ssr_executive.h
        sockaddr_universal.h
        sockaddr_universal.c
        ssrutils.c
        jconf.c
        json.c
        encrypt.c
        cache.c
        local.c
        common.h
        includeobfs.h
        local_api.h
        ${SOURCE_FILES_OBFS}
        ${SOURCE_FILES_SNI})

set(SOURCE_FILES_CLIENT
        ../depends/http-parser/http_parser.c
        ../depends/http-parser/http_parser.h
        ../depends/http-parser/http_parser_wrapper.c
        ../depends/http-parser/http_parser_wrapper.h
        cache.c
        cache.h
        encrypt.c
        encrypt.h
        ssrbuffer.c
        ssrbuffer.h
        ssrutils.c
        ssrutils.h
        udprelay.c
        udprelay.h
        client/defs.h
        client/listener.c
        client/main.c
        client/s5.c
        client/s5.h
        ssr_executive.c
        ssr_executive.h
        config_json.c
        config_json.h
        sockaddr_universal.h
        sockaddr_universal.c
        tunnel.c
        tunnel.h
        client/client.c
        client/tls_cli.c
        client/tls_cli.h
        websocket_basic.c
        websocket_basic.h
        text_in_color.c
        text_in_color.h
        dump_info.c
        dump_info.h
        cmd_line_parser.c
        cmd_line_parser.h
        daemon_wrapper.c
        daemon_wrapper.h
        ${SOURCE_FILES_OBFS}
        client/ssr_client_api.h)

set(SOURCE_FILES_TUNNEL
        utils.c
        jconf.c
        json.c
        encrypt.c
        udprelay.c
        cache.c
        netutils.c
        tunnel.c)

set(SOURCE_FILES_SERVER
        ../depends/http-parser/http_parser.c
        ../depends/http-parser/http_parser.h
        ../depends/http-parser/http_parser_wrapper.c
        ../depends/http-parser/http_parser_wrapper.h
        websocket_basic.c
        websocket_basic.h
        text_in_color.c
        text_in_color.h
        dump_info.c
        dump_info.h
        client/s5.c
        client/s5.h
        ssrutils.h
        ssrutils.c
        ssrbuffer.c
        ssrbuffer.h
        encrypt.c
        udprelay.c
        cache.c
        ip_addr_cache.c
        ip_addr_cache.h
        ssr_executive.c
        ssr_executive.h
        cmd_line_parser.c
        cmd_line_parser.h
        daemon_wrapper.c
        daemon_wrapper.h
        config_json.c
        config_json.h
        sockaddr_universal.h
        sockaddr_universal.c
        tunnel.c
        tunnel.h
        server/server.c
        ${SOURCE_FILES_OBFS})

set(SOURCE_FILES_MANAGER
        utils.c
        jconf.c
        json.c
        manager.c)

set(SOURCE_FILES_REDIR
        ssrutils.c
        jconf.c
        json.c
        encrypt.c
        netutils.c
        cache.c
        udprelay.c
        redir.c
        ${SOURCE_FILES_SNI})

include_directories(obfs)
include_directories(client)
IF(MSVC)
  include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../win32/include )
ENDIF(MSVC)

include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../depends/http-parser)

if(USE_CRYPTO_MBEDTLS)
    include_directories(${MBEDTLS_ROOT_DIR}/include)
    include_directories(${UVMBED_DIR}/include)
endif()

if (WIN32)
    list ( APPEND SOURCE_FILES_LOCAL win32.c )
    list ( APPEND SOURCE_FILES_TUNNEL win32.c )
    list ( APPEND SOURCE_FILES_SERVER win32.c )
endif ()

if (!APPLE)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
endif()

if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
    add_definitions(-Wall -Werror -ggdb3 -std=c99 -Wextra -pedantic)
    add_definitions("-D_DEFAULT_SOURCE -D_GNU_SOURCE")
endif()

if (UNIX)
if (APPLE)
else()
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libstdc++ -static-libgcc")
endif()
endif()

add_definitions(-DUDP_RELAY_ENABLE)

add_executable(ssr-client ${SOURCE_FILES_CLIENT})
#add_executable(ssr-local ${SOURCE_FILES_LOCAL})
#add_executable(ss_tunnel ${SOURCE_FILES_TUNNEL})
#add_executable(ssr-server ${SOURCE_FILES_SERVER})
#add_executable(ss_manager ${SOURCE_FILES_MANAGER})
#add_executable(ss_redir ${SOURCE_FILES_REDIR})
#add_library(libssr-native ${SOURCE_FILES_LOCAL})

set_target_properties(ssr-client PROPERTIES COMPILE_DEFINITIONS MODULE_LOCAL)

#set_target_properties(ssr-local PROPERTIES COMPILE_DEFINITIONS MODULE_LOCAL)

#set_target_properties(ss_tunnel PROPERTIES COMPILE_DEFINITIONS MODULE_TUNNEL)

#set_target_properties(ssr-server PROPERTIES COMPILE_DEFINITIONS MODULE_REMOTE)

#set_target_properties(ss_manager PROPERTIES COMPILE_DEFINITIONS MODULE_MANAGER)
#set_target_properties(ss_redir PROPERTIES COMPILE_DEFINITIONS MODULE_REDIR)

#target_compile_definitions(libssr-native PRIVATE MODULE_LOCAL LIB_ONLY)
#set_target_properties(libssr-native PROPERTIES SUFFIX ".la")

#####new##########

    find_library(LIBSODIUM_SHARED sodium)
    find_library(LIBMBEDTLS_SHARED mbedtls)
    find_library(LIBMBEDCRYPTO_SHARED mbedcrypto)
    find_library(LIBMBEDX509_SHARED mbedx509)
    find_library(LIBUV_SHARED uv)
    find_library(LIBJSON-C_SHARED json-c)
    list(APPEND DEPS_SHARED
        m
        ${LIBSODIUM_SHARED}
        ${LIBMBEDTLS_SHARED}
        ${LIBMBEDCRYPTO_SHARED}
        ${LIBMBEDX509_SHARED}
        ${LIBUV_SHARED}
        ${LIBJSON-C_SHARED}
        )

set (ss_lib_net
        ${DEPS_SHARED}
        )        

####newend###########

#set (ss_lib_common
#        json-c
#        uv_a
#        m
#        )

#set (ss_lib_net
#        ${ss_lib_common}
#        mbedtls # /usr/local/lib/libcrypto.a # libcrypto.a # ${LIBCRYPTO} #
#        sodium
#        )

if (WIN32)
    list ( APPEND ss_lib_net Ws2_32 )
endif()

target_link_libraries(ssr-client ${ss_lib_net} uv-mbed)

#target_link_libraries(ssr-local ${ss_lib_net})

#target_link_libraries(ss_tunnel ${ss_lib_net} )
#target_link_libraries(ssr-server ${ss_lib_net})
#target_link_libraries(ss_manager ${ss_lib_common} )
#target_link_libraries(ss_redir ${ss_lib_net})

install(TARGETS ssr-server ssr-local ssr-client 
    RUNTIME DESTINATION /usr/bin)

install(FILES ../config.json 
    DESTINATION /etc/ssr-native/)

if(CMAKE_BUILD_TYPE MATCHES Debug)
    # target_compile_definitions(ssr-server PUBLIC __AUTO_EXIT__=1 __AUTO_EXIT_TIMEOUT__=10000)
endif()

修改depends/uv-mbed/win32/CMakeLists.txt

cd ../depends/uv-mbed/win32 mv CMakeLists.txt CMakeLists.txtbak vi ./CMakeLists.txt


CMAKE_MINIMUM_REQUIRED(VERSION 3.0)

PROJECT("uv-mbed" VERSION 0.5.0 LANGUAGES C)

set(UVMBED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../ CACHE INTERNAL "uv-mbed library" FORCE)

add_subdirectory(../../mbedtls)

set_target_properties(mbedtls PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_BINARY_DIR}/mbedtls/include)

include_directories(${UVMBED_DIR}/../mbedtls/include)

add_subdirectory(../../libuv)

set_target_properties(uv_a PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/libuv/include)

include_directories(${UVMBED_DIR}/../libuv/include)

add_library(uv-mbed STATIC ${UVMBED_DIR}/include/uv-mbed/uv-mbed.h ${UVMBED_DIR}/src/uv-mbed.c ${UVMBED_DIR}/src/bio.c ${UVMBED_DIR}/src/bio.h)

if(WIN32) list(APPEND uv_mbed_defines WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0600) target_compile_definitions(uv-mbed PRIVATE ${uv_mbed_defines}) target_include_directories(uv-mbed PRIVATE ${UVMBED_DIR}/win32/include) endif()

target_include_directories(uv-mbed PUBLIC $ $<BUILD_INTERFACE:${UVMBED_DIR}/include> PRIVATE ${UVMBED_DIR}/include )

find_library(LIBMBEDTLS_SHARED mbedtls)
find_library(LIBMBEDCRYPTO_SHARED mbedcrypto)
find_library(LIBMBEDX509_SHARED mbedx509)
find_library(LIBUV_SHARED uv)
list(APPEND DEPS_SHARED
    ${LIBMBEDTLS_SHARED}
    ${LIBMBEDCRYPTO_SHARED}
    ${LIBMBEDX509_SHARED}
    ${LIBUV_SHARED}
    )

target_link_libraries(uv-mbed ${DEPS_SHARED})


############
##  开始编译
>cd ../../../../../../
>make package/shadowsocksr-native/compile V=s

在bin得到ipk文件

安装时需要先安装自己编译的libjson-c###.ipk 和 libmbed###.ipk 文件 
务必安装自己编译的libmbed###.ipk文件 自动安装的libmbed没有debug选项

# 最后谢谢ssrlive提供源代码
ssrlive commented 4 years ago

@openwrtssrn Great job! thanks.

weizhu commented 4 years ago

大神可不可以上传package到Openwrt 好让大家方便install?

ssrlive commented 4 years ago

不知道怎麼弄。

weizhu commented 4 years ago

@openwrtssrn 你会吗?

openwrtssrn commented 4 years ago

@weizhu 编译成功了 mt7621的。不知道怎么放文件。 @ssrlive 建议使用动态链接的CMakeLists.txt (libsodium libuv libmbedtls libjson-c)这样就可以借用标准的库文件。Openwrt存储比较小,静态编译出的文件有点大。

ssrlive commented 4 years ago

用 电邮 发给我吧. 我会放到 release 区. ssrlivebox@gmail.com

不是很理解 为什么在普通 Linux 下编译出来 1.x m 的压缩包, 到 openwrt 就体积急剧膨胀.

ssrlive commented 4 years ago

已加入 https://github.com/ShadowsocksR-Live/shadowsocksr-native/releases/latest

ssrlive commented 2 years ago

如果 @openwrtssrn 你有空,希望你能就最新的源码编译一个二进制发送给我,有人需要。