Warum funktioniert AWK in einem Makefile nicht richtig? [Duplikat
Diese Frage hat hier bereits eine Antwort:
Escaping in makefile 2 AntwortenHINWEIS: Escaping kein Problem, Probe von Shell ist nur Probe, in Makefile $.
GNU Makefile man sagt warum es nicht funktioniert:
Beachten Sie, dass die Erweiterung mit '%' in Musterregeln nach jeder Variablen- oder Funktionserweiterung erfolgt, die beim Lesen des Makefiles erfolgt.
- Orig. Frage
In der reinen Shell funktioniert das nächste Skript korrekt:
echo "test2.cpp src2/test2.cpp src1/test1.cpp src1/test.cpp" | \
awk 'BEGIN{RS=" "}{if(NR == 1) f=$0; else if(match($0, f)) print $0;}'
Filter ist zuerst: test1.cpp
Und es wird zurückgegeben: src1 / test1.cpp
Aber in Makefile funktioniert es nicht richtig (Fehler im Vergleich zu awk):
OBJ_DIR:=obj
SOURCES:=$(wildcard */*.cpp *.cpp)
OBJECTS_LOCAL:= $(addprefix $(OBJ_DIR)/, $(notdir $(SOURCES:.cpp=.o)))
LOCAL_PATHS_HEADERS:=$(sort $(dir $(wildcard *.h */*.h)))
TARGET:=libcommon.a
all:$(TARGET)
$(TARGET): $(OBJECTS_LOCAL)
ar -rcs $@ $^
$(OBJECTS_LOCAL): $(OBJ_DIR)/%.o : $(shell echo %.cpp $(SOURCES) | awk 'BEGIN{RS=" "}{if(NR == 1) f=$0; else if($0 ~ f) print $0;}' )
@mkdir -p $(OBJ_DIR)
@$(CC) -c OBJ_DIR:=obj
SOURCES:=$(wildcard */*.cpp *.cpp)
OBJECTS_LOCAL:= $(addprefix $(OBJ_DIR)/, $(notdir $(SOURCES:.cpp=.o)))
LOCAL_PATHS_HEADERS:=$(sort $(dir $(wildcard *.h */*.h)))
TARGET:=libcommon.a
all:$(TARGET)
$(TARGET): $(OBJECTS_LOCAL)
ar -rcs $@ $^
$(OBJECTS_LOCAL): $(OBJ_DIR)/%.o : $(shell echo %.cpp $(SOURCES) | awk 'BEGIN{RS=" "}{if(NR == 1) f=$$0; else if($$0 ~ f) print $$0;}' )
@mkdir -p $(OBJ_DIR)
@$(CC) -c $< -o $@ $(addprefix -I,$(LOCAL_PATHS_HEADERS))
lt; -o $@ $(addprefix -I,$(LOCAL_PATHS_HEADERS))
So nehme ich einfachin Makefile und überprüfe den Wert f und finde eine merkwürdige Länge von f
...%.cpp $(SOURCES) | awk '{print ("file1.cpp" ~ $1)"."$1"."length($1)}' )
awk Rückkehr scheitern im Vergleich; print gibt "0.file1.cpp.5" zurück, um einen Fehler mit der Länge zu verursachen, da es @ vergessen h.cpp
wert von%, info unten. Ich habe versucht, es zu korrigieren:
...%.cpp $(SOURCES) | awk 'BEGIN{RS=" "}{if(NR == 1) f=$0".cpp"; print ("file1.cpp.cpp" ~ f)"."("file1.cpp" ~ f)"."f"."length(f)}' )
aber awk return scheitern alle verglichen; print gibt "0.0.file1.cpp.cpp.9" zurück.
Ich überprüfe awk im manuellen Modus wie folgt:
...%.cpp $(SOURCES) : $(shell echo %.cpp $(SOURCES) | awk '{print "src/"$1}' )
Es funktioniert gut, aber es ist keine Variante, da es den automatischen Modus beendet.
--Hinzufüge
Information über verlorene Länge von Parameter% zu AWK
...%.cppppppp $(SOURCES) | awk '{print ("file1.cpp" ~ $1)"."$1"."length($1)}' )
print gibt "0.test2.cppppppp.10" zurück
- Update, ein Problem
Oben habe ich den Rückgabewert von @ gedruc$<
Aber die Dateiumleitung zeigt an, dass der Wert% in den Voraussetzungen nicht funktioniert (Dateiumleitung: "0.%. Cpp.5").
Kann ich eine automatische Variable mit Wert in den Voraussetzungen verwenden?