Можно ли ускорить эту систему сборки? - PullRequest
3 голосов
/ 25 ноября 2008

Наше телосложение медленное. Он использует вложенные make-файлы GNU в Linux. Он создает три сборки для трех разных целей из одного и того же исходного дерева. Он использует символические ссылки для указания на каждое из трех параллельных деревьев каталогов по очереди. Мы можем выполнять частичную сборку, используя подкаталоги make inside, что экономит время, но если наша работа охватывает несколько каталогов, мы должны создать как минимум одну из трех целей, что занимает минимум 45 минут. Только сборка подкаталога может занять "всего лишь" 5-10 минут.

Знаете ли вы какие-либо быстрые вещи, которые нужно проверить, которые могут затопить эту систему сборки? Например, есть ли более быстрая альтернатива символическим ссылкам?

Дополнение: я видел статью о рекурсивных make-файлах. Кто-нибудь знает из первых рук, каковы будут последствия сброса системы Makefile, которая в настоящее время имеет много make-файлов (около 800) и более 4,5 миллионов строк исходного кода? В настоящее время людям нравится возможность создавать только свой текущий подкаталог или процесс (встроенная цель linux) с помощью make в этом каталоге.

Я только что узнал, что до недавнего времени сборка была вдвое длиннее ( wince ), после чего инженер по выпуску развернул ccache.

Ответы [ 5 ]

4 голосов
/ 25 ноября 2008

Замечания по ускорению сборки:

Сборки, как правило, связаны с вводом / выводом, поэтому распределяйте их по нескольким дискам / контроллерам или машинам. Например, поместите источник на один физический диск, а цель (выходные данные сборки) - на другой физический диск, и отделите оба этих диска от физического диска, на котором находятся инструменты сборки (.NET, Java, Ant и т. Д.). ) и с физического диска, на котором установлена ​​ваша ОС.

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

Инструменты сборки часто включают в себя множество накладных расходов на запуск / останов процесса, поэтому выбирайте инструменты, сценарии и процедуры, которые минимизируют эти издержки. Это особенно верно для таких инструментов, как make и Ant, которые обычно вызывают другие инструменты в качестве подпроцессов. Например, я перехожу к системе сборки на основе Python, чтобы я мог выполнять большую часть своей обработки сборки из одного процесса, и при этом иметь возможность легко создавать другие процессы, когда это необходимо.

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

Сценарии сборки могут быстро и легко стать очень сложными, поэтому найдите время, чтобы упростить их. Сначала разделите сборки на отдельные проекты, каждый из которых собирает только один «артефакт», такой как JAR, DLL или EXE. Это позволяет вам сэкономить много времени, просто не вызывая длинную сборку, которая вам сейчас не нужна. Во-вторых, упростите каждую сборку проекта, НИКОГДА не переходя в другой проект - всегда устанавливайте зависимости вашего проекта с помощью артефакта сборки, а не источника. Это сделает каждый проект автономным, и вы можете использовать «супер» сценарии для создания различных подмножеств проектов по своему усмотрению.

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

4 голосов
/ 25 ноября 2008

Я не уверен, почему в вашем случае нужны символические ссылки. Если вы создаете несколько целей из одного и того же источника, вы можете попробовать поместить промежуточные и целевые файлы в отдельные каталоги.

Кроме того, вместо вложенных make-файлов , вы можете попробовать использовать что-то вроде jam . Если у вас несколько процессоров, вы можете попробовать make -j n , где n - это количество процессоров + 1.

1 голос
/ 25 ноября 2008

Упоминание о вложенных make-файлах предполагает, что подход, предложенный в "Рекурсивное создание считается вредным" , может помочь. Из аннотации:

Анализ показывает, что проблема связана с искусственным разбиением сборки на отдельные подмножества. Это, в свою очередь, приводит к описанным симптомам. Чтобы избежать симптомов, необходимо только избежать разделения; использовать один Makefile для всего проекта.

(Один логический make-файл все еще может состоять из нескольких физических файлов.)

1 голос
/ 25 ноября 2008

Если у вас есть более одного компьютера для компиляции, вы также можете использовать distcc . Это распространяет процесс сборки на несколько компьютеров, что должно ускорить процесс в сочетании с make -j 2.

В зависимости от размера проекта, узкое место может на самом деле быть с компилятором (т. Е. Вы включаете -O2 или -O3), и может быть мало что можно сделать, кроме сокращения исходного кода или удаления неиспользуемые файлы #include.

0 голосов
/ 25 ноября 2008

Мы используем мороженое. Не для того, чтобы убить время при сборке, а для ускорения процесса сборки. Это распределенная среда компиляции, которая использует свободное время процессора всех компьютеров в офисе. Наша установка довольно сложна, поскольку у нас есть среда кросс-компиляции, но она может быть намного проще, если вы не кросс-компиляции. http://en.opensuse.org/Icecream

...