不同的'制造'行为

时间:2013-01-09 00:25:16

标签: linux makefile kernel-module

我正在尝试为内核模块编写一个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也无效。

2 个答案:

答案 0 :(得分:3)

最可能的问题是您没有使用真实的标签字符来开始阅读make -C ...行,而是使用多个空格。 make要求所有命令都以制表符开头。

答案 1 :(得分:0)

几年前,我知道这就像我的手背;我会从记忆中尽我所能。该过程是make查看在被要求制作的目标之后列出的所有从属目标(依赖关系),并检查它们是否是最新的。 如果它们都是最新的,并且主要目标并不比其中任何一个都旧,我们就完成了。否则,请执行以下命令。因此,对于

prog: main.o subr.o
    $(CC) main.o subr.o –o $@

如果已编辑subr.c,我们需要重新编译它以使subr.o保持最新状态。 然后,由于subr.oprog更新,我们会运行命令重新链接prog

魔鬼生活在边界条件下。您的all伪目标没有依赖关系。 因此,没有任何依赖 all 目标更新。 因此,我们不会在all下面执行修订。

我通过说

来“解决”这个问题的ISTR
  

all: always
          命令(S)...

其中always不是关键字,而只是用户选择的伪文件名(如allcleannew等),选择为提醒您,强制执行all下的命令总是在那里。然后把

  

always:
                                  &lt; - 空行(无命令)

Makefile中的其他地方。


那很奇怪:我以为我刚刚在Philipp Claßen看到了答案,但随后就消失了。无论如何,他说

  

您的目标没有家属,因此make假设不需要做任何事情。   您必须将目标声明为.PHONY

     

Here是文档的链接。

所以现在你知道处理问题的“正确”(非kludge)方法。