Eu tenho uma pasta para vários testes de código C, contendo muitos arquivos chamados *.c
. Meu objetivo é fazer com que um Makefile procure qualquer nome de arquivo que termine em .c
e adicione a raiz desse nome de arquivo aos destinos.
Makefile
:
TARGETS = $(shell ls *.c | sed "s/\.c$//g")
all: $(TARGETS)
O problema é que o comando shell funciona conforme esperado em sh:
$ sh -c 'ls *.c | sed "s/\.c$//g"'
hello
... enquanto falha com make
:
$ make
sed: 1: "s/\.c/g": unterminated substitute in regular expression
make: Nothing to be done for `all'.
Tentei escapar do $
as \$
, que produz:
`sed: 1: "s/\.c\/g": unterminated substitute pattern`
O mesmo vale para substituir as aspas duplas ( "
) por aspas simples ( '
).
Responder1
Você precisa escapar do $
. Em make
, você faz isso usando $$
. Sua linha deve ser:
TARGETS = $(shell ls *.c | sed "s/\.c$$//g")
Embora este responda diretamente às perguntas, a solução do @cas parece ser melhor.
Responder2
Com GNU Make:
objects := $(patsubst %.c,%.o,$(wildcard *.c))
all : $(objects)
Consulte info make
ou pinfo make
e pesquise as funções wildcard
e patsubst
para obter mais detalhes. Dependendo da sua distribuição, pode ser necessário instalar o make-doc
pacote (ou nome semelhante) primeiro para obter a make
documentação completa.