2010-12-01 11 views
16

私はメイクに取り組んでいると私は、上部に次の変数宣言があるとします。変数リストをMakefileのターゲットとして使用するには?

FILES = file1.cpp file2.cpp file3.cpp 

は今、私はこのような各ターゲットを指定せずに、特殊なコマンドを使用して、それらのそれぞれをコンパイルするとします。

file1.o : file1.cpp 
    custom_command file1.cpp 
file2.o : file2.cpp 
    custom_command file2.cpp 
file3.o : file3.cpp 
    custom_command file3.cpp 

上記の$(FILES)変数を使用してこれを行うより良い方法はありますか?以下のような

何か:

$(FILES:.cpp=.o) : $(FILES) 
    custom_command $(FILES) 

は...それだけは$(FILES)変数内の各ファイルに対してこの操作を行う必要があります。

SRCS=a.c b.c 
OBJS=$(SRCS:.c=.o) 

$(OBJS): $(SRCS) 
     cc -c -o a.o a.c 
     cc -c -o b.o b.c 

いますが、依存関係が完全であることを覚えている - それはa.oは同様に、おそらくそうではありませんどのb.cに依存していることを前提としています

答えて

29

はい。 パターンルールとして知られているものがあります。例では、理解するのが最も簡単です:

%.o: %.cpp 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

は(Makefileの タブを必要とすることを覚えておいてください)。このルールでは、cppファイルからオブジェクトファイルを作成する方法について説明します。

あなたは、このような広範囲のルールをしたくない場合は、静的なパターンと呼ばれるものを使用することができます。

objects = file1.o file2.o file3.o 

all: $(objects) 

$(objects): %.o: %.cpp 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

ここではGNUでstatic pattern rulespattern rulesのセクションのマニュアルを作るのです。

6

あなた次のとおり、それを行うことができます。あなたは後におそらくだ何

は別のものに1つのファイルタイプを有効にする方法については、単一のルールです:

SRCS=a.c b.c 
OBJS=$(SRCS:.c=.o) 

all: $(OBJS) 

.c.o: 
     gcc -c -o [email protected] $< 

.c.o.o.cファイルを回すために実行するコマンドを何述べているようなルールでありますファイル。実際のコマンドでは、[email protected]が特定のターゲットに置き換えられ、$<が最初の前提条件の名前に置き換えられます。

あなたが使用できる他の多くの自動変数、info makeでそれらを調べるか、あなたが利用可能infoものを持っていない場合makeに良い本を探してくださいがあります。

+0

ええ、それは私がやろうとしていることです。 –

+0

依存関係を正確に指定する別の方法は、前提条件(GNU Make固有の機能)の[secondary expansion](https://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html)を使用することです。 – ruvim

1
SRCS = a.c b.c 
OBJS = $(SRCS:.c=.o) 

.c.o: 
     ${CC} ${CFLAGS} -c -o [email protected] $< 

$<は(IIRC、bsdmakeは正確な使用をにgmakeものに交換され$^$<の意味を持つ)非常に移植性がありませんが、これは実装のいずれかで有効になります.c.oのデフォルトのレシピです。

関連する問題