2022-06-11 01:09:45 +08:00
#!/usr/bin/env bash
2021-06-02 19:57:55 +08:00
2021-06-06 01:01:58 +08:00
self_dir = $( cd " $( dirname " $0 " ) " ; pwd )
2022-06-11 01:09:45 +08:00
# 通过 extensions.txt 生成一个 dialog 命令
function generate_ext_dialog_cmd( ) {
list = $( cat " $self_dir /extensions.txt " | grep -v "^#" | grep -v " ^ $" )
echo -n "dialog --backtitle \"static-php-cli Compile Options\" --checklist \"Please select the extension you don't want to compile.\n\nNOTE: Use <space> to select or deselect items\n\n** Default is compiling all **\" 24 60 20 " > $self_dir /.ask_cmd.sh
for loop in $list
do
2022-06-21 13:49:38 +08:00
case $loop in
^*)
loop = $( echo ${ loop : 1 } | xargs)
echo -n " $loop ' $loop Extension' off " >> $self_dir /.ask_cmd.sh
; ;
*) echo -n " $loop ' $loop Extension' on " >> $self_dir /.ask_cmd.sh ; ;
esac
2022-06-11 01:09:45 +08:00
done
echo " 2> $self_dir /extensions_install.txt " >> $self_dir /.ask_cmd.sh
}
# PHP 编译参数生成
2021-06-02 19:57:55 +08:00
function php_compile_args( ) {
2021-07-22 05:24:14 +00:00
_php_arg = " --prefix= $self_dir /php-dist "
2021-06-02 19:57:55 +08:00
_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 --with-pear=no "
_php_arg = " $_php_arg --disable-cgi "
_php_arg = " $_php_arg --disable-phpdbg "
2022-10-12 11:14:11 +08:00
_php_arg = " $_php_arg --with-config-file-path=/etc "
2021-06-06 01:01:58 +08:00
_php_arg = " $_php_arg $( $self_dir /check-extensions.sh check_in_configure $1 ) "
2021-06-02 19:57:55 +08:00
echo $_php_arg
}
2022-06-11 01:09:45 +08:00
# 第一个参数用于使用镜像地址还是原地址( mirror为镜像地址, original为原地址)
if [ " $1 " = "" ] ; then
dialog --backtitle "static-php-cli Compile Options" --yesno "<Yes>: Use mirror download address, mainland China users recommended.\n\n<No>: Use original address, global users recommended." 10 50
test $? = = 0 && USE_BACKUP = "no" || USE_BACKUP = "yes"
else
test " $1 " != "mirror" && USE_BACKUP = "yes" || USE_BACKUP = "no"
fi
# 第二个参数用于规定编译的 PHP 版本
if [ " $2 " = "" ] ; then
dialog --backtitle "static-php-cli Compile Options" --inputbox "Please input your PHP version to compile" 10 50 "8.1.7" 2>$self_dir /.phpver
if [ $? != 0 ] ; then
clear
echo "canceled Compiling PHP." && rm -f $self_dir /.phpver
exit 1
else
VER_PHP = $( cat $self_dir /.phpver)
rm -f $self_dir /.phpver
fi
else
VER_PHP = $2
fi
2021-06-02 19:57:55 +08:00
2022-06-11 01:09:45 +08:00
# 第三个参数用于是否直接安装,如果留空则询问编译的扩展,如果填入 all, 则直接编译所有的扩展
if [ " $3 " != "all" ] ; then
generate_ext_dialog_cmd && cat $self_dir /.ask_cmd.sh && chmod +x $self_dir /.ask_cmd.sh && $self_dir /.ask_cmd.sh
if [ $? != 0 ] ; then
clear
echo "canceled Compiling PHP while selecting extensions." && rm -rf $self_dir /.ask_cmd.sh
exit 1
fi
rm -f $self_dir /.ask_cmd.sh
else
cp $self_dir /extensions.txt $self_dir /extensions_install.txt
fi
# 第四个参数用于输出 PHP 和 micro 二进制文件的位置
if [ " $4 " = "" ] ; then
dialog --backtitle "static-php-cli Compile Options" --inputbox "Please input compiled output directory" 10 50 "/dist/" 2>$self_dir /.outdir
if [ $? != 0 ] ; then
clear
echo "canceled setting output dir, compiling PHP stopped." && rm -f $self_dir /.outdir
exit 1
else
OUT_DIR = $( cat $self_dir /.outdir)
rm -f $self_dir /.outdir
fi
else
OUT_DIR = $4
fi
if [ ! -d " $OUT_DIR " ] ; then
mkdir -p " $OUT_DIR "
fi
# 下载 PHP
2022-06-20 20:52:35 +08:00
2022-06-11 01:09:45 +08:00
echo "All done. Downloading PHP ..."
2022-06-20 20:52:35 +08:00
if [ -d " $self_dir /source/php- $VER_PHP " ] ; then
rm -rf " $self_dir /source/php- $VER_PHP "
fi
2022-06-11 01:09:45 +08:00
$self_dir /download.sh php ${ USE_BACKUP } ${ VER_PHP } || { echo "Download PHP failed!" && exit 1 ; }
# 选择性编译依赖的库、移动需要安装的扩展到 PHP 目录
$self_dir /check-extensions.sh check_before_configure ${ VER_PHP } || { echo "Install required library failed!" && exit 1 ; }
# 编译 PHP
echo "Compiling PHP ..."
php_dir = $( find $self_dir /source -name " php- $VER_PHP " -type d | tail -n1)
2021-06-06 01:01:58 +08:00
cd $php_dir && \
2021-06-02 19:57:55 +08:00
./buildconf --force && \
./configure LDFLAGS = -static $( php_compile_args $VER_PHP ) && \
2022-06-11 01:09:45 +08:00
$self_dir /check-extensions.sh check_after_configure ${ VER_PHP } && \
2021-06-02 19:57:55 +08:00
sed -ie 's/-export-dynamic//g' "Makefile" && \
sed -ie 's/-o $(SAPI_CLI_PATH)/-all-static -o $(SAPI_CLI_PATH)/g' "Makefile" && \
2022-06-11 01:09:45 +08:00
#sed -ie 's/$(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_MICRO_OBJS)/$(PHP_GLOBAL_OBJS:.lo=.o) $(PHP_BINARY_OBJS:.lo=.o) $(PHP_MICRO_OBJS:.lo=.o)/g' "Makefile" && \
make LDFLAGS = "-ldl" -j$( cat /proc/cpuinfo | grep processor | wc -l) && \
make install-cli && \
2022-06-20 20:52:35 +08:00
$self_dir /check-extensions.sh finish_compile && \
2022-06-27 14:06:01 +08:00
strip $self_dir /php-dist/bin/php
if [ $? != 0 ] ; then
2022-08-16 10:17:34 +08:00
exit 1
2022-06-27 14:06:01 +08:00
fi
# 将 PHP 和 micro 输出到指定目录
echo " Copying php binary to $OUT_DIR ... " && \
2022-06-11 01:09:45 +08:00
cp $self_dir /php-dist/bin/php $OUT_DIR / && \
test -f $php_dir /sapi/micro/micro.sfx && \
echo " Copying micro.sfx binary to $OUT_DIR ... " && \
cp $php_dir /sapi/micro/micro.sfx $OUT_DIR / || { exit 0 ; }