<分区>
注意:转义不是问题,来自 shell 的示例只是示例,在 Makefile $$ 中。
GNU Makefile man说明为什么它不起作用:
Note that expansion using ‘%’ in pattern rules occurs after any variable or function expansions, which take place when the makefile is read.
--原点。问题:
在纯 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;}'
先过滤: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 $@ $(addprefix -I,$(LOCAL_PATHS_HEADERS))
所以我采用简单的在Makefile中检查值f,发现一些奇怪的f长度
...%.cpp $(SOURCES) | awk '{print ("file1.cpp" ~ $$1)"."$$1"."length($$1)}' )
awk return 比较失败;
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)}' )
但是 awk return 在所有比较中都失败了;打印返回“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)}' )
打印返回“0.test2.cppppppp.10”
--Upd,有问题
上面,我正在打印 $<
的返回值
但是文件重定向显示值 % 在先决条件中不起作用(文件重定向:“0.%.cpp.5”)。
我可以在先决条件中使用任何带值的自动变量吗?