我有以下 makefile,它应该构建 procdriver.c 并因此输出 .ko 文件。问题是,即使我删除 procdriver.c,我的 makefile 似乎也能够构建 procdriver.ko 文件。我想尝试找出它每次构建的源文件的位置。
TARGET = procdriver
obj-m := procdriver.o
procdriver-objs+= gpioLib.o
KDIR:= /home/pi/myRpi/linux
PWD := $(shell pwd)
all: gpioLib.o procdriver.c
echo<<"in all"
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
rm -r -f .tmp_versions *.mod.c .*.cmd *.o *.symvers
gpioLib.o: gpioLib.c gpioLib.h
gcc -c gpioLib.c -o gpioLib.o
clean:
make -C $(KDIR) SUBDIRS=$(PWD) clean
这是 Makefile 的输出:http://paste.ubuntu.com/23575533/
答案1
这-d
(调试)选项显示您需要了解的内容,例如,
make -d |less
因为输出似乎转到标准输出。进入后less
,您可以向上/向下搜索有趣的详细信息。
你可以使用grep
,但会失去语境:
make -d | grep whatever
在某些情况下,了解make
已经考虑了哪些可能性(以及哪些可能性)会有所帮助。规则它已加载)以理解输出。
例如,当你跟踪它时,你会看到这一行的效果:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
运行的其他在目录中制作$(KDIR)
。这就是procdriver
创建模块的地方:
Must remake target '/home/pi/myRpi/procdriver.o'.
set -e; echo ' LD [M] /home/pi/myRpi/procdriver.o'; ld -EL -r -o /home/pi/myRpi/procdriver.o /home/pi/myRpi/gpioLib.o ; printf '%s\n' 'cmd_/home/pi/myRpi/procdriver.o := ld -EL -r -o /home/pi/myRpi/procdriver.o /home/pi/myRpi/gpioLib.o ' > /home/pi/myRpi/.procdriver.o.cmd
{ echo /home/pi/myRpi/procdriver.ko; echo /home/pi/myRpi/gpioLib.o; } > /home/pi/myRpi/.tmp_versions/procdriver.mod
Successfully remade target file '/home/pi/myRpi/procdriver.o'.
Pastebin 上的示例从跟踪的中间开始。当我查看一个简单的示例时,上一节的结尾如下:
Trying implicit prerequisite `SCCS/s.procdriver.w'.
Trying pattern rule with stem `procdriver'.
Rejecting impossible implicit prerequisite `procdriver.w'.
No implicit rule found for `procdriver.c'.
Finished prerequisites of target file `procdriver.c'.
No need to remake target `procdriver.c'.
Finished prerequisites of target file `all'.
Must remake target `all'.
要么你procdriver.c
的目录中有一个,要么(研究跟踪)一些其他功能可以帮助make
程序发现它是不必要的。在任何一种情况下,它都不会在子 make 的跟踪中使用该文件。
顺便说一句,该调试选项不在POSIX 使make
,尽管您不太可能遇到没有该功能的版本。例如,太阳操作系统4这样做了,并且索拉里斯继续提供它。