Makefile shell ignorando el final de línea de sed regexp

Makefile shell ignorando el final de línea de sed regexp

Tengo una carpeta para varias pruebas de código C, que contiene muchos archivos llamados *.c. Mi objetivo es hacer que un Makefile busque cualquier nombre de archivo que termine en .cy agregar la raíz de ese nombre de archivo a los destinos.

Makefile:

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

El problema es que el comando de shell funciona como se esperaba en sh:

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

...mientras falla con make:

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

Intenté escapar del $as \$, que en su lugar produce:

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

Lo mismo ocurre con la sustitución de las comillas dobles ( ") por comillas simples ( ').

Respuesta1

Necesitas escapar del $. En make, lo haces usando $$. Tu línea debería ser:

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

Aunque ésta responde las preguntas directamente, la solución de @cas parece ser mejor.

Respuesta2

Con GNU Hacer:

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

all : $(objects)

Consulte info makeo pinfo makey busque las funciones wildcardy patsubstpara obtener más detalles. Dependiendo de su distribución, es posible que primero necesite instalar el make-docpaquete (o un nombre similar) para obtener la makedocumentación completa.

información relacionada