1

私のmakefileは次のようになります。

FOO_OBJECT_FILES := $(OBJDIR)/Foo.cpp.o
BAR_OBJECT_FILES := $(OBJDIR)/Bar.cpp.o $(OBJDIR)Bar.c.o
ALL_OBJECT_FILES := $(FOO_OBJECT_FILES) $(BAR_OBJECT_FILES)

$(BINDIR)/Foo.a: $(FOO_OBJECT_FILES)
    # Rules for making a static library out of Foo's object files go here.

$(BINDIR)/Bar.a: $(BAR_OBJECT_FILES)
    # This uses the exact same command sequence as the previous rule.

$(BINDIR)/All.a: $(ALL_OBJECT_FILES)
       # Ditto.

# ...

プロジェクトにさらにターゲットが追加された場合(そうでない場合)、開発者は少なくとも3つのことを更新する必要があります。

  1. 新しいターゲットのオブジェクトファイルのリスト
  2. すべてのオブジェクトファイルのリスト
  3. 他のターゲットと同じルールを使用している場合でも、新しいターゲットを作成するためのターゲット

このプロセスを簡素化する方法はありますか、それとも私はそれに固執していますか?

ワイルドカードルールを使用してみましたが、マクロで機能するようには見えません。

$(BINDIR)/%.a: $(%_OBJECT_FILES)
    # ...

オブジェクトファイルのリストをルールとして扱うことはできますが、最終的なターゲットルールはそれらに直接アクセスできません。

OBJECT_FILES_Foo: $(OBJDIR)/Foo.cpp.o
OBJECT_FILES_Bar: $(OBJDIR)/Bar.cpp.o $(OBJDIR)Bar.c.o
OBJECT_FILES_All: FOO_OBJECT_FILES BAR_OBJECT_FILES

$(BINDIR)/%.a: OBJECT_FILES_%
    # This rule can't see into the object file lists to use them to build.

これ以上の方法はありませんか?

4

3 に答える 3

1

1 と 2 については大したことはできません。これらは Make が推定できない恣意的なものです。3を少し改善できます:

$(BINDIR)/%.a:
    # commands for making a static library

# adding a new target:
QUARTZ_OBJECT_FILES := $(OBJDIR)/Quartz.cpp.o $(OBJDIR)Arbitrary.o
ALL_OBJECT_FILES += $(QUARTZ_OBJECT_FILES) 
$(BINDIR)/Quartz.a: $(QUARTZ_OBJECT_FILES)

テンプレートを使用して、これらの 3 行を 1 行に減らすことができます。

$(eval $(call template, QUARTZ_OBJECT_FILES, $(OBJDIR)/Quartz.cpp.o $(OBJDIR)Arbitrary.o))

しかし、それは本当に価値がありますか?

于 2011-10-26T22:47:26.333 に答える
1

これを行う方法はおそらくたくさんあります。そのような方法の 1 つは次のとおりです。新しいターゲットに対して行う必要があるのは、その名前をモジュールのリストに追加し、その依存関係のリストを与えることだけです。

BINDIR := ビン
OBJDIR := オブジェクト

モジュール := フーバー

Foo_OBJS := $(OBJDIR)/Foo.cpp.o
Bar_OBJS := $(OBJDIR)/Bar.cpp.o $(OBJDIR)/Bar.co

#################################################### ###
# #
# 以下は何も変更する必要はありません。#
# #
#################################################### ###

All_OBJS := $(foreach mod, $(MODULES),$($(mod)_OBJS))

ルールを定義する
$(BINDIR)/$(1).a: $($(1)_OBJS)
    @エコー
    @echo 'ターゲット: $$@'
    @echo 'Deps : $$^'
エンデフ

$(foreach lib, すべての $(MODULES), $(eval $(call rule,$(lib))))

##########################################
# #
# 次の部分はテスト用です。#
# #
##########################################

.PHONY: すべて
すべて: $(foreach lib, すべての $(MODULES),$(BINDIR)/$(lib).a)

%.o:
    @echo メイキング $@
于 2011-10-26T22:48:51.523 に答える
1

他の回答では、手動で makefile を作成するための優れたソリューションが提供されていますが、単純に automake を使用してビルド プロセスを容易にすることができます。

于 2011-10-27T09:52:18.507 に答える