Обходной путь для GNU Make 3.80 eval bug
Я пытаюсь создать общий шаблон сборки для моих Makefiles, вроде того, что они обсуждают вэлектронная документация.
Я столкнулся с известной ошибкой в 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.
Ожидаемый результат - все .c файлы в ./src/test/ компилируются в .o файлы (через неявное правило).
Проблема в том, что $ ($ (1) _SRC_FILES) и $ ($ (1) _OBJ_FILES) вместе имеют длину более 193 символов (если исходных файлов достаточно).
Я попытался запустить файл make в каталоге, где есть только 2 файла .c, и он работает нормально. Только когда в каталоге SRC много файлов .c, я получаю сообщение об ошибке.
Я знаю, что GNU Make 3.81 исправляет эту ошибку. К сожалению, у меня нет полномочий или возможности установить более новую версию в системе, над которой я работаю. Я застрял с 3.80.
Итак, есть ли обходной путь? Может быть, разделить $ ($ (1) _SRC_FILES) и объявить каждую зависимость отдельно в eval?