私がメイクファイルで作業していて、上部に次の変数宣言があるとします。
_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)
変数の各ファイルに対してこれを行う必要があるだけです。
はい。 パターンルールとして知られているものがあります。例は理解するのが最も簡単です:
%.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 $@
あなたは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.o
がb.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
で良い本を探してください。 ] _利用可能なもの。
SRCS = a.c b.c
OBJS = $(SRCS:.c=.o)
.c.o:
${CC} ${CFLAGS} -c -o $@ $<
$<
は完全に移植可能ではありませんが(IIRC、bsdmakeは$^
および$<
の意味がgmakeが使用するものと正確に入れ替えられています)、これは.c.o
のデフォルトのレシピですどちらの実装でも有効です。