makefile
qwaszx523
努力成长的小菜鸟
展开
-
make的命令行选项
make支持的所有命令行参数(这些参数可以通过 make 的 man 手册查看):-b-m忽略,提供其它版本 make 兼容性。-B--always-make强制重建所有的规则中出现的目标文件。-C DIR--directory=DIR在读取Makefile之前,进入目录“DIR”,就是切换工作目录到“DIR”之后执行make。存在多个“-C”选项时, make的最终工作目录转载 2017-09-27 14:52:53 · 765 阅读 · 0 评论 -
make隐含规则
“隐含规则”为 make 提供了重建一类目标文件通用方法,不需要在 Makefile 中明确地给出重建某一个目标的命令,甚至可以不用写出明确的规则。make会自动根据已存在(或者可以被创建)的源文件类型来启动相应的隐含规则。1、make会对那些没有命令行的规则、 双冒号规则寻找一个隐含规则来执行。 注意:如果规则存在命令行,则make就会执行命令行,不会启动隐含规则。2、作为一个规则的原创 2017-09-27 17:06:14 · 412 阅读 · 0 评论 -
makefile模式规则
模式规则类似于普通规则,只是在模式规则中,目标的定义中需要包含“%”字符(确切地说是一个),包含“%”的目标被用来匹配一个文件名,“%”可以匹配任何非空字符串。1、文件名中“%”匹配的部分称为“茎”。2、规则的依赖文件中同样可以使用“%”,依赖中的“%”的取值情况由“茎”决定。3、规则的依赖文件也可以不包含模式字符“%”,此时,它表示所有符合目标模式的目标文件都依赖于一个指定的文件。4原创 2017-09-27 17:19:58 · 1044 阅读 · 0 评论 -
makefile万用规则
当一个模式规则的目标为“%”(它可以匹配任何文件名)时,我们称这个规则为万用规则。原创 2017-09-27 17:21:12 · 275 阅读 · 0 评论 -
make缺省规则
当在Makefile中没有重建的规则时(没有重建它的明确规则和可用的隐含规则)就执行这个缺省规则的命令来创建它。定义这样一个规则,我们可以使用最终万用规则来实现。如可以在Makefile中定义这样一个规则:%:: touch $@对没有找到的所有的文件使用“touch”命令创建一个空的文件。实现一个缺省规则的方式也可以不使用万用规则来实现, 可以使用伪目标“.DEFAULT”实现:.D原创 2017-09-27 17:26:08 · 1118 阅读 · 0 评论 -
makefile规则语法
通常规则的语法格式如下:TARGETS : PREREQUISITESCOMMAND...或者是这样:TARGETS : PREREQUISITES ; COMMANDCOMMAND...规则中“ TARGETS”可以是空格分开的多个文件名,也可以是一个标签(如执行清空的“clean”)。“TARGETS”的文件名可以使用通配符。通常规则只有一个目标文件,偶尔会在一个规则中需要原创 2017-09-26 10:27:14 · 284 阅读 · 0 评论 -
makefile变量的定义
一、变量名Makefile变量名是不包括":"、"#"、"="、前置空白和尾空白的任何字符串。(1)变量名最好由字母、数字和下划线组成 尽管在GNU make中没有对变量的命名有其它的限制,但是字母、数字和下划线以外的字符 可能会在make的后续版本中被赋予特殊的含义。(2)变量名大小写敏感(3)变量名中可以包含函数或者其它变量的引用(4)变量的值在长度上没有限制。值较长时可以原创 2017-09-22 17:23:19 · 1096 阅读 · 1 评论 -
makefile双冒号规则
双冒号规则就是使用“::”代替普通规则的“:”得到的规则。双冒号规则允许在多个规则中为同一个目标指定不同的重建目标的命令,1、Makefile中多规则目标的规则类型必须一致,要么都是普通规则,要么都是双冒号规则。而不允许一个目标同时出现在两种不同的规则中。2、多规则目标的每个规则会被独立的处理, 而不是像普通规则那样合并所有的依赖到一个目标文件。这就意味着对这些规则的处理就像多个不同的原创 2017-09-27 09:57:08 · 752 阅读 · 0 评论 -
make替换变量的定义
执行make时,一个含有“=”的命令行参数“V=X”的含义是将变量“V”的值设置为“X”。通过这种方式定义的变量会替代在Makefile中同名变量定义(如果存在,并且在Makefile中没有使用指示符“override” 对这个变量进行生命),称之为命令行参数定义覆盖普通变量定义。通过命令行参数定义变量时,也存在两种风格的变量定义:递归展式定义和直接展开式定义。除非在命令行原创 2017-09-27 14:26:37 · 570 阅读 · 0 评论 -
makefile终极目标
所谓终极目标就是make最终所要重建的、 Makefile中某个规则的目标。为了完成对终极目标的重建,可能会触发它的依赖或者依赖的依赖文件被重建的过程。默认情况下,终极目标就是出现在Makefile中,除以点号“.”开始的第一个规则中的第一个目标(如果第一个规则存在多个目标)。 在Makefile所在的目录下执行“make”时,将完成对默认终极目标的重建。另外,也可以通过命令行将原创 2017-09-26 14:00:24 · 1403 阅读 · 0 评论 -
makefile自动化变量
在模式规则中,规则的目标和依赖文件名代表了一类文件名。命令是对所有这一类文件重建过程的描述,显然,在命令中不能指定特定的文件名,否则模式规则将没有了意义。那么在模式规则的命令行中该如何表示文件,将成我们这一小节的讨论重点。 make中使用了“自动环变量”来实现这个目的,自动化变量的取值是根据具体的规则决定的,就是说对不同的规则其所代表的文件名不同。前边我们也看到了很多例子中使用到了自动化转载 2017-09-27 17:50:43 · 262 阅读 · 0 评论 -
makefile后缀规则
后缀规则是一种老风格定义隐含规则的方式。新版本的make中使用模式规则取代了这种实现方式,模式规则和它相比更加清晰明了。现在版本保留它的原因只是为了能够兼容旧的makefile文件。后缀规则有两种类型:“双后缀”和“单后缀”。双后缀规则定义一对后缀:目标文件的后缀和依赖目标的后缀。它匹配所有后缀为指定目标后缀的文件名。对于一个匹配的目标文件,它的依赖文件是这样形成:将目标文件中的后缀替换为转载 2017-09-27 17:31:39 · 5200 阅读 · 0 评论 -
指定makefile文件
默认情况下,make会在工作目录(执行make的目录)下依次搜索名为“GNUmakefile”、“makefile”和“Makefile”的文件,搜到到文件就停止搜索,然后解析执行该文件,如果make程序在工作目录下无法找到以上三个文件中的任何一个,它将不读取任何其他文件作为解析对象。“GNUmakefile”只有“GNUmake”才可以识别,而其他版本的make程序只会在工作目录下搜索原创 2017-09-26 10:12:55 · 2855 阅读 · 0 评论 -
makefile静态模式
静态模式规则的基本语法:TARGETS ...: TARGET-PATTERN: PREREQ-PATTERNS ... COMMANDS ...“ TAGETS”列出了此规则的一系列目标文件。像普通规则的目标一样可以包含通配符。“TAGET-PATTERN”和“ PREREQ-PATTERNS”说明了如何为每一个目标文件生成依赖文件。从目标模式( TAGET-PATTERN)的目标名转载 2017-09-27 09:32:52 · 371 阅读 · 0 评论 -
模块的编译方式
转自http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/Android 源码中包含了许多的模块,模块的类型有很多种,例如:Java 库,C/C++ 库,APK 应用,以及可执行文件等 。并且,Java 或者 C/C++ 库还可以分为静态的或者动态的,库或可执行文件既可能是针对设备(本文的“设备”指的转载 2016-09-19 11:31:16 · 484 阅读 · 0 评论 -
编译环境变量
转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/为了方便模块的编译,Build 系统设置了很多的编译环境变量。要编译一个模块,为了方便模块的编译,Build 系统设置了很多的编译环境变量。要编译一个模块,只要在编译之前根据需要设置这些变量然后执行编译即可。它们包括:LOCAL_SRC_FILES:转载 2016-09-19 11:34:06 · 682 阅读 · 0 评论 -
Makefile origin 函数
http://blog.chinaunix.net/uid-22028680-id-3054167.htmlorigin 函数的作用是告诉你变量是哪里来的,其出生状况如何,他并不改变变量。其语法是: $(origin varname)下面用实例说明:origin 函数的作用是告诉你变量是哪里来的,其出生状况如何,他并不改变变量。其语法是:$(origin转载 2016-11-18 16:05:43 · 421 阅读 · 0 评论 -
makefile $(Q)
位于主目录下的Makefile对Q变量进行了定义。ifeq($(KBUILD_VERBOSE),1) quiet = Q =else quiet=quiet_ Q = @endifQ的命运由KBUILD_VERBOSE的值来决定,而螳螂捕蝉,黄雀在后。V最终决定了Q的命运,通过在make命令参数中提供V=1可以开启V原创 2016-11-18 16:06:27 · 6907 阅读 · 0 评论 -
$@,$^,$<
Makefile有三个非常有用的变量。分别是$@,$^,$$@--目标文件,$^--所有的依赖文件,$原创 2016-11-18 16:08:38 · 353 阅读 · 0 评论 -
makefile中 = := ?= +=的区别
= 是最基本的赋值:= 是覆盖之前的值?= 是如果没有被赋值过就赋予等号后面的值+= 是添加等号后面的值原创 2016-11-18 16:12:14 · 230 阅读 · 0 评论 -
Makefile中的 FORCE
FORCE 首先分析一下这个依赖,它的规则定式义在内核源码主目录的Makefile中: PHONY += FORCE FORCE: 这个规则没有命令也没有依赖,它的目标也不是一个存在的文件名。fu在执行此规则时,目标FORCE总会被认为是最新的。这样当它作为其它规则的依赖时,因为依赖总被认为被更新过的,所以那个规则的中定义的命令总会被执行。原创 2016-11-18 18:16:41 · 2945 阅读 · 0 评论 -
· $(src)/$(obj)
$(src)是一个相对路径,它就是Makefile/Kbuild文件所在的路径。同样$(obj)就是编译目标保存的路径,默认就是源代码所在路径。原创 2016-12-15 11:08:46 · 1227 阅读 · 0 评论 -
Makefile 条件判断语句
语法 ifeq/ifneq/ifdef/ifndef ....... else ...... endif原创 2017-09-22 17:26:29 · 517 阅读 · 0 评论 -
makefile伪目标
伪目标主要用于执行其所在规则定义的命令,不需要重建文件,也称标签。在书写伪目标规则时,首先需要声明目标是一个伪目标,之后才是伪目标的规则定义。目标“clean”书写格式应该如下:.PHONY: targetNametargetName: 依赖列表 命令备注:1、伪目标每次都会被执行。2、当一个目标被声明为伪目标后,make 在执行此规则时不会试图去查找隐含规则来创建这个目标。我原创 2017-09-26 14:31:14 · 266 阅读 · 0 评论 -
makefile强制目标
如果一个规则没有命令或者依赖,而且它的目标不是一个存在的文件名。在执行此规则时,目标总会被认为是最新的。就是说:这个规则一旦被执行, make 就认为它的目标已经被更新过。这样的目标在作为一个规则的依赖时,因为依赖总被认为被更新过,因此作为依赖所在的规则定义的命令总会被执行。看一个例子:clean: FORCErm $(objects)FORCE:这个例子中,目标“FORCE”符合上原创 2017-09-26 14:34:01 · 2032 阅读 · 0 评论 -
makefile空目标
空目标是伪目标的一个变种,用来记录上一次执行此规则定义命令的时间。和伪目标不同的是:这个目标可以是一个存在的文件,一般文件的具体内容我们并不关心,通常此文件是一个空文件。空目标文件命令部分都会使用“touch”在完成所有命令之后来更新目标文件的时间戳,记录此规则命令的最后执行时间。 make 时通过命令行将此目标作为终极目标,当前目录下如果不存在这个文件,“touch”会在第一次执行时创建原创 2017-09-26 15:08:37 · 637 阅读 · 0 评论 -
makefile空目标
空目标是伪目标的一个变种,用来记录上一次执行此规则定义命令的时间。和伪目标不同的是:这个目标可以是一个存在的文件,一般文件的具体内容我们并不关心,通常此文件是一个空文件。空目标文件命令部分都会使用“touch”在完成所有命令之后来更新目标文件的时间戳,记录此规则命令的最后执行时间。 make 时通过命令行将此目标作为终极目标,当前目录下如果不存在这个文件,“touch”会在第一次执行时创建原创 2017-09-27 09:16:44 · 1361 阅读 · 0 评论 -
makefile多规则目标
Makefile 中,一个文件可以作为多个规则的目标出现。这种情况时,此目标文件的所有依赖文件将会被合并成此目标一个依赖文件列表,其中任何一个依赖文件比目标更新(比较目标文件和依赖文件的时间戳)时, make 将会执行特定的命令来重建这个目标。对于一个多规则的目标,重建此目标的命令只能出现在一个规则中(可以是多条命令)。如果多个规则同时给出重建此目标的命令, make将使用最后一个规则所以转载 2017-09-27 09:22:00 · 936 阅读 · 0 评论 -
obj-x
1、obj-y += foo.o 告诉Kbuild在当前目录里,有一个名为foo.o的目标文件。foo.o将从foo.c 或foo.S文件编译得到。2、obj-y += /usr/kernel/ 表示该目录下的对应所有文件生成的 .o 目标文件。3、如果要编译成模块,要用obj-m了。例子:obj-$(CONFIG_FOO) += foo.o原创 2016-07-14 09:07:00 · 556 阅读 · 0 评论