реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Make, ускорение процесса сборки проектов
Petka
сообщение Aug 23 2012, 12:55
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(AHTOXA @ Aug 23 2012, 14:28) *
Ой ли? Сдаётся мне, что ключ -j появился далеко не сразу. И к этому времени было уже очень много таких вот "безграмотных" мейкфайлов.

Это не причина НЕ исправлять такие makefile.
Раньше и в компиляторах не было volatile. Но это не причина НЕ исправлять старый код.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 23 2012, 14:11
Сообщение #17


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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).


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 23 2012, 17:33
Сообщение #18


фанат дивана
******

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



Цитата(Petka @ Aug 23 2012, 18:55) *
Это не причина НЕ исправлять такие makefile.
Раньше и в компиляторах не было volatile. Но это не причина НЕ исправлять старый код.

Хорошо хоть, что с этих мейкфайлов снято обвинение в «безграмотности», теперь они просто «старый код» sm.gif
А теперь представьте, что в следующей версии make введут новый ключик, и вам придётся править все свои мейкфайлы. Имхо, это неправильно. И сравнение с volatile здесь не совсем уместно - в случае make ничто не мешало авторам поставить между субцелями пресловутые «точки следования».


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 23 2012, 19:28
Сообщение #19


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Petka
сообщение Aug 23 2012, 19:39
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(AHTOXA @ Aug 23 2012, 21:33) *
Хорошо хоть, что с этих мейкфайлов снято обвинение в «безграмотности», теперь они просто «старый код» sm.gif
А теперь представьте, что в следующей версии make введут новый ключик, и вам придётся править все свои мейкфайлы. Имхо, это неправильно. И сравнение с volatile здесь не совсем уместно - в случае make ничто не мешало авторам поставить между субцелями пресловутые «точки следования».

ИМХО вывод сообщений неправильно организовывать как подцели какой-либо цели.
По замыслу make, подцели необязательно вообще будут выполняться by design.
Про определённый порядок выполнения зависимостей нигде никогда ничего не гарантировалось.
Всё что вы просили выполнить в вашем makefile для цели all будет добросовестно выполнено. Вывод на экран сообщений был? Размер выводился? elf собирался? При любом ключе -j ?
Проводя аналогии с компиляторами: сейчас уже никого не удивляет, что в ассемблерном листинге оптимизирующего компилятора фактический порядок "промежуточных" арифметических вычислений может отличатся от написанного в исходном тексте программы. Не говоря уже о выкидывании незадействованного кода. Если программист заложился на какие-то побочные свойства инструмента - это только ответственность программиста а не проблема инструмента.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 23 2012, 20:40
Сообщение #21


фанат дивана
******

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



Цитата(Petka @ Aug 24 2012, 01:39) *
Про определённый порядок выполнения зависимостей нигде никогда ничего не гарантировалось.

Пока не появился ключик -j - вполне себе гарантировалосьsm.gif
Цитата(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 цели. Между ними (после них) вполне можно было поставить точки следования.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Aug 24 2012, 04:38
Сообщение #22


Местный
***

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



Цитата(AHTOXA @ Aug 22 2012, 20:44) *
У меня была именно такая цель:
Код
build: clean all

Это не одно и то же.
Вы указали две разные цели (clean и all). Каждая из этих целей имеет свой рецепт, и при указании -j эти два рецепта выполняются параллельно.
В примере же ReAl один рецепт из двух строк. Эти строки всегда будут выполняться последовательно независимо от наличия или отсутствия -j.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Petka
сообщение Aug 24 2012, 07:05
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(AHTOXA @ Aug 24 2012, 00:40) *
Пока не появился ключик -j - вполне себе гарантировалосьsm.gif

После этого утверждения была бы уместна ссылка на документацию какой-то определённой версии make. С подтверждением этого смелого утверждения.
Цитата
Нет. В моём примере (build: clean all) - как раз-таки ничего не собиралось. Ибо сначала выполнялась цель all, а потом - clean. В результате после выполнения make build - никакого elf-а не было.
...

В этом примере для цели build необходимо удовлетворение двух взаимоисключающих подцелей. Вы так построили сценарий для make. При чём тут инструмент?
Мне вся эта ситуация напоминает появление процессоров с "Hyper-threading". Тогда программисты не были готовы к настоящему параллельному выполнению потоков и отсутствие всяких "spin_lock" приводило к непредсказуемым результатам.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 24 2012, 08:03
Сообщение #24


фанат дивана
******

Группа: Свой
Сообщений: 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) - кривой. Уж сколько времени я им пользуюсь, а ощущение кривизны не проходит, а только усиливается.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Petka
сообщение Aug 24 2012, 13:14
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 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


