|
|
  |
Make, ускорение процесса сборки проектов |
|
|
|
Aug 23 2012, 14:11
|

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

|
Цитата(AHTOXA @ Aug 23 2012, 10:53)  Код all: message_begin elf size message_end Получается, что все эти варианты тоже будут глючить от многопоточности. Имхо, надо было и в такой перечень целей вставить «точки следования». size сам зависит от elf, так что там без проблем, message_begin иногда выскакивает после compiling от первого %.o. Это немного неприятно, не не смертельно. Там и предупреждения/ошибки компилятора идут вперемешку с compiling по мере появления, всё равно смотреть потом внимательно надо :-) И править это руки не доходят. А важные вещи, в отличие от декора, вроде как нормально (ну кроме make clean all). По правке — полностью согласен в мнением по volatile :-) Более того, volatile уже давно как был, но с ростом пронырливости компилятора приходится править то, где эти volatile есть, но в других местах (например, так было с чтением системного тика в scmRTOS).
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Aug 23 2012, 19:28
|

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

|
Цитата(AHTOXA @ Aug 23 2012, 20:33)  А теперь представьте, что в следующей версии make введут новый ключик, и вам придётся править все свои мейкфайлы. Имхо, это неправильно. Неправильно будет, если ключик по умолчанию будет включен. А так: не хош -- не пользуй, хош -- подстройся. Всё честно. Цитата(AHTOXA @ Aug 23 2012, 20:33)  случае make ничто не мешало авторам поставить между субцелями пресловутые «точки следования». «Ага, щас»™ В результате для Код %.elf : $(OBJS) между файлкми из $(OBJS) будет по точке следования и -j N идёт лесом. Параллельно их создавать будет нельзя. Спасибо, не надо. Я лучше пешком постою ручками всё поправлю там, где я не рассчитал на -j
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Aug 23 2012, 19:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(AHTOXA @ Aug 23 2012, 21:33)  Хорошо хоть, что с этих мейкфайлов снято обвинение в «безграмотности», теперь они просто «старый код»  А теперь представьте, что в следующей версии make введут новый ключик, и вам придётся править все свои мейкфайлы. Имхо, это неправильно. И сравнение с volatile здесь не совсем уместно - в случае make ничто не мешало авторам поставить между субцелями пресловутые «точки следования». ИМХО вывод сообщений неправильно организовывать как подцели какой-либо цели. По замыслу make, подцели необязательно вообще будут выполняться by design. Про определённый порядок выполнения зависимостей нигде никогда ничего не гарантировалось. Всё что вы просили выполнить в вашем makefile для цели all будет добросовестно выполнено. Вывод на экран сообщений был? Размер выводился? elf собирался? При любом ключе -j ? Проводя аналогии с компиляторами: сейчас уже никого не удивляет, что в ассемблерном листинге оптимизирующего компилятора фактический порядок "промежуточных" арифметических вычислений может отличатся от написанного в исходном тексте программы. Не говоря уже о выкидывании незадействованного кода. Если программист заложился на какие-то побочные свойства инструмента - это только ответственность программиста а не проблема инструмента.
|
|
|
|
|
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, 04:38
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(AHTOXA @ Aug 22 2012, 20:44)  У меня была именно такая цель: Код build: clean all Это не одно и то же. Вы указали две разные цели (clean и all). Каждая из этих целей имеет свой рецепт, и при указании -j эти два рецепта выполняются параллельно. В примере же ReAl один рецепт из двух строк. Эти строки всегда будут выполняться последовательно независимо от наличия или отсутствия -j.
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
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 24 2012, 13:14
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(AHTOXA @ Aug 24 2012, 12:03)  Это совершенно очевидно. Один поток - цели выполняются последовательно. Очевидно? А почему не в обратном порядке? А почему не в алфавитном порядке? А почему не в порядке расположения файлов в файловой системе? Цитата Не взаимоисключающих, а последовательных. Именно взаимоисключающих. Про последовательность см. выше. Так же прошу ссылку на документацию, где оговорен порядок выполнения целей. Цитата .... Короче, вы меня не переубедите. Инструмент этот (make) - кривой. Уж сколько времени я им пользуюсь, а ощущение кривизны не проходит, а только усиливается. Жаль. Тут сделал пару тестов: Код all: first second third
first: sleep 3 echo first
second: sleep 2 echo second
third: sleep 1 echo third
.PHONY: first second third Код $ make Код sleep 3 echo first first sleep 2 echo second second sleep 1 echo third third Код make -j 3 Код sleep 3 sleep 2 sleep 1 echo third third echo second second echo first first Если нам важен порядок немного патчим кривой makefile без создания промежуточных целей: Код all: first second third
first: sleep 3 echo first
second: | first sleep 2 echo second
third: | second sleep 1 echo third
.PHONY: first second third Код make -j 3 Код sleep 3 echo first first sleep 2 echo second second sleep 1 echo third third Вуаля! Может кому-нибудь будет полезно.
|
|
|
|
|
Aug 27 2012, 05:32
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(AHTOXA @ Aug 24 2012, 13:03)  Это совершенно очевидно. Один поток - цели выполняются последовательно. Вы говорите о разном.  Совершенно бесспорно, что без -j выполнение происходит последовательно. Petka же говорил(а) о порядке обработки целей в этой последовательности. То, что рецепты выполняются последовательно, а не параллельно, под сомнение не ставилось... Цитата(AHTOXA @ Aug 24 2012, 13:03)  Не взаимоисключающих, а последовательных. Без -j всё работает как задумано. Если бы при добавлении ключика -j ввели точки следования после каждой из PHONY-целей, то всё бы работало и с -j.  Если после каждой цели (каждого рецепта) ввести точку последовательности, то и сборка будет выполняться строго последовательно. Таким образом, весь эффект опции -j (которая как раз предписывает выполнять рецепты параллельно) будет уничтожен. В таком случае, просто не указывайте -j, и Вы получите желаемое! Возможно, я просто не понял, что Вы имели в виду, говоря о точках последовательности (я понимаю "точка последовательности" как то, что новый рецепт начинает выполняться только после завершения выполнения предыдущего), в таком случае, буду благодарен за разъяснение (еще лучше с примером).
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Aug 27 2012, 06:01
|

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

