注意:转义没有问题,来自shell的示例只是示例,在Makefile $$中.
GNU Makefile的人说为什么它不起作用:
请注意,模式规则中使用'%'的扩展发生在读取makefile之后发生的任何变量或函数扩展之后.
--orig.问题:
在纯shell中,下一个脚本正常工作:
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;}'
Run Code Online (Sandbox Code Playgroud)
过滤器是第一个: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 $< -o $@ …Run Code Online (Sandbox Code Playgroud)