Обходной путь для 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?

Ответы на вопрос(2)

Ваш ответ на вопрос