|
Цитата(alx2 @ Aug 27 2012, 11:32)  Вы говорите о разном.  Совершенно бесспорно, что без -j выполнение происходит последовательно. Petka же говорил(а) о порядке обработки целей в этой последовательности. Ну мы вроде как друг-друга поняли  По факту порядок обработки целей совпадает с порядком их объявления. Хотя я и не встречал в документации явных гарантий этого. Цитата(alx2 @ Aug 27 2012, 11:32)   Если после каждой цели (каждого рецепта) ввести точку последовательности, то и сборка будет выполняться строго последовательно. Таким образом, весь эффект опции -j (которая как раз предписывает выполнять рецепты параллельно) будет уничтожен. Я написал не "каждой цели", а "каждой PHONY-цели". Так что эффект останется. Цитата(alx2 @ Aug 27 2012, 11:32)  В таком случае, просто не указывайте -j, и Вы получите желаемое! Так и делаю, не переписывать же многие десятки makefile-ов. (И, вдохновлённый этим обсуждением, снова почитываю про scons...  )
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 28 2012, 03:46
|
Частый гость
 
Группа: Участник
Сообщений: 97
Регистрация: 24-07-08
Из: Иркутск
Пользователь №: 39 180

|
Цитата(AHTOXA @ Aug 24 2012, 04:40)  Пока не появился ключик -j - вполне себе гарантировалось  Ключик -j очень старый, лет 10 назад он уже был старым. PS. 1989г, make, ключ -j уже имеется.
Сообщение отредактировал e-serg - Aug 28 2012, 04:00
|
|
|
|
|
Aug 28 2012, 05:30
|
Частый гость
 
Группа: Участник
Сообщений: 97
Регистрация: 24-07-08
Из: Иркутск
Пользователь №: 39 180

|
Цитата(AHTOXA @ Aug 28 2012, 13:28)  И? Это вы к чему? к этой фразе Цитата(AHTOXA @ Aug 23 2012, 19:28)  Ой ли? Сдаётся мне, что ключ -j появился далеко не сразу. ... более 20 лет, этот ключик "-j", у gnu make существует, новым его не назвать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|