0%

Makefile

一.常用Makefile变量

  1. 变量***$@***: 代表目标文件

  2. 变量***$^***: 代表所有依赖文件

  3. 变量***$<***: 代表第一个依赖文件

  4. 变量***:=***: 表示变量的值决定与它在Makefile中的位置,而不是把整个Makefile展开后的最终值

  1. 变量***?=***:意思是覆盖之前的值

  2. 变量***+=***: 意思是添加等号后面的值

二.Makefile常见函数

  1. filter函数:

    1
    $(filter <pattern...>,<text>)

    filter函数是个过滤函数,表示以pattern模式过滤text字符串里的单词,仅保留符合模式pattern的单词,返回值是符合pattern的字符串

  2. firstword函数:

    1
    $(firstword <text>)
    1
    2
    3
    4
    5
    6
    7
    8
    ifneq ($(filter 4.%,$(MAKE_VERSION)),)	# make-4
    ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)
    quiet=silent_
    endif
    else # make-3.8x
    ifneq ($(filter s% -s%,$(MAKEFLAGS)),)
    quiet=silent_
    endif

    firstword函数作用是取出text字符串的第一个单词,函数返回值就是取到的单词。分析Uboot源码可以得知,当使用make -s编译时,”-s”就会作为MAKEFLAGS变量的一部分传递给Makefile,如果MAKEFLAGS为***MAKEFLAGS += -rR –include-dir=$(CURDIR)***,那么上图的firstword取到的单词就是rRs。

  3. patsubst函数:

    1
    $(patsubst <pattern>,<replacement>,<text>)

    patsubst函数就是替换函数。作用是在text中查找符合pattern的部分,如果匹配的话就用replacement替换掉,函数的返回值就是替换后的字符串。

  4. wildcard函数:

    1
    $(wildcard PATTERN...)

    wildcard函数作用就是:为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。一般我们可以使用“$(wildcard *.c)”来获取工作目录下的所有的.c文件列表。复杂一些用法;可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函数获取工作目录下的.c文件列表;之后将列表中所有文件名的后缀.c替换为.o。这样我们就可以得到在当前目录可生成的.o文件列表。因此在一个目录下可以使用如下内容的Makefile来将工作目录下的所有的.c文件进行编译并最后连接成为一个可执行文件。

  1. “%”和“”的区别此两者均为通配符,但更准确的讲,%为Makefile规则通配符,一般用于规则描述,如
    %.o:%c
    $(CC) $< -o $@
    表示所有的目标文件及其依赖文件,或者
    $(filter %.c ,SOURCES)
    此处SOURCES表示包含.c .cc .cpp等多类型源文件,该过滤器函数将c文件过滤出来,而%.c即为此过滤器规则。
    通配符
    则不具备上述功能。尤其是在Makefile,当变量定义或者函数调用时,该通配符的展开功能就失效了,即不能正常使用了,此时需要借助wildcard函数。二者应用范围不同。

三.Makefile里的编译选项

  1. make O=out

    在make时,使用”O”指定输出目录,上面语句意思就是设置目标文件输出到out目录下,这样做目的就是把源文件和编译产生的文件分开,否则源文件和编译产生的文件都在同一个目录内。还有个方法就是设置环境变量KBUILD_OUTPUT,然后指定输出目录(绝对路径),最后export导出即可。但需注意的是O选项优先级比KBUILD_OUTPUT环境变量高

  2. make C=x

    在make时,使用”C”决定是否使能代码检查。当x为1时,检查那些需要重新编译的文件;当x为2时,检查所有源码文件。

  3. make M=dir

    在make时,使用”M”允许单独编译某个模块。

四.Makefile获取主机架构和系统

  1. HOSTARCH用于保存主机架构,调用uname -m即可
  2. HOSTOS用于保存主机OS,调用uname -s

五.Makefile里的一些关键字

  1. sinclude,sinclude意思可include意思差不多,都是读取指定文件的内容,但不同点是sinclude读取的文件如果不存在的话不会报错。