2013-01-09 38 views
0

我想为内核模块编写一个makefile,但无法让它工作。运行以下具有此输出不同的'make'行为

$ make 
make: Nothing to be done for 'all'. 

但在

$ 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... 

我的生成文件的内容直接在终端运行结果make命令(源文件是main.c中)

obj-m += main.o 
all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules 

在尝试使用makefile之前,我会删除* .o和* .ko。将all更改为default也不会做任何事情。

回答

3

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

+0

OMFG就是它,标签。我需要一支烟 – James

0

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

prog: main.o subr.o 
    $(CC) main.o subr.o –o [email protected] 

如果subr.c已被编辑,我们需要重新编译它带来subr.o最新的。 然后,由于subr.oprog更新,我们运行命令来重新链接prog

魔鬼生活在边界条件。您的all伪目标不具有依赖性。 因此,没有任何依赖项all目标更新。 因此,我们不会执行all以下的commnd(s)。

ISTR我“固定”这一说

all: always
       指令(S)...

其中always不是关键字,但仅仅是一个用户选择的伪文件名(如all,clean,new等),选择提醒您它是在那里强制命令()总是运行。然后把

always:
                               < - 空行(没有命令)

在Makefile别的地方。


这是奇特:我以为我刚才看到一个答案从这里Philipp Claßen,但随后消失了。无论如何,他说

你的目标没有家属,所以make假设什么都不需要做。 你必须声明你的目标为.PHONY

Here是链接到文档。

所以,现在你知道“正确”(非kludge)的方式来处理这个问题。

+0

仅供参考:您应该可以删除自己的答案,然后在删除时进行编辑,保存并取消删除。当然,在更高的代表水平上,这是可能的。这给你一个修复你不满意的答案的机会。它还可以避免你被问到“你是否真的想为这个问题增加另一个答案”。 –

+0

@JonathanLeffler:我不确定你指的是什么,但是,FYI,我发布了同一答案的第二个副本_by accident_。但是,谢谢你的建议;我可能会在将来使用它。 – Scott

+0

感谢您的努力,但问题是IDE取代空间的标签 – James