GNU Makefile笔记
来源:互联网 发布:dmsp ols夜间灯光数据 编辑:程序博客网 时间:2024/05/04 19:43
简单来说,当一个makefile需要另一个makefile中的变量规则时,但简单的include会导致各种重定义
那么可以采用所有匹配模式规则
#sample GNUmakefile
foo:
frobnicate > foo
@$(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)
简单一句话,获取变量的出处
函数说明:
“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笔记
- GNU Makefile 笔记 foreach wildcard patsubst
- GNU Makefile
- Makefile-----GNU
- 《GNU make项目管理》笔记--简单的makefile
- GNU make 和 makefile
- GNU make 和 makefile
- GNU中的Makefile
- GNU中的Makefile
- 一个智能GNU makefile
- GNU make and Makefile
- GNU make 和 makefile
- GNU Makefile示例
- GNU makefile 指南
- [转载]GNU makefile
- GNU make 和 makefile
- GNU Makefile 之 (详述)
- GNU make 和 makefile
- 《C++ concurrency in action》 读书笔记 -- Part 4 第五章 C++的多线程内存模型 (1)
- 安装部署CloudStack 4.0企业私有云平台
- 【公告】C币兑换平台上线
- MongoDB中的聚合操作
- Unity3D,Finite State Machine
- GNU Makefile笔记
- 那些不能错过的Xcode插件
- Matrox MIL9.0卸载和安装过程
- Codeforces9D(树形dp)
- java 循环读取一个指定文件夹下的所有文件
- jquery validate 验证
- 如何将本地音频文件设置为ringtone、notifications、alarm等
- CSS精灵写法
- java a&b与a&&b的区别 a|b与a||b的区别 break、continue、return