В Makefile я хочу удалить список файлов, соответствующих шаблону из имен файлов с префиксом test_, из другого списка.
Давайте возьмем этот Makefile, который делает то, что я хочу (только не как я хочу):
SRC_FILES = \
src/path/a.c \
src/path/b.c \
src/path/c.c \
src/path/d.c
TEST_FILES = \
test/another_path/test_b.c \
test/another_path/test_c.c \
RESULTING_FILES = \
$(TEST_FILES) \
$(filter-out src/path/b.c src/path/c.c,$(SRC_FILES))
all:
@echo SOURCE FILES:
@echo $(SRC_FILES)
@echo ""
@echo TEST FILES:
@echo $(TEST_FILES)
@echo ""
@echo RESULTING FILES:
@echo $(RESULTING_FILES)
Давайте запустим make all:
ИСТОЧНИКИ ФАЙЛОВ: src / path / a. c src / path / b. c src / path / c. c src / path / d. c
ИСПЫТАТЕЛЬНЫЕ ФАЙЛЫ: test / another_path / test_b. c test / another_path / test_ c. c
РЕЗУЛЬТАТЫ ФАЙЛОВ: test / another_path / test_b. c test / another_path / test_ c. c src / path / a. c src / path / d. c
Мы видим, что результирующие файлы состоят из:
- всех тестовых файлов
- исходных файлов после удаления тех, которые соответствуют одному из тестовых файлов имя файла без префикса теста _.
Чтобы удалить исходные файлы, которые мне не нужны, я использую следующую строку: $(filter-out src/path/b.c src/path/c.c,$(SRC_FILES))
Как видите, файлы, которые я хочу удалить жестко закодированы. Как я могу получить тот же результат, что и предыдущая строка, но без жесткого кодирования пути к файлу / имени файла? Цель состоит в том, чтобы удалить исходные файлы, для которых есть эквивалентный тестовый файл (a. c <-> test_a. c).
РЕДАКТИРОВАТЬ: я не объяснил это изначально, но путь к исходные файлы могут быть разными для каждого файла, например:
SRC_FILES = \
src/path_1/a.c \
src/path_2/b.c \
src/path_1/next_path/c.c \
src/path_4/d.c