GNU Makefile笔记

来源:互联网 发布:dmsp ols夜间灯光数据 编辑:程序博客网 时间:2024/05/04 19:43
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 了。


















































0 0
原创粉丝点击