6. 静态模式规则

静态模式规则 是一种应用于指定目标的模式规则。

模式规则是通用的规则,静态模式规则你可以认为他是为某些文件制定的专用的模式规则。

语法:

目标文件列表 : 目标文件模式 : 依赖文件模式
<制表符> 命令1
<制表符> 命令2
...

示例:

使用静态模式规则,在编写 main.o 时使用一种模式规则。在编译 file1.ofile2.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.ofile2.o 时使用的是规则 file1.o file2.o : %.o : %.c $(HEADERS),而编译 main.o 时使用的是规则 main.o : %.o : %.c

实验:

尝试使用静态模式规则。