Я хочу иметь покрытие кода для моего расширения 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
Мне удалось сузить его до следующей строки ltmain.sh
скрипт, который поставляется с PHP:
https://github.com/php/php-src/blob/d1186b8/ltmain.sh#L3457
мой libtool
генерируется во время ./configure
также имеет эту строку:
*.$objext)
Теперь, если я вручную изменить его на:
*.$objext | *.gcno)
процесс связывания больше не удаляет .gcno
файл, и я могу получить правильный отчет о покрытии.
Я предполагаю, что есть способ заставить процесс связывания не удалять .gcno
файлы и, следовательно, позволяют мне создать правильный отчет о покрытии. Я что-то упускаю здесь очевидное?
Я предполагаю, что есть способ заставить процесс связывания не удалять файлы .gcno и, следовательно, позволить мне создать соответствующий отчет о покрытии.
В этом случае, вероятно, нет. ltmain.sh
Вы упоминали выше, говорит, что это из libtool 1.5.26. Однако версия libtool, которая утверждает, что больше не удаляет информацию профайлера .gcno, — это libtool 2.2.6. Исправление, вероятно, также в более поздних версиях libtool.
Таким образом, чтобы исправить это, вам нужно будет получить php-src
сопровождающие обновляют libtool. Или патч libtool
как часть вашего процесса сборки, как вы сделали вручную.
Других решений пока нет …