如何修复gnu make rule使用vpath将文件复制到另一个目录时该目录是./?

时间:2012-06-05 15:12:25

标签: gnu-make

根据Beta在gnu make copy many files to a single location中的回答,我有一个工作规则,可以将不同路径中的数字复制到我的构建目录中的./figures/ subdir

ORIG_FILE_DIRS += ..
LOCAL_FILES += figures/myfig.png
DESTDIR := figures

all : $(LOCAL_FILES)

vpath %.png $(ORIG_FILE_DIRS)

$(DESTDIR)/%.png: %.png
  mkdir -p $(DESTDIR)
  cp $< $@

这很好用,如果数字不是./ - 例如,修改它以尝试从备用路径复制latex .sty文件(我需要在当前工作目录中),我试过:

ORIG_FILE_DIRS += ..
LOCAL_FILES += mycommon.sty
DESTDIR := ./

all : $(LOCAL_FILES)

vpath %.sty $(ORIG_FILE_DIRS)

$(filter %.sty,$(LOCAL_FILES)) : $(DESTDIR)/%.sty: %.sty
  mkdir -p $(DESTDIR)
  cp $< $@

(过滤器试图明确,因为我在./)中有一些其他.sty文件。

这给了我

make: Circular mycommon.sty <- mycommon.sty dependency dropped.
make: Nothing to be done for `all'.

我不确定如何解决这个问题。我尝试了依赖的显式路径:

$(filter %.sty,$(LOCAL_FILES)) : $(DESTDIR)/%.sty: ../%.sty
  mkdir -p $(DESTDIR)
  cp $< $@

但仍然会获得循环依赖(对于../mycommon.sty)。

2 个答案:

答案 0 :(得分:1)

我可以重命名原件:给它们一个不同的后缀,并使用一个普通的旧后缀规则。

答案 1 :(得分:1)

我对另一个问题的回答有点像黑客,所以这就是。

有几种方法可以做到,没有一种方法是完美的。可能最不丑的是使用临时目录:

ORIG_FILE_DIRS += ...
DESTDIR := figures
TEMPDIR := tempdir
TEMP_FILES += $(TEMPDIR)/fig1.png

all : $(TEMP_FILES)
        mv $^ $(DESTDIR)

vpath %.png $(ORIG_FILE_DIRS)

$(TEMPDIR)/%.png: %.png
        mkdir -p $(TEMPDIR)
        cp $< $@

移动文件要比复制它们快得多(O(1)),因此速度不会受到影响。只是不要做任何愚蠢的事情,比如使用tempdir作为目的地。