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 .c
y 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 make
o pinfo make
y busque las funciones wildcard
y patsubst
para obtener más detalles. Dependiendo de su distribución, es posible que primero necesite instalar el make-doc
paquete (o un nombre similar) para obtener la make
documentación completa.