好的,这是一段使用了上述 gnu make 内置函数的代码:
```
定义源文件
SOURCES = main.c foo.c bar.c baz.c
使用 patsubst 函数将 .c 后缀的源文件名替换为 .o 后缀
OBJECTS = $(patsubst %.c, %.o, $(SOURCES))
使用 filter 函数筛选以 b 开头的源文件
B_SOURCES = $(filter %b%, $(SOURCES))
使用 sort 函数对源文件进行排序
SORTED_SOURCES = $(sort $(SOURCES))
使用 strip 函数去除 B_SOURCES 中每个文件名的 .c 后缀
B_OBJECTS = $(strip $(patsubst %.c, %.o, $(B_SOURCES)))
使用 findstring 函数判断是否存在 main.c 文件
ifneq (,$(findstring main.c, $(SOURCES))) MAIN_EXISTS = yes endif
使用 subst 函数将所有 baz 替换为 qux
MODIFIED_SOURCES = $(subst baz,qux,$(SOURCES))
all: $(OBJECTS) @echo "Building all targets: $(OBJECTS)"
%.o: %.c @echo "Compiling $< -> $@"
打印变量的值
print-%: ; @echo $=$($)
.PHONY: clean clean: @echo "Cleaning all targets"
打印变量的值
print-variables: $(foreach V, $(sort $(.VARIABLES)), $(if $(filter-out environment% default automatic, $(origin $V)), $(warning $V=$($V) ($(value $V)))))
显示所有定义的变量
show-variables: @echo "SOURCES = $(SOURCES)" @echo "OBJECTS = $(OBJECTS)" @echo "B_SOURCES = $(B_SOURCES)" @echo "SORTED_SOURCES = $(SORTED_SOURCES)" @echo "B_OBJECTS = $(B_OBJECTS)" @echo "MAIN_EXISTS = $(MAIN_EXISTS)" @echo