Как создать одну большую карту зависимостей для всего проекта, которая создается с помощью make-файлов? - PullRequest
4 голосов
/ 03 мая 2010

У меня есть гигантский проект, который построен с использованием make-файлов. Запуск make в корневом каталоге проекта занимает более 20 минут, если файлы не были изменены (то есть, просто просматривая проект и проверяя наличие обновленных файлов).

Я хотел бы создать карту зависимостей, которая скажет мне, какие каталоги мне нужно запустить 'make' на основе измененных файлов. У меня уже есть список обновленных файлов, которые я могу получить из своей системы контроля версий, и я хотел бы пропустить 20 минут обхода и перейти прямо к местам, которые нужно перекомпилировать.

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

[Редактировать - уточнения, ответы на комментарии]

Проект действительно гигантский, он занимает 20 минут просто из-за размера и из-за всех вещей, описанных в ссылке ниже («рекурсивное использование считает вредным»). К сожалению, проект составлен из множества частей, пришедших из разных мест, и у меня мало гибкости в том, что я могу сделать с низкоуровневыми файлами Makefile ... верхние уровни, соединяющие части, - это те, которые я контролирую.

Ответы [ 2 ]

2 голосов
/ 03 мая 2010

Одна вещь, которую вы могли бы искать, это "makefile graph" - есть несколько проектов для создания деревьев зависимостей из больших makefile проектов. Вот один из них: http://sailhome.cs.queensu.ca/~bram/makao/index.html. Я думаю, что это и создаст симпатичный график, и на самом деле создаст вещи.

Если вы хотите свернуть свой собственный синтаксический анализатор Makefile и, по сути, заменить make собственным скриптом, мой совет будет "не делать". Но есть коллекция модулей Perl: Makefile :: Parser . Он утверждает, что "прошел 51% тестового набора GNU Make".

Если вы хотите просто посмотреть на то, что занимает так много времени, вы можете включить вывод отладки в Make. Биты этого типа обычно бесполезны, например, страницы и страницы Make решают, применять ли неявные правила или нет, но, возможно, случится нечто очевидное, чего не должно происходить. Если вы хотите сделать это, вы можете посмотреть римейк , "GNU Make с понятной трассировкой и отладчиком".

0 голосов
/ 03 мая 2010

Если простая сборка без обновлений занимает 20 минут, это должен быть огромный проект! Учитывая, что ваша конфигурация make-файла в порядке, вы можете попробовать что-то вроде ccache .

обратите внимание, что даже если вы получите список файлов, которые вам просто нужно скомпилировать, вам все равно может понадобиться запустить make из корня проекта, потому что изменения придется связать обратно с основными двоичными файлами. Так что, если ccache еще недостаточно хорош, и вы настаиваете на том, чтобы решить эту проблему самостоятельно, вам все равно придется отслеживать, какие двоичные файлы вам нужно снова связать с помощью "ld"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...