Оболочка Makefile игнорирует конец строки sed regexp

Оболочка Makefile игнорирует конец строки sed regexp

У меня есть папка для различных тестов кода C, содержащая множество файлов с именами *.c. Моя цель — заставить Makefile искать все имена файлов, заканчивающиеся на , .cи добавлять корень этого имени файла в цели.

Makefile:

TARGETS = $(shell ls *.c | sed "s/\.c$//g")
all: $(TARGETS)

Проблема в том, что команда shell работает так, как и ожидалось в sh:

$ sh -c 'ls *.c | sed "s/\.c$//g"'
hello

...хотя это не удается с make:

$ make
sed: 1: "s/\.c/g": unterminated substitute in regular expression
make: Nothing to be done for `all'.

Я попробовал экранировать $as \$, но вместо этого получил:

`sed: 1: "s/\.c\/g": unterminated substitute pattern`

То же самое касается замены двойных кавычек ( ") на одинарные ( ').

решение1

Вам нужно экранировать $. В make, вы делаете это с помощью $$. Ваша строка должна быть:

TARGETS = $(shell ls *.c | sed "s/\.c$$//g")

Хотя это решение напрямую отвечает на вопросы, решение @cas, похоже, лучше.

решение2

С помощью GNU Make:

objects := $(patsubst %.c,%.o,$(wildcard *.c))

all : $(objects)

См. info makeили pinfo makeи найдите функции wildcardи patsubstдля получения более подробной информации. В зависимости от вашего дистрибутива вам может потребоваться make-docсначала установить пакет (или похожее имя), чтобы получить полную makeдокументацию.

Связанный контент