Почему AWK не работает правильно в make-файле? [Дубликат]
На этот вопрос уже есть ответ:
Выход в makefile 2 ответаПРИМЕЧАНИЕ: выход из строя не проблема, выборка из оболочки - это только пример, в Makefile $.
GNU Makefile man говорит, почему это не работает:
Обратите внимание, что раскрытие с использованием «%» в правилах шаблонов происходит после любых расширений переменных или функций, которые имеют место при чтении make-файла.
- Orig. вопрос
В чистой оболочке следующий скрипт работает правильно:
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;}'
Фильтр первый: test1.cpp
И он возвращает: src1 / test1.cpp
Но в Makefile он работает неправильно (ошибка по сравнению с 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))
Так что я беру простой в Makefile и проверьте значение f, и нашли странную длину f
...%.cpp $(SOURCES) | awk '{print ("file1.cpp" ~ $1)"."$1"."length($1)}' )
озврат @awk не выполнен в сравнении; print возвращает «0.file1.cpp.5» с ошибкой длины, потому что она забыла.cpp
значение%, информация ниже. Я попытался исправить это:
...%.cpp $(SOURCES) | awk 'BEGIN{RS=" "}{if(NR == 1) f=$0".cpp"; print ("file1.cpp.cpp" ~ f)"."("file1.cpp" ~ f)"."f"."length(f)}' )
bw awk return fail во всех сравниваемых; print возвращает "0.0.file1.cpp.cpp.9".
Я проверяю awk в ручном режиме, вот так:
...%.cpp $(SOURCES) : $(shell echo %.cpp $(SOURCES) | awk '{print "src/"$1}' )
Это отлично работает, но это не вариант, потому что это убьет автоматический режим.
--Добавлят
Информация о потерянной длине от параметра% до AWK
...%.cppppppp $(SOURCES) | awk '{print ("file1.cpp" ~ $1)"."$1"."length($1)}' )
print возвращает "0.test2.cppppppp.10"
- Upd, какая-то проблема
Выше я печатал возвращаемое значение из$<
Но перенаправление файла показывает, что значение% не работает в предварительных условиях (перенаправление файла: «0.%. Cpp.5»).
Могу ли я использовать любую автоматическую переменную со значением в предварительных условиях?