Makefile の一般的なビルド テンプレートを作成しようとしています。これは、eval ドキュメントで説明されているようなものです。
GNU Make 3.80 で既知のバグに遭遇しました。$(eval) が 193 文字を超える行を評価すると、Make は「Virtual Memory Exhausted」エラーでクラッシュします。
問題を引き起こすコードは次のようになります。
SRC_DIR = ./src/
PROG_NAME = test
define PROGRAM_template
$(1)_SRC_DIR = $$(SRC_DIR)$(1)/
$(1)_SRC_FILES = $$(wildcard $$($(1)_SRC_DIR)*.c)
$(1)_OBJ_FILES = $$($(1)_SRC_FILES):.c=.o)
$$($(1)_OBJ_FILES) : $$($(1)_SRC_FILES) # This is the problem line
endef
$(eval $(call PROGRAM_template,$(PROG_NAME)))
この Makefile を実行すると、
gmake: *** virtual memory exhausted. Stop.
予想される出力は、./src/test/ 内のすべての .c ファイルが (暗黙の規則によって) .o ファイルにコンパイルされることです。
問題は、$$($(1)_SRC_FILES) と $$($(1)_OBJ_FILES) が一緒になって 193 文字を超えることです (十分なソース ファイルがある場合)。
.c ファイルが 2 つしかないディレクトリで make ファイルを実行しようとしましたが、正常に動作しました。エラーが発生するのは、SRC ディレクトリに多数の .c ファイルがある場合のみです。
GNU Make 3.81 でこのバグが修正されていることは知っています。残念ながら、作業中のシステムに新しいバージョンをインストールする権限や能力がありません。私は3.80で立ち往生しています。
それで、何か回避策はありますか?$$($(1)_SRC_FILES) を分割して、eval 内で各依存関係を個別に宣言することはできますか?