shell Makefile ignorando o final da linha de expressão regular

2

Eu tenho uma pasta para vários testes de código C, contendo muitos arquivos chamados *.c . Meu objetivo é fazer uma busca no Makefile para qualquer nome de arquivo terminado em .c e adicionar a raiz desse nome de arquivo aos alvos.

Makefile :

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

A questão é que o comando shell funciona como 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'.

Eu tentei escapar do $ as \$ , o que gera:

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

O mesmo vale para substituir as aspas duplas ( " ) por aspas simples ( ' ).

    
por svenper 01.11.2015 / 02:16

2 respostas

2

Com o 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 distro, você pode precisar instalar o pacote make-doc (ou nome similar) primeiro para obter a documentação completa do make .

    
por 01.11.2015 / 02:32
5

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 às perguntas diretamente, a solução da @ cas parece ser melhor.

    
por 01.11.2015 / 02:31