Ich habe einen Ordner für verschiedene Tests von C-Code, der viele Dateien mit dem Namen enthält *.c
. Mein Ziel ist es, ein Makefile nach jedem Dateinamen suchen zu lassen, der mit endet, .c
und die Wurzel dieses Dateinamens zu den Zielen hinzuzufügen.
Makefile
:
TARGETS = $(shell ls *.c | sed "s/\.c$//g")
all: $(TARGETS)
Das Problem besteht darin, dass der Shell-Befehl in sh wie erwartet funktioniert:
$ sh -c 'ls *.c | sed "s/\.c$//g"'
hello
...während es mit Folgendem fehlschlägt make
:
$ make
sed: 1: "s/\.c/g": unterminated substitute in regular expression
make: Nothing to be done for `all'.
Ich habe versucht, das $
as zu umgehen \$
, was stattdessen Folgendes ergibt:
`sed: 1: "s/\.c\/g": unterminated substitute pattern`
Dasselbe gilt für das Ersetzen der doppelten Anführungszeichen ( "
) durch einfache Anführungszeichen ( '
).
Antwort1
Sie müssen das maskieren $
. In make
tun Sie das mit $$
. Ihre Zeile sollte sein:
TARGETS = $(shell ls *.c | sed "s/\.c$$//g")
Obwohl diese die Fragen direkt beantwortet, scheint die Lösung von @cas besser zu sein.
Antwort2
Mit GNU Make:
objects := $(patsubst %.c,%.o,$(wildcard *.c))
all : $(objects)
Weitere Einzelheiten finden Sie unter info make
oder pinfo make
und suchen Sie nach den wildcard
Funktionen . Abhängig von Ihrer Distribution müssen Sie möglicherweise zuerst das Paket (oder einen ähnlichen Namen) installieren, um die vollständige Dokumentation zu erhalten.patsubst
make-doc
make