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: