Отладка зависимостей CMake/Make для параллельной сборки

Я управляю для работы сложным проектом C++, определения сборки которого написаны в CMake, а сама сборка получается путем вызова make. Исходное дерево состоит из множества модулей и хорошо распараллеливается.

Линейная сборка всегда успешна, а параллельная — в большинстве случаев. Когда во время такой сборки возникает проблема с зависимостями, я обычно иду и исправляю ее, но я хотел бы тестировать зависимости программно, а не исправлять проблемы по мере их возникновения.

Идеальным решением было бы пройтись по всем зависимостям в CMake и исправить их, но на практике это не всегда возможно, потому что мы активно используем пользовательские макросы для каких-то зависимостей, специфичных для нашего исходного дерева (я не могу зайти в подробности, извините). Итак, я думал решить проблему по-другому (и, возможно, эффективно), стараясь максимально переиспользовать стандартные инструменты.

  1. Моя первая мысль заключалась в том, чтобы внедрить какую-то «случайность» в планирование заданий Make, чтобы сборочная машина могла бесконечно пытаться использовать разные пути компиляции, перестраивая дерево, пока не произойдет сбой. Другой вопрос (здесь) Однако указал, что эта функция недоступна в Make.

  2. Поэтому я попробовал другое решение: я создал сценарий-оболочку вокруг g++, который спит в течение $RANDOM секунд, чтобы внести некоторый шум в планировщик заданий Make. Недостатком этого решения является, конечно же, увеличенное время компиляции.
    Это частичное решение, однако, имеет фундаментальный недостаток: если проблема найдена, это доказательство отсутствия зависимости, но, если нет ошибки создан, мы не можем доказать, что все зависимости верны.

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

Спасибо.


person Marco Leogrande    schedule 27.07.2012    source источник
comment
Когда сборка терпит неудачу, ее повторный запуск не помогает решить проблему?   -  person arrowd    schedule 08.10.2012
comment
@arrowdodger Да, но я всегда хотел бы завершить сборку одним выстрелом.   -  person Marco Leogrande    schedule 08.10.2012
comment
Будет ли перенос вызова make в сценарий, который вызывает make до тех пор, пока успех не будет считаться однократным?   -  person arrowd    schedule 08.10.2012
comment
@arrowdodger Я знаю об этом решении, но оно мне не нравится; это хак, который работает вокруг проблемы, не решая ее.   -  person Marco Leogrande    schedule 08.10.2012


Ответы (2)


Я думаю, вам нужно использовать лучший make, если вы действительно хотите эффективно решить эту проблему. Electric Make (часть ElectricAccelerator) — это совместимый с GNU make вариант make, который отслеживает доступ к файловой системе во время сборки и автоматически выявлять и исправлять проблемы, вызванные неправильным выполнением. Кроме того, ElectricMake может генерировать аннотированный журнал сборки, который покажет вам, к каким файлам обращалось каждое задание в сборке, а также зависимости (явные и неявные) между заданиями, которые вы могли бы использовать для исправления отсутствующих зависимостей в make-файлах.

Вы можете скачать и попробовать ElectricAccelerator Huddle, бесплатную версию ElectricAccelerator.

Отказ от ответственности: я являюсь архитектором и техническим руководителем ElectricAccelerator.

person Eric Melski    schedule 27.07.2012
comment
Спасибо. Я посмотрю на это. - person Marco Leogrande; 28.07.2012

Вы можете попробовать проанализировать сами зависимости. Cmake может довольно легко генерировать графики зависимостей в dot/graphviz: http://www.cmake.org/Wiki/CMake:For_CMake_Hackers

В вашем анализе может помочь теория графов: http://en.wikipedia.org/wiki/Graph_theory

person qneill    schedule 28.11.2013