У меня есть папка для различных тестов кода 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
документацию.