Closed yonheng closed 3 years ago
我编译成功了。分享一下我的过程供大家参考
Makefile 参考的shadowsocks-libev openwrt https://github.com/shadowsocks/openwrt-shadowsocks
大体流程 下载sdk 获取依赖feeds 创建Makefile 修改Cmakefiles 编译
前往openwrt 下载sdk
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
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))
源文件的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'
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)'
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 注意两个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()
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)
include_directories(${UVMBED_DIR}/../mbedtls/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
$
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提供源代码
@openwrtssrn Great job! thanks.
大神可不可以上传package到Openwrt 好让大家方便install?
不知道怎麼弄。
@openwrtssrn 你会吗?
@weizhu 编译成功了 mt7621的。不知道怎么放文件。 @ssrlive 建议使用动态链接的CMakeLists.txt (libsodium libuv libmbedtls libjson-c)这样就可以借用标准的库文件。Openwrt存储比较小,静态编译出的文件有点大。
用 电邮 发给我吧. 我会放到 release 区. ssrlivebox@gmail.com
不是很理解 为什么在普通 Linux 下编译出来 1.x m 的压缩包, 到 openwrt 就体积急剧膨胀.
如果 @openwrtssrn 你有空,希望你能就最新的源码编译一个二进制发送给我,有人需要。
请问能编译一个适合openwrt的客户端吗?