Я не уверен, почему вы используете eval здесь; почему не просто:
_ABS_PATH = $(subst C:,c:,$(abspath $(DIRECTORY)))
Но, в любом случае, в любое время, когда вам нужно сделать что-то умное с переводом строк и т. Д. В GNU, есть хорошая ставка, что Джон Грэм-Камминг уже сделал это для вас. Проверьте его самый превосходный инструментарий GMSL (GNU Make Standard Library) для многих распространенных функций. В комплекте есть вариация lc (строчные). Вместо того, чтобы воспроизвести его здесь (вместе с уведомлением об авторских правах, поскольку оно под лицензией BSD), вы можете получить копию.
Получив его, вы можете сделать что-то подобное, если хотите, чтобы весь путь был в нижнем регистре:
include gmsl
_ABS_PATH = $(call lc,$(abspath $(DIRECTORY)))
Если вы просто хотите, чтобы буква диска была в нижнем регистре, а не все остальное, это более сложно, примерно так должно работать:
include gmsl
_DRIVE = $(word 1,$(subst :, ,$(abspath $(DIRECTORY))))
_ABS_PATH = $(call lc,$(_DRIVE)):$(patsubst $(_DRIVE):%,%,$(abspath $(DIRECTORY)))
Там могут быть более простые способы. Также, если вы уверены, что значение DIRECTORY уже установлено, вам следует рассмотреть возможность использования здесь «: =» вместо «=», поскольку это сделает НАМНОГО более эффективным (особенно если много используется $ (_ ABS_PATH)).