如果规则的依赖关系不存在,如何忽略该规则?

时间:2015-10-09 10:19:35

标签: makefile gnu-make

我有一个包含两个规则的Makefile。一个将数据库文件转换为SQL文件,另一个转换为相反的文件。

all:

data.sql: data.sqlite3
    sqlite3 $< .dump > $@

data.sqlite3: data.sql
    sqlite3 $@ < $<

这样可行,但我收到有关循环依赖的警告。

$ rm data.sql
$ make data.sql
make: Circular data.sqlite3 <- data.sql dependency dropped.
sqlite3 data.sqlite3 .dump > data.sql

$ rm data.sqlite3 
$ make data.sqlite3
make: Circular data.sql <- data.sqlite3 dependency dropped.
sqlite3 data.sqlite3 < data.sql

是否有可能摆脱警告?

2 个答案:

答案 0 :(得分:1)

从你自己的解决方案中我收集它从来就不是这样的 .sql.sqlite3同时存在。在那里面 如果你错过了.sql,你可以更简洁 或.sqlite3作为假装制定代理目标的副作用但是 从来没有真正这样做。这是一个例子:

# These are the missing `.sql` files for which a `.sqlite3` exists...
sql_missing = $(filter-out \
    $(wildcard *.sql),$(addsuffix .sql,$(basename $(wildcard *.sqlite3))))
# These are the missing `.sqlite3` files for which an `.sql` exists...
sqlite3_missing = $(filter-out \
    $(wildcard *sqlite3),$(addsuffix .sqlite3,$(basename $(wildcard *.sql))))
# There are the proxy targets...
targs = $(addsuffix _missing,$(sql_missing) $(sqlite3_missing))

.PHONY: all

all: $(targs)

%.sql_missing: %.sqlite3
    @echo "$< => $(basename $@).sql"
    @touch $(basename $@).sql

%.sqlite3_missing: %.sql
    @echo "$< => $(basename $@).sqlite3"
    @touch $(basename $@).sqlite3

这适用于目录中的文件类型或两者的填充, 只要您只想重新创建每个不完整对的缺失文件。

使用中:

$ ls
Makefile
$ touch f1.sql
$ touch f2.sqlite3
$ make
f2.sqlite3 => f2.sql
f1.sql => f1.sqlite3
$ ls
f1.sql  f1.sqlite3  f2.sql  f2.sqlite3  Makefile
$ make
make: Nothing to be done for 'all'.

答案 1 :(得分:0)

我想我明白了。有点冗长,但似乎有效。

DBFILE := data.sqlite3
SQLFILE := data.sql

ifeq ("$(wildcard $(SQLFILE))","")
MISSING := $(SQLFILE)
endif

ifeq ("$(wildcard $(DBFILE))","")
MISSING := $(DBFILE)
endif

all: $(MISSING)

ifeq ("$(wildcard $(SQLFILE))","")
$(SQLFILE): $(DBFILE)
    sqlite3 $< .dump > $@
endif

ifeq ("$(wildcard $(DBFILE))","")
$(DBFILE): $(SQLFILE)
    sqlite3 $@ < $<
endif