Я новичок в компиляции модулей ядра для включения исходных файлов в дерево с помощью make-файла. Я прочитал несколько руководств, и я все еще не понимаю. Не получив слишком подробно, я создал сценарий для описания проблемы и итогового make-файла.Makefile для компиляции модуля ядра для включения исходных файлов дерева
dir1/main.c
dir2/subdir2/file.c
dir2/subdir2/include/file.h
Ниже в результате Makefile
obj-m:=main.o
main-y := ../dir2/include/file.o
KDIR := /home/userid/rowboat-android/kernel/
PWD := $(shell pwd)
default:
$(MAKE) ARCH=arm CROSS_COMPILE=/home/userid/rowboat-android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- -C $(KDIR) SUBDIRS=$(PWD) modules
clean
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
За описанном сценарии это Makefile правильно?
В справочном материале рассказывается о ccflags-y и EXTRA_CFLAGS. Может кто-то объяснить причину этих переключателей?
Мой основной источник ссылок являются
- Building External Modules
- Linux Kernel Makefiles
- Вопросы и ответы по Stackoverflow
Благодарим Вас за Ваше время заранее
Благодарим вас за ответ. Так, основываясь на разделе 4.3 Несколько подкаталогов [Building External Modules] (https://www.kernel.org/doc/Documentation/kbuild/modules.txt), определяя ccflags-y: = -I $ (src) ../ dir2/subdir2/include/file.h будет включать в себя прослушанный файл. –
Почти! '-I' работает немного по-другому. '-I' сообщает компилятору, где искать включенные файлы, которые включают исходные файлы, используя формат' #include 'file.h "'. Поэтому ваш оператор должен быть 'ccflags-y: = -I $ (src) ../ dir2/subsir2/include /' и внутри 'main.c' и' file.c' вы должны иметь файл '#include '. h "'. –
Я никогда раньше не использовал $ (src), но в соответствии с разделом 3.10 [Linux Kernel Makefiles] (https://www.kernel.org/doc/Documentation/kbuild/makefiles.txt), который должен быть установлен в той же папке, что и ваш Makefile. –