BSD make

Ivan8209

Вопрос на засыпку.
Есть примерно такая конструкция (из реального кода):

1 ALL = main
2 all: this subdirs
3 this: $(ALL)
4 main: $(OBJS)
5 $(CC) ...
6 subdirs:
7 for i in $(SUBDIRS); do ...

У меня получается, что subdirs всегда начинает собираться раньше
main, в каком бы порядке ни стояли цели в строке 2.
Вопросы.
1. "Кто виноват?" Кто-нибудь знает соображения, почему так?
2. "Что делать?" ...Чтобы main собиралась раньше subdirs?
Желательно --- наименьшим вмешательством.
3. "Быть или не быть?" Может, это вовсе баг?
---
"This user is BSD-compliant."

tokuchu

На сколько я понял - между main и subdirs никаких зависимостей нет, поэтому, теоретически, они могут собираться в любом порядке.

Ivan8209

Пока что найдено такое решение:
вместо "all: this subdirs" написать следующее

all:
$(MAKE) this
$(MAKE) subdirs

Немного кривовато, зато работает.
Но все вопросы остались.
---
...Я работаю антинаучным аферистом...

Ivan8209

Хм. Мысль яcна.
Только как быть? Ведь цели-то нематериальны.
Разве что выписать явную цепочку "all: subdirs", "subdirs: this".
---
...Я работаю антинаучным аферистом...

tokuchu

А зачем их именно в такой последовательности надо запускать?

Ivan8209

Просто в одном из $(SUBDIRS) требуется то, что собирается в this.
Чтобы не путаться, это thttpd-2.25b.
---
...Я работаю антинаучным аферистом...

Ivan8209

Решение упростилось:

-subdirs:
+subdirs: this

---
...Я работаю антинаучным аферистом...

ppplva

Разве что выписать явную цепочку "all: subdirs", "subdirs: this".
Хватит просто "subdirs: this". IMHO, вполне корректный вариант.

tokuchu

Просто в одном из $(SUBDIRS) требуется то, что собирается в this.
Ну тогда, похоже, что надо зависимость добавлять.
Так по идее и нагляднее будет для потомков, которые будут в этом копаться.

sergey_m

Всё правильно. Чётко сформулировал зависимость на русском языке:
Просто в одном из $(SUBDIRS) требуется то, что собирается в this.
Чётко записал её же на языке make:

subdirs: this

Что тут неясного?

pitrik2

надо заскриншотить этот тред, пока не удалили
редко бывает, когда КОНТРА лажает

Ivan8209

Цели нематериальны.
Как хак, это сойдёт. По-хорошему же, надо трясти разработчика,
чтобы он прописал зависимости правильно.
_Материальные_ зависимости.
На самом деле, основной вопрос другой:
что такого поменялось в make от netbsd-3 до netbsd-4,
что перестали собираться некоторые пакеты?
Но с этим вопросом мы уже сами как-нибудь разберёмся.
---
...Я работаю антинаучным аферистом...

kruzer25

что такого поменялось в make от netbsd-3 до netbsd-4
Поменялась неопределённость.
Раньше 0/0 возвращало 1, а сейчас стало возвращать 2.

sergey_m

Контра никогда не признает своей неправоты.

pitrik2

Цели нематериальны.
Как хак, это сойдёт.
покажи где в спецификации make написано что цели должны быть материальны?
с какого перепуга это хак, если это прямое следование спецификации?

pitrik2

Контра никогда не признает своей неправоты.
это еще печальнее
рейтинг то падает

Ivan8209

Мне покласть на рейтинг.
По поводу 0/0 и make.
Есть довольно общие алгоритмы, которые устойчивы к делению на нуль,
если не заниматься искусственным выполнением "unspecified",
вставляя туда случайные числа, результат деления предсказуем.
А ещё можно не писать "unspecified", а заявлять
или подразумевать, что деление работает "см. алгоритм."
То же самое и с make: у него была одна семантика, стала другая,
это в условиях _отсутствия_ формальной спецификации, а не чего-то там.
В итоге то, что раньше собиралось без вопросов, сейчас перестало.
---
...Я работаю...

