Я разве сказал, что плохой? Я сказал, что смеялся сквозь слёзы.
Над всей этой навороченной ad-hoc кучей невнятного, неинтуитивного синтаксиса, эзотерических комбинаций служебных символов, ни с чем не совместимых собственных расширений, постоянной путаницы с переменными среды, и прочих прелестей.
Толя, прости, но ты не прав. Уродство Makefile начинается там, где совершенно непонимающий принцип работы make человек изобретает велосипед.
Еще одна деталь: Makefile != Project file. Цель Makefile - указывать на последовательную взаимосвязь модулей. Вторичная цель - собирадь модули в кучу, пользуясь уже определенной взаимосвязью. Все остальные применения - изобретения "умельцев". Что ж поделаешь если GNU make очень уж "открыт" для разного рода издевательств?
И последнее. Насчет автотулзов. Они примитивны, как пять копеек. Просто надо прочесть документацию (хотя бы по диагонали). В большинстве случаев я начнинаю проект именно с автотулзов. В этом вся соль - начинать надо по человечески, иначе потом очень долго придется мучатся. В принципе там нужно ДВА файла создать и внести в них определения. Далее все происходит автоматически. А если хочется (ну очень) что-то свое добавить (что редко требуется) - вперед в m4.
Кстати - о последнем. С тех пор, как я преодолел "образовательный барьер" во всем что касается m4 (в частности благодоря автотулзам) я вообще не понимаю, зачем люди пишут СВОИ моторы обработки шаблонов... И себя не понимаю, когда вижу какую-то муть, написаную 3-4 года назад:))))
Хмм... Да... Проще. А потом кому-нибудь придется этот спец-сборщик насиловать... Точнее себя им насиловать. Вплоть до перевода всего на стандартный MAKE. (Мне приходилось это делать дважды)
На самом деле СБОРЩИКОМ является именно autotools. А make это всего-лишь центральный инструмент (на равне с gcc, ld и так далее). Любой написаный "от-руки" или с помощью своих скриптов makefile - это уже "свой" сборщик.
Плюс аутотулз в том, что это действительно сборщик "на все случаи жизни". При этом он не так сложен, как его малюют. Минус аутотулз - дурная репутация и совершенно непонятная для большинства людей концепция.
> Хмм... Да... Проще. А потом кому-нибудь придется этот спец-сборщик насиловать... Точнее себя им насиловать. Вплоть до перевода всего на стандартный MAKE. (Мне приходилось это делать дважды)
по моему опыту, в любом проекте серьёзной величины написание/поддержка makefile'ов и окружающих скриптов/среды/etc является нормальной такой задачей где-то на одну восьмую (как минимум одну шестнадцатую) разработчика. посему есть смысл потратить силы и время на дизайн и прочая. ситуация, в которой каждый участник проекта должен лезть в эту муть при каждой надобности — при всей своей повсеместности, нездоровая. но, разумеется, если ожидать что каждый должен мочь — тогда чем "стандартнее" инструментарий, тем лучше.
Угум... В таком ключе я как-то раз работал... Сначала меня крыл матюками "изобретатель" makefile. Потом, когда я наконец-то прочел его изобретение и обнаружил, что у него makefile выполняет функции batch-script обложил матюгами уже я его.
А потом мне пришлось тихо всё затачивать под скромный, простой и ДОКУМЕНТИРОВАНЫЙ механизм автоматического генерирования Makefile. Правда в этом случае не было надобности в portability. Иначе бы зарыблся бы в автотулзы.
Кхе-кхе. Где он рулит-то? Я его ТРИ раза пытался пробовать... Мудохался пол дня, переписывал, переделывал всё... А потом он у меня на сотом файле где-то загнулся. Очень был разочарован. Тормозит страшно... Многотредовость не поддерживает. Соображает плохо. И главное примитивных сборок с ним так быстро, как с make не сделаешь...
Ну-ну.... И откуда make возьмет этот program.o? Из пальца, опять-таки высосет? (hint: не всякий make знает, что .o это значит "строй object file из файла .c")
Это всё зависит от того, как машина сконфигурирована. На современном линуксе это может и проканать (тоже, кстати, не всегда). А где-то такое написание не катит.
Всё-таки если и писать Makefile в ручную, то по правилам. С определением компилятором, путей, взаимосвязей исходников. Особенно если хочется поиграться с precompiled-headers (я правда с ними еще не игрался на GCC, но говорят неплохо работают)...
Конечно. Но вероятность того, что такое написание прокатит -- больше, чем вероятность того, что компилятор C называется gcc. Он ведь опять-таки все больше на современном линуксе. Несколько логичнее было бы писать просто cc, наверное (хоть и ненамного). Вообще, странно надеяться на переносимость рукотворных Makefiles.
О! Так об этом и речь. Makefile не переносим в "чистом виде". Зато если что-то такое, быстренькое - очень даже удобно. Для переноски же есть всё тот же Autoconfig. Почему при этом надо плакать (или смеяться) я не знаю...
(gcc действительно отнюдь не везде стоит - ваша правда - надо всё-таки писать:
CC=gcc CFLAGS=-I/usr/include -L/usr/lib
program: program.c $(CC) -o program program.c $(CFLAGS)
но вед' хрен там, публика предпочитает мыслит' в духе "а где у нас тут gcc". отсутствие вкуса к нормал'ному декларативному синтаксису влечет за собой замусоренност' мышления. во многих отношениях бол'шинство современных айтишников по сию пору работает (мозгами) на ассемблере, и считает что так и нужно.
Проблема, однако, тут в том, что как только захочешь оторваться от земли и воспарить в высоты декларативного синтаксиса, так оказывается, что на каком-нибудь HP-UX make таки не знает, "где тут у нас gcc" и как правильно говорить -lfoo. Или знает, но в версии CVS, которая по случайности уже полгода как не поддерживает вашу версию OS, потому что слишком старая и у разработчиков её нету. И возникает интересный выбор - то ли изучать сорсы всех этих штук и править вручную, то ли опускаться в дебри ассемблера и писать все правила заново - но зато чтобы работали раз и навсегда.
Я по сходным причинам отказался от использования в наших проектах autotools, которые якобы сильно помогают строить shared libraries. Они-то помогают, на линуксе и т.п., где и так с этим проблем нету. А вот как на что поэкзотичнее перейти - кино и немцы начинается. Легче вручную написать все нужные команды, чем разбираться, почему libtool уверен, что на этой системе динамические библиотеки обязаны строиться анальным способом с выподвыперевертом.
> Проблема, однако, тут в том, что как только захочешь оторваться от земли и воспарить в высоты декларативного синтаксиса, так оказывается
дык я, собственно, к чему? ежели abstraction boundary пролегает по маршруту к gcc и названию флага для делания shared library, то натурал'но оказывается. еще и не такое может оказат'ся. потому как строит' абстракцию на уровне плоской текстуал'ной "макро"-модстановки отдел'ных слов в makefile — как и было сказано выше, практика хот' и повсеместная, но нездоровая.
это с одной стороны. с другой стороны, натурал'но, подобный подход к многоплатформенности позволяет испол'зоват' всякие эвристические по сути своей инструменты типа autoconf'а. потому как если надо знат' не как тут gcc зовут, а как тут shared library строит', то на autoconf'е в сочетании с make'ом сил'но далеко уехат' не получится. :)
(а еще очен' хотелос' бы добыт' фонетическую раскладку кириллицы для Windows, которая не совала бы мягкий знак, твердый знак и букву "йо" в места, недоступные для лаптоповой клавиатуры. так что простите за неровный почерк. :))
всей этой навороченной ad-hoc кучей невнятного, неинтуитивного синтаксиса, эзотерических комбинаций служебных символов, ни с чем не совместимых собственных расширений
no subject
Date: 2005-04-21 11:33 am (UTC)Над всей этой навороченной ad-hoc кучей невнятного, неинтуитивного синтаксиса, эзотерических комбинаций служебных символов, ни с чем не совместимых собственных расширений, постоянной путаницы с переменными среды, и прочих прелестей.
no subject
Date: 2005-04-21 11:49 am (UTC)Еще одна деталь: Makefile != Project file. Цель Makefile - указывать на последовательную взаимосвязь модулей. Вторичная цель - собирадь модули в кучу, пользуясь уже определенной взаимосвязью. Все остальные применения - изобретения "умельцев". Что ж поделаешь если GNU make очень уж "открыт" для разного рода издевательств?
И последнее. Насчет автотулзов. Они примитивны, как пять копеек. Просто надо прочесть документацию (хотя бы по диагонали). В большинстве случаев я начнинаю проект именно с автотулзов. В этом вся соль - начинать надо по человечески, иначе потом очень долго придется мучатся. В принципе там нужно ДВА файла создать и внести в них определения. Далее все происходит автоматически. А если хочется (ну очень) что-то свое добавить (что редко требуется) - вперед в m4.
Кстати - о последнем. С тех пор, как я преодолел "образовательный барьер" во всем что касается m4 (в частности благодоря автотулзам) я вообще не понимаю, зачем люди пишут СВОИ моторы обработки шаблонов... И себя не понимаю, когда вижу какую-то муть, написаную 3-4 года назад:))))
no subject
Date: 2005-04-21 11:50 am (UTC)Кстати, а какие альтернативы?
no subject
Date: 2005-04-21 11:55 am (UTC)no subject
Date: 2005-04-21 12:11 pm (UTC)no subject
Date: 2005-04-21 12:19 pm (UTC)На самом деле СБОРЩИКОМ является именно autotools. А make это всего-лишь центральный инструмент (на равне с gcc, ld и так далее). Любой написаный "от-руки" или с помощью своих скриптов makefile - это уже "свой" сборщик.
Плюс аутотулз в том, что это действительно сборщик "на все случаи жизни". При этом он не так сложен, как его малюют. Минус аутотулз - дурная репутация и совершенно непонятная для большинства людей концепция.
no subject
Date: 2005-04-21 12:42 pm (UTC)по моему опыту, в любом проекте серьёзной величины написание/поддержка makefile'ов и окружающих скриптов/среды/etc является нормальной такой задачей где-то на одну восьмую (как минимум одну шестнадцатую) разработчика. посему есть смысл потратить силы и время на дизайн и прочая. ситуация, в которой каждый участник проекта должен лезть в эту муть при каждой надобности — при всей своей повсеместности, нездоровая. но, разумеется, если ожидать что каждый должен мочь — тогда чем "стандартнее" инструментарий, тем лучше.
no subject
Date: 2005-04-21 12:47 pm (UTC)А потом мне пришлось тихо всё затачивать под скромный, простой и ДОКУМЕНТИРОВАНЫЙ механизм автоматического генерирования Makefile. Правда в этом случае не было надобности в portability. Иначе бы зарыблся бы в автотулзы.
no subject
Date: 2005-04-22 01:31 pm (UTC)no subject
Date: 2005-04-22 02:13 pm (UTC)Только чувство должно быть искренним...
no subject
Date: 2005-04-22 02:22 pm (UTC)no subject
Date: 2005-04-21 11:55 am (UTC)no subject
Date: 2005-04-21 12:04 pm (UTC)no subject
Date: 2005-04-21 12:41 pm (UTC)no subject
Date: 2005-04-21 12:44 pm (UTC)gcc -o program program.c -I/usr/include -L/usr/lib
Что может быть, пардон, проще? Другой синтаксис? Так какая разница какой он - синтаксис?
no subject
Date: 2005-04-23 12:27 pm (UTC)no subject
Date: 2005-04-23 04:57 pm (UTC)no subject
Date: 2005-04-23 05:00 pm (UTC)no subject
Date: 2005-04-23 05:14 pm (UTC)Всё-таки если и писать Makefile в ручную, то по правилам. С определением компилятором, путей, взаимосвязей исходников. Особенно если хочется поиграться с precompiled-headers (я правда с ними еще не игрался на GCC, но говорят неплохо работают)...
no subject
Date: 2005-04-23 06:12 pm (UTC)Как-то так.
no subject
Date: 2005-04-23 06:16 pm (UTC)(gcc действительно отнюдь не везде стоит - ваша правда - надо всё-таки писать:
CC=gcc
CFLAGS=-I/usr/include -L/usr/lib
program: program.c
$(CC) -o program program.c $(CFLAGS)
)
no subject
Date: 2005-04-23 10:25 pm (UTC)что в переводе в голый make с соответствующей конфигурацией выглядело бы как-то так:
но вед' хрен там, публика предпочитает мыслит' в духе "а где у нас тут gcc". отсутствие вкуса к нормал'ному декларативному синтаксису влечет за собой замусоренност' мышления. во многих отношениях бол'шинство современных айтишников по сию пору работает (мозгами) на ассемблере, и считает что так и нужно.
а где у нас тут gcc
Date: 2005-04-24 11:51 am (UTC)Я по сходным причинам отказался от использования в наших проектах autotools, которые якобы сильно помогают строить shared libraries. Они-то помогают, на линуксе и т.п., где и так с этим проблем нету. А вот как на что поэкзотичнее перейти - кино и немцы начинается. Легче вручную написать все нужные команды, чем разбираться, почему libtool уверен, что на этой системе динамические библиотеки обязаны строиться анальным способом с выподвыперевертом.
Re: а где у нас тут gcc
Date: 2005-04-24 12:27 pm (UTC)дык я, собственно, к чему?
ежели abstraction boundary пролегает по маршруту к gcc и названию флага для делания shared library, то натурал'но оказывается. еще и не такое может оказат'ся.
потому как строит' абстракцию на уровне плоской текстуал'ной "макро"-модстановки отдел'ных слов в makefile — как и было сказано выше, практика хот' и повсеместная, но нездоровая.
это с одной стороны. с другой стороны, натурал'но, подобный подход к многоплатформенности позволяет испол'зоват' всякие эвристические по сути своей инструменты типа autoconf'а. потому как если надо знат' не как тут gcc зовут, а как тут shared library строит', то на autoconf'е в сочетании с make'ом сил'но далеко уехат' не получится. :)
(а еще очен' хотелос' бы добыт' фонетическую раскладку кириллицы для Windows, которая не совала бы мягкий знак, твердый знак и букву "йо" в места, недоступные для лаптоповой клавиатуры. так что простите за неровный почерк. :))
за неровный почерк
From:спасибо!
From:(no subject)
From:(no subject)
From:no subject
Date: 2005-04-23 11:16 am (UTC)Это вы про Perl говорили? ;)