6. 静态模式规则
静态模式规则 是一种应用于指定目标的模式规则。
模式规则是通用的规则,静态模式规则你可以认为他是为某些文件制定的专用的模式规则。
语法:
目标文件列表 : 目标文件模式 : 依赖文件模式
<制表符> 命令1
<制表符> 命令2
...
示例:
使用静态模式规则,在编写 main.o 时使用一种模式规则。在编译 file1.o 和 file2.o 时使用另外一种模式规则。
改写后的 Makefile,如下:
.PHONY: all clean
SOURCES := file1.c file2.c main.c
HEADERS := file1.h file2.h
OBJECTS := file1.o file2.o main.o
TARGET := myapp
# 修改隐含规则的变量,更改编译命令
CC = gcc
CFLAGS = -g -Wall
all: $(TARGET) # 编译最终目标
$(TARGET) : $(OBJECTS)
gcc -o $@ $^
# 自定义静态模式规则1
main.o : %.o : %.c
gcc -o $@ -c $<
echo "pattern rule 1..."
# 自定义静态模式规则2
file1.o file2.o : %.o : %.c $(HEADERS)
gcc -c $< -I.
echo "pattern rule 2..."
clean: # 清除目标文件
rm $(OBJECTS)
多目标规则
上述规则 file1.o file2.o : %.o : %.c $(HEADERS) 是多目标规则,每个目标会单独执行相应命令,自动变量 $@ 置代表当前正在处理的目标。
执行 make 命令后则结果如下:
weimz@anonymous myapp % make
gcc -c file1.c -I.
echo "pattern rule 2..."
pattern rule 2...
gcc -c file2.c -I.
echo "pattern rule 2..."
pattern rule 2...
gcc -o main.o -c main.c
echo "pattern rule 1..."
pattern rule 1...
gcc -o myapp file1.o file2.o main.o
运行结果可以看出,在编译 file1.o 和 file2.o 时使用的是规则 file1.o file2.o : %.o : %.c $(HEADERS),而编译 main.o 时使用的是规则 main.o : %.o : %.c。
实验:
尝试使用静态模式规则。