kruzer25

Какой-то идиот воспользовался недокументированным поведением какой-то функции. В новой версии этой функции, поведение в таких недокументированных случаях, и у идиота всё перестало работать. А ведь он мог бы просто не пользоваться недокументированным поведением, а писать всё по-человечески.
Кто же виноват в такой ситуации? Мне почему-то кажется, что всё-таки тот идиот, а не разработчики функции.

Ivan8209

> Какой-то идиот воспользовался недокументированным
> поведением какой-то функции.
Этот идиот не из NetBSD и, следовательно, неподотчётен.
Если большинство реализаций make работают с его кодом,
значит, он может думать как ему удобно. Тем более, что
у него перед глазами есть прекрасный пример проекта GNU,
который кладёт на все стандарты.
Вот только есть беда: идиот идиотом, а работать с его кодом приходится.
---
...Я работаю антинаучным аферистом...

kruzer25

Этот идиот не из NetBSD и, следовательно, неподотчётен.
Его проблемы.
Если большинство реализаций make работают с его кодом,
значит, он может думать как ему удобно
Его проблемы. Нормальные люди делают так, как сказано в документации, а не так - "пошаманили, вроде работает, почему - хз, но работает, так что пусть так и остаётся".
а работать с его кодом приходится
А кто виноват в кривизне кода? Правильно - идиот.

pitrik2

например, могло измениться вот что: разрабы make решили, что удобнее сначала вызывать таски с меньшим количеством зависимостей, а уже потом с большим
не быстрей, не производительней, а именно удобней
и они вполне могли в чейнджлоге об этом упомянуть
это я просто привожу пример, что поведение деления на ноль вполне может измениться
деление на ноль бывает задокументированным
а вот другой пример: закладывание на то что sizeof(int) = 4
ты закладываешься, переходишь на 64-бит процессор и обламываешься
и кто после этого идиот? ты или кто писал спецификацию?

SCIF32

А кто виноват в кривизне кода? Правильно - идиот.

Начиная с некоторого момента становится важным не кто виноват, а как это исправить.

pitrik2

а как это исправить
тебе же сказали как
что опять не так?
upd: сорри, показалось что это контра отвечал

sergey_m

например, могло измениться вот что: разрабы make решили, что удобнее сначала вызывать таски с меньшим количеством зависимостей, а уже потом с большим
Так оно и было наверное. Как следствие Makefiles с недостаточно точно прописанными зависимостями перестали работать.
Жалобы Контры совершенно неуместны. Это примерно, как если бы он написал бы глючный алгоритм сортировки, который работал бы на 90% входных данных. А потом в один прекрасный день появились бы входные данные, на которых его алгоритм не работает. И данные были бы виноваты в этом.

Ivan8209

> Жалобы
Тебе .
---
...Я работаю...

slonishka

если видишь пост КОНТРА
жди ответ пенартурА

SPARTAK3959

Еще можно перейти на ant - там в случае неопределенности порядка предпочитается порядок следования целей в списке зависимостей.

Ivan8209

Нельзя перейти на ant.
Хочешь перейти на ant? Убеди в этом разработчиков thttpd.
---
"Аллах не ведёт людей неверных."

Ivan8209

> 1. "Кто виноват?" Кто-нибудь знает соображения, почему так?
Виновата параллельность, всё происходит из-за defined(MAKE_JOBS
MAKE_JOBS определена в /etc/mk.conf
Соображения пока неизвестны.
> 2. "Что делать?" ...Чтобы main собиралась раньше subdirs?
> Желательно --- наименьшим вмешательством.
Убрать MAKE_JOBS=... из /etc/mk.conf или завернуть
в ".ifndef BSD_PKG_MK", как, собственно, и советуют официальные
источники: "Parallel package builds are not supported."
---
"This user is BSD-compliant."
Оставить комментарий
Имя или ник:
Комментарий: