6

コンパイルしたい .cpp ファイルのセットがあります。これらの .cpp ファイルは、階層ディレクトリ構造になっています。対応する .o ファイルがすべて 1 つのビルド フォルダーにまとめられるようにします。

ファイルを列挙するためにGNU makeを取得する方法は次のとおりです...

SRCS = \
    $(wildcard $(CODE)/**/*.cpp) \
    $(wildcard $(CODE)/AlgebraLibraries/**/*.cpp) \
    $(wildcard $(CODE)/Calculator/Environments/**/*.cpp)

BARE_SRCS = $(notdir $(SRCS))
BARE_OBJS = $(BARE_SRCS:.cpp=.o)
OBJS = $(addprefix $(BUILD)/, $(BARE_OBJS))

これを行った後、.cpp ファイルから .o ファイルを作成するルールを作成する方法がわかりません。直感的に、私がやりたいのは次の疑似コードです。

for i=0, N do  # <-- a for-loop!
  $(OBJS)[i]: $(SRCS)[i]   # <-- the rule!
    $(CPP) -c $(SRCS)[i] -o $(OBJS)[i] # <-- the recipe
end

もちろん、これは有効な GNU make コードではありませんが、ここで私がやろうとしていることを理解していただけると信じています。以下は動作しません。

%.o: %.cpp
    $(CPP) -c $< -o $@

.o ファイルが .cpp ファイルと一緒に存在すると仮定して、GNU make が % 記号を一致させているため、これは機能しません。

このすべてに代わる方法は、機能することはわかっていますが、非常に面倒なことですが、すべてのルールを明示的なルールとして手作業で列挙することです。それは遅れている!もっと良い方法があるはずです。

私はルールを生成する GNU make の機能を調査してきましたが、組み込みロジックなしではそれを行う方法がないようです。いくつかのフロー制御ステートメントを使用して、作成したいルールを生成できれば、非常に便利です。これは GNU-make に多くを求めすぎているのでしょうか?

いずれにせよ、GNU make でやろうとしていることを行う方法はありますか? もしそうなら、どのように?

ご協力ありがとうございました!

4

2 に答える 2

15

これは...いくつかの高度な Make トリックの仕事のように見えます:

all: $(OBJS)

define ruletemp
$(patsubst %.cpp, $(BUILD)/%.o, $(notdir $(1))): $(1)
    $$(CPP) -c $$< -o $$@
endef

$(foreach src,$(SRCS),$(eval $(call ruletemp, $(src))))
于 2013-03-02T02:39:42.053 に答える
2

が定数の場合$(BUILD)、いつでも次のことができます。

$(BUILD)/%.o: %.cpp
    $(CPP) -c $< -o $@
于 2015-07-23T17:37:16.297 に答える