make contest
В первую очередь это письмо обращено к Диме Обухову, который утверждает,
что "все легко, вот тут добавим еще пару зависимостей, и эта задача тоже
решится". С удовольствием увижу присоединившимся к контесту Алексея
Чеусова, с BSD make (видимо, pmake, чтобы было топичнее - но если что, я
и netbsd найду). Остальные желающие себя попробовать - тоже welcome.
Более того, в дальнейшем сильно не welcome рассуждения "вы не умеете
пользоваться make" от тех, кто не продемонстрировал своего умения в этой
задаче. Она сравнительно проста.
Итак.
Дерево проекта:
dirA
Makefile
dirB
Makefile
b.c
c.c
Makefile в dirA собирает пакет. Допустим, для простоты a.tar.gz. Он
туда кладет dirB/b и dirB/c, которые собирает путем компиляции из b.c и
c.c соответственно dirB/Makefile. То есть, внимание, результатом работы
dirB/Makefile (тем самым бинарником, о котором ты говоришь выше)
являются только dirB/b и dirB/c. dirB/b.c НЕ является результатом его
работы. И нафиг не нужен при пакетировании.
Все очень просто.
Собственно задача: написать мейкфайлы так, чтобы каждый выполнял свою
работу (dirB/Makefile создавал dirB/b и dirB/c, dirA/Makefile -
a.tar.gz). Чтобы при этом при изменении b.c и запуске make all
(внимание на имя цели!) в dirA пересобирался dirB/b и a.tar.gz. А
dirB/c не пересобирался (поскольку c.c не менялся). Чтобы при этом
сборка работала, разумеется, путем запуска make all в dirA "с чистого
листа", т.е. при отсутствии в dirB бинарников. И чтобы при запуске make
all (внимание, то же самое имя цели!) в dirB собирались b и с. Тоже
соответственно зависимостям (ну, само по себе это просто).
Дополнительные файлы в проект добавлять можно (я, ага, хочу, чтобы
задача все же имела решение).
Почему имя цели одинаковое? А мы моделируем debian/rules, в нем имена
целей, используемых системой сборки пакетов (следовательно, не
подлежащие замене) с легкостью совпадают с именами целей из orig.tar.gz
(тоже, соответственно, замене не подлежащими). А дополнительный цимес
задаче оно доставляет...
make, поскольку мы в d-r, по умолчанию гнутый.
Большие знатоки заменителей могут показать решение той же задачи на
заменителях. Было бы интересно посмотреть.
Решение считается имеющимся, если я в нем ошибок не нашел (т.е. не сумел
предъявить последовательность команд, которая демонстрирует, что задача
не решена). А НЕ если в своем решении не сумел найти ошибок его автор.
Я просто об эту задачу (естественно, в куда более расширенном варианте,
там несколько директорий не по прихоти, а по делу) уже обнаслаждался по
самое не могу. Если кто-то считает, что я плохо умею пользоваться make,
а на самом деле там все легко - подтвердите свое заявление фактами,
пожалуйста.
Для невнимательных: задача решение имеет. В такой вот простенькой
конфигурации - даже не слишком сложное, по крайней мере на гнутом мейке.
Но крайне хреново масштабируется.
Других тараканов make (их тоже есть) я в нее включать не стал.
Тем, кто справится с этой задачей, и будет еще пассионарен, могу
предложить ту, об которую я таки обломал зубы (отслеживание актуальных
зависимостей от инклудов, в полной постановке).
--
Artem Chuprina
RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru
kernel bug (англ.) - ядрёна вошь
Reply to: