|
Make, ускорение процесса сборки проектов |
|
|
|
Aug 21 2012, 17:25
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Сегодня попробовал задать мейку во сколько потоков ему работать, т.к. у меня в системе видятся 4 ядра (1+HT)*2 то я задал 4: Код make -j 4 all Результат: проект собрался ровно в 2 раза быстрее! Спешу поделиться своей радостью со всеми:-)
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
 |
Ответов
|
Aug 23 2012, 20:40
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Petka @ Aug 24 2012, 01:39)  Про определённый порядок выполнения зависимостей нигде никогда ничего не гарантировалось. Пока не появился ключик -j - вполне себе гарантировалось  Цитата(Petka @ Aug 24 2012, 01:39)  Всё что вы просили выполнить в вашем makefile для цели all будет добросовестно выполнено. Вывод на экран сообщений был? Размер выводился? elf собирался? При любом ключе -j ? Нет. В моём примере (build: clean all) - как раз-таки ничего не собиралось. Ибо сначала выполнялась цель all, а потом - clean. В результате после выполнения make build - никакого elf-а не было. Цитата(ReAl @ Aug 24 2012, 01:28)  «Ага, щас»™ В результате для Код %.elf : $(OBJS) между файлкми из $(OBJS) будет по точке следования и -j N идёт лесом. Параллельно их создавать будет нельзя. Так я про PHONY цели. Между ними (после них) вполне можно было поставить точки следования.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 24 2012, 07:05
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(AHTOXA @ Aug 24 2012, 00:40)  Пока не появился ключик -j - вполне себе гарантировалось  После этого утверждения была бы уместна ссылка на документацию какой-то определённой версии make. С подтверждением этого смелого утверждения. Цитата Нет. В моём примере (build: clean all) - как раз-таки ничего не собиралось. Ибо сначала выполнялась цель all, а потом - clean. В результате после выполнения make build - никакого elf-а не было. ... В этом примере для цели build необходимо удовлетворение двух взаимоисключающих подцелей. Вы так построили сценарий для make. При чём тут инструмент? Мне вся эта ситуация напоминает появление процессоров с "Hyper-threading". Тогда программисты не были готовы к настоящему параллельному выполнению потоков и отсутствие всяких "spin_lock" приводило к непредсказуемым результатам.
|
|
|
|
|
Aug 24 2012, 08:03
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Petka @ Aug 24 2012, 13:05)  После этого утверждения была бы уместна ссылка на документацию какой-то определённой версии make. С подтверждением этого смелого утверждения. Это совершенно очевидно. Один поток - цели выполняются последовательно. Цитата(Petka @ Aug 24 2012, 13:05)  В этом примере для цели build необходимо удовлетворение двух взаимоисключающих подцелей. Вы так построили сценарий для make. При чём тут инструмент? Не взаимоисключающих, а последовательных. Без -j всё работает как задумано. Если бы при добавлении ключика -j ввели точки следования после каждой из PHONY-целей, то всё бы работало и с -j. Я считаю это большой глупостью авторов make. Короче, вы меня не переубедите. Инструмент этот (make) - кривой. Уж сколько времени я им пользуюсь, а ощущение кривизны не проходит, а только усиливается.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 28 2012, 13:34
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(AHTOXA @ Aug 24 2012, 11:03)  Я считаю это большой глупостью авторов make. Вот что-то мне в этой фразе не понравилось :-) Это 50% пинка, вся остальная тема — ещё 50% Всем спасибо, пинок застаивл еще раз заглянуть в документацию :-) Код .NOTPARALLEL: start dirs clean reset OK :-( Тьху, не оно :-( Разница во времени на мелком проекте небольшая и линкеовка с LTO занимает около половины, без LTO и с time стало хорошо видно, что полностью. отрубается параллельность. Ну и не дочитался сразу, что зависимости к этой цели по барабану, главное, что она есть в Makefile. Ну, значит, нужен feature request на .SEQUENTIAL и доброволец на реализацию :-) Всё равно было полезно поговорить :-) сlean я делаю отдельно вручную. Но прошёлся по более-менее актуальным для себя Makefile, в одном старом было rebuild, в нескольких других (все в примерах scmRTOS) цель build. Заменил на уже предложенное мной Код build: $(MAKE) clean $(MAKE) В том числе во всех CortexM3/GCC примерах и вбросил изменения в репозиторий.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 10 2012, 10:21
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(ReAl @ Aug 28 2012, 17:34)  Код build: $(MAKE) clean $(MAKE) Скажите, пожалуйста, в чем смысл в цели build _всегда_ делать clean? Если меняется код только в одном файле, то компилировать надо только его, а линковать всё, но в этом случае пересобирается весь проект. Время сборки увеличивается.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Sep 10 2012, 17:40
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(AHTOXA @ Sep 10 2012, 15:28)  Потому что цель такая - полная пересборка. Для выборочной пересборки, о которой вы говорите, есть цель all. Цитата из makefile_template для Winavr Код # Default target. all: begin gccversion sizebefore build sizeafter end
# Change the build target to build a HEX file or a library. build: elf hex eep lss sym #build: lib Мне понятно, что цель build является частью общей цели all. На мой взгляд логично исходя из названия целей. Скажите, пожалуйста, какие причины причины побудили Вас сделать иначе?
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Sep 11 2012, 02:26
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(mdmitry @ Sep 10 2012, 20:40)  Цитата из makefile_template для Winavr ... Мне понятно, что цель build является частью общей цели all. На мой взгляд логично исходя из названия целей. Скажите, пожалуйста, какие причины причины побудили Вас сделать иначе? "иначе" -- это цель, которую можно было бы назвать rebuild («Потому что цель такая - полная пересборка.») назвать все-таки build ? Ну, например, потому, что человек считает простой вызов make -- так, по дороге отладочным. А вот когда нужно сделать build программы (пишут же «XXX version YYY build ZZZ» а не «rebuild ZZZ»), то тогда и вызывается make build. Впрочем, я сам больше склоняюсь к имени rebuild :-) Кстати, по поводу make clean all и -j. Code::Blocks по кнопке «пересобрать» сам последовательно запускает make clean и make, поэтому ничего и не вылазит :-) Цитата(Дмитриос @ Sep 11 2012, 01:37)  Мне кажется существенным выгрышем по сборке было бы использование чего нить такого, что не заставляет пересобирать ВЕСЬ проект. А никто тут и не пересобирает ВЕСЬ проект при каждом изменении одной буквы в листовом файле проекта. Это так, в нескольких сообщениях обсуждается название цели, которая используется для (выделенной в отдельную цель, нечастой, осознанно вызываемой) полной пересборки.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
Сообщений в этой теме
demiurg_spb Make Aug 21 2012, 17:25 klen Разделяем Вашу радость
если задать число более че... Aug 21 2012, 19:15 demiurg_spb Спасибо за наводку!
Проверил, у меня видимо не... Aug 21 2012, 19:39  ReAl Цитата(demiurg_spb @ Aug 21 2012, 22:39) ... Aug 22 2012, 12:25   AHTOXA Цитата(ReAl @ Aug 22 2012, 18:25) Если на... Aug 22 2012, 15:44    demiurg_spb Цитата(ReAl @ Aug 22 2012, 16:25) Из окру... Aug 22 2012, 20:14     AHTOXA Цитата(demiurg_spb @ Aug 23 2012, 02:14) ... Aug 23 2012, 05:11    ReAl Цитата(AHTOXA @ Aug 22 2012, 18:44) У мен... Aug 23 2012, 06:50     AHTOXA Да, наверняка всё так и есть. Но мне это не нравит... Aug 23 2012, 07:53      Petka Цитата(AHTOXA @ Aug 23 2012, 11:53) Да, н... Aug 23 2012, 08:52       AHTOXA Цитата(Petka @ Aug 23 2012, 14:52) Баналь... Aug 23 2012, 10:28        Petka Цитата(AHTOXA @ Aug 23 2012, 14:28) Ой ли... Aug 23 2012, 12:55         AHTOXA Цитата(Petka @ Aug 23 2012, 18:55) Это не... Aug 23 2012, 17:33          ReAl Цитата(AHTOXA @ Aug 23 2012, 20:33) А теп... Aug 23 2012, 19:28          Petka Цитата(AHTOXA @ Aug 23 2012, 21:33) Хорош... Aug 23 2012, 19:39      ReAl Цитата(AHTOXA @ Aug 23 2012, 10:53) Кодal... Aug 23 2012, 14:11    alx2 Цитата(AHTOXA @ Aug 22 2012, 20:44) У мен... Aug 24 2012, 04:38 IgorKossak Попробовал подобным образом сделать ребилд, т. е.
... Aug 22 2012, 06:42 _Pasha Цитата(IgorKossak @ Aug 22 2012, 09:42)
... Aug 22 2012, 07:14 DmitryM eCos по умолчанию собирается -j 4 Aug 22 2012, 19:10 IgorKossak AHTOXA
+1
Любую переделку мейкфайлов считаю мовето... Aug 23 2012, 08:02   Petka Цитата(AHTOXA @ Aug 24 2012, 12:03) Это с... Aug 24 2012, 13:14   alx2 Цитата(AHTOXA @ Aug 24 2012, 13:03) Это с... Aug 27 2012, 05:32    AHTOXA Цитата(alx2 @ Aug 27 2012, 11:32) Вы гово... Aug 27 2012, 06:01    AHTOXA Цитата(ReAl @ Aug 28 2012, 19:34) Тьху, н... Aug 28 2012, 15:32 e-serg Цитата(AHTOXA @ Aug 24 2012, 04:40) Пока ... Aug 28 2012, 03:46  AHTOXA И? Это вы к чему? Aug 28 2012, 04:28   e-serg Цитата(AHTOXA @ Aug 28 2012, 13:28) И? Эт... Aug 28 2012, 05:30    AHTOXA Цитата(e-serg @ Aug 28 2012, 11:30) ... Aug 28 2012, 06:01 MBR Где-то в гентушных факах рекомендовалось устанавли... Sep 4 2012, 07:35 Дмитриос Мне кажется существенным выгрышем по сборке было б... Sep 10 2012, 22:37 AHTOXA Цитата(mdmitry @ Sep 10 2012, 23:40) Код#... Sep 11 2012, 02:46 mdmitry Цитата(AHTOXA @ Sep 11 2012, 06:46) Как м... Sep 11 2012, 07:13 MBR я тоже плюсую за all и clean. Причем, не забываем ... Sep 12 2012, 06:32 AHTOXA all и clean и так есть. Речь про
Кодbuild: cle... Sep 12 2012, 08:46
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|