0

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

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 $< $@

如果数字不是 ./,这很好用——例如,修改它以尝试从备用路径复制乳胶 .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)。

4

2 回答 2

1

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

于 2012-06-05T23:52:06.967 回答
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其用作您的目的地。

于 2012-06-06T14:31:25.143 回答