0

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

これは、数字が./でない場合にうまく機能します-たとえば、これを変更して、代替パスから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 の場合) が発生します。

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 に答える