Re: make contest
DEO>> и проблема автогена депендсов везде решена?
> Это наиболее тяжкая часть, но по сравнению с make оно гораздо лучше во
> всех. Подробности я не смотрел, и подозреваю, что полностью корректного
> решения нет ни в одном. Но во всяком случае грабли, по которым ходит
> make, там убраны.
Не из упрямства, а справедливости ради, не ГРАБЛИ, а маленькие грабельки ;-)
Эти грабельки совсем не мешают жить, нужно всего лишь уметь готовить make ;-)
Позволю себе представить собственно "классический" вариант решения
проблемы, в очередной раз становясь на защиту классического make-а
и, в особенности, одной его реализации ;-)
Для удобства чтения разделил секции строкой =========================.
===========================================================================
0 dictd_bsd_make>bmake dict
... <построили в общем>
===========================================================================
0 dictd_bsd_make>touch dict/dict.h
===========================================================================
0 dictd_bsd_make>bmake dict TRG='depend all'
SUBDIR="libmaa dict_common dict" /usr/pkg/bin/bmake depend all
depend ===> libmaa
depend ===> dict_common
depend ===> dict
all ===> libmaa
all ===> dict_common
all ===> dict
gcc -O2 -Werror -c dict.c
gcc -L../dict_common -L../libmaa -o dict dict.o -ldict_common -lmaa
===========================================================================
0 dictd_bsd_make>bmake dict TRG='depend all'
SUBDIR="libmaa dict_common dict" /usr/pkg/bin/bmake depend all
depend ===> libmaa
depend ===> dict_common
depend ===> dict
all ===> libmaa
all ===> dict_common
all ===> dict
===========================================================================
0 dictd_bsd_make>cat Makefile
.if !defined(SUBDIR)
SUBDIR+= libmaa
SUBDIR+= dict_common
SUBDIR+= .WAIT
SUBDIR+= dict
SUBDIR+= dictd
SUBDIR+= dictfmt
SUBDIR+= dictzip
.endif
TRG?= all
.PHONY: dict dictd dictfmt dictzip
dict dictd dictfmt dictzip:
SUBDIR="libmaa dict_common $@" $(MAKE) $(TRG)
.include <bsd.subdir.mk>
===========================================================================
0 dictd_bsd_make>cat dict/dict.c
#include "dict.h"
int main ()
{
return 0;
}
===========================================================================
0 dictd_bsd_make>cat dict/Makefile
PROG= dict
.include "../dict_common/Makefile.inc"
.include "../libmaa/Makefile.inc"
.include <bsd.prog.mk>
===========================================================================
ОРстальные файлы каркасного проекта я уже показывал рядом.
Для тех, кто дочитал до этого места. Дальше думаю понятно, что
делать. Пилите ваше IDE, то есть ваш Linux/UNIX до состояния, в
котором она IDE пригодна к использованию. Например man
bash/zsh/ksh/tcsh/mksh на предмет алиасов, функций и программируемых
автодополнений.
Ктоме того, в BSD make по умолчанию до основного make-а всегда
включается (include-ится) mk.conf. В нем можно писать всяческие
приватные goodies, с помощью которых жизнь станет намного легче. У
меня там, к примеру, прописан такой таргет.
.PHONY : list-vars
list-vars :
.for v in ${VARS}
@printf "%s=%s\n" "${v}" "${${v}}"
.endfor
Работает так
0 pdnsd>bmake list-vars VARS='PKGNAME MAINTAINER'
PKGNAME=pdnsd-1.2.7
MAINTAINER=schwarz@NetBSD.org
0 pdnsd>
mk.conf - это собственно продолжение идеи о том, что ОС UNIX - это и
есть ваша IDE. BSD make эту идею продолжает и развивает.
mk.conf - ваши "умолчания" и спец функции по аналогии с .myshrc.
_Сильно_ облегчает жизнь именно на этапе разработки.
Туда можно прописать очень сложные вещи, в том числе настройки для
различных проектов.
Собственно того же самого можно добиться и с GNU make, прописывая _явно_
в каждый Makefile проекта что-нибудь вроде
sinclude /etc/gnu_mk.conf
--
Best regards, Aleksey Cheusov.
Reply to: