Shell Makefile ignorando sed regexp final da linha

Shell Makefile ignorando sed regexp final da linha

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 .ce 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 makeou pinfo makee pesquise as funções wildcarde patsubstpara obter mais detalhes. Dependendo da sua distribuição, pode ser necessário instalar o make-docpacote (ou nome semelhante) primeiro para obter a makedocumentação completa.

informação relacionada