如何查看Makefile使用了哪些文件?

如何查看Makefile使用了哪些文件?

我有以下 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这样做了,并且索拉里斯继续提供它。

相关内容