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

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: