Как создать нетранзитивный список зависимостей (GCC) - PullRequest
3 голосов
/ 06 марта 2011

Существует ли способ создания зависимостей исходного файла C (++), аналогичный использованию параметра -MM в GCC, который включает только прямые зависимости указанного файла, то есть только файлы, непосредственно включенные в этот исходный файл?

Больше контекста о том, почему я ищу эту функциональность - возможно, есть иное решение моей проблемы: у меня есть универсальный make-файл с автоматическим определением зависимостей, который удовлетворяет мои потребности, но медленный. Основная структура выглядит следующим образом:

  • Полные зависимости main.cpp извлекаются с помощью gcc -MM
  • Все * .h зависимости, для которых существует соответствующий * .cpp, изменены на * .o зависимости
  • измененные зависимости включены в make-файл
  • Все * .o цели построены, зависимости извлекаются с помощью gcc -MM и включаются
  • Все цели * .o связаны для создания исполняемого файла

Пока что этот make-файл работал нормально, но, как уже было сказано, он медленный. Я проанализировал путь его выполнения для одного проекта и включил все сгенерированные зависимости вручную, чтобы попытаться оптимизировать его скорость. В результате, удалив все транзитивные зависимости, make-файл сохранил свою функциональность, но получил намного быстрее (также отражается в количестве строк отладочного вывода make -d).

1 Ответ

0 голосов
/ 22 сентября 2011

Прежде всего, метод, который вы используете, немного сбивает с толку. Все файлы .h, используемые при компиляции одного файла .cpp, должны храниться в его зависимостях, и автоматический сбор файлов * .o не должен быть медленным . Я бы посоветовал перейти к классическому -MM и составить список файлов cpp, которые должны быть скомпилированы вручную. Automake делает это таким образом, и если бы был действительно надежный способ автоматически определить список модулей компиляции, эти ребята нашли бы это: -).

Тем не менее, опция -H gcc вам поможет. Он печатает имена всех используемых файлов в stderr, с помощью. с префиксом для уровня включения. Таким образом,

cpp -I $< >/dev/null | sed -n -e 's/^\. //p'

должен сделать свое дело. Предостережение: если заголовочный файл сначала включается глубже в иерархию, а затем в основной файл, он не обнаруживается. Однако ваша система зависимостей должна справиться с этим, если вы сохраните файлы «1: 1» в файлах .h и .cpp.

...