XCache is a fast, stable PHP opcode cacher that has been proven and is now running on production servers under high load. https://xcache.lighttpd.net/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

359 lines
6.7 KiB

#!/bin/bash
# this script is for developers only
set -e
MAKE=/usr/bin/make
true() { # {{{1
return 0
}
hi() { # {{{1
colors=(4 2 3 5 6 7 8 9)
re=()
i=0
for r in "$@"; do
((color=$i % ${#colors[@]})) || true
color=${colors[$color]}
r="${r/\#/\\#}"
r="s#$r#[4${color}m\0#g"
re[$i]="-e$r"
((i=i+1))
done
sed -ur "${re[@]}"
}
hiecho() { # {{{1
echo """$@"""
}
# }}}
stopfpm() { # {{{1
if [[ -f $1 ]]; then
local pid=`cat $1 2>/dev/null || true`
if [[ $pid -gt 0 ]]; then
hiecho Stopping fpm $pid @ $1
kill $pid || true
fi
fi
}
xtest() { # {{{1
$MAKE -f devel/test.mak
}
prep() { # {{{1
$MAKE -f devel/prepare.mak "$@"
}
mergepo() { # {{{1
prep
local i
find htdocs -iname '*.po' | while read -r i; do
if [[ -f $i-merged ]]; then
mv $i-merged $i
fi
done
}
po2php() { # {{{1
mergepo
local phpfile
find htdocs -iname '*.po' | while read -r i; do
phpfile=${i/.po/.php}
devel/po2php.awk < $i > $phpfile.tmp
mv $phpfile.tmp $phpfile
done
}
updatedeps() { # {{{1
pwd=$(readlink -f "$(pwd)")
builddir=$(readlink -f ../trunk-php5-debug-zts)
if [[ -z $builddir ]]; then
hiecho required ../trunk-php5-debug-zts not found
return 1
fi
find . -iname \*.c | sort | while read -r sourceFile; do
sourceFile=${sourceFile#./}
{
case "$sourceFile" in
includes.c)
echo '$(XCACHE_INCLUDES_I)'
;;
esac
echo ${sourceFile%.c}.lo '$(builddir)/'${sourceFile%.c}.lo:
hiecho "Checking $sourceFile ..." >&2
for dependency in $(gcc -MM $sourceFile -I$HOME/test/php5-debug-zts/include/php/{,main,Zend,TSRM} -I. -I${builddir} -MG | sed 's#.*:##g' | sed 's#\\##g'); do
dependency=$(readlink -f "$dependency")
case "$dependency" in
$pwd/*)
dependency=${dependency#$pwd/}
;;
$builddir/*)
dependency="\$(builddir)/"${dependency#$builddir/}
;;
esac
case "$dependency" in
/*) ;;
$sourceFile) ;;
\$\(builddir\)/xc_processor.h)
echo '$(XCACHE_PROC_H)'
;;
\$\(builddir\)/xc_processor.c.h)
echo '$(XCACHE_PROC_C)'
;;
*)
if [[ -r $dependency ]]; then
echo '$(srcdir)/'$dependency
else
hiecho "$dependency not found" >&2
fi
esac
done | sort | uniq
} | xargs
done > Makefile.frag.deps
}
# }}}1
hiecho "Loading config devel/run.cfg"
. devel/run.cfg
PHPSDIR=${PHPSDIR:-$HOME/test}
if [[ $# -eq 0 ]]; then
set -- $action "${args[@]}"
fi
# devel actions
case "$1" in
prep*) shift; prep "$@"; exit;;
tags) shift; rm -f tags; prep tags "$@"; exit;;
po2php) po2php; exit;;
mergepo) mergepo; exit;;
dep*) updatedeps; exit;;
xtest) xtest; exit;;
stopfpm) stopfpm devel.pid; exit;;
esac
basename=$(basename $(pwd))
case "$basename" in
*-*)
# in build dir, starts from src dir
dirs="${basename#*-}"
xcachesrcdir=../${basename%%-*}
cd $xcachesrcdir
;;
*)
# in src dir
dirs=${dirs:-php5-debug-zts}
xcachesrcdir=../$basename
;;
esac
touch devel.pid
svn propget svn:ignore . > .svnignore
# ==========================
do_phpize() { # {{{1
if [[ ! -x $PHPSDIR/$phpbasename/bin/phpize ]]; then
hiecho $PHPSDIR/$phpbasename/bin/phpize not found
exit
fi
export PATH=$PHPSDIR/$phpbasename/bin:$PATH
local pedantic=
case $phpbasename in
php5|php5.4) pedantic=-pedantic-errors;;
*) pedantic=-pedantic;;
esac
phpize --clean \
&& phpize \
&& CFLAGS="-g -O0 $pedanti -Wno-variadic-macros -Wno-long-long -Wall -Wno-unused-parameter -Wno-unused-function -W -Wshadow -Werror=implicit-function-declaration -std=c89 -D_GNU_SOURCE -D_POSIX_SOURCE -Dinline=" ./configure \
--enable-xcache-cacher \
--enable-xcache-optimizer \
--enable-xcache-encoder \
--enable-xcache-decoder \
--enable-xcache-disassembler \
--enable-xcache-coverager \
--enable-xcache-test \
--enable-xcache-constant
}
do_make() { # {{{1
if [[ ! -f Makefile ]]; then
do_phpize
fi
LANG=C $MAKE $MAKEOPTS "$@" 2>&1 \
| sed -ur \
-e 's#Werror=implicit-function-declaration#We/rror=i/mplicit-function-declaration#' \
-e 's#-pedantic-errors#-pedantic-e/rrors#' \
-e 's#\./xc_processor\.h#'$PWD'/xc_processor.h#' \
-e 's#\./xc_processor\.c\.h#'$PWD'/xc_processor.c.h#' \
| hi error implicit warn FAIL
ret=${PIPESTATUS[0]}
if [[ $ret -ne 0 ]]; then
exit $ret
fi
}
cleanfpm() { # {{{1
echo
stopfpm $pidfile
}
# }}}
run() {
pidfile=$xcachesrcdir/devel.pid
# prepare {{{1
case "$1" in
phpize)
if [[ -r Makefile ]]; then
$MAKE xcachesvnclean || true
fi
;;
esac
rm -f php-src
find -L . -type l | xargs rm -fv
lndir "$xcachesrcdir" >/dev/null || true
find . -iname .\*.swp | xargs rm -f
ln -snf ~/src/php/$phpbasename php-src
for i in ~/src/php/$phpbasename/sapi/cgi/php{,-cgi}; do
if [[ -r $i ]]; then
ln -snf "$i" php-cgi
fi
done
ln -snf ~/src/php/$phpbasename/sapi/cli/php php-cli
ln -snf ~/src/php/$phpbasename/sapi/fpm/php-fpm php-fpm
case "$1" in
phpize) do_phpize; exit;;
make) shift; do_make "$@"; exit;;
*) do_make;;
esac
# }}}1
if [[ -z $1 ]]; then
set -- devel.php
fi
cmd=()
tracer=()
# run utils {{{1
case "$1" in
dc)
shift
./php-cli -c devel.ini ./bin/phpdc.phpr $@ | tee decompiled.php
return
;;
dop)
shift
./php-cli -c devel.ini ./bin/phpdop.phpr $@
return
;;
retest)
shift
$MAKE xcachetest "$@" TESTS="`grep '^/.*\.phpt$' php_test_results_*.txt | uniq | xargs`"
return
;;
test)
shift
case "$1" in
*.phpt)
$MAKE xcachetest TEST_ARGS=-v TESTS="$*"
return
;;
*/)
$MAKE xcachetest TESTS="$*"
return
;;
*)
$MAKE xcachetest
return
;;
esac
;;
esac
# }}}
# pick tracer {{{1
case "$1" in
ltr*)
shift
export USE_ZEND_ALLOC=0
tracer=(ltrace -s1024 -e malloc,realloc,free,write)
;;
str*)
shift
tracer=(strace -s1024 -T)
;;
gdb)
shift
#USE_ZEND_ALLOC=0
tracer=(gdb --args)
;;
val*)
shift
export USE_ZEND_ALLOC=0
tracer=(valgrind --gen-suppressions=all)
;;
esac
# pick sapi {{{1
case "$phpbasename" in
*-apache1*)
cmd=($HOME/apache1/bin/httpd -X)
;;
*-apache*)
echo "Don't know how to run apache"
exit 1
;;
*)
case "$1" in
fcgi)
shift
cmd=(./php-cgi -q -c devel.ini)
set -- -b 1026
;;
fpm)
shift
cmd=(./php-fpm -c devel.ini -y devel.fpm -g $(readlink -f $pidfile))
set --
;;
*)
cmd=(./php-cgi -q -c devel.ini)
;;
esac
"${cmd[@]}" -v || true
esac
# run {{{1
commandLine=("${tracer[@]}" "${cmd[@]}" "$@")
case "${cmd[0]}" in
*php-fpm*)
stopfpm
hiecho Starting fpm "${commandLine[@]}" ...
"${commandLine[@]}"
echo -n "Ctrl-C to stop"
trap cleanfpm SIGINT SIGTERM exit
cat > /dev/null || true
stopfpm
;;
*)
hiecho "${commandLine[@]}"
"${commandLine[@]}"
;;
esac
# }}}
}
for phpbasename in "${dirs[@]}"; do
mkdir -p ${xcachesrcdir}-${phpbasename}
cd ${xcachesrcdir}-${phpbasename} || exit
lndir ${xcachesrcdir} >/dev/null || true
pwd
run "$@"
done