Makefile-Shell ignoriert sed regexp Zeilenende

Makefile-Shell ignoriert sed regexp Zeilenende

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, .cund 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 maketun 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 makeoder pinfo makeund suchen Sie nach den wildcardFunktionen . 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.patsubstmake-docmake

verwandte Informationen