NotePublic/Software/Development/Environment/Make/Makefile_简明语法.md

2.1 KiB
Raw Blame History

Makefile 简明语法

静态模式

静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。我们还是先来看一下语法:

< targets ....> : < target-pattern > : < prereq-patterns ...>
    <commands>
    .....
  1. targets: 定义了一系列的目标文件,可以有通配符。是目标的一个集合。
  2. target-pattern是指明了 targets 的模式,也就是的目标集模式。
  3. prereq-patterns 是目标的依赖模式,它对 target-parrtern 形成的模式再进行一次依赖目标的定义。

例如:

OBJS = a.o b.o

$(OBJS) : %.o : %.c
    gcc -c $< -o $@

all: $(OBJS)

这两条命令的功能就是,大目标是 OBJS这个 OBJS 就是各种“.o”文件“%.o”是指“$(OBJS)”中全部“.o”文件而“%.c”就将对应的“.o”文件替换为同名的“.c”文件。后续的命令结合了 2 个自动化变量,“$<” 表示依赖对象集中的第一个,这里指对应的“.c”文件“$@” 则代表了目标集,这里指对应的“.o”文件。所以上述 Makefile 的功能就是要遍历所有的“.c”文件对所有的“.c”文件进行编译然后编译生成对应的“.o”文件。

有时targets 是不需要的,可以简写如下:

OBJ1 = a.o b.o
OBJ2 = c.o d.o

%.o : %.c
    gcc -c $< -o $@

all: $(OBJ1) $(OBJ2)

这时 Makefile 默认对所有的“.c”文件应用该规则生成对应的“.o”文件a.c、b.c、c.c、d.c 都使用 gcc -c < -o @ 规则进行编译)。

FORCE


FORCE: ;

.PHONY: FORCE

<target>:<dependences> FORCE

如果一个规则没有命令或者依赖而且它的目标不是一个存在的文件名在执行此规则时目标总会被认为是最新的。也就是说这个规则一旦被执行make 就认为它所表示的目标已经被更新过。当将这样的目标(FORCE)作为一个规则的依赖时(如上的 vmlinux: ),由于依赖总被认为是被更新过的,所以作为依赖所在的规则定义的命令总会被执行。