2016-09-30 14 views
0

自動変数を使用してターゲット名を取得する方法はありますか?Makefileのフィルタ機能

SOURCES = $(wildcard *.c) 
dummytgt: $(OBJ)/tier.o 
$(GCC) $(CFLAGS) -c $(filter [email protected],$(SOURCES)).c -o [email protected] 

は、私は、入力としてファイル名を言及する必要はありませんが、ターゲット名と同じである.cファイルを取得するにはフィルタ機能を使用したいと思います。作る入力が

答えて

0
$(filter [email protected],$(SOURCES)) 

をファイルがありません。しかし、あなたがそれ前提にし、まだ

[email protected] 

またはそれ以上を使用していない理由は、私が表示されないエラーをスローします。

0

それはがこれを解析して作る方法を見ておくと便利です。

SOURCES = $(wildcard *.c) 
dummytgt: $(OBJ)/tier.o 
    $(GCC) $(CFLAGS) -c $(filter [email protected],$(SOURCES)).c -o [email protected] 

まず第一に、 それが行くようにマクロを定義し、拡大する、メイクファイルを読み込みますが。

  • SOURCES = $(wildcard *.c)${SOURCES}が定義$(wildcard *.c)と怠惰な変数であることを意味しています。 Lazy?はい、これらの回帰変数(マニュアルになります)は、拡張されたときにのみ右側が拡大されます。
  • にはファイルの読み込み時に依存関係が必要なため、$(OBJ)が展開されます。 ${OBJ}の拡張がobjs(たとえば)としましょう。
  • シェルコマンドブロックは、単一の遅延変数のままです。 まで拡張されています。になります。は、dmmytgtをビルドすることを決定します。

あなたはまったく同じ効果にこれを書かれている可能性:このフラグメントが機能するためには

dummytgt: objs/tier.o 
    $(GCC) $(CFLAGS) -c $(filter [email protected],$(wildcard *.c)).c -o [email protected] 

、 ファイルobjs/tier.oはすでに存在している必要があります。 そうだとしましょう。

を作るには、今では、今ではコマンドブロックを展開する(メイクファイルに応じて)それはdummytgtを構築するために必要なすべて、 を持っています。

  • $(wildcard *.c)は、1.c 2.c(たとえば)に拡張されます。
  • [email protected]dummytgt
  • $(filter dummytgt,1.c 2.c)が空もちろんである(と常になります!)
  • ${GCC}は、このようにシェルが

    gcc -c .c -o dummytgt 
    

    おそらくgccの.cと呼ばれるファイルがないと文句を言い取得します(たとえば)

  • ${CFLAGS}が空である(例えば)

gccです。 結果のエラーはとなり、が実行されます。

ここでは好きでないことがいくつかあります: $(wildcard)は、hacky one-liner makefiles IMHOのみです。 dummytgtにはobjs/tier.oが必要ですが、そのビルド手順は決して参照しません。 $(filter)は常に何も展開されません。