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

Re: Чем плох рекурсивный make?



AC>> DEBUG ?= 0  # кстати не помню ?= это GNUmake или вообще make? хез

AC>> ...

AC>> debug_depends:
AC>>     test -e $@ || echo $(DEBUG) > $@
AC>>     test "`cat $@`" = "$(DEBUG)" || echo $(DEBUG) > $@

AC>> и дальше ставим зависимость от debug_depends

AC>> то есть получится что make его перезаписывать будет только при смене
AC>> переменных

AC>> и соответственно в зависимости:

AC>> %.o: %.c debug_depends

AC> Начнем с того, что make его вообще перезаписывать не будет.  Он его
AC> запишет один раз, и все.

а ну да и правда, надо это в shell выносить, либо в цель .PHONY, которая
всегда будет выполняться:

DEBUG ?= 0

DEBUG_FILE      = tmp/debug

SRC             = test.pl
TARGET          = tmp/$(SRC)


all: debug_dep $(TARGET)
$(DEBUG_FILE): debug_dep

$(TARGET): $(DEBUG_FILE) $(SRC)
        cat $(SRC) > $(TARGET)

debug_dep: 
    @test -e $(DEBUG_FILE) || echo $(DEBUG) > $(DEBUG_FILE)
    @test "`cat $(DEBUG_FILE)`" = "$(DEBUG)" || echo $(DEBUG) > $(DEBUG_FILE)


.PHONY: debug_dep

и работает:

apache:[~]$ make DEBUG=0
apache:[~]$ make DEBUG=0
apache:[~]$ make DEBUG=1
cat test.pl > tmp/test.pl
apache:[~]$ make DEBUG=1
apache:[~]$ make DEBUG=0
cat test.pl > tmp/test.pl
apache:[~]$ make DEBUG=0


правда не пишет про то что "цель не требует выполнения команд", 
потому что реально команды выполняет.

если хочется совсем уж короткой работы то так:

DEBUG ?= 0

DEBUG_FILE      = tmp/debug

SRC             = test.pl
TARGET          = tmp/$(SRC)


$(shell \
    test -e $(DEBUG_FILE) || echo $(DEBUG) > $(DEBUG_FILE); \
    test "`cat $(DEBUG_FILE)`" = "$(DEBUG)" || echo $(DEBUG) > $(DEBUG_FILE) \
    );

all: $(TARGET)

$(TARGET): $(DEBUG_FILE) $(SRC)
        cat $(SRC) > $(TARGET)


и работа:

apache:[~]$ make DEBUG=1
make: Цель `all' не требует выполнения команд.
apache:[~]$ make DEBUG=1
make: Цель `all' не требует выполнения команд.
apache:[~]$ make DEBUG=0
cat test.pl > tmp/test.pl
apache:[~]$ make DEBUG=0
make: Цель `all' не требует выполнения команд.
apache:[~]$ make DEBUG=0
make: Цель `all' не требует выполнения команд.
apache:[~]$ make DEBUG=1
cat test.pl > tmp/test.pl
apache:[~]$ make DEBUG=1
make: Цель `all' не требует выполнения команд.
apache:[~]$ make DEBUG=1
make: Цель `all' не требует выполнения команд.

AC> Ты б хоть проверил свое "решение", прежде чем предлагать.
да, я собственно шеллскрипт (идею) предлагал, а так сорри
 действительно не проверил :(
а так вот в вышеприведенном именно этот скрипт и работает :)
--
... mpd is off

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera@debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Attachment: signature.asc
Description: Digital signature


Reply to: