下面簡單的解釋一下
第一行 include $(TOPDIR)/rules.mk 是固定寫法,不論是luci還是可執行文件的Makefile,第一行都是它
PKG_NAME:=redsocks2
PKG_VERSION:=0.66
PKG_RELEASE:=1
這三行代表你打包出的ipk的軟件名,版本,PKG_RELEASE是發布號,一般是1,2,3等。其中PKG_NAME用于給其他的軟件包安裝時檢查依賴用,PKG_VERSION在升級ipk的時候有用,比如你要用一個舊版ipk替換新版ipk,默認是不可以的,而新版替換舊版就沒什么問題
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/semigodking/redsocks.git
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_VERSION:=bc2706a331c04a76df428748da97a7d4b5fa1754
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
上面這幾行標識出源代碼應該從哪里下載,
PKG_SOURCE_PROTO指出是git還是svn,
PKG_SOURCE_URL指出git倉庫下載的地址。
PKG_SOURCE_SUBDIR指出git應該將源代碼克隆到什么位置。
PKG_SOURCE_VERSION指出應該克隆哪個版本,由commit號決定,有了它你就可以直接編譯最新版的ipk安裝包或者編譯舊版本的安裝包,非常實用
PKG_SOURCE 這個我也不是很清楚是做什么的
PKG_MAINTAINER:=semigodking 《semigodking@gmail.com》
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
PKG_MAINTAINER 后面寫作者的郵箱,比較隨意,不影響編譯
PKG_BUILD_DIR代表編譯目錄,也就是在哪里編譯源碼,目錄內容和我上面Ubuntu截圖的那個目錄是一樣的,這里寫錯了會無法編譯,報錯找不到目錄。同理編譯完成后生成的可執行文件也要到這個目錄里面去找
include $(INCLUDE_DIR)/package.mk 這一行是固定寫法
define Package/redsocks2
SECTION:=net
CATEGORY:=Network
TITLE:=Redirect any TCP connection to a SOCKS or HTTPS proxy server
URL:=https://github.com/semigodking/redsocks
DEPENDS:=+libevent2 +libopenssl
endef
上面這些是定義應該編譯什么ipk包,可以寫好幾個define,由于這個的redsocks2之編譯openssl一個版本所以就寫了一個,如果想要編譯polarSSL版本需要再寫一個define
上面的redsocks2就是顯示在make menuconfig中的包名
SECTION指的是在make menuconfig中該ipk包應該被放在哪個父目錄下
TITLE是make menuconfig中的標題說明
URL指的是URL說明
DEPENDS這一行比較關鍵,這個規定了編譯時的依賴庫,同時也表明出安裝時的依賴庫,如果這里依賴庫填寫少了,比如缺少+libevent2這個庫,那么編譯時就會報出缺少event.o這個文件,編譯就會失敗,同時如果在向openwrt安裝redsocks的ipk時,如果沒有安裝libevent2.ipk,那么redsocks2的ipk也不會安裝成功,提示缺少依賴庫libevnet2。
注:如果在安裝過程中,實現使用了opkg update并聯網安裝redsocks2的ipk,openwrt會自動聯網其所需要的依賴庫。使用ImageBuilder打包固件時也會如此。
define Package/redsocks2/description
This is a modified version of original redsocks. \
The name is changed to be REDSOCKS2 since this release to distinguish with original redsocks. \
This variant is useful for anti-GFW (***)。
endef
這一段指出了在make menuconfig時候顯示的軟件描述信息,不影響編譯
define Package/redsocks2/conffiles
/etc/config/redsocks2
endef
指出了該軟件包的配置文件位置,作用不大,不影響編譯
define Package/redsocks2/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/redsocks2 $(1)/usr/bin
$(INSTALL_DIR) $(1)/etc/redsocks2
$(INSTALL_DATA) 。/files/redsocks2.template $(1)/etc/redsocks2/config.template
endef
這一段非常重要,它詳細的列出了梅雨個編譯后生成的文件的安裝位置,比如上一段前兩行標識將編譯路下的redsocks2文件安裝到/uer/bin目錄下
后兩行表示將files(提前放在package/redsocks目錄下)目錄下的redsocks2.template文件(該文件為你自己寫的隨便一個文件)安裝到/etc/redsocks2目錄下并改名為config.template
同時,原版redsocks目錄下的文件也可以在這里規定安裝到哪去,比如下面兩句
$(INSTALL_DIR) $(1)/etc/
$(INSTALL_DATA) $(PKG_BUILD_DIR)/redsocks.conf.example $(1)/etc/redsocks2.conf.example
就是把編譯目錄下的redsocks.conf.example文件(該文件是github上原作者自己制作的文件,和上面那個不一樣)安裝到/etc/目錄下
最后一行$(eval $(call BuildPackage,redsocks2))是固定寫法
有了這個Makefile文件之后,我們就不需要把github上的源碼克隆到本地,因為SDK在執行Makefile文件的時候會自動幫我們去完成這寫操作。需要我們做的就是將該Makefile放到/package/redsocks2目錄下,然后在SDK目錄執行make menuconfig,選擇redsocks2為M模式,然后執行
make package/redsocks2/compile V=99
就可以在SDK目錄/bin/ar71xx下面獲得一個ipk包了
這里有一個我寫好的現成可以直接用的目前最新版redsocks2 ipk編譯文件,有需要的可以直接用SDK編譯:https://github.com/AlexZhuo/openwrt-redsocks2
除了使用Makefile打包ipk之外,也可以用SDK直接交叉編譯出OpenWrt所使用的程序,方法略麻煩,是redsocks2作者提供的方法。這個需要根據CPU的不同設置不同的環境變量,找來找去也聽麻煩的,比如ar71xx可以用如下方法配置環境變量然后編譯
export PATH=$PATH:/home/alex/Downloads/OpenWrt-SDK-15.05.1-ar71xx-nand_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/
export STAGING_DIR=/home/alex/Downloads/OpenWrt-SDK-15.05.1-ar71xx-nand_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/
export CFLAGS=“-I/home/alex/Downloads/OpenWrt-SDK-15.05.1-ar71xx-nand_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/include/ -L/home/alex/Downloads/OpenWrt-SDK-15.05.1-ar71xx-nand_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/lib/”
make CC=mipsel-openwrt-linux-gcc LD=mipsel-openwrt-linux-ld
同理,如果想要編譯ramips CPU的話只需要修改上面環境變量的目錄即可
export PATH=$PATH:/home/alex/OP_SDK/OpenWrt-SDK-15.05.1-ramips-rt305x_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/
export STAGING_DIR=/store/build/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/
export CFLAGS=“-I/home/alex/OP_SDK/OpenWrt-SDK-15.05.1-ramips-rt305x_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/include/ -L/home/alex/OP_SDK/OpenWrt-SDK-15.05.1-ramips-rt305x_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/lib/”
make CC=mipsel-openwrt-linux-uclibc-gcc LD=mipsel-openwrt-linux-uclibc-ld
使用這種方法我們只能編譯出一個redsocks2的可執行文件,可以通過scp上傳到路由器上使用,但是沒有了ipk的安裝過程,系統也就不認為你安裝了一個名字叫redsocks2的組件,如果由其他依賴包依賴redsocks2的話,還是會報錯。所以ipk安裝的方式更好一些
評論
查看更多