我正在尝试为内核模块编写一个makefile,但无法使其工作。运行以下内容有此输出
$ make
make: Nothing to be done for 'all'.
但直接在终端上运行make命令会导致
$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
make: Entering directory '/usr/src/linux-headers-3.5.0-17-generic'
CC [M] <blah>
Building modules, stage 2
<blah>
make: Leaving directory...
我的Makefile的内容是(源文件是main.c)
obj-m += main.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
在尝试使用makefile之前,我会删除* .o和* .ko。将all
更改为default
也无效。
答案 0 :(得分:3)
最可能的问题是您没有使用真实的标签字符来开始阅读make -C ...
行,而是使用多个空格。 make
要求所有命令都以制表符开头。
答案 1 :(得分:0)
make
查看在被要求制作的目标之后列出的所有从属目标(依赖关系),并检查它们是否是最新的。
如果它们都是最新的,并且主要目标并不比其中任何一个都旧,我们就完成了。否则,请执行以下命令。因此,对于
prog: main.o subr.o
$(CC) main.o subr.o –o $@
如果已编辑subr.c
,我们需要重新编译它以使subr.o
保持最新状态。
然后,由于subr.o
比prog
更新,我们会运行命令重新链接prog
。
魔鬼生活在边界条件下。您的all
伪目标没有依赖关系。
因此,没有任何依赖比 all
目标更新。
因此,我们不会在all
下面执行修订。
我通过说
来“解决”这个问题的ISTR
all: always
命令(S)... 的
其中always
不是关键字,而只是用户选择的伪文件名(如all
,clean
,new
等),选择为提醒您,强制执行all
下的命令总是在那里。然后把
always:
&lt; - 空行(无命令)
Makefile中的其他地方。
那很奇怪:我以为我刚刚在Philipp Claßen看到了答案,但随后就消失了。无论如何,他说
您的目标没有家属,因此
make
假设不需要做任何事情。 您必须将目标声明为.PHONY
。Here是文档的链接。
所以现在你知道处理问题的“正确”(非kludge)方法。