Re: Чем плох рекурсивный make?
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 $@`" = "$(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: ran@jabber.ran.pp.ru
Как в notepad тексты редактировать? Руками каждую букву набирать, что ли?
(c)vitus
Reply to: