[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Чем плох рекурсивный make?



AC> Блин.  Ты хочешь доказать мне, что можно придумать пример, где
AC> рекурсивный вызов make не составляет проблем?  Не вопрос, я и сам могу.

AC> Вопрос в том, что в типичном случае проблемы будут.  А в том, где не
AC> будет, использование make - это из пушек по воробьям.

AC> Или тебе настолько не нравится слово "рекурсивный", что ты не можешь
AC> найти в себе сил выяснить, что оно значит в контексте обсуждаемой фразы
AC> из четырех английских слов?

[*] я вижу что описываемые проблемы растут не из "кривости" или
    "рекурсивности" make а из неправильного применения инструмента.

AC>>> Шелловский скрипт unconditional сборки проекта проще соответствующего
AC>>> мейкфайла.  Потому что надо описать только команды сборки, а на
AC>>> зависимости можно забить.
AC>> если ты на зависимости забьешь то у тебя не соберется

AC> Соберется.  Я две строчки местами поменяю (несколько раз), и соберется.
ну так ты удовлетворишь зависимости этими двумя строчками потому и
соберется

AC>> а и shell'овским скриптом тоже можно смотреть на даты файлов и
AC>> сравнивать их.
AC>> разницы тут ровно столько что в одном языке одно действие сделать проще
AC>> чем в другом

AC> Ты слово unconditional не смог прочесть или найти в словаре?
и что это слово? (*)

AC> Объясняю.  Берем (для примера урезанный, существенное сохранено) вариант
AC> того самого debian/rules, который тебе вроде как нравился.

AC> install: 	configure install-stamp
AC> install-stamp:
AC> make -C .. install DESTDIR=debian/tmp
AC> touch $@

AC> Выполнили один раз.  Результат, допустим, не понравился.

AC> Изменяем проект (допустим, накладываем патч).  Даже, допустим, собираем
AC> результат.  Там же, в проекте.  Запускаем debian/rules install, дабы
AC> заново собрать пакет (на самом деле, естественно, запускаем binary, а
AC> оно позовет install - там это будет в еще два шага, я их не привел).
AC> Вопрос.  Какая версия будет в пакете в результате?
здесь как видно не собирался никто сделать повторную сборку ибо не нужна

понадобится - configure вынесется в отдельную цель и будет результат
всегда правильный

а наложение патчей на собственно make'ы, да потребует сделать clean, но
эту проблему можно будет решить поставив зависимость на сам Makefile.

где проблема-то? в том что решалась одна задача, а захотелось решить
попутно и другую? так давай ее впишем в ТЗ и решим? добавится пара целей
и депендсов и ничего не изменится :)

AC> Для особо невнимательных сразу ответ.  Старая.  В смысле - та, которая
AC> была, а не обновленная.  Оно просто не попытается ничего инсталлировать.

AC> Почему?  Да потому что ему неоткуда знать, что там что-то изменилось.
AC> Оно видит только, что есть файл install-stamp, а раз он есть, делать
AC> ничего не надо.
ну да, это ведь такая работа и задумана.

AC> Можно его изменить так, чтобы он гарантированно каждый раз собирал
AC> свежую версию.
смотри, если мы не делаем configure, а делаем

make
изменили что-то
make
изменили что-то
make

то оно ж в исходной (авторской) системе сборки отлично итеративно
собирает/линкует только изменения.

то есть поменяв зависимость (что типично для языка make) с install-stamp
на собираемые бинарники мы решим и ту задачу что тебе нужна (она была
просто не нужна в рамках этого make)
задачу мы решаем все теми же средствами make и что тут ломается
в идеологии непонятно.

AC> Но - фактически ценой отказа от функциональности make по
AC> анализу "что надо собирать, а что - нет".
а где отказ?

смотри, авторский make собирает N бинарников и M либ

в debian/rules мы вместо того чтобы ставить N+M зависимостей, нарисовали
один install-stamp, но можно на install-stamp просто в зависимости
прописать все бинарники и будет то же самое, только с полноценной
ресборкой (я думаю это появится как только майнтенеру понадобится
поотлаживать что-то в коде, а пока ненужно)

AC> Терминология используется не твоя, а авторов make.  Dixi.
ну хорошо, рекурсивный
избежать легко учетом зависимостей

внешный make - компилятор
то что он собирает является депендсом для того что собирает данный мейк

что не так?

AC> Нет.  Вон выше пример разжеван в деталях.  Ровно такая ситуация, даже
AC> без либы2.
этот пример как раз пример недоделанного (до решения _и_ этой задачи)
make
доделка сводится к вводу нескольких зависимостей

AC> Повторяю.  Специально писать надо makefile1, а не makefile3.  Т.е. в
AC> данном случае правками в debian/rules это не лечится.
именно лечится

установкой (заменой) зависимости install-stamp на бинарники (в
простейшем случае видимо достаточно будет зависеть от одного из
бинарников, в идеальном случае - от всех)

AC> А на практике, естественно, этого никто делать и не пытается (особенно,
AC> если makefile1 сгенерирован, а не руками писан), а делают make -C dir.
и после make -C dir получают собранными те цели что собирает этот make.

в данном случае эти цели заменены на install-stamp

--
... mpd is off

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera@debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Attachment: signature.asc
Description: Digital signature


Reply to: