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]