#!/bin/sh _script_ver="1.2.0" _use_backup="no" _home_dir=$(pwd)"/" _source_dir="$_home_dir""source" _opt_dir="$_home_dir""opt" function download_file() { downloader="wget" type wget >/dev/null 2>&1 || { downloader="curl"; } if [ "$downloader" = "wget" ]; then _down_prefix="O" else _down_prefix="o" fi _down_symbol=0 if [ ! -f "$2" ]; then $downloader "$1" -$_down_prefix "$2" >/dev/null 2>&1 && \ echo "$1 完成! $2" && _down_symbol=1 else echo "$1 已存在!" && _down_symbol=1 fi if [ $_down_symbol == 0 ]; then echo "失败!请检查网络连接!" rm -rf "$2" return 1 fi return 0 } # 获取要下载的源码的版本号 function lib_ver() { case $1 in "phpver"|"php") echo "7.4.18" ;; "swoole") echo "4.6.6" ;; "hash") echo "1.5" ;; "inotify") echo "3.0.0" ;; "redis") echo "5.3.4" ;; "libxml2") echo "2.9.10" ;; "curl") echo "7.76.1" ;; "liblzma") echo "master" ;; *) echo "unknown" ;; esac } # 获取解压后的源码根目录 function lib_x_dirname() { case $1 in "php"|"swoole"|"hash"|"inotify"|"redis"|"libxml2"|"curl") if [ "$2" = "file" ]; then _name_prefix=".tar.gz"; else _name_prefix=""; fi echo "$1-$(lib_ver $1)$_name_prefix" ;; "liblzma") if [ "$_use_backup" = "yes" ]; then if [ "$2" = "file" ]; then _name_prefix=".zip"; else _name_prefix=""; fi echo "$1-$(lib_ver $1)$_name_prefix" else if [ "$2" = "file" ]; then _name_prefix=".tar.gz"; else _name_prefix=""; fi echo "$1""$_name_prefix" fi ;; *) echo "unknown" ;; esac } # 获取要下载的源码的链接地址 function lib_download_link() { if [ "$_use_backup" = "yes" ]; then case $1 in "php") echo "https://www.php.net/distributions/php-$(lib_ver $1).tar.gz" ;; "swoole") echo "https://pecl.php.net/get/swoole-$(lib_ver $1).tgz" ;; "hash") echo "https://pecl.php.net/get/hash-$(lib_ver $1).tgz" ;; "inotify") echo "https://pecl.php.net/get/inotify-$(lib_ver $1).tgz" ;; "redis") echo "https://pecl.php.net/get/redis-$(lib_ver $1).tgz" ;; "libxml2") echo "http://xmlsoft.org/sources//libxml2-$(lib_ver $1).tar.gz" ;; "liblzma") echo "https://github.com/kobolabs/liblzma/archive/refs/heads/master.zip" ;; "curl") echo "https://curl.haxx.se/download/curl-$(lib_ver $1).tar.gz" ;; *) echo "unknown" ;; esac else case $1 in "php") echo "http://mirrors.sohu.com/php/php-$(lib_ver $1).tar.gz" ;; "swoole") echo "https://dl.zhamao.me/swoole/swoole-$(lib_ver $1).tgz" ;; "hash") echo "https://pecl.php.net/get/hash-$(lib_ver $1).tgz" ;; "inotify") echo "https://pecl.php.net/get/inotify-$(lib_ver $1).tgz" ;; "redis") echo "https://dl.zhamao.me/phpredis/redis-$(lib_ver $1).tgz" ;; "libxml2") echo "https://dl.zhamao.me/libxml2/libxml2-$(lib_ver $1).tar.gz" ;; "liblzma") echo "https://dl.zhamao.me/liblzma/liblzma.tar.gz" ;; "curl") echo "https://dl.zhamao.me/curl/curl-$(lib_ver $1).tar.gz" ;; *) echo "unknown" ;; esac fi } # 获取下载后源码包的解压命令 function lib_x_cmd() { case $1 in "php"|"swoole"|"hash"|"inotify"|"redis"|"libxml2"|"curl") _x_cmd="tar" ;; "liblzma") if [ "$_use_backup" = "yes" ]; then _x_cmd="unzip"; else _x_cmd="tar"; fi ;; *) _x_cmd="unknown" ;; esac case $2 in "cmd") echo $_x_cmd ;; "file-prefix") case $_x_cmd in "tar") echo "-xf" ;; "unzip") echo "" ;; esac ;; "out-prefix") case $_x_cmd in "tar") echo "-C" ;; "unzip") echo "-d" ;; esac ;; esac } _curl_override_1=' AC_DEFUN([PHP_CHECK_LIBRARY], [ $3 ]) ' _curl_override_2=' AC_DEFUN([PHP_CHECK_LIBRARY], [ save_old_LDFLAGS=$LDFLAGS ac_stuff="$5" save_ext_shared=$ext_shared ext_shared=yes PHP_EVAL_LIBLINE([$]ac_stuff, LDFLAGS) AC_CHECK_LIB([$1],[$2],[ LDFLAGS=$save_old_LDFLAGS ext_shared=$save_ext_shared $3 ],[ LDFLAGS=$save_old_LDFLAGS ext_shared=$save_ext_shared unset ac_cv_lib_$1[]_$2 $4 ])dnl ]) ' function lib_x() { $(lib_x_cmd $1 cmd) $(lib_x_cmd $1 file-prefix) "$_source_dir/$(lib_x_dirname $1 file)" $(lib_x_cmd $1 out-prefix) "$_source_dir/" } function lib_move_ext() { _src_dir="$_source_dir/$(lib_x_dirname $1)" _dst_dir="$_source_dir/$(lib_x_dirname php)/ext/$1" mv $_src_dir $_dst_dir } function download_all() { mkdir "$_source_dir" > /dev/null 2>&1 for loop in "php" "swoole" "inotify" "hash" "redis" "libxml2" "liblzma" "curl" do echo "正在下载 $loop 源码 ..." download_file $(lib_download_link $loop) "$_source_dir/$(lib_x_dirname $loop file)" || { exit 1; } & done wait } function compile_liblzma() { if [ -f "$_opt_dir/liblzma/lib/liblzma.so" ]; then echo "已编译 liblzma!" && return fi tar -xf "$_source_dir/$(lib_x_dirname liblzma file)" -C "$_source_dir/" && \ cd "$_source_dir/$(lib_x_dirname liblzma)" && \ ./configure --prefix="$_opt_dir/liblzma" && \ make -j4 && \ make install && \ echo "编译 liblzma 完成!" } function compile_curl() { if [ -f "$_opt_dir/curl/bin/curl" ]; then echo "已编译 curl!" && return fi lib_x curl && \ cd "$_source_dir/$(lib_x_dirname curl)" && \ CC=gcc CXX=g++ CFLAGS=-fPIC CPPFLAGS=-fPIC ./configure --prefix="$_opt_dir/curl" \ --without-nghttp2 \ --with-ssl=/usr \ --with-pic=pic \ --enable-ipv6 \ --enable-shared=no \ --without-libidn2 \ --disable-ldap \ --without-libpsl \ --without-lber \ --enable-ares && \ make -j4 && \ make install && \ echo "编译 curl 完成!" } function compile_libxml2() { if [ -f "$_opt_dir/libxml2/lib/libxml2.so" ]; then echo "已编译 libxml2!" && return fi lib_x libxml2 && \ cd "$_source_dir/$(lib_x_dirname libxml2)" && \ ./configure --with-lzma="$_opt_dir/liblzma" --prefix="$_opt_dir/libxml2" --exec-prefix="$_opt_dir/libxml2" --without-python && \ make -j4 && \ make install && \ echo "编译 libxml2 完成!" } function php_get_configure_args() { _php_arg="--prefix=$_home_dir""php-dist" _php_arg="$_php_arg --disable-all" _php_arg="$_php_arg --enable-shared=no" _php_arg="$_php_arg --enable-static=yes" _php_arg="$_php_arg --enable-inline-optimization" _php_arg="$_php_arg --with-layout=GNU" _php_arg="$_php_arg --enable-calendar" _php_arg="$_php_arg --enable-ctype" _php_arg="$_php_arg --enable-filter" _php_arg="$_php_arg --enable-openssl" _php_arg="$_php_arg --enable-bcmath" _php_arg="$_php_arg --with-openssl-dir=/usr" _php_arg="$_php_arg --enable-pcntl" _php_arg="$_php_arg --enable-openssl" _php_arg="$_php_arg --with-openssl" _php_arg="$_php_arg --with-iconv" _php_arg="$_php_arg --enable-json" _php_arg="$_php_arg --enable-mbstring" _php_arg="$_php_arg --enable-phar" _php_arg="$_php_arg --enable-pdo" _php_arg="$_php_arg --with-pdo-mysql=mysqlnd" _php_arg="$_php_arg --enable-sockets" _php_arg="$_php_arg --enable-swoole" _php_arg="$_php_arg --enable-inotify" _php_arg="$_php_arg --enable-redis" _php_arg="$_php_arg --disable-redis-session" _php_arg="$_php_arg --enable-simplexml" _php_arg="$_php_arg --enable-dom" _php_arg="$_php_arg --enable-xml" _php_arg="$_php_arg --enable-xmlwriter" _php_arg="$_php_arg --enable-xmlreader" _php_arg="$_php_arg --with-zlib" _php_arg="$_php_arg --enable-posix" _php_arg="$_php_arg --enable-mysqlnd" _php_arg="$_php_arg --enable-tokenizer" _php_arg="$_php_arg --with-curl" _php_arg="$_php_arg --with-pear=no" _php_arg="$_php_arg --disable-cgi" _php_arg="$_php_arg --disable-phpdbg" case $(lib_ver php) in 7.3.*) _php_arg="$_php_arg --with-gd" _php_arg="$_php_arg --enable-libxml" _php_arg="$_php_arg --with-libxml-dir=$_opt_dir/libxml2" _php_arg="$_php_arg --enable-hash" ;; *) _php_arg="$_php_arg --enable-gd" _php_arg="$_php_arg --with-libxml" ;; esac echo $_php_arg } function compile_php() { echo "正在编译 php ..." && \ rm -rf "$_source_dir/$(lib_x_dirname php)" && \ lib_x php && \ lib_x swoole && \ lib_move_ext swoole && \ "$_source_dir/$(lib_x_dirname php)/ext/swoole/clear.sh" && \ lib_x redis && \ lib_move_ext redis && \ lib_x inotify && \ lib_move_ext inotify && \ cd "$_source_dir/$(lib_x_dirname php)/" && \ echo "$_curl_override_1" > "$_home_dir""ac_override_1" && \ echo "$_curl_override_2" > "$_home_dir""ac_override_2" && \ cat "$_home_dir""ac_override_1" "ext/curl/config.m4" "$_home_dir""ac_override_2" > /tmp/aa && \ mv /tmp/aa "ext/curl/config.m4" && \ rm -rf "$_home_dir""ac_override_1" "$_home_dir""ac_override_2" && \ PKG_CONFIG_PATH="$PKG_CONFIG_PATH:""$_opt_dir/libxml2/lib/pkgconfig" && \ PKG_CONFIG_PATH="$PKG_CONFIG_PATH:""$_opt_dir/curl/lib/pkgconfig" && \ ./buildconf --force && \ PKG_CONFIG_PATH=$PKG_CONFIG_PATH ./configure LDFLAGS=-static $(php_get_configure_args) && \ sed -ie 's/-export-dynamic//g' "$_source_dir/$(lib_x_dirname php)/Makefile" && \ sed -ie 's/-o $(SAPI_CLI_PATH)/-all-static -o $(SAPI_CLI_PATH)/g' "$_source_dir/$(lib_x_dirname php)/Makefile" && \ sed -ie 's/swoole_clock_gettime(CLOCK_REALTIME/clock_gettime(CLOCK_REALTIME/g' "$_source_dir/$(lib_x_dirname php)/ext/swoole/include/swoole.h" && \ make LDFLAGS=-ldl -j4 && \ make install && \ strip "$_home_dir""php-dist/bin/php" && \ cd $_home_dir } #apk add g++ pkgconf autoconf nghttp2 libcurl \ # git gcc zlib-dev libstdc++ ncurses zlib linux-headers \ # readline make libssl1.1 libxml2 m4 libgcc vim binutils \ # oniguruma-dev openssl openssl-dev # 编译必需的 apk add gcc g++ autoconf libstdc++ linux-headers make m4 libgcc binutils ncurses # php的zlib支持 apk add zlib-dev zlib-static # php的mbstring支持 apk add oniguruma-dev # php的openssl支持 apk add openssl-libs-static openssl-dev openssl # php的gd支持,如果不需要gd则去掉--enable-gd和下面的依赖 apk add libpng-dev libpng-static # curl的c-ares支持,如果不需要curl则去掉 apk add c-ares-static c-ares-dev download_all && \ compile_liblzma && \ compile_libxml2 && \ compile_curl && \ compile_php && \ echo "完成!见 php-dist/bin/php"