Honestly it's only a patch to the build system to add basically 
--enable-gcov to the configure (much like --enable-debug). Basically it
just checks for the proper libraries and utilities during configure as
it should and if everything is okay builds PHP with the proper compile-
time flags and libraries. The libgcov takes care of all the
instrumenting internally (so no changes to internals code). The
difference is that with --enable-gcov PHP produces a ton of .gcda
and .gcno files which contain the code coverage data. Enabling at
configure also provides two new make commands:

make cov 
(gather up all the .gcda, .gcno files in the build tree from running php
and put them in one place then run the lcov utility to process them into
a consolidated .phplcov-info.dat file)

make cov-html
Process the .phplcov-info.dat file and generate a pretty HTML report in
the cov_html/ directory

It's really a non-intrusive no-code-change patch. Unfortunately I can't
seem to get at the CVS right now.. Attached is (basically) the patch.

John

On Thu, 2005-07-28 at 11:31 -0700, Andi Gutmans wrote:
> Is this an extension or changes to the core? Do you already have a patch?
> In any case, this would have to wait until earliest after the branch and go 
> to HEAD.
> But I suggest to first make a proposal and show what you're planning on 
> doing here on internals@
> 
> Andi
> 
> At 03:02 PM 7/27/2005 -0400, John Coggeshall wrote:
> >I'd also like to get this in to PHP 5.1+ after we branch before Unicode:
> >
> >http://blog.coggeshall.org/archives/204_Code_Coverage_Support_for_PHP_5.html
> >
> >John
> 
PHP_ARG_ENABLE(gcov,  whether to include gcov symbols,
[  --enable-gcov           Enable GCOV code coverage (requires LTP)], no, no)

if test "$PHP_GCOV" = "yes"; then
  AC_DEFUN([PHP_PROG_LTP],[

    ltp_version_list="1.4"

    AC_CHECK_PROG(LTP, lcov, lcov)
    AC_CHECK_PROG(LTP_GENHTML, genhtml, genhtml)
    if test "$LTP"; then
      AC_CACHE_CHECK([for ltp version], php_cv_ltp_version, [
        php_cv_ltp_version=invalid
        ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'`
        for ltp_check_version in $ltp_version_list; do
          if test "$ltp_version" = "$ltp_check_version"; then
            php_cv_ltp_version="$ltp_check_version (ok)"
          fi
        done
      ])
    else
      ltp_msg="To enable code coverage reporting you must have one of the follo 
wing LTP versions installed: $ltp_version_list"
      AC_MSG_ERROR([$ltp_msg])
    fi

    case $php_cv_ltp_version in
      ""|invalid[)]
        ltp_msg="You must have one of the following versions of LTP: $ltp_versi 
on_list (found: $ltp_version)."
        AC_MSG_ERROR([$ltp_msg])
        LTP="exit 0;"
        ;;
    esac

    if test "$LTP_GENHTML" = ""; then
       AC_MSG_ERROR([Could not find genhtml from the LTP package])
    fi

    PHP_SUBST(LTP)
    PHP_SUBST(LTP_GENHTML)
  ])

  PHP_PROG_LTP
  AC_CHECK_LIB(gcov, __gcov_open, [
    PHP_ADD_LIBRARY(gcov)
    AC_DEFINE(HAVE_GCOV, 1, [Whether you have gcov])
    CFLAGS="$CFLAGS -O0 -fprofile-arcs -ftest-coverage"
    PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/Makefile.gcov,$abs_srcdir)
  ], [
    AC_MSG_ERROR([Problem with enabling gcov. Please check config.log for detai 
ls.])
  ])
fi

.php_cov_info.ltpdata:
        @mkdir -p .cov/; \
        find . -name \*.gcda -o -name \*.gcno | sed -e 's/^\.\/\.cov\/.*//' | 
xargs --replace cp {} .cov/; \
        find . -name \*.gcda -o -name \*.gcno | sed -e 's/^\.\/\.cov\/.*//' | 
sed -e 's/^\.\///' | xargs --max-args=1 dirname | sed -e 's/\/.*//' | xargs 
--replace ln -s `pwd`/{} `pwd`/.cov > /dev/null 2>&1; \
        $(LTP) --directory .cov --output-file=.php_cov_info.ltpdata --capture; \

cov: .php_cov_info.ltpdata

cov-html: cov 
        @$(LTP_GENHTML) -o cov_html/ .php_cov_info.ltpdata -t "PHP Code 
Coverage" -s;

cov-clean:
        find . -name \*.gcda -o -name \*.gcno -exec rm -f {} \;
        rm -f .cov/*      # This is done first, since we are symlinked inside..
        rm -Rf .cov       # Now remove the directory
        rm -f .php_cov_info.ltpdata
        rm -Rf cov_html

Attachment: gen_php_cov
Description: application/shellscript

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to