简单使用Makefile

Makefile

介绍

  • Makefile 里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。
#--注释--
target ...: prerequisites ...
    command
    ...
    ...
  • target:可以是一个或多个目标文件、标签、执行文件。
  • prerequisites:生成该target所依赖的文件和/或target
    • 如果有一个以上的文件比target文件要新或者target不存在的话,command命令就会被执行。
  • command:该target要执行的命令(任意的shell命令)。

常用语法

  • 可以声明变量存储信息,简化命令。用$符使用该变量。
    objects = main.o kbd.o command.o display.o \
      insert.o search.o files.o utils.o
    edit : $(objects)
      cc -o edit $(objects)
    include foo.make *.mk $(bar)      #引入其他makefile文件
    .PHONY : clean    #伪目标clean,避免和文件重名,只是一个标签
    clean :
      -rm edit $(objects)
    
  • make 看到一个 .o 文件,它就会自动的把 .c 文件加在依赖关系。
    • 如果 make 找到一个 whatever.o ,那么 whatever.c 就会是 whatever.o 的依赖文件。并且 cc -c whatever.c 也会被推导出来。
  • rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事
  • 如果make执行时,有-I--include-dir参数,那么在这个参数所指定的目录下去寻找文件。
  • 支持通配符* ? ~

  • 特殊变量VPATH,如果定义了这个变量,那么,make 就会在当前目录找不到的情况下,到所指定的目录中去找寻文件。
    • e.g. VPATH = src:../headers,用冒号分隔。
bigoutput littleoutput : text.g
    generate text.g -$(subst output,,$@) > $@
  • $表示执行一个 Makefile 的函数,函数名为subst
  • $@ 表示目标的集合,就像一个数组

makefile的工作流程

  • 当只输入make命令时,会经历如下基本过程
    1. 会在当前目录下找名字叫“Makefile”或“makefile”的文件。
    2. 如果找到,读入包含文件,初始化文件中的变量,找文件中的第一个目标文件(target)。
    3. 如果第一个目标文件不存在或者比依赖项旧,则会执行后面的命令重新生成目标文件。
    4. 如果需要的依赖文件不存在,会寻找生成该文件的规则。
posted @ 2022-01-08 16:59  Oniisan_Rui  阅读(67)  评论(0)    收藏  举报