非常に単純なMakefileがあり、期待どおりに動作していません。最終的な目標は、毎回適切なファイルを含めて再帰的に呼び出し、含まれているものに固有のビルドを作成することです(すべて同じコードベースを共有するが、ソースファイルの異なる組み合わせを利用するいくつかのプロジェクトをビルドしています)。再帰的な呼び出しを実際に処理したことはないので、明らかな何かが欠けているに違いありません。.mk
現在、 Makefileと同じフォルダにあるファイルは1つだけです。これは、このテストの目的のためだけの単純なワンライナーです。最終的には、プロジェクトごとのさまざまな設定が含まれます。
Makefile:
SHELL = /bin/sh
ifdef MYFILE
include $(MYFILE)
PROGRAM = $(basename $(MYFILE))
endif
all: $(wildcard *.mk)
dummy:
@echo -- Entering dummy stub ... why do I need this?
%.mk: dummy
@echo Calling $(MAKE) MYFILE=$@ $*
$(MAKE) MYFILE=$@ $*
$(PROGRAM): objs
@echo Time to link!
objs:
@echo Building objs!
test.mk
SOMEVAR = SomeValue
次の2つの問題があります。
問題1
パターンルールから前提条件を削除するdummy
と、パターンルールが呼び出されることはありません(恐ろしい「すべてに対して何もする必要がない」エラーが発生します)。%.mk
そのダミーの前提条件を必要とせずに、ルールの下でレシピを実行する方法はありますか?
問題2
前述の2つのファイルを考えると、makeは次のことを実行することを期待します。
- make [1]が開始し、
all
ルールにヒットします %.mk
make[1]はパターンルールにジャンプします- make [1]はそれ自体を再帰的に呼び出します(呼び出しは次のようになります
make MYFILE=test.mk test
) - make [2]が起動し、test.mkファイルが含まれ、PROGRAM変数が設定されます
- make [2]は$(PROGRAM)ルールにジャンプします(そのターゲットで明示的に呼び出されたため)
- make [2]はobjsルールにジャンプし、レシピを実行して、チェーンに戻ります
実際には、makeは%.mk
パターンルールに固執し、無限ループに入ります。test
最初の再帰呼び出し($(PROGRAM)
ターゲットに対応する必要があります)を組み込むように明示的に指示したときに、パターンルールをヒットすることを主張している理由がわかりません。ここで何が欠けていますか?