【问题标题】:Generated libtool is removing *.gcno on linking when compiling PHP extension编译 PHP 扩展时,生成的 libtool 正在删除链接上的 *.gcno
【发布时间】:2023-05-11 14:47:02
【问题描述】:

我想为我的 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 文件,因此允许我生成正确的覆盖率报告。我在这里遗漏了什么明显的东西吗?

【问题讨论】:

    标签: php code-coverage php-extension libtool gcov


    【解决方案1】:

    我认为有一种方法可以强制链接过程不删除 .gcno 文件,因此允许我生成正确的覆盖率报告。

    在这种情况下,可能不会。您在上面引用的ltmain.sh 表示它来自 libtool 1.5.26。但是,声称不再删除 .gcno 分析器信息的 libtool 版本是 libtool 2.2.6。该修复程序可能也在以后的 libtool 版本中。

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

    【讨论】:

    • 我想出了一个解决方法:在phpize 之后我打电话给:aclocal && libtoolize --copy --force && autoreconf。现在我有最新的 libtools 并且覆盖范围很好。虽然我不确定这是否会导致我还无法预见的问题:/
    • 这种方法也可以,因为代码覆盖率似乎是您主要关心的问题。但是,正如您所说,这样做可能会出现无法预料的构建问题。