Как удалить расширение в make-файле - PullRequest
0 голосов
/ 31 мая 2018

У меня есть следующий make-файл:

CC=gcc
CFLAGS=-c ---
LDFLAGS = ---

SRCFILES := $(shell find ../ -name '*.c')
OBJFILES := $(patsubst %.c,%.o,$(SRCFILES))
TESTFILE := $(patsubst %_test.c,%,$(SRCFILES))

all: $(TESTFILE)
$(TESTFILE): $(OBJFILES)
    $(CC) $(LDFLAGS) $(OBJFILES) -o $@

all: $(OBJFILES)
%.o: %.c
    $(CC) $(CFLAGS) $< -o $@

Для всех: $ (OBJFILES) и ниже, работает отлично.он создает все необходимые мне объектные файлы, но у меня возникли проблемы с созданием тестового файла.Один из файлов SRC - это ABC_test.c, а файл, который я хочу вывести, - это ABC_test (без расширения).

У ABC_test будут зависимости всех OBJ-файлов.Я думаю, что у меня правильная настройка, но если это не так, пожалуйста, дайте мне знать.Я очень новичок в makefiles.

Я попытался использовать подстановку, как вы можете видеть в имени TESTFILE.Я считаю, что мой вопрос слишком конкретен и не может найти помощь в поиске Google.Есть идеи, что я могу сделать?

1 Ответ

0 голосов
/ 31 мая 2018

Важно понимать, что patsubst не пропускает слова из результата.Если слово соответствует шаблону, то оно подставляется.Если слово не соответствует шаблону, оно просто выводится как есть.

Итак, если у вас есть:

FOO = foo_1 foo_2 bar_1 bar_2

$(info $(patsubst foo%,FOO%,$(FOO))

, то результат будет:

FOO_1 FOO_2 bar_1 bar_2

Это НЕ будет, как вы, вероятно, ожидаете:

FOO_1 FOO_2

с пропущенными несовпадающими значениями.Если вы хотите удалить слова из вывода, вам нужно использовать функции filter и filter-out.Так, например:

TESTFILE = $(patsubst %_file.c,%,$(filter %_test.c,$(SRCFILES)))
...