Makefile

Makefile变量

为了简化和维护Mackfile,可以在Mackfile中使用变量,格式 varname=some_text

引用变量的值:$(varname) 按照惯例,在Mackfile中,变量一般大写

Makefile自动化变量

选项名 作用
$@ 规则的目标文件名
$< 规则的第一个依赖文件名
$^ 规则的所有依赖文列表
$* 不包括后缀名的当前依赖文件名
$? 当前目标所依赖的文件列表中比当前目标文件还要新的文件

综合示例

.PHONY: clean
.SUFFIXES: .c .o
.c.o:
    gcc -Wall -g -o $@ -c $^

OBJECTS = main.o sub.o add.o
SOURCES = $(OBJECTS:.o=.c)

main: $(OBJECTS)
    gcc -Wall -g -o $@ $^

clean:
    @echo "delete execute file and object file..."
    rm -f $(OBJECTS) main

注解

.SUFFIXES:.c .o 表示任何x.c文件与x.o文件关联


Make使用隐含推导规则/生成多个可执行文件

示例 生成多个可执行文件1

.PHONY: clean all

BIN = 01test 02test

all: $(BIN)

clean:
    -rm -f $(BIN)

示例 生成多个可执行文件2-使用自己定制的规则,生成.o中间文件

.PHONY: clean all

BIN = 01test 02test
OBJECTS = $(BIN:=.o)

all: $(BIN)

01test.o: 01test.c
02test.o: 02test.c

clean:
-rm -f $(BIN) $(OBJECTS)

示例 生成多个可执行文件3-使用更加细致的规则

.PHONY: clean all

CFLAGS = -g -Wall
CC = gcc

BIN = 01test 02test
OBJECTS = $(BIN:=.o)

.SUFFIXES: .c .o
.c.o:
    $(CC) $(CFLAGS) -c $< -o $@

all: $(BIN)

01test.o: 01test.c
02test.o: 02test.c

clean:
    -rm -f $(BIN) $(OBJECTS)


模式规则与后缀规则

%.o:%.c .c.o:

示例

.PHONY: clean all

CC = gcc
CFLAGS = -Wall -g
BIN = 01test 02test
SOURCES = $(BIN:=.c)
OBJECTS = $(BIN:=.o)

all: $(BIN)

01test: 01test.o
02test: 02test.o

#%.o: %.c #模式规则
#   $(CC) $(CFLAGS) -c $< -o $@
.c.o:  #后缀规则,与前作用相同
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    -rm -rf $(BIN) $(OBJECTS)