Почему базовое имя в Makefile работает не так, как ожидалось?

#makefile

#makefile

Вопрос:

 TESTS=test/hello.c
try:
        @for t in $(TESTS); do echo $(basename $$t); done
  

Запустив «make», я получаю

 ~ make
test/hello.c
  

Это странно, потому что я ожидал получить базовое имя «hello.c». Есть объяснение? Спасибо.

Ответ №1:

Проблема в том, что вы пытаетесь использовать директиву Make basename внутри цикла оболочки for . Make сначала развернет $(basename ...) инструкцию (так $(basename $$t) становится $t ), затем передаст команду

 for t in test/hello.c; do echo $t; done
  

для командной строки.

Это даст test/hello :

 @for t in $(basename $(TESTS)); do echo $$t; done
  

и это даст hello.c :

 @for t in $(notdir $(TESTS)); do echo $$t; done
  

Комментарии:

1. Да. Это имеет смысл. Каким тогда было бы решение для распечатки базового имени из Makefile

2. Используйте $$(basename $(TESTS))

3.@jsp: Это вызывает функцию оболочки basename . Я предположил, что OP хотел использовать функцию Make basename .