Como ver quais arquivos um Makefile usa?

2

Eu tenho o seguinte makefile, que deve construir procdriver.c e, assim, gerar um arquivo .ko. O problema é que mesmo quando eu excluo procdriver.c meu makefile parece ser capaz de construir um arquivo procdriver.ko. Eu gostaria de tentar descobrir de onde ele obtém o arquivo de origem que está construindo toda vez.

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

Esta é a saída do Makefile: link

    
por LandonZeKepitelOfGreytBritn 04.12.2016 / 00:56

1 resposta

2

A opção -d (depuração) mostra o que você precisa saber, por exemplo,

make -d |less

pois a saída parece ir para a saída padrão. Uma vez em less , você pode pesquisar para cima / para baixo para os detalhes interessantes.

Você poderia usar grep , mas perderá contexto :

make -d | grep whatever

Em alguns casos, ajuda a ver quais possibilidades make já considerou (e o que regras carregou) para dar sentido à saída.

Por exemplo, ao rastreá-lo, você verá o efeito dessa linha:

$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 

que executa outro no diretório $(KDIR) . É aí que o módulo procdriver é criado:

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

O exemplo no pastebin começa no meio do traço. Quando eu olhei um exemplo rápido, a seção anterior termina com isso:

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

Você tem um procdriver.c em seu diretório ou (estude o traço) algum outro recurso ajuda o programa make a descobrir que não era necessário. Em ambos os casos, ele não usa esse arquivo no rastreamento para a sub-make.

A propósito, essa opção de depuração não está em POSIX make , embora você esteja É improvável que encontre uma versão de make sem o recurso. Por exemplo, SunOS 4 fez isso e Solaris continua a fornecê-lo.

    
por 04.12.2016 / 01:01