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

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



Dmitry E. Oboukhov -> debian-russian@lists.debian.org  @ Tue, 30 Sep 2008 20:16:13 +0400:

 AC>>>>> PS: недавно вот sim'овский debian/rules перекроили выкинули
 AC>>>>> рекурсию, получился изящщненький такой rules на полтора экрана
 AC>>>>> размером, а был экранов на 7-8 да еще и с рекурсией продраться
 AC>>>>> сквозь логику можно, но трудно

 AC>>>> install-stamp:
 AC>>>> dh_testdir
 AC>>>> dh_testroot
 AC>>>> make -C build-sim    install DESTDIR=$(TMP_DIR)/sim
 AC>>>> make -C build-sim-qt install DESTDIR=$(TMP_DIR)/sim-qt

 AC>>>> Если это не рекурсия, то кто тогда рекурсия?

 AC>>> рекурсия это
 AC>>> debian/rules пара-переменных цель

 AC>> Это - рекурсивный вызов makefile.  А речь идет про рекурсивный вызов make.
 DEO> гы, берем например /usr/bin там скриптов наверное треть
 DEO> куча из них перевызввает друг друга (например docbook2html пока дойдешь
 DEO> до ELF'а поседеешь :))

 DEO> и что их кто-то называет рекурсивными? нет

Называют.

 DEO> чем отличается вызов make из make от выозва скажем gcc?

 DEO> ничем
 DEO> в случае make собирается цель
 DEO> в случае gcc собирается цель

make, напомню, в отличие от gcc, вызывают не только чтобы собрать цель,
но и чтобы _пере_собрать ее.  С минимальными затратами.  Он именно для
этого придуман, иначе он был бы нафиг не нужен, шелловский скрипт,
начинающийся с set -e, того же результата достигает куда проще и с куда
меньшими возможностями ошибок.

Он, конечно, _заодно_ позволяет и собрать цель, но это, прямо скажем, не
основное его назначение, а именно что побочный эффект.  Так вот,
рекурсивный вызов make ломает его основную функциональность.  Побочную,
правда, сохраняет.

Кстати, грабель подобного типа в дебиановских пакетах мне попадалось.
Я, правда, заранее знаю, что они там есть...  Но, в частности, мне
попадался пакет, который не собирался с первой попытки, а собирался
только со второй...  Причем стараниями мейнтейнера, а не автора
апстрима...

 DEO> в первом случае можно опциями влиять на получаемый результат
 DEO> во втором случае можно опциями влиять на получаемый результат

 DEO> как хотите но я категорически против называния вызова стороннего
 DEO> Make рекурсивным.

Хорошо, специально для тебя.  Running make from make considered
harmful.  В info make именно это называется recursive, но чего не
сделаешь для хорошего человека...

 AC>>> вызов внешних make - это не рекурсия, это тоже самое что и вызов
 AC>>> внешнего компилятора.

 AC>> Нет.  Домашнее упражнение: найти принципиальную разницу.  Хинт:
 AC>> внимательно осознать цели и задачи make.
 DEO> нет принципиальной разницы

 DEO> вызов make с другим makefile в данном случае - лишь один из видов
 DEO> компиляторов:
 DEO>  цель собирает
 DEO>  код ошибки возвращает

Я недаром указал, что приведенное место - пример того, почему harmful.
Ты потрудись подумать, что там harmful.  Для человека, как бы типа
ответственного за корректную сборку пакетов, это очень нелишнее
знание...

-- 
Artem Chuprina
RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru

Юзер упорствует в хождении по граблям. Образовавшиеся шишки он считает
трудовыми мозолями. (С)энта


Reply to: