Makefile学习笔记

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值