Makefile: удаление списка файлов, соответствующих нескольким усеченным именам файлов из другого списка - PullRequest
0 голосов
/ 23 марта 2020

В 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

1 Ответ

2 голосов
/ 23 марта 2020

Преобразование тестовых файлов в шаблон, соответствующий имени файла:

TEST_PATTERNS = $(addprefix %/,$(patsubst test_%,%,$(notdir $(TEST_FILES))))

Теперь вы можете использовать фильтр:

$(filter-out $(TEST_PATTERNS),$(SRC_FILES))

Или, если вы действительно хотите указать c путь не шаблон, который вы можете использовать $(addprefix src/path/,$(...))

...