任何人都可以解释下面给出的简单 makefile,因为我想从内核模块编程开始,但我不明白。
obj−m += hello−1.o
all:
make −C /lib/modules/$(shell uname −r)/build M=$(PWD) modules
clean:
make −C /lib/modules/$(shell uname −r)/build M=$(PWD) clean
答案1
事实上你有两个目标(all
和clean
)。当您在文件夹中时,可以通过make all
或 来在控制台上调用它们make clean
。第一个目标始终是默认目标(make
结果为make all
)。
缩进了食谱被指出。这是 make 执行来构建目标的代码。所以调用make
将导致调用
make −C /lib/modules/$(shell uname −r)/build M=$(PWD) modules
当然,shell 扩展了uname
命令和M
环境变量。然后make
在指定的文件夹 ( /lib/modules/$(shell uname −r)/build
) 中使用目标进行调用modules
。这个目标(子进程)的作用显然没有在这个文件中指定。这意味着,还有/lib/modules/$(shell uname −r)/build
另一个Makefile
,modules
定义了目标。上面列出的命令modules
在/lib/modules/$(shell uname −r)/build/Makefile
.
对于目标也是如此clean
。这将发出一个子进程,其clean
目标位于指定文件夹中。
这两个目标的想法是具有两个显着特征。第一个 ( all
) 是构建一些东西(可能是你的模块)。另一个是清理你的工作(clean
),以防编译出错并且你想删除任何非源文件。然而,这种对目标的解释只是从名称上看的。这取决于它们的实施。如果您愿意,您可以将它们命名为t1
、t2
、 。然而,它的可读性比, , andt3
差得多。all
clean
install
第一行将一个字符串附加hello−1.o
到 vaiable 中obj−m
。由于该变量之前为空(如果没有通过外部环境变量设置),因此只需将其设置为该值即可。但是,该值未经过export
编辑,因此仅在本地可见。所以它对子进程没有影响(参见这个链接)。
补充一点:我错了,obj-m
没有效果。Makefile
由内核重新读取并Makefile
搜索以 开头的变量obj-
。然后将它们用于编译所需的目标文件。来源:https://stackoverflow.com/a/21140538/882756