покрытие кода — Сгенерированный libtool удаляет * .gcno при компоновке при компиляции расширения PHP

Я хочу иметь покрытие кода для моего расширения 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 файлы и, следовательно, позволяют мне создать правильный отчет о покрытии. Я что-то упускаю здесь очевидное?

1

Решение

Я предполагаю, что есть способ заставить процесс связывания не удалять файлы .gcno и, следовательно, позволить мне создать соответствующий отчет о покрытии.

В этом случае, вероятно, нет. ltmain.sh Вы упоминали выше, говорит, что это из libtool 1.5.26. Однако версия libtool, которая утверждает, что больше не удаляет информацию профайлера .gcno, — это libtool 2.2.6. Исправление, вероятно, также в более поздних версиях libtool.

Таким образом, чтобы исправить это, вам нужно будет получить php-src сопровождающие обновляют libtool. Или патч libtool как часть вашего процесса сборки, как вы сделали вручную.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]