码迷,mamicode.com
首页 > 其他好文 > 详细

Gnu make学习笔记

时间:2017-09-17 17:33:21      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:调用   清除   必须   gnu   --   字符串   使用   com   自动   


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

# 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

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

# 伪目标:避免当前目录下正好存在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 $@ $^
.PHONY: clean
clean:
  rm -rf hello $(objects)

#P63

---- 《GNUMake.pdf》

Gnu make学习笔记

标签:调用   清除   必须   gnu   --   字符串   使用   com   自动   

原文地址:http://www.cnblogs.com/momo0609/p/7536148.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!