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

Re: make contest



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

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

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

> Нет, если ты можешь _естественно_ организовать проект по схеме "один
> проект - один файл на выходе", то да, наверное...
Один таргет файл условно. Есть понятие PROG - он один.
К нему можно добавить произвольное количество просто FILES
(mueller7.{dict,index})
или SCRIPTS (dictunformat.sh) и чего душе будет угодно.
PROG - это обычно екзешник или либа.

> Но это, насколько я могу понять, исключает unit tests
Нет, не отменяет.
Мухи отдельно, котлеты отдельно.

> (там по жизни
> несколько бинарников, да еще с шансами собираться и работать на разных
> платформах).
man bmake
/ .OBJDIR
/ MAKEOBJDIR
/ MACHINE
etc.

>  Делать отдельный проект ("вот это - хрень, а вот это -
> тесты на хрень")?
Можно отдельным проектом, можно отдельным таргетом в зависимости от.

>  А если мне надо пересобрать и перепрогнать один из
> тестовых бинарников?
В случае с несколькими полезными таргетами на каждый проект можно видоизменить
мое решение например так.

  TRG?= all
  .PHONY: dict dictd dictfmt dictzip
  dict dictd dictfmt dictzip:
	SUBDIR="libmaa dict_common $@" ${MAKE} ${TRG}

  .include <bsd.subdir.mk>

Запускать так

  bmake dict TRG=all_tests

Можно наоборот в переменную засунуть имя [под]проекта.

> Ну, то есть, допустим, у меня будет не project и project/t, а
> project и project_tests.  Сиблинги.  Ну, допустим, раз они сиблинги,
> даже можно сделать ../Makefile.  И вот мне надо пересобрать один из
> тестовых бинарников после правки исходника в проекте, и прогнать его
> штатным образом.
Поставь проект "project_tests" в зависимость от проекта "проект".
Работать будет точно так же, как екзешник и либа.
Не принципиально.

>  То есть создав ему развесистую среду и передав
> несколько штатных параметров.  Общая длина командной строки -
> символов 200.
Какая разница, окружение передается вообще сорешенно прорачно.

    env TEST_OPTS='options' TEST_ENV='oceans' bmake dict TRG=all_tests

где

dict/Makefile:

   .PHONY: all_tests
   all_tests : dict
        env ${TEST_ENV} dict_test.sh ${TEST_OPTS}

> Сейчас у меня, с гнутым мейком, такой запуск делается отдельной целью в
> мейкфайле тестов.
>  Она умеет пересобрать _свой_ бинарь.
Я уже ответил.

> В принципе, я готов на make all в собственно проекте, хотя тоже без
> лишней необходимости не хотелось бы.  Но на прогон всех тестов я не
> готов, это минут 40.
разбей тесты на кучу подпроектов в зависимости от того, что они тестируют.
Далее каждому тесту - отдельный test_NNN/Makefile
И далее общий project_all_test/Makefile, объединяющий все тесты.

> Это как будет сделано в случае с nbmake?
Я уже ответил. Легко и непринужденно. Внимательно читаем непрочитанное
письмо. Принимаем идеологию "один проект - олдин каталог", это раз.
Пользуемся bsd.subdir.mk и вызываем $(MAKE) с модифицированной
переменной SUBDIR - два. Строим граф зависимостей между проектами,
по которому собственно и формируется SUBDIR - это три.

> И сразу, чтоб два раза не вставать.  А как у этих замечательных скриптов
> с поддержкой кросс-компиляции?
NetBSD целиком и полностью строится на nbmake.
Собирается на всем что движется. Доподлинно собирается на FreeBSD и Linux.
То есть проблем никаких. Если есть где, то явно не в nbmake-е.

> На одной и той же машине с "родной", естественно.  А с
> сосуществованием одновременно нескольких сборок под разные платформы
0 runawk>ls -la /tmp/runawk/
total 0
drwxr-xr-x  2 cheusov syntagma  40 2008-10-02 18:34 .
drwxrwxrwt 23 root    root     740 2008-10-02 18:34 ..
0 runawk>env MAKEOBJDIR=/tmp/runawk bmake
gcc -O2  -Wall -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wno-uninitialized -Wreturn-type -Wcast-qual -Wpointer-arith -Wwrite-strings -Wswitch -Wshadow -Werror   -DAWK_PROG='"/usr/bin/awk"' -DSTDIN_FILENAME='"/dev/stdin"' -DMODULESDIR='"/usr/local/share/runawk"' -DRUNAWK_VERSION='"0.14.2"' -c /home/cheusov/prjs/runawk/runawk.c
gcc   -o runawk runawk.o 
pod2man -s 1 -r 'AWK Wrapper' -n runawk  -c 'RUNAWK manual page' /home/cheusov/prjs/runawk/runawk.pod > runawk.1
nroff -Tascii -mandoc runawk.1 > runawk.cat1
0 runawk>ls -la /tmp/runawk/
total 68
drwxr-xr-x  2 cheusov syntagma   120 2008-10-02 18:35 .
drwxrwxrwt 23 root    root       740 2008-10-02 18:35 ..
-rwxr-xr-x  1 cheusov syntagma 20921 2008-10-02 18:35 runawk
-rw-r--r--  1 cheusov syntagma 15655 2008-10-02 18:35 runawk.1
-rw-r--r--  1 cheusov syntagma 12089 2008-10-02 18:35 runawk.cat1
-rw-r--r--  1 cheusov syntagma 14516 2008-10-02 18:35 runawk.o
0 runawk> 

Makefile на sf.net

> (исходники общие, раздаются по NFS - интересно, естественно,
типичный случай - source dir на read only.
Смотри выше. Условие: в каталоге с исходниками не должно быть мусора,
то есть частично построенного проекта. Он должен
быть ПОЛНОСТЬЮ ЧИСТ - только исходники.

 AC>> тогда нечего задавать вопросы публично. Можешь пребывать в своем
 AC>> неведении и дальше. Мне от этого ни холодно ни жарко.

> Ну, задачу-то я могу и дать.  Ту самую, которую я не могу решить
> средствами make.
man bmake
/ [.]if
/ [.]for

>  Там не только recursive, там еще и автогенерируемые
> зависимости
Зависимости между ПРОЕКТАМИ ставятся руками, их мало.
Между файлами - стандартный подход

  bmake depend

>, и зависимость от параметров сборки (только что обсудили), и
> пересборка после cvs up, и чего-то еще веселенького до кучи...
Уже объяснял не раз - ЗДЕСЬ МИН НЕТ.

-- 
Best regards, Aleksey Cheusov.


Reply to: