2013-10-02 4 views
2

Я новичок в компиляции модулей ядра для включения исходных файлов в дерево с помощью 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. Может кто-то объяснить причину этих переключателей?

Мой основной источник ссылок являются

  1. Building External Modules
  2. Linux Kernel Makefiles
  3. Вопросы и ответы по Stackoverflow

Благодарим Вас за Ваше время заранее

ответ

1

Согласно Linux documentation :

ccflags-y указывает параметры для компиляции с помощью $ (CC).

 Example: 
      # drivers/acpi/Makefile 
      ccflags-y := -Os 
      ccflags-$(_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT 

ccflags-OBJ будет проходить независимо от флагов указан до $ (CC) , когда делают строит obj.o. Если вы используете ccflags-y, то это действует как своего рода подстановочный знак и передает этот флаг всем объектам, созданным make-файлом. Обычно это не относится к внешним модулям, но эффекты этих флагов являются рекурсивными, если ваш Makefile вызывает другие Make-файлы.

В той же документации указано, что EXTRA_CFLAGS - это старый способ сделать то же самое, и вы не должны его использовать.

+0

Благодарим вас за ответ. Так, основываясь на разделе 4.3 Несколько подкаталогов [Building External Modules] (https://www.kernel.org/doc/Documentation/kbuild/modules.txt), определяя ccflags-y: = -I $ (src) ../ dir2/subdir2/include/file.h будет включать в себя прослушанный файл. –

+0

Почти! '-I' работает немного по-другому. '-I' сообщает компилятору, где искать включенные файлы, которые включают исходные файлы, используя формат' #include 'file.h "'. Поэтому ваш оператор должен быть 'ccflags-y: = -I $ (src) ../ dir2/subsir2/include /' и внутри 'main.c' и' file.c' вы должны иметь файл '#include '. h "'. –

+0

Я никогда раньше не использовал $ (src), но в соответствии с разделом 3.10 [Linux Kernel Makefiles] (https://www.kernel.org/doc/Documentation/kbuild/makefiles.txt), который должен быть установлен в той же папке, что и ваш Makefile. –

Смежные вопросы