Я пытаюсь создать общий шаблон сборки для моих Makefiles, вроде того, что они обсуждают в документация по оценке.
Я столкнулся с известной ошибкой в GNU Make 3.80. Когда $(eval) оценивает строку, длина которой превышает 193 символа, Make аварийно завершает работу с ошибкой «Исчерпана виртуальная память».
Код, который у меня есть, который вызывает проблему, выглядит так.
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?