这个make文件行发生了什么?

时间:2016-08-22 23:15:44

标签: makefile

好的,所以即时进入内核模块开发和指南,几乎都使用包含这一行的相同基本make文件:

make -C /lib/modules/`uname -r`/build M=$(PWD) modules

所以我的问题是:

  1. 为什么make文件调用make?这似乎是递归的
  2. 什么是M?我无法在任何手册页中找到make -M标志

1 个答案:

答案 0 :(得分:1)

递归使用make是将模块化引入构建过程的常用技术。例如,在您的特定情况下,您可以通过将相关组件放在名称与该体系结构的uname -r输出匹配的文件夹中来支持新体系结构,并且您不必更改主makefile文件所有。另一个例子,如果你将一个组件模块化,那么在不对新项目的主makefile进行大的改动的情况下,可以更容易地在另一个项目中重用。

将代码分成文件,模块和类(显然是C语言以外的语言)可能会有所帮助,将构建过程分成单独的模块会很有帮助。它只是一种组织形式,可以更轻松地管理您的项目。您可以将相关功能分组到单独的库或插件中,并单独构建它们。不同的个人或团队可以在单独的组件上工作,而不需要所有组件或团队都需要对主makefile的写访问权。您可能希望单独构建组件,以便可以单独测试它们。

当然,如果不递归使用make,这并不是不可能完成所有这些事情,但它是组织事物的一种常见方式。即使你没有递归地使用make,你仍然会得到一堆不同的组件" makefiles"在一个大项目中 - 它们只是被导入或包含在主makefile中,而不是单独站立并通过make的单独调用运行。

为一个非常大的项目创建和维护单个makefile并不是一件小事。但是,正如文章Recursive make considered harmful所述,递归使用make也不是没有问题。

至于你的M,它只是在命令行覆盖一个变量。在makefile中的某个地方,将使用变量M,如果您以这种方式在命令行指定其值,那么您指定的值将覆盖该变量中可能出现的任何其他赋值。生成文件(多个)。