GNU Makefile笔记
2014-12-08 17:41
134 查看
1.重载另外一个Makefile
简单来说,当一个makefile需要另一个makefile中的变量规则时,但简单的include会导致各种重定义
那么可以采用所有匹配模式规则
#sample GNUmakefile
foo:
frobnicate > foo
%: force
@$(MAKE) -f Makefile $@
force: ;
#sample Makefile
bar:
@echo"hello"
解释:存在两个makefile,GNUmakefile and Makefile in difficent directory
在GNUmakefile文件夹中执行make bar,因为在“GUNmakefile”中没有此目标的更新规
则。make 将使用“所有匹配模式”规则,执行命令“$(MAKE) -f Makefile bar”。如
果文件“Makefile”中存在此目标更新规则的定义,那么这个规则会被执行。此过程同
样适用于其它 “GNUmakefile”中没有给出的目标更新规则。此方式的灵活之处在于:
如果在“Makefile”文件中存在同样一一个目标“foo”的重建规则,由于 make 执行时
首先读取文件“GUNmakefile”并在其中能够找到目标“foo”的重建规则,所以 make
就不会去执行这个“所有模式匹配规则”(上例中目标“%”所在的规则)。这样就避
免了使用指示符“include”包含一个 makefile 文件时所带来的目标规则的重复定义问
题("%"所有模式匹配,“-f”读取指定makefile)
2.origin函数使用
简单一句话,获取变量的出处
函数说明:
“VARIABLE”
是一个变量名而不是一个变量的引用。
因此通常它不
包含“$”
(当然,计算的变量名例外)
。
1. undefined
变量“VARIABLE”没有被定义。
2. default
变量
“VARIABLE”
是一个默认定义
(内嵌变量) 。 如
“CC”“MAKE”“RM”
、
、
等变量(参考 10.3 隐含变量 一节)
。如果在Makefile中重新定义这些变量,
函数返回值将相应发生变化。
3. environment
变量
“VARIABLE”
是一个系统环境变量,
并且make没有使用命令行选项
“-e”
(Makefile中不存在同名的变量定义,此变量没有被替代)
。参考 10.7 make
的命令行选项 一节
4. environment override
变量“VARIABLE”是一个系统环境变量,并且make使用了命令行选项“-e”
。
Makefile中存在一个同名的变量定义,使用“make -e”时环境变量值替代了
文件中的变量定义。 参考 9.7 make的命令行选项 一节
5. file
变量“VARIABLE”在某一个 makefile 文件中定义。
6. command line
变量“VARIABLE”在命令行中定义。
7. override
变量“VARIABLE”在 makefile 文件中定义并使用“override”指示符声明。
8. automatic
9.
ifdef bletch
ifeq "$(origin bletch)" "environment"
bletch = barf, gag, etc.
endif
endif
这里,如果存在环境变量“bletch”
,则对它进行重定义。
ifneq "$(findstring environment,$(origin bletch))" ""
bletch = barf, gag, etc.
endif
这个例子实现了:即使环境变量中已经存在变量“bletch”
,无论是否使用“make -e”
来执行 Makefile,变量“bletch”的值都是“barf,gag,etc”
(在 Makefile 中所定义的)
。
环境变量不能替代文件中的定义。
10.遍历子目录的文件
#这里递归遍历3级子目录
DIRS := $(shell find . -maxdepth 3 -type d)
#这里循环遍历目录的cpp文件
FILES = $(foreach dir,$(DIRS),$(wildcard $(dir)/*.cpp))
11.赋值方式简述
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
之前一直纠结makefile中“=”和“:=”的区别到底有什么区别,因为给变量赋值时,两个符号都在使用。网上搜了一下,有人给出了解答,但是本人愚钝,看不懂什么意思。几寻无果之下,也就放下了。今天看一篇博客,无意中发现作者对于这个问题做了很好的解答。解决问题之余不免感叹,有时候给个例子不就清楚了吗?为什么非要说得那么学术呢。^_^
1、“=”
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo
bar 。
2、“:=”
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
简单来说,当一个makefile需要另一个makefile中的变量规则时,但简单的include会导致各种重定义
那么可以采用所有匹配模式规则
#sample GNUmakefile
foo:
frobnicate > foo
%: force
@$(MAKE) -f Makefile $@
force: ;
#sample Makefile
bar:
@echo"hello"
解释:存在两个makefile,GNUmakefile and Makefile in difficent directory
在GNUmakefile文件夹中执行make bar,因为在“GUNmakefile”中没有此目标的更新规
则。make 将使用“所有匹配模式”规则,执行命令“$(MAKE) -f Makefile bar”。如
果文件“Makefile”中存在此目标更新规则的定义,那么这个规则会被执行。此过程同
样适用于其它 “GNUmakefile”中没有给出的目标更新规则。此方式的灵活之处在于:
如果在“Makefile”文件中存在同样一一个目标“foo”的重建规则,由于 make 执行时
首先读取文件“GUNmakefile”并在其中能够找到目标“foo”的重建规则,所以 make
就不会去执行这个“所有模式匹配规则”(上例中目标“%”所在的规则)。这样就避
免了使用指示符“include”包含一个 makefile 文件时所带来的目标规则的重复定义问
题("%"所有模式匹配,“-f”读取指定makefile)
2.origin函数使用
简单一句话,获取变量的出处
函数说明:
“VARIABLE”
是一个变量名而不是一个变量的引用。
因此通常它不
包含“$”
(当然,计算的变量名例外)
。
1. undefined
变量“VARIABLE”没有被定义。
2. default
变量
“VARIABLE”
是一个默认定义
(内嵌变量) 。 如
“CC”“MAKE”“RM”
、
、
等变量(参考 10.3 隐含变量 一节)
。如果在Makefile中重新定义这些变量,
函数返回值将相应发生变化。
3. environment
变量
“VARIABLE”
是一个系统环境变量,
并且make没有使用命令行选项
“-e”
(Makefile中不存在同名的变量定义,此变量没有被替代)
。参考 10.7 make
的命令行选项 一节
4. environment override
变量“VARIABLE”是一个系统环境变量,并且make使用了命令行选项“-e”
。
Makefile中存在一个同名的变量定义,使用“make -e”时环境变量值替代了
文件中的变量定义。 参考 9.7 make的命令行选项 一节
5. file
变量“VARIABLE”在某一个 makefile 文件中定义。
6. command line
变量“VARIABLE”在命令行中定义。
7. override
变量“VARIABLE”在 makefile 文件中定义并使用“override”指示符声明。
8. automatic
9.
ifdef bletch
ifeq "$(origin bletch)" "environment"
bletch = barf, gag, etc.
endif
endif
这里,如果存在环境变量“bletch”
,则对它进行重定义。
ifneq "$(findstring environment,$(origin bletch))" ""
bletch = barf, gag, etc.
endif
这个例子实现了:即使环境变量中已经存在变量“bletch”
,无论是否使用“make -e”
来执行 Makefile,变量“bletch”的值都是“barf,gag,etc”
(在 Makefile 中所定义的)
。
环境变量不能替代文件中的定义。
10.遍历子目录的文件
#这里递归遍历3级子目录
DIRS := $(shell find . -maxdepth 3 -type d)
#这里循环遍历目录的cpp文件
FILES = $(foreach dir,$(DIRS),$(wildcard $(dir)/*.cpp))
11.赋值方式简述
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
之前一直纠结makefile中“=”和“:=”的区别到底有什么区别,因为给变量赋值时,两个符号都在使用。网上搜了一下,有人给出了解答,但是本人愚钝,看不懂什么意思。几寻无果之下,也就放下了。今天看一篇博客,无意中发现作者对于这个问题做了很好的解答。解决问题之余不免感叹,有时候给个例子不就清楚了吗?为什么非要说得那么学术呢。^_^
1、“=”
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo
bar 。
2、“:=”
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
相关文章推荐
- gnu makefile快速看一遍后笔记点滴[原创]
- make和makefile的用法笔记
- Oracle 8i在GNU/Linux上的安装笔记
- 铁血联盟2源码学习笔记--Makefile边看边学3
- makefile学习笔记(三)
- Makefile学习笔记4:Makefile的一些模板
- Makefile学习笔记1:Linux平台Makefile文件的编写基础篇(zz)
- RHCE课程-RH033Linux基础笔记一之Linux起源、GNU简介、发行版本介绍及特点
- GNU/Linux 编程指南学习笔记之four : diff & patch
- makefile学习笔记(二)
- Oracle 8i在GNU/Linux上的安装笔记
- GNU make and Makefile
- Makefile学习笔记
- GNU 自动工具生成Makefile流程图解
- GNU中的Makefile
- makefile 笔记
- GNU/Linux下库机制笔记
- vivi_Makefile分析笔记
- Makefile学习笔记3:Linux下makefile基础 (zz)
- GNU Make 学习笔记(一)