编译 PHP 扩展时,生成的 libtool 正在删除链接上的 *.gcno

Generated libtool is removing *.gcno on linking when compiling PHP extension

我想要我的 PHP 扩展的代码覆盖率。我正在使用以下设置:

PHP 7.2.2 (cli) (built: Mar 24 2018 20:43:46) ( NTS DEBUG )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609

我可以毫无问题地构建扩展并且 运行 所有测试。 我正在按如下方式配置扩展:

CXX=gcc CFLAGS="--coverage -fprofile-arcs -ftest-coverage $CFLAGS" LDFLAGS="--coverage" ./configure

make all

的编译步骤
/bin/bash /home/alex/Projects/php-7.2.2/ext/zookeeper/libtool --mode=compile cc -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 -I. -I/home/alex/Projects/php-7.2.2/ext/zookeeper -DPHP_ATOM_INC -I/home/alex/Projects/php-7.2.2/ext/zookeeper/include -I/home/alex/Projects/php-7.2.2/ext/zookeeper/main -I/home/alex/Projects/php-7.2.2/ext/zookeeper -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -I/usr/local/include/php/ext/date/lib  -DHAVE_CONFIG_H  --coverage -fprofile-arcs -ftest-coverage -O0   -c /home/alex/Projects/php-7.2.2/ext/zookeeper/zookeeper.c -o zookeeper.lo

生成以下文件:

.libs/zookeeper.gcno
.libs/zookeeper.o

现在是链接部分:

/bin/bash /home/alex/Projects/php-7.2.2/ext/zookeeper/libtool --mode=link cc -DPHP_ATOM_INC -I/home/alex/Projects/php-7.2.2/ext/zookeeper/include -I/home/alex/Projects/php-7.2.2/ext/zookeeper/main -I/home/alex/Projects/php-7.2.2/ext/zookeeper -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -I/usr/local/include/php/ext/date/lib  -DHAVE_CONFIG_H  --coverage -fprofile-arcs -ftest-coverage -O0  --coverage -o zookeeper.la -export-dynamic -avoid-version -prefer-pic -module -rpath /home/alex/Projects/php-7.2.2/ext/zookeeper/modules  zookeeper.lo -Wl,-rpath,/home/alex/Projects/php-7.2.2/ext/zookeeper/target/release -L/home/alex/Projects/php-7.2.2/ext/zookeeper/target/release -lzookeeper_bridge

记录以下步骤:

rm -fr  .libs/zookeeper.gcno

我设法将其缩小到与 PHP 捆绑在一起的 ltmain.sh 脚本的以下行: https://github.com/php/php-src/blob/d1186b8/ltmain.sh#L3457

我在 ./configure 期间生成的 libtool 也有这一行:

*.$objext)

现在,如果我手动将其更改为:

*.$objext | *.gcno)

链接过程不再删除 .gcno 文件,我可以获得正确的覆盖率报告。

我假设有一种方法可以强制链接过程不删除 .gcno 文件,因此可以生成正确的覆盖率报告。我在这里遗漏了什么明显的东西吗?

I assume there is a way to force the linking process to not to remove the .gcno files and therefore allow me to generate the proper coverage report.

在这种情况下,可能不会。您在上面引用的 ltmain.sh 表示它来自 libtool 1.5.26. However, the version of libtool that claims to no longer remove .gcno profiler information is libtool 2.2.6。修复可能也在以后的 libtool 版本中。

所以要修复它,您必须让 php-src 维护者升级 libtool。或者像您手动完成的那样,在构建过程中修补 libtool