“make target”是什么?

28

为什么在编译源代码之前我需要制定一个make target

更具体地说,make target究竟是什么?

5个回答

35

Makefile看起来像这样:

all: mybinary

mybinary: files.o it.o depends.o on.o
[tab]$(CC) $(CFLAGS) files.o it.o depends.o on.o -o mybinary

files.o: files.c files.h
[tab]$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@

...

这意味着,当您键入make all时(简写为只键入make),它将确保mybinary目标或文件是最新的。要做到这一点,它需要确保mybinary比files.o、it.o、depends.o和on.o都要新。如果不是,则使用下一行指定的shell命令来构建mybinary。但在执行此操作之前,它首先确保files.o等文件是最新的。这意味着它们必须比files.c和files.h更新。如果不是,则使用下一行指定的shell命令来构建files.o。一旦所有*.o文件都是最新的,就可以构建mybinary。一旦构建了mybinary,all目标就被满足了。

目标通常只是文件。块的格式为:

target: list of dependency files
[tab]shell commands to build target if it's older than any of its dependencies
[tab]more shell commands
[tab]still more

通过通配符也可以指定目标,例如 %.c 在shell中表示的是 *.c

有些目标是“虚拟”目标,意思是它们不对应任何真实文件。其中 "all" 目标就是这种类型的,"clean" 目标 (make clean) 也是如此。你实际上不需要或者想要构建一个名为 "all" 或 "clean" 的文件。有多种方式可以指定目标是虚拟的。

出现在 Makefile 中的第一个目标将是如果你只输入 make 命令时调用的那个目标。一种约定是将该目标命名为 "all"。因此 make 命令将与 make all 命令相同。


关于“它需要确保mybinary比所有的files.o、it.o、depends.o和on.o都要新”这一问题,应该如何实现呢?是通过比较文件的最后修改时间来实现的吗? - Pacerier
1
是的,通过比较文件上次修改时间。事实上,这导致了UNIX实用程序touch的创建,其目的仅是更新文件的修改日期,以触发构建。 - James Curran

7
一个“make target”基本上是您想要重新构建的文件。
Make无法推测出您想要构建什么,因此您必须隐式或显式地告诉它应该构建什么。通常,文件中的第一个目标是一个名称,例如“all”,如果您运行“make”而没有任何明确的目标,则它将构建makefile中列出的第一个目标。然而,有些makefile没有指定任何目标;那么您必须在命令行上指定一个目标。或者,如果您不想构建默认目标,则必须指定您想要构建的目标。
目标也可以是GNU make术语中的“phony”。也就是说,它是一个不存在的名称,规则不会创建它,但是(虚假目标)依赖于许多其他具有与之关联的规则的文件。实际上,“all”目标通常是虚拟目标 - 在大多数目录中没有名为“all”的文件。

3

makefile通常包含编译程序、安装程序、清理工作等代码。

因此,target这个词可以是各种关键字,比如allinstallclean等。

这是一种说“做某事”的方式。make all意味着做所有事情


3
严格来说,命令“make all”只是暗示(声明)“完成必要的工作以确保‘all’是最新的”。通常情况下,人们编写Makefile以执行大部分所需操作(但例如不会自动安装)。但这只是一种约定。 - Jonathan Leffler

1

make 是一种常见的开发工具,它检查源代码文件和从中生成的目标代码之间的文件日期,并编译其中源代码更新的文件。它通过使用一个名为 makefile 的文件来实现这一点,该文件列出需要进行比较的文件。

标准语法是 make /f makefile myprog.exe

这意味着使用 makefile 中的文件列表构建 myprog.exe。makefile 默认为 makefile.mak,因此如果您使用该名称,则不必在命令行上指定它。

这里的 myprog.exe 被称为目标。一个技巧是,您可以在 makefile 中放置一个不存在文件的构建指令列表。如果您然后说要构建该目标,它将运行这些命令。通常,您会看到类似于 make clean 的东西,它会删除临时文件。


“standard”的含义是什么? - Pacerier
这意味着大多数“make”程序将接受该语法以执行我在下一段中描述的操作。有许多变体的“make”,所以我不能代表所有变体,但大多数都会接受该语法。 - James Curran
有没有任何官方推荐的“标准”适用于make呢? - Pacerier

0

在现实生活中,当你想要实现某些事情时,通常会称之为目标或者目的。为了达到这个目标,通常需要先完成一些前提条件。

在计算机领域,目标也有类似的含义。它不一定局限于构建软件,但在构建软件时经常出现。

一个软件通常由许多组件组成,而这些组件通常具有相互依赖关系。假设完全构建一个软件是您的最终目标,为了实现这个目标,您需要根据它们的依赖关系构建组件。您可以将这些组件组织成一个层次结构,就像一棵树一样。每个节点都是一个中间目标,根节点是最终目标,通常被命名为all。您可以针对任何目标节点(中间或根)调用make,然后需要完成所有子目标才能使目标节点完成。

对于每个目标,您需要指定完成该目标所需执行的操作。这些操作称为命令或规则。

引用自此处的一些话:

目标将组任务按特定顺序分组,并允许构建过程分解为较小的单元。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接