我有一个包含两个规则的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
是否有可能摆脱警告?
答案 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