2016-12-04 3 views
1

У меня есть следующий файл makefile, который должен построить procdriver.c и, следовательно, вывести файл .ko. Проблема в том, что даже когда я удаляю procdriver.c, мой make-файл, похоже, может создать файл procdriver.ko. Я хотел бы попытаться выяснить, откуда он получает исходный файл, который он создает каждый раз.Почему мой Makefile создает несуществующий исходный файл?

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/

EDIT

весь вывод команды римейк: http://paste.ubuntu.com/23577274

Я думаю, что это самый важный бит продукции : http://pastebin.com/0vj9aNMg

+2

Обычно Makefiles не строят исходные файлы. – Olaf

+1

@ Олаф, что бы вы предложили в этом случае? Поскольку evern, когда я удаляю procdriver.c, выводит файл procdriver.ko. Что не должно произойти. – LandonZeKepitelOfGreytBritn

+0

Используйте 'remake' для отладки' Makefile'-s –

ответ

2
obj-m := procdriver.o 
procdriver-objs+= gpioLib.o 

неправ. Это говорит о том, что единственный объект файла для модуля будет procdriver.o и что система сборки для генерации, что один из procdriver-objs

procdriver-objs является Initally пустой и поэтому становится = gpioLib.o. Таким образом, gpioLib.o является единственным предметом предпосылки procdriver.o; поэтому gpioLib.c и gpioLib.h являются единственными исходными предпосылками procdriver.o. procdriver.c является избыточным.

Вы хотите (я верю), чтобы сделать модуль из пары объектных файлов procdriver.o и gpioLib.o, составленной соответственно из соответствующих .c файлов. То, как вы должны выразить это:

obj-m += my-module-name.o 
my-module-name-objs := procdriver.o gpioLib.o 

Вам придется пересмотреть свои имена файлов, чтобы избежать столкновения между my-module-name.o и procdriver.o. Обратитесь к документации The Linux Kernel Module Programming Guide: 2.7. Modules Spanning Multiple Files.

Большая часть содержимого вашего файла makefile избыточна. Насколько я могу видеть все это потребности является:

obj-m += my-module-name.o 
my-module-name-objs := procdriver.o gpioLib.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

gpioLib.o: gpioLib.h 
Смежные вопросы