Это происходит потому, что вы смешиваете две стадии расширения. Перед вызовом оболочки для выполнения правила все переменные make и функции раскрываются. Таким образом, $$elems
становится $elems
, и эта строка затем используется в качестве ввода для функций $(dir ...)
и $(notdir ...)
. Эта строка не содержит /
, поэтому dir
возвращает ./
, а notdir
возвращает $elems
. В конце в оболочке выполняется следующая команда.
@for elems in /home/folder1/folder2/fileName1 /home/folder3/folder4/fileName2 /home/folder5/folder6/fileName3; \
do \
echo ./; \
echo $elems; \
done
Уильям Перселл дал возможный обходной путь, используя функции оболочки. Другой возможностью было бы выполнить раскрытие перед выполнением правила, например:
MYLIST = \
/home/folder1/folder2/fileName1 \
/home/folder3/folder4/fileName2 \
/home/folder5/folder6/fileName3 \
MYDIRS = $(dir $(MYLIST))
MYFILES = $(notdir $(MYLIST))
MYLIST:
@for elems in $(MYDIRS) $(MYFILES); \
do \
echo $$elems; \
done
$(@D)
и $(@F)
не дают вам все части dir и fileName, потому что они дают файл и директорию цели текущего вызова правила. В каждый момент есть только одна цель. Вы можете использовать эти автоматические переменные, однако, чтобы делать то, что вы хотите, позволяя make
выполнять цикл вместо оболочки, как показано ниже:
MYLIST = \
/home/folder1/folder2/fileName1 \
/home/folder3/folder4/fileName2 \
/home/folder5/folder6/fileName3 \
all: $(MYLIST)
$(MYLIST):
@echo $(@D)
@echo $(@F)