2013-01-16 138 views
2

我正在尝试创建一个helloworld模块。我必须写下如下的makefile。Linux内核模块编程Makefile

ifneq ($(KERNELRELEASE),) 
obj-m := hello.o 
else 
KDIR := /path/to/kernel/sources 
all: 
    make -C $(KDIR) M= 'pwd' modules 
endif 

我知道这个makefile运行两次了。它如何通过只调用一次运行两次?

什么时候在这里使用obj-m值?

+0

我编辑过(它正在等待同行评议)清理文件内容格式。在进行调用之前,请检查并确保它看起来像原始文件(包括制表符(不包括空格))。 – altendky

回答

4

这个Makefile有一个规则:

all: 
    make -C $(KDIR) M= 'pwd' modules 

英文: “进入目录$(KDIR)和执行make(目标是modules)”。

所以,当你使用这个Makefile调用make,调用make使用另一个makefile文件。

你应该从简单的事情开始。如果您告诉我们您要做什么,我们可以提供帮助。

+0

谢谢!我明白了。但是,第二次,它会调用一个不同的makefile(顶级makefile)。那么当这个makefile中的obj-m被执行时呢? – Gomathi

+0

@Gomathi:在makefile *中显示*,$'(KERNELRELEASE)'为空,在这种情况下'obj-m'永远不会被设置或提及,或者'$(KERNELRELEASE)'不* *为空,哪种情况obj-m已设置但从未使用过(并且没有规则,所以Make会投诉并退出)。 – Beta

+0

感谢您的解释! – Gomathi

0

似乎这个文件可能有一个规则,但只有当KERNELRELEASE是空的。 obj-m仅被定义如果KERNELRELEASE空,在这种情况下,Makefile不会真的在一个做任何事......我猜obj-m将由内核包括本Makefile使用(已定义KERNELRELEASE后)如果你真的将它构建到内核中而不是作为一个动态加载的模块,它是自己的。