Подстановочный знак Makefile и расширение переменной - PullRequest
0 голосов
/ 26 января 2019

У меня есть этот Makefile (сокращенно):

COMPILE                  = armcc
LINK                     = armlink
SRCDIR := ./src1 \
          ./src2

INCLUDES := -I ./inc 
CSRC := $(wildcard $(SRCDIR)/*.c)
# CSRC := ./src1/*.c ./src2/*.c
OBJS := $(CSRC:.c=.o)

.PHONY: clean

clean:
    @echo "Clean Finished"

%.o: %.c
    @echo Compiling $<
    @$(COMPILE) $(INCLUDES) $< -o $@

mktest: $(OBJS) Makefile
    @echo $(CSRC)
    @echo $(OBJS)
    @echo building mktest
    @$(LINK) -o mktest.axf

Когда я запускаю его, подстановочный знак расширяется только для последней записи в переменной SRCDIR, которая является ./src2. Вывод показан ниже.

c:> make mktest
./src1 ./src2/file2.c
./src1 ./src2/file2.o
building mktest

Если я заменю строку, в которой определен CSRC, строкой под ней. Работает нормально, а вывод показан ниже.

c:> make mktest
./src1/*.c ./src2/*.c
./src1/*.o ./src2/*.o
building mktest

Это нормально, если у меня есть только несколько подкаталогов, которые я хочу включить. Но если я захочу добавить больше, Makefile станет безобразным. Я не правильно использую здесь подстановочный знак?

1 Ответ

0 голосов
/ 26 января 2019

Ваше определение CSRC должно быть таким:

CSRC:= $(foreach dir,$(SRCDIR),$(wildcard $(dir)/*))

Если вы посмотрите документацию :

$(wildcard pattern…)

Эта строка, используемая в любом месте make-файла, заменяется разделенным пробелами списком имен существующих файлов, которые соответствуют одному из заданных шаблонов имен файлов ...

Это означает, что ваша оригинальная строка выглядит так:

CSRC := $(wildcard src1/ src2/*.c)

Это файлы, имена которых совпадают с src1/ или src2/*.c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...