2016-08-22 48 views
0

好了,所以即时得到到内核模块开发和导游都非常使用包含该行基本相同的make文件:这个make文件行是怎么回事?

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

所以我的问题是:

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

引用的make文件中没有'-M'。 –

+0

那么,如果不是国旗,M是多少? – TaylorE

+1

尽管你认为'make'会递归地调用'make',你为什么觉得这很奇怪?[递归认为有害](http://aegis.sourceforge.net/auug97.pdf)? 'M'只是一个在命令行被覆盖的变量。 –

回答

1

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

就像将代码分解为文件,模块和类(后者对于C语言以外的语言)显然是有帮助的,将编译过程分离为单独的模块可能会有所帮助。这只是让组织更容易管理项目的一种形式。您可以将相关功能分组到单独的库或插件中,并分别构建它们。不同的个人或团队可以在单独的组件上工作,而不需要它们都需要对主makefile的写入权限。您可能需要单独构建组件,以便可以单独测试它们。

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

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

至于你的M,这只是在命令行重写一个变量。 makefile中的某个地方会使用变量M,如果用这种方式在命令行指定了它的值,那么您指定的值将覆盖可能在makefile中出现的任何其他变量赋值, 。