Как создать файлы gcov для проекта в другом каталоге?

sed '/^Start-Date:/ {N; /\n$/d}'

sed's Потоковый Редактор, хлебайте/определять стаи строки и имейте свой путь с ними.

N "добавляют новую строку и следующую входную строку к текущему буферу", таким образом, \n в буфере запуск добавленной строки /\n$/d означает, "если последняя добавленная строка в буфере пуста, просто отбрасывают все это".

3
29.07.2015, 12:26
2 ответа

У вас есть команды, поэтому вставьте их в сценарий!

Чтобы запустить набор команд для разных данных, поместите изменяющиеся данные в переменную .

Чтобы запустить gcov и mv для всех файлов, есть несколько возможных методов, в том числе:

  • Запустите gcov для всех файлов, затем переместите их.
  • Запустите gcov для одного файла, затем переместите его вывод.
  • Запустите gconv для файлов в каталоге, затем переместите их.

Первый подход не работает, потому что gcov необходимо выполнить в каталоге, содержащем исходные файлы. Третий подход, основанный на каталогах, на самом деле является наиболее сложным из трех: простейшим методом было бы запускать gcov для одного файла за раз.

В bash вы можете рекурсивно перечислить все файлы C в каталоге и его подкаталогах с помощью шаблона подстановки ** / *. C .Подстановочный знак ** должен быть включен с параметром globstar опцией . Для перебора файлов используйте цикл for .

Чтобы перейти в каталог только для выполнения одной команды, запустите cd и эту команду в подоболочке : (cd… && gcov…) .

Вам нужен еще один тип конструкции оболочки: небольшая манипуляция с именами файлов для извлечения части каталога. расширение параметра конструкция $ {x% / *} расширяется до значения переменной x с самым коротким суффиксом, соответствующим шаблону / * удалено. Другими словами, это часть каталога имени файла, хранящаяся в x . Это не сработало бы, если бы x состоял только из имени файла без части каталога (то есть foo в отличие от bar / foo ); так случилось, что в корне дерева исходных текстов OpenSSL нет файла .c , но есть простой способ убедиться, что имя файла начинается с ./ , обозначающего текущий каталог .

Вызовите этот сценарий в корне дерева исходных текстов OpenSSL после запуска ./ config с желаемыми параметрами.

#!/bin/bash
shopt -s globstar
gcov_data_dir="../../gcovdata/${PWD##*/}"
make
make tests
for x in ./**/*.c; do
  mkdir -p "$gcov_data_dir/${x%/*}"
  (cd "${x%/*}" && gcov "${x##*/}") &&
  mv "$x.gcov" "$gcov_data_dir/${x%/*}"
done

Чтобы избежать необходимости перемещать файлы .gcov , альтернативным подходом было бы создание леса символических ссылок на каталог компиляции и запуск gcov в gcovdata каталог. С GNU coreutils (т.е. на невстроенном Linux или Cygwin) вы можете сделать это с помощью cp -al .

cp -al openssl-1.0.0 gcovdata
cd gcovdata
for x in ./**/*.c; do
  (cd "${x%/*}" && gcov "${x##*/}")
done
2
27.01.2020, 21:27

После запуска вашего gcov просто сделайте это:

mv *.gcov sub-folder-name
mv *.gcda sub-folder-name
mv *.gcno sub-folder-name
0
06.05.2020, 23:36

Теги

Похожие вопросы