关于makefile

  1. 基本规则:
    target...: prerequisites ...(预备知识,先决条件)

      command(指令)
    
  2. 引用其它的Makefile
    在include前面可以有一些空字符,但是绝不能是[Tab]键开始。include和可以用一个或多个空格隔开。举个例子,你有这样几个Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么,下面的语句:

    include foo.make *.mk $(bar)

如果文件都没有指定绝对路径或是相对路径的话,make会在当前目录下首先寻找,如果当前目录下没有找到,那么,make还会在下面的几个目录下找:

         1.如果make执行时,有“-I”或“--include-dir”参数,那么make就会在这个参数所指定的目录下去寻找。

         2.如果目录/include(一般是:/usr/local/bin或/usr/include)存在的话,make也会去找。

3、 make的工作方式

GNU的make工作时的执行步骤入下:(想来其它的make也是类似)

  (1).    读入所有的Makefile。

  (2).    读入被include的其它Makefile。

  (3).    初始化文件中的变量。

  (4).    推导隐晦规则,并分析所有规则。

  (5).    为所有的目标文件创建依赖关系链。

  (6).    根据依赖关系,决定哪些目标要重新生成。

  (7).    执行生成命令。

4、 为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。
.PHONY: clean

clean:

       rm*.o temp
  1. 静态模式

    objects: foo.o bar.o
    all: $(objects)
    $(objects): %o:%c
    $(cc) -c $(CFLAGS) $< -o $@

    file: foo.elc bar.o lose.o
    $(filter %.o, %(file)): %.o:%c
    $(cc) -c %(CFLAGS) $< -o $@

  2. 自动生成依赖性
    大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。
    [.d]文件中就存放对应[.c]文件的依赖关系。

  3. Makefile 书写命令

(1). @加在命令开头,不会输出命令

(2)我们可以在Makefile的命令行前加一个减号“-”(在Tab键之后),标记为不管命令出不出错都认为是成功的。

  1. 自动化变量
    $@
    表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
    $%
    仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是
    [.a],Windows下是[.lib]),那么,其值为空。
    $<
    依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
    $?
    所有比目标新的依赖目标的集合。以空格分隔。
    $^
    所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
    $+
    这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。
    $*
    这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir /a.foo"。9

posted on 2018-06-15 21:20  流逝并不遗憾  阅读(112)  评论(0编辑  收藏  举报

导航