web-dev-qa-db-ja.com

変数リストを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)変数の各ファイルに対してこれを行う必要があるだけです。

25
Nathan Osman

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

%.o: %.cpp
       $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

(Makefilesrequiretabs)このルールは、cppファイルからオブジェクトファイルを作成する方法を説明します。

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

objects = file1.o file2.o file3.o

all: $(objects)

$(objects): %.o: %.cpp
        $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

これは、GNU Make manualの 静的パターンルール および パターンルール に関するセクションです。

44
Chris

あなたはcan次のようにそれを行います:

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.ob.cにも依存していることを前提としていますが、おそらくそうではありません。

おそらく、あるファイルタイプを別のファイルタイプに変換する方法に関する単一のルールがあります。

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

all: $(OBJS)

.c.o:
        gcc -c -o $@ $<

.c.oは、.cファイルを.oファイルに変換するために実行するコマンドを示すルールです。実際のコマンドでは、$@は特定のターゲットに置き換えられ、$<は最初の前提条件の名前に置き換えられます。

他にもたくさんあります自動変数使用できます。info makeで検索するか、makeがない場合はinfoで良い本を探してください。 ] _利用可能なもの。

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

.c.o:
        ${CC} ${CFLAGS} -c -o $@ $<

$<は完全に移植可能ではありませんが(IIRC、bsdmakeは$^および$<の意味がgmakeが使用するものと正確に入れ替えられています)、これは.c.oのデフォルトのレシピですどちらの実装でも有効です。

1
user502515