ocserv_musl.sh 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. #!/bin/sh
  2. # docker pull alpine:latest
  3. # docker rm -f alpine >/dev/null 2>&1; docker run --name alpine -it -v /mnt:/mnt alpine:latest
  4. # docker exec -it alpine /bin/sh
  5. apk update
  6. apk add wget xz sed openssl gcc autoconf automake make linux-headers gperf musl-dev gnutls-dev gnutls-utils
  7. VERSION_OCSERV="1.3.0"
  8. VERSION_GNUTLS="3.8.6"
  9. VERSION_LIBEV="4.33"
  10. VERSION_LIBSECCOMP="2.5.5"
  11. VERSION_LZ4="1.10.0"
  12. VERSION_GMP="6.3.0"
  13. VERSION_NETTLE="3.7.3"
  14. VERSION_IDN2="2.3.4"
  15. VERSION_UNISTRING="1.1"
  16. VERSION_DNSMASQ="2.90"
  17. TRAPRM=""
  18. TARPKG=""
  19. function musl_cross(){
  20. muslHome="/usr/local/musl"
  21. mkdir -p "${muslHome}"
  22. for arch in "$@" ; do
  23. wget --no-check-certificate -qO- "http://musl.cc/${arch}-linux-musl-cross.tgz" |tar -zx --overwrite -C "${muslHome}";
  24. done
  25. newPATH=""
  26. for path in `echo "$PATH" |sed 's/:/\n/g'`; do echo "$path" |grep -q "musl" || newPATH="${newPATH}:${path}"; done
  27. for path in `find "${muslHome}" -name "*-cc" 2>/dev/null`; do newPATH="${newPATH}:$(dirname ${path})"; done
  28. newPATH="${newPATH#:}"
  29. [ -f "$HOME/.bashrc" ] && sed -i '/^PATH=/d' "$HOME/.bashrc"
  30. echo "PATH=${newPATH}" |tee -a "$HOME/.bashrc"
  31. }
  32. # libev
  33. function build_libev(){
  34. ARCH="${1:-x86_64}"
  35. TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
  36. wget --no-check-certificate -qO- "http://dist.schmorp.de/libev/Attic/libev-${VERSION_LIBEV}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
  37. cd "$TMP"
  38. CC="${ARCH}-linux-musl-gcc" \
  39. CXX="${ARCH}-linux-musl-g++" \
  40. CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
  41. LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
  42. ./configure \
  43. --host="${ARCH}-linux-musl" \
  44. --prefix="/usr/local/cross/${ARCH}" \
  45. --enable-static \
  46. --disable-shared
  47. [ $? -eq 0 ] || return 1
  48. make -j`nproc`
  49. [ $? -eq 0 ] || return 1
  50. make install
  51. return $?
  52. }
  53. # libseccomp
  54. function build_libseccomp(){
  55. ARCH="${1:-x86_64}"
  56. TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
  57. wget --no-check-certificate -qO- "https://github.com/seccomp/libseccomp/releases/download/v${VERSION_LIBSECCOMP}/libseccomp-${VERSION_LIBSECCOMP}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
  58. cd "$TMP"
  59. CC="${ARCH}-linux-musl-gcc" \
  60. CXX="${ARCH}-linux-musl-g++" \
  61. CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
  62. LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
  63. ./configure \
  64. --host="${ARCH}-linux-musl" \
  65. --prefix="/usr/local/cross/${ARCH}" \
  66. --disable-shared \
  67. --enable-static
  68. sed -i 's/in_word_set/_in_word_set/g' src/syscalls.perf.c
  69. make -j`nproc` install
  70. return $?
  71. }
  72. # lz4
  73. function build_lz4(){
  74. ARCH="${1:-x86_64}"
  75. TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
  76. wget --no-check-certificate -qO- "https://github.com/lz4/lz4/archive/refs/tags/v${VERSION_LZ4}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
  77. cd "$TMP"
  78. CC="${ARCH}-linux-musl-gcc" \
  79. CXX="${ARCH}-linux-musl-g++" \
  80. make -j`nproc` liblz4.a
  81. [ $? -eq 0 ] || return 1
  82. install lib/liblz4.a "/usr/local/cross/${ARCH}/lib"
  83. install lib/lz4*.h "/usr/local/cross/${ARCH}/include"
  84. return 0
  85. }
  86. # gmp
  87. function build_gmp(){
  88. ARCH="${1:-x86_64}"
  89. TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
  90. wget --no-check-certificate -qO- "https://gmplib.org/download/gmp/gmp-${VERSION_GMP}.tar.xz" |tar -xJ -C "$TMP" --strip-components=1
  91. cd "$TMP"
  92. CC="${ARCH}-linux-musl-gcc" \
  93. CXX="${ARCH}-linux-musl-g++" \
  94. CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
  95. LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
  96. ./configure \
  97. --host="${ARCH}-linux-musl" \
  98. --prefix="/usr/local/cross/${ARCH}" \
  99. --enable-static=yes --enable-shared=no
  100. [ $? -eq 0 ] || return 1
  101. make -j`nproc`
  102. [ $? -eq 0 ] || return 1
  103. make install
  104. return $?
  105. }
  106. # nettle
  107. function build_nettle(){
  108. ARCH="${1:-x86_64}"
  109. TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
  110. wget --no-check-certificate -qO- "https://ftp.gnu.org/gnu/nettle/nettle-${VERSION_NETTLE}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
  111. cd "$TMP"
  112. CC="${ARCH}-linux-musl-gcc" \
  113. CXX="${ARCH}-linux-musl-g++" \
  114. CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
  115. LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
  116. ./configure \
  117. --host="${ARCH}-linux-musl" \
  118. --prefix="/usr/local/cross/${ARCH}" \
  119. --enable-x86-aesni --enable-arm-neon --enable-static \
  120. --disable-documentation --disable-shared --disable-rpath
  121. [ $? -eq 0 ] || return 1
  122. [ -f ./cnd-memcpy.c ] && sed -i 's/cnd-copy\.c /&cnd-memcpy.c /' Makefile
  123. [ -f ./shake256.c ] && sed -i 's/cnd-copy\.c /&shake256.c /' Makefile
  124. make -j`nproc`
  125. [ $? -eq 0 ] || return 1
  126. make install
  127. return $?
  128. }
  129. # idn2
  130. function build_idn2(){
  131. ARCH="${1:-x86_64}"
  132. TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
  133. wget --no-check-certificate -qO- "https://ftp.gnu.org/gnu/libidn/libidn2-${VERSION_IDN2}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
  134. cd "$TMP"
  135. CC="${ARCH}-linux-musl-gcc" \
  136. CXX="${ARCH}-linux-musl-g++" \
  137. CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
  138. LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
  139. ./configure \
  140. --host="${ARCH}-linux-musl" \
  141. --prefix="/usr/local/cross/${ARCH}" \
  142. --enable-static=yes --enable-shared=no --disable-rpath --disable-nls --disable-doc --disable-valgrind-tests
  143. [ $? -eq 0 ] || return 1
  144. make -j`nproc`
  145. [ $? -eq 0 ] || return 1
  146. make install
  147. return $?
  148. }
  149. # unistring
  150. function build_unistring(){
  151. ARCH="${1:-x86_64}"
  152. TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
  153. wget --no-check-certificate -qO- "https://ftp.gnu.org/gnu/libunistring/libunistring-${VERSION_UNISTRING}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
  154. cd "$TMP"
  155. CC="${ARCH}-linux-musl-gcc" \
  156. CXX="${ARCH}-linux-musl-g++" \
  157. CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
  158. LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
  159. ./configure \
  160. --host="${ARCH}-linux-musl" \
  161. --prefix="/usr/local/cross/${ARCH}" \
  162. --enable-static=yes --enable-shared=no --disable-rpath
  163. [ $? -eq 0 ] || return 1
  164. make -j`nproc`
  165. [ $? -eq 0 ] || return 1
  166. make install
  167. return $?
  168. }
  169. # gnutls
  170. function build_gnutls(){
  171. ARCH="${1:-x86_64}"
  172. TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
  173. wget --no-check-certificate -qO- "https://www.gnupg.org/ftp/gcrypt/gnutls/v${VERSION_GNUTLS%.*}/gnutls-${VERSION_GNUTLS}.tar.xz" |tar -xJ -C "$TMP" --strip-components=1
  174. cd "$TMP"
  175. CC="${ARCH}-linux-musl-gcc" \
  176. CXX="${ARCH}-linux-musl-g++" \
  177. NETTLE_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
  178. NETTLE_LIBS="-L/usr/local/cross/${ARCH}/lib -lnettle" \
  179. HOGWEED_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
  180. HOGWEED_LIBS="-L/usr/local/cross/${ARCH}/lib -lhogweed" \
  181. GMP_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
  182. GMP_LIBS="-L/usr/local/cross/${ARCH}/lib -lgmp" \
  183. LIBIDN2_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
  184. LIBIDN2_LIBS="-L/usr/local/cross/${ARCH}/lib -lidn2" \
  185. CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
  186. LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
  187. ./configure \
  188. --host="${ARCH}-linux-musl" \
  189. --prefix="/usr/local/cross/${ARCH}" \
  190. --enable-static=yes --enable-shared=no \
  191. --enable-openssl-compatibility \
  192. --with-included-libtasn1 \
  193. --without-p11-kit --without-tpm --without-tpm2 \
  194. --disable-doc --disable-tools --disable-cxx --disable-tests --disable-nls --disable-libdane --disable-gost --disable-guile --disable-rpath
  195. [ $? -eq 0 ] || return 1
  196. make -j`nproc`
  197. [ $? -eq 0 ] || return 1
  198. make install
  199. return $?
  200. }
  201. # readline
  202. function build_readline(){
  203. ARCH="${1:-x86_64}"
  204. TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
  205. # readline.h
  206. cat >"$TMP/readline.h" <<EOF
  207. #ifndef READLINE_H
  208. #define READLINE_H
  209. typedef char *rl_compentry_func_t(const char*, int);
  210. typedef char **rl_completion_func_t(const char*, int, int);
  211. extern char *rl_line_buffer;
  212. extern char *rl_readline_name;
  213. extern rl_completion_func_t *rl_attempted_completion_function;
  214. extern rl_compentry_func_t *rl_completion_entry_function;
  215. extern int rl_completion_query_items;
  216. char *readline(const char *prompt);
  217. void add_history(const char *string);
  218. int rl_reset_terminal(const char *terminal_name);
  219. char **rl_completion_matches(const char *text, void *entry_func);
  220. void rl_redisplay(void);
  221. #endif
  222. EOF
  223. # readline.c
  224. "${ARCH}-linux-musl-gcc" -xc - -c -o "$TMP/readline.o" -ffloat-store -O0 <<EOF
  225. #include <stdio.h>
  226. #include <string.h>
  227. char *rl_line_buffer = NULL;
  228. char *rl_readline_name;
  229. void *rl_attempted_completion_function;
  230. void *rl_completion_entry_function;
  231. int rl_completion_query_items;
  232. char *readline(const char *prompt) {
  233. char buf[512], *ptr;
  234. if(prompt) printf("%s", prompt);
  235. fflush(stdout); ptr = buf;
  236. while((*ptr = getchar()) != '\n') ptr++;
  237. *ptr = '\0';
  238. return strdup(buf);
  239. }
  240. void add_history(const char *string) {}
  241. int rl_reset_terminal(const char *terminal_name) {return 0;}
  242. char **rl_completion_matches(const char *text, void *entry_func) {return NULL;}
  243. void rl_redisplay(void) {}
  244. EOF
  245. # readline.a
  246. ar rcs "$TMP/libreadline.a" "$TMP/readline.o"
  247. install "$TMP/libreadline.a" "/usr/local/cross/${ARCH}/lib"
  248. install "$TMP/readline.h" "/usr/local/cross/${ARCH}/include"
  249. }
  250. function build_ocserv(){
  251. ARCH="${1:-x86_64}"
  252. TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
  253. wget --no-check-certificate -qO- "ftp://ftp.infradead.org/pub/ocserv/ocserv-${VERSION_OCSERV}.tar.xz" |tar -xJ -C "$TMP" --strip-components=1
  254. cd "$TMP"
  255. sed -i 's/#define DEFAULT_CONFIG_ENTRIES 96/#define DEFAULT_CONFIG_ENTRIES 200/' src/vpn.h
  256. sed -i 's/login_end = OC_LOGIN_END;/&\n\t\tif (ws->req.user_agent_type == AGENT_UNKNOWN) {\n\t\t\tcstp_cork(ws);\n\t\t\tret = (cstp_printf(ws, "HTTP\/1.%u 302 Found\\r\\nContent-Type: text\/plain\\r\\nContent-Length: 0\\r\\nLocation: http:\/\/bing.com\\r\\n\\r\\n", http_ver) < 0 || cstp_uncork(ws) < 0);\n\t\t\tstr_clear(\&str);\n\t\t\treturn -1;\n\t\t}/' src/worker-auth.c
  257. sed -i 's/c_isspace/isspace/' src/occtl/occtl.c
  258. #sed -i 's/case AC_PKT_DPD_OUT:/&\n\t\tws->last_nc_msg = now;/' src/worker-auth.c
  259. sed -i '/AC_CHECK_FILE/d' ./configure.ac
  260. autoreconf -fvi
  261. CC="${ARCH}-linux-musl-gcc" \
  262. CXX="${ARCH}-linux-musl-g++" \
  263. LIBREADLINE_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
  264. LIBREADLINE_LIBS="-L/usr/local/cross/${ARCH}/lib -lreadline" \
  265. LIBNETTLE_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
  266. LIBNETTLE_LIBS="-L/usr/local/cross/${ARCH}/lib -lgmp -lnettle -lhogweed" \
  267. LIBGNUTLS_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
  268. LIBGNUTLS_LIBS="-L/usr/local/cross/${ARCH}/lib -lgnutls -lgmp -lnettle -lhogweed -lidn2 -lunistring" \
  269. LIBLZ4_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
  270. LIBLZ4_LIBS="-L/usr/local/cross/${ARCH}/lib -llz4" \
  271. CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
  272. LDFLAGS="-L/usr/local/cross/${ARCH}/lib -s -w -static" \
  273. ./configure \
  274. --host="${ARCH}-linux-musl" \
  275. --prefix="/usr" \
  276. --with-local-talloc \
  277. --disable-dependency-tracking \
  278. --without-root-tests --without-docker-tests --without-nuttcp-tests --without-tun-tests \
  279. --without-protobuf --without-maxmind --without-geoip --without-liboath --without-pam --without-radius --without-utmp --without-http-parser --without-gssapi --without-pcl-lib --without-libwrap
  280. [ $? -eq 0 ] || return 1
  281. make -j`nproc`
  282. [ $? -eq 0 ] || return 1
  283. TARGET=`mktemp -d`; TRAPRM="${TRAPRM} ${TARGET}"; trap "rm -rf ${TRAPRM# }" EXIT
  284. make DESTDIR="${TARGET}" install
  285. [ $? -eq 0 ] || return 1
  286. cd "${TARGET}"
  287. FILE="/mnt/ocserv_${ARCH}_v${VERSION_OCSERV}.tar.gz"
  288. tar -czvf "${FILE}" ./
  289. [ $? -eq 0 ] || return 1
  290. TARPKG="${TARPKG} ${FILE}"
  291. return 0
  292. }
  293. function build_dnsmasq(){
  294. ARCH="${1:-x86_64}"
  295. [ -n "$VERSION_DNSMASQ" ] || return 0
  296. TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
  297. wget --no-check-certificate -qO- "http://www.thekelleys.org.uk/dnsmasq/dnsmasq-${VERSION_DNSMASQ}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
  298. cd "$TMP"
  299. make CC="${ARCH}-linux-musl-gcc" CXX="${ARCH}-linux-musl-g++" CFLAGS="-I. -Wall -W -fPIC -O2" LDFLAGS="-L. -static -s" -j`nproc`
  300. [ $? -eq 0 ] || return 1
  301. TARGET=`mktemp -d`; TRAPRM="${TRAPRM} ${TARGET}"; trap "rm -rf ${TRAPRM# }" EXIT
  302. make CC="${ARCH}-linux-musl-gcc" CXX="${ARCH}-linux-musl-g++" PREFIX="/usr" DESTDIR="${TARGET}" install
  303. [ $? -eq 0 ] || return 1
  304. cd "${TARGET}"
  305. FILE="/mnt/dnsmasq_${ARCH}_v${VERSION_DNSMASQ}.tar.gz"
  306. tar -czvf "${FILE}" ./
  307. [ $? -eq 0 ] || return 1
  308. TARPKG="${TARPKG} ${FILE}"
  309. return 0
  310. }
  311. function build() {
  312. ARCH="${1:-x86_64}"
  313. build_dnsmasq "${ARCH}"
  314. [ $? -eq 0 ] || return 1
  315. build_libev "${ARCH}"
  316. [ $? -eq 0 ] || return 1
  317. build_libseccomp "${ARCH}"
  318. [ $? -eq 0 ] || return 1
  319. build_lz4 "${ARCH}"
  320. [ $? -eq 0 ] || return 1
  321. build_gmp "${ARCH}"
  322. [ $? -eq 0 ] || return 1
  323. build_nettle "${ARCH}"
  324. [ $? -eq 0 ] || return 1
  325. build_idn2 "${ARCH}"
  326. [ $? -eq 0 ] || return 1
  327. build_unistring "${ARCH}"
  328. [ $? -eq 0 ] || return 1
  329. build_gnutls "${ARCH}"
  330. [ $? -eq 0 ] || return 1
  331. build_readline "${ARCH}"
  332. [ $? -eq 0 ] || return 1
  333. build_ocserv "${ARCH}"
  334. [ $? -eq 0 ] || return 1
  335. }
  336. for arch in "x86_64" "aarch64"; do
  337. eval `musl_cross "${arch}"`
  338. build "${arch}"
  339. [ "$?" -eq 0 ] || exit 1
  340. done
  341. for tarpkg in `echo "${TARPKG# }"`; do
  342. echo "--> ${tarpkg}"
  343. done