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

Re: make contest



 AC>> Задача стояла построить _зависящую_ цель (пакет) при измениях в
 AC>> исходных файлах _зависимых_ целей (конкретные программы). Эта
 AC>> задача решена.

> Задача подразумевала некоторую вполне конкретную раскладку по
> директориям.  А не как понравится тебе.

Извини подвинься. Вот уж каталоги я будут делать так, как удобно мне :)
В идеологии mk scripts: один проект (екзешник или библиотека) -
один каталог. Можно сделать как угодно, но оно того не стоит.
И это ОЧЕНЬ удобно.

> Но я не вижу, как твое решение масштабируется на реальную жизнь,
> когда надо будет в A получить актуальным не все, а только конкретный
> бинарник, когда в B изменился один исходник.
Про каталоги - смотри выше. А масштабируется все прекрасно -
дописыванием зависимостей между _проектами_, то есть фактически нужно
задать граф зависимостей, повторюсь, между проектами.

Реальный небольшой пример, в котором
1) dictd/dict/dictfmt/dictzip независимы
2) libmaa и dict_common независимы
1) dictd/dict/dictfmt/dictzip линкуются с libmaa и dict_common

./Makefile:
  .PHONY: dict dictd dictfmt dictzip
  dict dictd dictfmt dictzip:
	SUBDIR="libmaa dict_common .WAIT $@" $(MAKE) all

  .include <bsd.subdir.mk>

Для ОЧЕНЬ больших вот таких вот графов естественно пишется отдельный
подмодуль, который будет этот граф строить автоматом.  Более строго:
по графу, заданному списком ребер (проект A зависит от проекта B),
нужно найти для заданной вершины (проекта) все проекты, от которых он
зависит (сущестсвует путь от ... до заданной вершины), затем дернуть
$(MAKE) all с нужным SUBDIR.

Как это работает.

    0 dictd_bsd_make>bmake dictd
    SUBDIR="libmaa dict_common dictd" /usr/pkg/bin/bmake all
    all ===> libmaa
    all ===> dict_common
    all ===> dictd

    0 dictd_bsd_make>touch libmaa/1.c 

    0 dictd_bsd_make>bmake dictfmt
    SUBDIR="libmaa dict_common dictfmt" /usr/pkg/bin/bmake all
    all ===> libmaa
    gcc -O2  -Werror   -c 1.c
    gcc -O2  -Werror   -c -pg 1.c -o 1.po
    gcc -O2  -Werror   -c -fPIC -DPIC 1.c -o 1.so
    building standard maa library
    ar cq libmaa.a 1.o 2.o 3.o
    ranlib libmaa.a
    building profiled maa library
    ar cq libmaa_p.a 1.po 2.po 3.po
    ranlib libmaa_p.a
    building shared object maa library
    ar cq libmaa_pic.a 1.so 2.so 3.so
    ranlib libmaa_pic.a
    building shared maa library (version 2.0.3)
    ld -shared -soname libmaa.so.2 -o libmaa.so.2.0.3    --whole-archive libmaa_pic.a --no-whole-archive   
    ln -sf libmaa.so.2.0.3 libmaa.so.2.tmp
    mv -f libmaa.so.2.tmp libmaa.so.2
    ln -sf libmaa.so.2.0.3 libmaa.so.tmp
    mv -f libmaa.so.tmp libmaa.so
    all ===> dict_common
    all ===> dictfmt
    gcc  -L../dict_common -L../libmaa  -o dictfmt dictfmt.o -ldict_common -lmaa

    0 dictd_bsd_make>bmake dictfmt
    SUBDIR="libmaa dict_common dictfmt" /usr/pkg/bin/bmake all
    all ===> libmaa
    all ===> dict_common
    all ===> dictfmt

    0 dictd_bsd_make>touch dict_common/3.c

    0 dictd_bsd_make>bmake dict   
    SUBDIR="libmaa dict_common dict" /usr/pkg/bin/bmake all
    all ===> libmaa
    all ===> dict_common
    gcc -O2  -Werror   -c 3.c
    gcc -O2  -Werror   -c -pg 3.c -o 3.po
    building standard dict_common library
    ar cq libdict_common.a 1.o 2.o 3.o
    ranlib libdict_common.a
    building profiled dict_common library
    ar cq libdict_common_p.a 1.po 2.po 3.po
    ranlib libdict_common_p.a
    all ===> dict
    gcc  -L../dict_common -L../libmaa  -o dict dict.o -ldict_common -lmaa

    0 dictd_bsd_make>

> То есть, задачу ты не решил ни формально, ни фактически.  По разным
> причинам, но не решил.
Если ты АБСОЛЮТНО уверен в том, что ты Д'Артаньян, а остальные все
пианисты, и в том, что make твою задачу решить не в состоянии, тогда
нечего задавать вопросы публично. Можешь пребывать в своем неведении
и дальше. Мне от этого ни холодно ни жарко.

Третий раз я повторять не стану.

P.S.
Для демонстрации собственно лаконичности и простоты.

libmaa/Makefile (и это собственно все, что нужно для .so):

  LIB=            maa
  SRCS=           1.c 2.c 3.c # etc.

  SHLIB_MAJOR=    2
  SHLIB_MINOR=    0
  SHLIB_TEENY=    3

  .include <bsd.lib.mk>

dict_common/Makefile (статическая либа):
  LIB=            dict_common
  SRCS=           1.c 2.c 3.c # etc.

  MKPIC=          no # we build static library

  .include <bsd.lib.mk>

dict/Makefile (требует libmaa и статическую dict_common):
   PROG=           dict

   .include "../dict_common/Makefile.inc"
   .include "../libmaa/Makefile.inc"
   .include <bsd.prog.mk>

dict_common/Makefile.inc:
   LDFLAGS+=       -L../dict_common
   LDADD+=         -ldict_common
   DPADD+=         ../dict_common/libdict_common.a

-- 
Best regards, Aleksey Cheusov.


Reply to: