次のディレクトリ構造があります。
./
|- obj/
|--- debug/
|--- release/
|- bin/
|--- debug/
|--- release/
|- src/
|--- main.c
|--- libb/
|----- foo.c
|- include/
|--- libb/
|----- foo.h
Makefile
さらに、次の形式 (例)で my の個々のオブジェクトの依存関係を手動で指定します。
main_DEPS = libb/foo
と入力できるようになりmake bin/debug/main
、必要な依存関係とターゲット ファイルが生成されます。
obj/debug/libb/foo.o
obj/debug/main.o
bin/debug/main
それ、どうやったら出来るの?私の現在のアプローチは非常に複雑で不完全です。
以下はオブジェクトファイルを作成します。ただし、必要なサブフォルダー (
libb
) がまだ存在しない場合、作成に失敗します。また、変更されたヘッダー ファイルも追跡しません。前提条件を自動的に生成する Makefile チュートリアルのトリックは、おそらく適応できますか?CFLAGS+=-I include obj/*/%.o: src/%.cpp $(CC) $(CFLAGS) $< -c -o $@
以下は、バイナリの依存関係を解決し、必要なすべてのオブジェクト ファイルからビルドしようとします。
*_DEPS
しかし、変数からそれらのオブジェクト ファイルを取得する方法がわかりません。.SECONDEXPANSION: bin/debug/%: obj/debug/%.o $(patsubst %,obj/debug/%.o,$($(patsubst bin/debug/%,%,$@)_DEPS)) $(LD) $(LDFLAGS) $< $(patsubst %,obj/debug/%.o,$($(patsubst bin/debug/%,%,$@)_DEPS)) -o $@ bin/release/%: obj/release/%.o $(patsubst %,obj/release/%.o,$($(patsubst bin/release/%,%,$@)_DEPS)) $(CXX) $(LDFLAGS) $< $(patsubst %,obj/release/%.o,$($(patsubst bin/release/%,%,$@)_DEPS)) -o $@
残念ながら、これは依存関係を自動的に構築しません。「obj/debug/libb/foo.o: そのようなファイルやディレクトリはありません」と文句を言うだけです
mkdir obj/debug/libb; make obj/debug/libb/foo.o
。また、これはどうしようもなく複雑であり、不要なコードの重複を使用しています (これは、さらに複雑にしない限り取り除くことはできません)。
これに対する最も複雑でない解決策は何ですか? make
原則として、広く利用可能なもの (autoconf など)以外のものを使用することに反対しているわけではありませんが、労力 (および必要な新しい学習) を最小限に抑えることを好みます。よりもはるかに複雑ですmake
。