¿Por qué AWK no funciona correctamente en un archivo MAKE? [duplicar
Esta pregunta ya tiene una respuesta aquí:
Escaping en makefile 2 respuestasNOTICE: Escapar no es problema, la muestra del shell es solo una muestra, en Makefile $.
GNU Makefile man dice por qué no funciona:
Tenga en cuenta que la expansión con ‘%’ en las reglas de patrón se produce después de cualquier expansión de variables o funciones, que tiene lugar cuando se lee el archivo MAKE.
- Orig. pregunta
En shell puro, el siguiente script funciona correctamente:
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 es primero: test1.cpp
Y devuelve: src1 / test1.cpp
Pero en Makefile no funciona correctamente (error comparado con 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))
Así que tomo @ simpen Makefile y verifique el valor f, y encontré alguna longitud extraña de f
...%.cpp $(SOURCES) | awk '{print ("file1.cpp" ~ $1)"."$1"."length($1)}' )
awk return falla en comparación; print devuelve "0.file1.cpp.5" para que falle con la longitud, porque ha olvidado.cpp
valor de%, información debajo. Intenté corregirlo:
...%.cpp $(SOURCES) | awk 'BEGIN{RS=" "}{if(NR == 1) f=$0".cpp"; print ("file1.cpp.cpp" ~ f)"."("file1.cpp" ~ f)"."f"."length(f)}' )
but awk return falla en todos los comparados; print devuelve "0.0.file1.cpp.cpp.9".
Compruebo awk en modo manual, así:
...%.cpp $(SOURCES) : $(shell echo %.cpp $(SOURCES) | awk '{print "src/"$1}' )
Funciona bien, pero no es una variante, porque matará el modo automático.
--Añadi
Información sobre la longitud perdida del parámetro% a AWK
...%.cppppppp $(SOURCES) | awk '{print ("file1.cpp" ~ $1)"."$1"."length($1)}' )
print devuelve "0.test2.cppppppp.10"
- Upd, algún problema
Antes, estaba imprimiendo el valor de retorno de$<
Pero la redirección de archivos muestra que el valor% no funciona en los requisitos previos (redirección de archivos: "0.%. Cpp.5").
¿Puedo usar alguna variable automática con valor en los requisitos previos?