Вуаля!
Может кому-нибудь будет полезно.
Go to the top of the page
 
+Quote Post
alx2
сообщение Aug 27 2012, 05:32
Сообщение #26


Местный
***

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



Цитата(AHTOXA @ Aug 24 2012, 13:03) *
Это совершенно очевидно. Один поток - цели выполняются последовательно.
Вы говорите о разном. sm.gif
Совершенно бесспорно, что без -j выполнение происходит последовательно. Petka же говорил(а) о порядке обработки целей в этой последовательности. То, что рецепты выполняются последовательно, а не параллельно, под сомнение не ставилось...

Цитата(AHTOXA @ Aug 24 2012, 13:03) *
Не взаимоисключающих, а последовательных. Без -j всё работает как задумано. Если бы при добавлении ключика -j ввели точки следования после каждой из PHONY-целей, то всё бы работало и с -j.

sm.gif Если после каждой цели (каждого рецепта) ввести точку последовательности, то и сборка будет выполняться строго последовательно. Таким образом, весь эффект опции -j (которая как раз предписывает выполнять рецепты параллельно) будет уничтожен. В таком случае, просто не указывайте -j, и Вы получите желаемое!

Возможно, я просто не понял, что Вы имели в виду, говоря о точках последовательности (я понимаю "точка последовательности" как то, что новый рецепт начинает выполняться только после завершения выполнения предыдущего), в таком случае, буду благодарен за разъяснение (еще лучше с примером).


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 27 2012, 06:01
Сообщение #27


фанат дивана
******

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



Цитата(alx2 @ Aug 27 2012, 11:32) *
Вы говорите о разном. sm.gif
Совершенно бесспорно, что без -j выполнение происходит последовательно. Petka же говорил(а) о порядке обработки целей в этой последовательности.

Ну мы вроде как друг-друга понялиsm.gif По факту порядок обработки целей совпадает с порядком их объявления. Хотя я и не встречал в документации явных гарантий этого.
Цитата(alx2 @ Aug 27 2012, 11:32) *
sm.gif Если после каждой цели (каждого рецепта) ввести точку последовательности, то и сборка будет выполняться строго последовательно. Таким образом, весь эффект опции -j (которая как раз предписывает выполнять рецепты параллельно) будет уничтожен.
Я написал не "каждой цели", а "каждой PHONY-цели". Так что эффект останется.
Цитата(alx2 @ Aug 27 2012, 11:32) *
В таком случае, просто не указывайте -j, и Вы получите желаемое!

Так и делаю, не переписывать же многие десятки makefile-ов.
(И, вдохновлённый этим обсуждением, снова почитываю про scons... sm.gif )


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
e-serg
сообщение Aug 28 2012, 03:46
Сообщение #28


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 24-07-08
Из: Иркутск
Пользователь №: 39 180



Цитата(AHTOXA @ Aug 24 2012, 04:40) *
Пока не появился ключик -j - вполне себе гарантировалосьsm.gif

Ключик -j очень старый, лет 10 назад он уже был старым.

PS. 1989г, make, ключ -j уже имеется.

Сообщение отредактировал e-serg - Aug 28 2012, 04:00
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 28 2012, 04:28
Сообщение #29


фанат дивана
******

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



И? Это вы к чему?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
e-serg
сообщение Aug 28 2012, 05:30
Сообщение #30


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 24-07-08
Из: Иркутск
Пользователь №: 39 180



Цитата(AHTOXA @ Aug 28 2012, 13:28) *
И? Это вы к чему?

к этой фразе
Цитата(AHTOXA @ Aug 23 2012, 19:28) *
Ой ли? Сдаётся мне, что ключ -j появился далеко не сразу. ...

более 20 лет, этот ключик "-j", у gnu make существует, новым его не назвать.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01532 секунд с 7
ELECTRONIX ©2004-2016