2

ビルド プロセスの一環として、いくつかのファイルを m4 で処理する必要があります。これらのファイルには「.in」拡張子が付けられ、最上位のディレクトリだけでなく、サブディレクトリにも配置されます。find を使用してそれらを見つけ、シェル ループで処理します。

入力ファイルと同じディレクトリに出力をファイル (「.in」拡張子を削除) に保存して処理するためのより簡単なルールを作成するための makefile 構文マジックはありますか?

これは私が今メイクファイルに持っているものです:

PROCESS_FILES=$(shell find . -name \*.in)
WORK_FILES=$(subst .in,,$(PROCESS_FILES))



$(WORK_FILES): $(PROCESS_FILES) 
  for file in $(PROCESS_FILES); \
  do \
      m4  $$file > $${file%.*};\
  done
4

2 に答える 2

4

サフィックスのあるファイルをそのサフィックスのないファイルに変換する一連のルールを作成でき.inます。

古典的な表記法では、次のようになります。

# Not functional — see discussion
.SUFFIXES: .in       # Add .in as a suffix

M4       = m4
M4FLAGS  =
M4SCRIPT = xyz.m4

.in:
    ${M4} ${M4FLAGS} ${M4SCRIPT} $< > $*

これは.in認識された接尾辞として追加.inされ、3 つのマクロで指定されたコマンドを使用して、接尾辞のあるファイルをファイルなしで変換することを示します。は、拡張子$<付きのファイルの名前です.in。the$*は、拡張子を除いたファイルの名前です。

残念ながら、この表記法は、変換するファイルが などの名前を持ち、xyz.inに変換する必要がある場合にのみ機能しますxyzxyz.h.inに変換する必要がある場合には機能しませんxyz.h

.h.in接尾辞がとであることを指定することは可能ですが、2 つの間の変換規則はと で.h始まり、混乱します。.h.in.h:make

ただし、GNU make には、これに対応できるサフィックス規則を定義するための代替表記法があります。

.SUFFIXES: .h.in .h      # Add .h.in and .h as suffixes

M4       = m4
M4FLAGS  =
M4SCRIPT = xyz.m4

%.h: %.h.in
    ${M4} ${M4FLAGS} ${M4SCRIPT} $< > $*.h

この%.h: %.h.in行は、2 つのドットでサフィックスを処理できます。.c.in唯一の煩わしさは、または.y.inまたはなどの拡張子ごと.mk.inに、同様のマッピングを提供する必要があることです。

(Mac OS X 10.7.4 でテスト済み。その makefile がxyz.mkの場合、空のファイルを作成してxyz.h.inから実行するmake -n -f xyz.mk xyz.hと、ビルドがコマンドを実行することがわかりますm4 xyz.m4 xyz.h.in > xyz.h。)

于 2012-08-09T11:32:11.763 に答える
0

ソースファイル、からpath/to/file.in作成するためのルール、および出力ファイルへの依存関係がある場合、必要なのはそれだけです。%%.inpath/to/file

おそらく、依存関係を からの出力で表現したいと思うでしょうfind。GNU Make では、これは簡単です。他の方言では、おそらく次のようなものを生成して含めたいと思うでしょうfind -name '*.in' | sed 's/\.in$//' >make.dep

于 2012-08-09T11:18:41.973 に答える