source: trunk/devel/run @ 1403

Last change on this file since 1403 was 1403, checked in by moo, 10 months ago

devel: fix sort, retest only last results

  • Property svn:executable set to *
File size: 7.9 KB
Line 
1#!/bin/bash
2# this script is for developers only
3
4set -e
5MAKE=/usr/bin/make
6
7true() { # {{{1
8    return 0
9}
10
11hi() { # {{{1
12    colors=(4 2 3 5 6 7 8 9)
13    re=()
14    i=0
15    for r in "$@"; do
16        ((color=$i % ${#colors[@]})) || true
17        color=${colors[$color]}
18        r="${r/\#/\\#}"
19        r="s#$r#[4${color}m[31m\0[0m#g"
20        re[$i]="-e$r"
21        ((i=i+1))
22    done
23    sed -ur "${re[@]}"
24}
25hiecho() { # {{{1
26    echo "[32m""$@""[0m"
27}
28
29# }}}
30
31stopfpm() { # {{{1
32    if [[ -f $1 ]]; then
33        local pid=`cat $1 2>/dev/null || true`
34        if [[ $pid -gt 0 ]]; then
35            hiecho Stopping fpm $pid @ $1
36            kill $pid || true
37        fi
38    fi
39}
40
41xtest() { # {{{1
42    $MAKE ${MAKEOPTS} -f devel/test.mak
43}
44
45prep() { # {{{1
46    $MAKE ${MAKEOPTS} -f devel/prepare.mak "$@"
47}
48
49mergepo() { # {{{1
50    prep
51    local i
52    find htdocs -iname '*.po' | while read -r i; do
53        if [[ -f $i-merged ]]; then
54            mv $i-merged $i
55        fi
56    done
57}
58
59po2php() { # {{{1
60    mergepo
61
62    local phpfile
63    find htdocs -iname '*.po' | while read -r i; do
64        phpfile=${i/.po/.php}
65        devel/po2php.awk < $i > $phpfile.tmp
66        mv $phpfile.tmp $phpfile
67    done
68}
69
70updatedeps() { # {{{1
71    pwd=$(readlink -f "$(pwd)")
72    builddir=$(readlink -f ../trunk-php5-debug-zts)
73    if [[ -z $builddir ]]; then
74        hiecho required ../trunk-php5-debug-zts not found
75        return 1
76    fi
77    find . -iname \*.c | LANG=C sort | while read -r sourceFile; do
78        sourceFile=${sourceFile#./}
79        {
80            case "$sourceFile" in
81            includes.c)
82                echo '$(XCACHE_INCLUDES_I)'
83                ;;
84            esac
85            echo ${sourceFile%.c}.lo '$(builddir)/'${sourceFile%.c}.lo:
86            hiecho "Checking $sourceFile ..." >&2
87            for dependency in $(gcc -DHAVE_XCACHE_TEST -DHAVE_XCACHE_DPRINT -DXCACHE_DEBUG -MM $sourceFile -I$PHPSDIR/$phpbasename/include/php/{,main,Zend,TSRM} -I. -I${builddir} -MG | sed 's#.*:##g' | sed 's#\\##g'); do
88                dependency=$(readlink -f "$dependency")
89                case "$dependency" in
90                $pwd/*)
91                    dependency=${dependency#$pwd/}
92                    ;;
93                $builddir/*)
94                    dependency="\$(builddir)/"${dependency#$builddir/}
95                    ;;
96                esac
97
98                case "$dependency" in
99                *xc_const_string_opcodes_php*)
100                    for dependency in xcache/xc_const_string_*.h; do
101                        echo '$(srcdir)/'$dependency
102                    done
103                    ;;
104
105                /*) ;;
106                $sourceFile) ;;
107
108                xc_processor.h|\$\(builddir\)/xc_processor.h)
109                    echo '$(XCACHE_PROC_H)'
110                    ;;
111                xc_processor.c.h|\$\(builddir\)/xc_processor.c.h)
112                    echo '$(XCACHE_PROC_C)'
113                    ;;
114                *)
115                    if [[ -r $dependency ]]; then
116                        echo '$(srcdir)/'$dependency
117                    else
118                        hiecho "$dependency not found" >&2
119                    fi
120                esac
121            done | LANG=C sort | uniq
122        } | xargs
123    done > Makefile.frag.deps
124}
125# }}}1
126
127hiecho "Loading config devel/run.cfg"
128. devel/run.cfg
129PHPSDIR=${PHPSDIR:-$HOME/test}
130
131if [[ $# -eq 0 ]]; then
132    set -- $action "${args[@]}"
133fi
134
135basename=$(basename $(pwd))
136case "$basename" in
137*-*)
138    # in build dir, starts from src dir
139    dirs="${basename#*-}"
140    xcachesrcdir=../${basename%%-*}
141    cd $xcachesrcdir
142    ;;
143*)
144    # in src dir
145    dirs=${dirs:-php5-debug-zts}
146    xcachesrcdir=../$basename
147    ;;
148esac
149
150touch devel.pid
151svn propget svn:ignore . > .svnignore
152
153# ==========================
154
155do_phpize() { # {{{1
156    if [[ ! -x $PHPSDIR/$phpbasename/bin/phpize ]]; then
157        hiecho $PHPSDIR/$phpbasename/bin/phpize not found
158        exit
159    fi
160    export PATH=$PHPSDIR/$phpbasename/bin:$PATH
161    local pedantic=
162    case $phpbasename in
163    php5|php5.4) pedantic=-pedantic-errors;;
164    *) pedantic=-pedantic;;
165    esac
166    phpize --clean \
167    && phpize \
168    && CFLAGS="$CFLAGS -g -O0 $pedantic -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 \
169        --enable-xcache-cacher \
170        --enable-xcache-optimizer \
171        --enable-xcache-encoder \
172        --enable-xcache-decoder \
173        --enable-xcache-disassembler \
174        --enable-xcache-coverager \
175        --enable-xcache-test \
176        --enable-xcache-dprint \
177        --enable-xcache-constant
178}
179do_make() { # {{{1
180    if [[ ! -f Makefile ]]; then
181        do_phpize
182    fi
183    LANG=C $MAKE $MAKEOPTS "$@" 2>&1 \
184    | sed -ur \
185        -e 's#Werror=implicit-function-declaration#We/rror=i/mplicit-function-declaration#' \
186        -e 's#-pedantic-errors#-pedantic-e/rrors#' \
187        -e 's#\./xc_processor\.h#'$PWD'/xc_processor.h#' \
188        -e 's#\./xc_processor\.c\.h#'$PWD'/xc_processor.c.h#' \
189    | hi error implicit warn FAIL
190    ret=${PIPESTATUS[0]}
191    if [[ $ret -ne 0 ]]; then
192        exit $ret
193    fi
194}
195cleanfpm() { # {{{1
196    echo
197    stopfpm $pidfile
198}
199# }}}
200run() {
201    pidfile=$xcachesrcdir/devel.pid
202
203    # prepare {{{1
204    case "$1" in
205    phpize)
206        if [[ -r Makefile ]]; then
207            $MAKE $MAKEOPTS xcachesvnclean || true
208        fi
209        ;;
210    esac
211
212    rm -f php-src
213    find -L . -type d -print0 | xargs -0 rmdir -p 2>/dev/null || true
214    find -L . -type l -print0 | xargs -0 rm -fv
215    lndir "$xcachesrcdir" >/dev/null || true
216    find . -iname .\*.swp -print0 | xargs -0 rm -f
217    ln -snf ~/src/php/${phpbasename%%-*} php-src
218    for i in ~/src/php/$phpbasename/sapi/cgi/php{,-cgi}; do
219        if [[ -r $i ]]; then
220            ln -snf "$i" php-cgi
221        fi
222    done
223    ln -snf ~/src/php/$phpbasename/sapi/cli/php php-cli
224    f=~/src/php/$phpbasename/sapi/cli/php; [ -f "$f" ] && ln -snf "$f" php-cli
225    f=~/src/php/$phpbasename/sapi/fpm/php-fpm; [ -f "$f" ] && ln -snf "$f" php-fpm
226
227    case "$1" in
228    phpize) do_phpize; return $?;;
229    make) shift; do_make "$@"; return $?;;
230    *) do_make;;
231    esac
232    # }}}1
233
234    if [[ -z $1 ]]; then
235        set -- devel.php
236    fi
237
238    cmd=()
239    tracer=()
240
241    # run utils {{{1
242    case "$1" in
243    dc)
244        shift
245        case "$1" in
246        *.cpp.php)
247            < "$1" \
248            sed -r -e 's#__#____#g' \
249            | cpp -C -P -traditional-cpp -DPHP_VERSION=$phpVersion \
250            | sed -r -e 's#^ +##g' -e 's#\t +#\t#g' -e 's#____#__#g' > sample.php || exit $?
251            shift
252            ./php-cli -c devel.ini ./bin/phpdc.phpr sample.php "$@" | tee decompiled.php
253            ;;
254        *)
255            ./php-cli -c devel.ini ./bin/phpdc.phpr "$@" | tee decompiled.php
256            ;;
257        esac
258        return
259        ;;
260    retest)
261        shift
262        lastResult=$(ls php_test_results_*.txt | LANG=C sort | tail -n1)
263        $MAKE $MAKEOPTS xcachetest "$@" TESTS="$(grep '^/.*\.phpt$' $lastResult | uniq | xargs)"
264        return
265        ;;
266    test)
267        shift
268        case "$1" in
269        *.phpt)
270            $MAKE $MAKEOPTS xcachetest TEST_ARGS=-v TESTS="$*"
271            return
272            ;;
273        */)
274            $MAKE $MAKEOPTS xcachetest TESTS="$*"
275            return
276            ;;
277        *)
278            $MAKE $MAKEOPTS xcachetest
279            return
280            ;;
281        esac
282        ;;
283    esac
284    # }}}
285    # pick tracer {{{1
286    case "$1" in
287    ltr*)
288        shift
289        export USE_ZEND_ALLOC=0
290        tracer=(ltrace -s1024 -e malloc,realloc,free,write)
291        ;;
292    str*)
293        shift
294        tracer=(strace -s1024 -T)
295        ;;
296    gdb)
297        shift
298        #USE_ZEND_ALLOC=0
299        tracer=(gdb --args)
300        ;;
301    val*)
302        shift
303        export USE_ZEND_ALLOC=0
304        export ZEND_DONT_UNLOAD_MODULES=1
305        tracer=(valgrind -v --gen-suppressions=all)
306        ;;
307    esac
308
309    # pick sapi {{{1
310    case "$phpbasename" in
311    *-apache1*)
312        cmd=($HOME/apache1/bin/httpd -X)
313        ;;
314    *-apache*)
315        echo "Don't know how to run apache"
316        exit 1
317        ;;
318    *)
319        case "$1" in
320        dop)
321            shift
322            cmd=(./php-cli -c devel.ini)
323            set -- ./bin/phpdop.phpr "$@"
324            ;;
325        fcgi)
326            shift
327            cmd=(./php-cgi -q -c devel.ini)
328            set -- -b 1026
329            ;;
330        fpm)
331            shift
332            cmd=(./php-fpm -c devel.ini -y devel.fpm -g $(readlink -f $pidfile))
333            set --
334            ;;
335        *)
336            cmd=(./php-cgi -q -c devel.ini)
337            ;;
338        esac
339
340        "${cmd[@]}" -v || true
341    esac
342
343    # run {{{1
344    commandLine=("${tracer[@]}" "${cmd[@]}" "$@")
345
346    case "${cmd[0]}" in
347    *php-fpm*)
348        stopfpm
349        hiecho Starting fpm "${commandLine[@]}" ...
350        "${commandLine[@]}"
351        echo -n "Ctrl-C to stop"
352        trap cleanfpm SIGINT SIGTERM exit
353        cat > /dev/null || true
354        stopfpm
355        ;;
356    *)
357        hiecho "${commandLine[@]}"
358        "${commandLine[@]}"
359        ;;
360    esac
361    # }}}
362}
363
364for phpbasename in "${dirs[@]}"; do
365    phpVersion=${phpbasename%%-*}
366    phpVersion=${phpVersion##php}
367    phpVersion=${phpVersion/./}
368    case "$phpVersion" in
369    ??) phpVersion="${phpVersion}0";;
370    ?) phpVersion="${phpVersion}00";;
371    esac
372
373    # devel actions
374    case "$1" in
375    prep*) shift; prep "$@"; exit;;
376    tags) shift; rm -f tags; prep tags "$@"; exit;;
377    po2php) po2php; exit;;
378    mergepo) mergepo; exit;;
379    dep*) updatedeps; exit;;
380    xtest) xtest; exit;;
381    stopfpm) stopfpm devel.pid; exit;;
382    esac
383
384    mkdir -p ${xcachesrcdir}-${phpbasename}
385    cd ${xcachesrcdir}-${phpbasename} || exit
386    lndir ${xcachesrcdir} >/dev/null || true
387
388    pwd
389    run "$@"
390done
Note: See TracBrowser for help on using the repository browser.