source: git/devel/run

trunk
Last change on this file was 291b881, checked in by Xuefer <xuefer@…>, 5 years ago

devel: support sample cpp for dboth/dop

  • Property mode set to 100755
File size: 8.4 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    local colors=(4 2 3 5 6 7 8 9)
13    local re=()
14    local 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 clean all
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    local pwd=$(readlink -f "$(pwd)")
72    local builddirname=${xcachesrcdir}-${phpbasename}
73    local builddir=$(readlink -f $builddirname)
74    if [[ -z $builddir ]]; then
75        hiecho required $builddirname not found
76        return 1
77    fi
78    local sourceFile
79    local sourceFilename
80    find . -iname \*.c | LANG=C sort | while read -r sourceFile; do
81        sourceFilename=${sourceFile#./}
82        {
83            case "$sourceFilename" in
84            includes.c)
85                echo '$(XCACHE_INCLUDES_I)'
86                ;;
87            esac
88            echo ${sourceFilename%.c}.lo '$(builddir)/'${sourceFilename%.c}.lo:
89            hiecho "Checking $sourceFilename ..." >&2
90            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
91                dependency=$(readlink -f "$dependency")
92                case "$dependency" in
93                $pwd/*)
94                    dependency=${dependency#$pwd/}
95                    ;;
96                $builddir/*)
97                    dependency="\$(builddir)/"${dependency#$builddir/}
98                    ;;
99                esac
100
101                case "$dependency" in
102                *xc_const_string_opcodes_php*)
103                    for dependency in xcache/xc_const_string_*.h; do
104                        echo '$(srcdir)/'$dependency
105                    done
106                    ;;
107
108                /*) ;;
109                $sourceFilename) ;;
110
111                xc_processor.h|\$\(builddir\)/xc_processor.h)
112                    echo '$(XCACHE_PROC_H)'
113                    ;;
114                xc_processor.c.h|\$\(builddir\)/xc_processor.c.h)
115                    echo '$(XCACHE_PROC_C)'
116                    ;;
117                *)
118                    if [[ -r $dependency ]]; then
119                        echo '$(srcdir)/'$dependency
120                    else
121                        hiecho "$dependency not found" >&2
122                    fi
123                esac
124            done | LANG=C sort | uniq
125        } | xargs
126    done > Makefile.frag.deps
127}
128# }}}1
129
130hiecho "Loading config devel/run.cfg"
131. devel/run.cfg
132PHPSDIR=${PHPSDIR:-$HOME/test}
133
134if [[ $# -eq 0 ]]; then
135    set -- "${args[@]}"
136fi
137
138basename=$(basename $(pwd))
139case "$basename" in
140*-*)
141    # in build dir, starts from src dir
142    dirs="${basename#*-}"
143    xcachesrcdir=../${basename%%-*}
144    cd $xcachesrcdir
145    ;;
146*)
147    # in src dir
148    dirs=${dirs:-php5-debug-zts}
149    xcachesrcdir=../$basename
150    ;;
151esac
152
153touch devel.pid
154
155# ==========================
156
157do_phpize() { # {{{1
158    if [[ ! -x $PHPSDIR/$phpbasename/bin/phpize ]]; then
159        hiecho $PHPSDIR/$phpbasename/bin/phpize not found
160        exit
161    fi
162    export PATH=$PHPSDIR/$phpbasename/bin:$PATH
163    local pedantic=
164    case $phpbasename in
165    php5|php5.4) pedantic=-pedantic-errors;;
166    *) pedantic=-pedantic;;
167    esac
168    phpize --clean \
169    && phpize \
170    && CFLAGS="$CFLAGS -Dinline= -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 \
171        --enable-xcache-cacher \
172        --enable-xcache-optimizer \
173        --enable-xcache-encoder \
174        --enable-xcache-decoder \
175        --enable-xcache-disassembler \
176        --enable-xcache-assembler \
177        --enable-xcache-coverager \
178        --enable-xcache-test \
179        --enable-xcache-dprint \
180        --enable-xcache-constant
181}
182do_make() { # {{{1
183    if [[ ! -f Makefile ]]; then
184        do_phpize
185    fi
186    LANG=C $MAKE $MAKEOPTS "$@" 2>&1 \
187    | sed -ur \
188        -e 's#Werror=implicit-function-declaration#We/rror=i/mplicit-function-declaration#' \
189        -e 's#-pedantic-errors#-pedantic-e/rrors#' \
190        -e 's#\./xc_processor\.h#'$PWD'/xc_processor.h#' \
191        -e 's#\./xc_processor\.c\.h#'$PWD'/xc_processor.c.h#' \
192    | hi error implicit warn FAIL
193    ret=${PIPESTATUS[0]}
194    if [[ $ret -ne 0 ]]; then
195        exit $ret
196    fi
197}
198cleanfpm() { # {{{1
199    echo
200    stopfpm $pidfile
201}
202# }}}
203run() {
204    pidfile=$xcachesrcdir/devel.pid
205
206    # prepare {{{1
207    case "$1" in
208    phpize)
209        if [[ -r Makefile ]]; then
210            $MAKE $MAKEOPTS xcachesvnclean || true
211        fi
212        ;;
213    esac
214
215    rm -f php-src
216    find -L . -type d -print0 | xargs -0 rmdir -p 2>/dev/null || true
217    find -L . -type l -print0 | xargs -0 rm -fv
218    lndir "$xcachesrcdir" >/dev/null || true
219    find . -iname .\*.swp -print0 | xargs -0 rm -f
220    ln -snf ~/src/php/${phpbasename%%-*} php-src
221    for i in ~/src/php/$phpbasename/sapi/cgi/php{,-cgi}; do
222        if [[ -r $i ]]; then
223            ln -snf "$i" php-cgi
224        fi
225    done
226    ln -snf ~/src/php/$phpbasename/sapi/cli/php php-cli
227    f=~/src/php/$phpbasename/sapi/cli/php; [ -f "$f" ] && ln -snf "$f" php-cli
228    f=~/src/php/$phpbasename/sapi/fpm/php-fpm; [ -f "$f" ] && ln -snf "$f" php-fpm
229
230    case "$1" in
231    phpized) CFLAGS=-DXCACHE_DEBUG do_phpize; return $?;;
232    phpize) do_phpize; return $?;;
233    make) shift; do_make "$@"; return $?;;
234    *) do_make;;
235    esac
236    # }}}1
237
238    if [[ -z $1 ]]; then
239        set -- devel/sample.cpp.php
240    fi
241
242    cmd=()
243    phpApp=()
244    tracer=()
245
246    # run utils {{{1
247    case "$1" in
248    retest)
249        shift
250        lastResult=$(ls php_test_results_*.txt | LANG=C sort | tail -n1)
251        $MAKE $MAKEOPTS xcachetest "$@" TESTS="$(grep '^/.*\.phpt$' $lastResult | uniq | xargs)"
252        return
253        ;;
254    test)
255        shift
256        case "$1" in
257        *.phpt)
258            $MAKE $MAKEOPTS xcachetest TEST_ARGS=-v TESTS="$*"
259            return
260            ;;
261        */)
262            $MAKE $MAKEOPTS xcachetest TESTS="$*"
263            return
264            ;;
265        *)
266            $MAKE $MAKEOPTS xcachetest
267            return
268            ;;
269        esac
270        ;;
271    esac
272    # }}}
273    # pick tracer {{{1
274    case "$1" in
275    ltr*)
276        shift
277        export USE_ZEND_ALLOC=0
278        tracer=(ltrace -s1024 -e malloc,realloc,free,write)
279        ;;
280    str*)
281        shift
282        tracer=(strace -s1024 -T)
283        ;;
284    gdb)
285        shift
286        #USE_ZEND_ALLOC=0
287        tracer=(gdb --args)
288        ;;
289    val*)
290        shift
291        export USE_ZEND_ALLOC=0
292        export ZEND_DONT_UNLOAD_MODULES=1
293        tracer=(valgrind -v --gen-suppressions=all)
294        ;;
295    esac
296
297    # pick sapi {{{1
298    case "$phpbasename" in
299    *-apache1*)
300        cmd=($HOME/apache1/bin/httpd -X)
301        ;;
302    *-apache*)
303        echo "Don't know how to run apache"
304        exit 1
305        ;;
306    *)
307        case "$1" in
308        dc)
309            shift
310            cmd=(./php-cli -c devel.ini)
311            phpApp=(./bin/phpdc.phpr)
312            ;;
313        dboth)
314            shift
315            cmd=(./php-cli -c devel.ini)
316            phpApp=(./bin/phpdc.phpr)
317            set -- "$@" -c -d
318            ;;
319        dop)
320            shift
321            cmd=(./php-cli -c devel.ini)
322            phpApp=(./bin/phpdc.phpr)
323            set -- "$@" -d
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    # hack sample.cpp.php {{{1
344    case "$1" in
345    *.cpp.php)
346        < "$1" \
347        sed -r -e 's#__#____#g' \
348        | cpp -C -P -traditional-cpp -undef -ffreestanding -DPHP_VERSION=$phpVersion \
349        | sed -r -e 's#^ +##g' -e 's#\t +#\t#g' -e 's#____#__#g' > devel.php.tmp || exit $?
350        if [[ ! -e devel.php ]] || ! cmp devel.php.tmp devel.php >/dev/null; then
351            cat devel.php.tmp > devel.php
352        else
353            rm -f devel.php.tmp
354        fi
355        shift
356        set -- devel.php "$@"
357        ;;
358    esac
359
360    # run {{{1
361    set -- "${tracer[@]}" "${cmd[@]}" "${phpApp[@]}" "$@"
362
363    case "${cmd[0]}" in
364    *php-fpm*)
365        stopfpm
366        hiecho Starting fpm "$@" ...
367        "$@" | tee output.php
368        echo -n "Ctrl-C to stop"
369        trap cleanfpm SIGINT SIGTERM exit
370        cat > /dev/null || true
371        stopfpm
372        return
373        ;;
374    *)
375        hiecho "$@"
376        case "${tracer[@]}" in
377        gdb*|val*)
378            "$@"
379            ;;
380        *)
381            "$@" | tee output.php
382            ret=${PIPESTATUS[0]}
383            echo exit = $ret >&2
384            return $ret
385            ;;
386        esac
387        ;;
388    esac
389    # }}}
390}
391
392for phpbasename in "${dirs[@]}"; do
393    phpVersion=${phpbasename%%-*}
394    phpVersion=${phpVersion##php}
395    phpVersion=${phpVersion/./}
396    case "$phpVersion" in
397    ??) phpVersion="${phpVersion}0";;
398    ?) phpVersion="${phpVersion}00";;
399    esac
400
401    # devel actions
402    case "$1" in
403    prep*) shift; prep "$@"; exit;;
404    tags) shift; rm -f tags; prep tags "$@"; exit;;
405    po2php) po2php; exit;;
406    mergepo) mergepo; exit;;
407    dep*) updatedeps; exit;;
408    xtest) xtest; exit;;
409    stopfpm) stopfpm devel.pid; exit;;
410    esac
411
412    mkdir -p ${xcachesrcdir}-${phpbasename}
413    cd ${xcachesrcdir}-${phpbasename} || exit
414    lndir ${xcachesrcdir} >/dev/null || true
415
416    pwd
417    run "$@"
418done
Note: See TracBrowser for help on using the repository browser.