Gnu make学习笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gnu make学习笔记相关的知识,希望对你有一定的参考价值。


# 单行注释
# 多行注释:脚本语言大多是行注释;若想多行注释,建议每行首用#号。可替代方法是行尾续行符,但这样不太好

# Makefile规则结构
# target:[prerequisites]
#  command
# 或者
# target:[prerequisites]; command
# 其中每条command需要以Tab开始,遵从shell语法。如果用“;”隔开的话,就不用Tab了
# 注意不要轻易以Tab开头,以Tab开头的命令都被交给系统shell去接手了
# make后执行的默认是第一条规则,即第一个target
# 路径上所依赖的target则是采用深度优先的递归策略逐个生成
# 不被默认target依赖的target将不会被执行,除非显式调用,比如make clean

#例子1: 最简单的Makefile
hello: main.o utils.o
  cc -o hello main.o utils.o

main.o: main.c common.h
  cc -c main.c

utils.o: utils.c common.h
  cc -c utils.c

clean:
  rm -rf hello main.o utils.o

#例子2: 用变量简化,加自动推导,Makefile默认支持cc -c main.c -o main.o自动推导出main.o,因此可省略
objects = main.o utils.o
hello: $(objects)
  cc -o hello $(objects)
clean:
  rm -rf hello $(objects)

# 默认Makefile:执行make时,依次找makefile -> Makefile,如果找不到就Stop;也可以利用自动推导,make xxx.o来编译单个文件

# 引用其他文件:其中“-”表示忽略错误
-include xxx/Makefile *.mk

# 变量定义:区别?
varA = xxx
VarB := xxx

# 变量定义中的通配符不会被通配处理,因此直接写*.o会被当做字符串,必须用wildcard函数
objects = *.o
objects = $(wildcard *.o)


# 多行变量的定义:define与endef之间包起来,会像宏一样完整展开到使用该多行变量的地方

# 条件分支:ifdef/ifndef/ifeq/ifneq

#P33

# 文件搜索路径:大型工程*.c和*.o不在同一目录时使用。如下第一种是固定写法,第二种是分类型通配,最后单个vpath是清除搜索路径
VPATH = src:inc:../headers
vpath %.c src
vpath %.h inc:../headers
vpath

# 自动化变量:
# “$^”代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。
# “[email protected]”代表规则的目标
# “$<”代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。

# 伪目标:避免当前目录下正好存在clean目标时出现困惑,另一个原因是考虑编译效率让其不生成依赖关系。方法是将其声明为.PHONY的依赖项
# 若不声明为伪目标,执行make clean时会先查找clean这个目标及其依赖关系,导致效率下降;声明为伪目标就是明确告诉它没有这个实体
# .PHONY声明后面的所有目标都是伪目标
.PHONY: clean

# 并发执行的依赖顺序,如下没有规则的target,只是指定依赖顺序,即dirA目录需要等待dirB目录先执行完make动作
dirA: dirB

#例子3: 全部通配的Makefile。此处使用了“:=”,原因?
objects := $(patsubst %.c,%.o, $(wildcard *.c))
hello: $(objects)
  cc -o [email protected] $^
.PHONY: clean
clean:
  rm -rf hello $(objects)

#P63

---- 《GNUMake.pdf》

以上是关于Gnu make学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

GNU工具链学习笔记

linux 学习笔记 GNU工具链简介

GNU LD 脚本学习笔记

Linux学习笔记

JavaScript学习笔记函数

[An Introduction to GCC 学习笔记] 05 Make外部库