Dmitry E. Oboukhov -> debian-russian@lists.debian.org  @ Thu, 2 Oct 2008 
17:15:32 +0400:


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

 AC>>> ...

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

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

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

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

 AC>>> %.o: %.c debug_depends

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

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

 DEO> DEBUG ?= 0

 DEO> DEBUG_FILE      = tmp/debug

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


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

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

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


 DEO> .PHONY: debug_dep

 DEO> и работает:

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


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

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

 DEO> DEBUG ?= 0

 DEO> DEBUG_FILE      = tmp/debug

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


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

 DEO> all: $(TARGET)

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


 DEO> и работа:

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

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

Ну, это лучше, да.  Причем мне, честно говоря, сходу даже было
непонятно, почему работает первое решение...  Пришлось гонять make -d и
разбираться.

А теперь вот так вот для каждой переменной, которую можно указать
мейкфайлу, и у каждой цели, на сборку которой эта переменная влияет...
И пару раз ошибиться...

Нет, все-таки такие вещи должен отслеживать сам инструмент...

-- 
Artem Chuprina
RFC2822: <ran{}ran.pp.ru> Jabber: [EMAIL PROTECTED]

Как в notepad тексты редактировать? Руками каждую букву набирать, что ли?
        (c)vitus


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Ответить