Makefile学习笔记
命令规则
目标:依赖文件列表
命令
注意:
1. 目标 可以是可执行文件,目标文件,或中间文件。
2. 命令 起始字符必须为TAB字符。
3. 注释 注释使用“#”。
常用变量
变量 | 描述 |
---|---|
$@ | 规则的目标文件名 |
$< | 规则的第一个依赖文件名 |
$^ | 规则的所有依赖文件列表 |
其他
命令前加@,此命令不打印到屏幕上,但命令依旧执行。
模式规则 %.o:%.c <===> 后缀规则 .o.c:
$(make) <===> make
常用内嵌函数
函数调用的格式
$(function arguments)
(1)模式匹配函数
$(wildcard PATTERN)
例如:SOURCES = $(wildcard *.c)
(2)模式替换函数
$(patsubst PATTERN, REPLACEMENT,TEXT)
例如:OBJS = $(patsubst %.c, %.o, $(SOURCES))
等价于$(src:.c=.o)
(3)shell函数
获取当前目录下的所有子目录
例如:SUBDIR = $(shell ls -d */)
获取子目录中的.c文件
例如:SUBSRC = $(shell find $(SUBDIR) -name '*.c')
Makfile模板
支持一级目录的Makfile
# makefile 模板
# 作者:wenpeng_lu
# 日期:2017/4/30
# 适用场景:(1)多个源文件位于同一级文件夹
# (2)只生成一个可执行文件
.PHONY: install clean
CC = gcc
LIB = -lpthread
CFLAGS = -Wall -g
BIN = test
# 可执行文件通常的安装目录为 /usr/sbin
INSTALLDIR = ./
# 模式匹配
SOURCES = $(wildcard *.c)
# 模式替换
OBJS = $(patsubst %.c, %.o, $(SOURCES))
# 终极目标
$(BIN): $(OBJS)
$(CC) $(CFLAGS) $^ -o $@ $(LIB)
# 模式规则
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 可执行文件部署
install:
cp $(BIN) $(INSTALLDIR)
clean:
rm -rf $(BIN) $(OBJS)
支持二级目录的Makfile
# makefile 模板
# 作者:wenpeng_lu
# 日期:2017/4/30
# 适用场景:(1)支持二级目录
# (2)在一级目录生成一个可执行文件
.PHONY: install clean
CC = gcc
LIB = -lpthread
CFLAGS = -Wall -g
BIN = test
# 可执行文件通常的安装目录为 /usr/sbin
INSTALLDIR = ./
# 子文件夹
SUBDIR = $(shell ls -d */)
SUBSRC = $(shell find $(SUBDIR) -name '*.c')
SUBOBJ = $(SUBSRC:%.c=%.o)
# 根文件夹
ROOTSRC = $(wildcard *.c)
ROOTOBJ = $(ROOTSRC:%.c=%.o)
# 终极目标
$(BIN): $(ROOTOBJ) $(SUBOBJ)
$(CC) $(CFLAGS) $^ -o $@ $(LIB)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
install:
cp $(BIN) $(INSTALLDIR)
clean:
rm -rf $(BIN) $(ROOTOBJ) $(SUBOBJ)
支持多个makefile的makefile
# 主控makefile
# 作者:wenpeng_lu
# 日期:2017/4/30
# 适用场景:(1)多个源文件目录,且每个目录下生成一个可执行文件
# (2)本makefile调用SUBDIRS目录下的子makefile
SUBDIRS = $(shell ls -d */)
#SUBDIRS = test1 test2
.PHONY:default all clean $(SUBDIRS)
# make默认为生成all
default:all
# all,clean的生成规则相同
# 其中,$(MAKE) 等价于 make
all clean:
$(MAKE) $(SUBDIRS) TARGET=$@
$(SUBDIRS):
$(MAKE) -C $@ $(TARGET)