Makefile常用

1、makefile主要5个部分:

1.1、显示规则 :: 说明如何生成一个或多个目标文件(包括 生成的文件, 文件的依赖文件, 生成的命令)

1.2、隐晦规则 :: make的自动推导功能所执行的规则

1.3、变量定义 :: Makefile中定义的变量

1.4、文件指示 :: Makefile中引用其他Makefile; 指定Makefile中有效部分; 定义一个多行命令

1.5、注释 :: Makefile只有行注释 “#”, 如果要使用或者输出"#"字符, 需要进行转义, "#"

target ... : prerequisites ...

command ...

...

2、通配符:

* :表示任意一个或多个字符

? :表示任意一个字符

[...] :xx.[abcd]表示a,b,c,d中 的任意一个字符;[^abcd]表示除a,b,c,d以外的字符,[0~9]表示0~9任意一个数字

~ :表示用户的home目录

3、路径搜索

3.1 当前目录中找不到文件时, 按顺序从 src目录 ../parent-dir目录中查找文件

VPATH src:../parent-dir

3.2 .h结尾的文件都从 ./header 目录中查找

VPATH %.h ./header

3.3 清除示例2中设置的规则

VPATH %.h

3.4 清除所有VPATH的设置

VPATH

4、Makefile中的变量

4.1 变量定义(= or :=)

两者的区别: :=只能使用前面定义好的变量,=可以使用后面定义的变量

(1)

OBJS2 = $(OBJS1) programC.o

OBJS1 = programA.o programB.o

all:

@echo $(OBJS2)

执行make:

$make

programA.o programB.o programC.or

(2)

OBJS2 := $(OBJS1) programC.o

OBJS1 := programA.o programB.o

all:

@echo $(OBJS2)

执行make:

$make

programC.o

4.2 变量替换

# Makefile内容

SRCS := programA.c programB.c programC.c

OBJS := $(SRCS:%.c=%.o)

all:

@echo "SRCS: " $(SRCS)

@echo "OBJS: " $(OBJS)

# bash中运行make

$ make

SRCS: programA.c programB.c programC.c

OBJS: programA.o programB.o programC.o

4.3 变量追加值 +=

# Makefile内容

SRCS := programA.c programB.c programC.c

SRCS += programD.c

all:

@echo "SRCS: " $(SRCS)

# bash中运行make

$ make

SRCS: programA.c programB.c programC.c programD.c

4.4 变量覆盖 override

作用是使Makefile中定义的变量能够覆盖make命令参数中指定的变量

# Makefile内容 (没有用override)

SRCS := programA.c programB.c programC.c

all:

@echo "SRCS: " $(SRCS)

# bash中运行make

$ make SRCS=nothing

SRCS: nothing

#################################################

# Makefile内容 (用override)

override SRCS := programA.c programB.c programC.c

all:

@echo "SRCS: " $(SRCS)

# bash中运行make

$ make SRCS=nothing

SRCS: programA.c programB.c programC.c

4.5 目标变量

作用是使变量的作用域仅限于这个目标(target),而不是对整个Makefile都有效

# Makefile 内容

SRCS := programA.c programB.c programC.c

target1: TARGET1-SRCS := programD.c

target1:

@echo "SRCS: " $(SRCS)

@echo "SRCS: " $(TARGET1-SRCS)

target2:

@echo "SRCS: " $(SRCS)

@echo "SRCS: " $(TARGET1-SRCS)

# bash中执行make

$ make target1

SRCS: programA.c programB.c programC.c

SRCS: programD.c

$ make target2

SRCS: programA.c programB.c programC.c

SRCS:

5、Makefile命令前缀

可以加两种前缀 @和-,或者不用前缀

不用前缀:输出执行的命令以及命令执行结果,出错的话停止执行

@前缀:只输出命令执行的结果,出错的话停止执行

-前缀:命令执行有错的话,忽略错误,继续执行

6、伪目标

伪目标并不是一个“目标(target)”,不像真正的目标那样会生成一个目标文件

典型的伪目标是Makefile中用来清理编译过程中中间文件的clean伪目标

.PHONY: clean

clean:

-rm -f *.o

7、引用其他的Makefile

语法:include(filename 可以包含通配符和路径)

8、查看C文件的依赖关系

例子:

显示内核源码中virt/kvm/kvm_main.c 中的依赖关系

$ cd virt/kvm/

$ gcc -MM kvm_main.c

kvm_main.o: kvm_main.c iodev.h coalesced_mmio.h async_pf.h

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值