Makefile编写指南
基本结构
# 目标:依赖
# recipe (TAB-indented!)
.PHONY: all clean test
CC = gcc
CFLAGS = -Wall -O2
all: myapp
myapp: main.o utils.o
$(CC) $(CFLAGS) -o $@ $^
main.o: main.c main.h
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f *.o myapp
test: all
./myapp --test
自动变量
| 变量 | 含义 |
|---|---|
| $@ | 目标名称 |
| $< | 第一个依赖 |
| $^ | 所有依赖 |
| $? | 比目标新的依赖 |
| $* | 模式规则的茎 |
| $(@D) | 目标目录 |
| $(@F) | 目标文件名 |
函数与模式
SRCS := $(wildcard src/*.c)
OBJS := $(patsubst src/%.c,obj/%.o,$(SRCS))
# 模式规则
obj/%.o: src/%.c
@mkdir -p $(@D)
$(CC) $(CFLAGS) -c $< -o $@
# 字符串函数
UPPER := $(shell echo $(NAME) | tr a-z A-Z)
FILTERED := $(filter %.c, $(FILES))
WITHOUT := $(filter-out test_%.c, $(SRCS))
# 条件
ifeq ($(OS),Windows_NT)
EXE = .exe
else
EXE =
endif