У меня есть основной модуль ядра, с которым связываются другие модули ядра. Я структурировал модули так (концептуально):
main module/
|
\drivers/
|
|\driver1
|\driver2
\driver3
Поскольку это модули ядра, мне нужно скомпилировать их следующим образом:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
Однако, поскольку Makefile драйверов может быть вызван из предыдущих каталогов, мне нужно сделать $(shell pwd)
перед вызовом другого make (linux make). Итак, Makefile теперь выглядит так:
CURRENT_DIR := $(shell pwd)
.PHONY: all
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(CURRENT_DIR) modules
Пока все хорошо и работает отлично. Проблема заключается в следующем: у меня есть файл, который нужно включить драйверам, поэтому я должен указать путь включения, который нужно сделать. Я впервые попробовал
EXTRA_CFLAGS += -I../..
и сразу понял, почему это не работает (относительный путь будет к / lib / module / ... не к текущему каталогу). Поэтому я изменил его на:
MAIN_MODULE_HOME := $(CURRENT_DIR)/../..
EXTRA_CFLAGS += -I$(MAIN_MODULE_HOME)
Как ни странно, это не работает! Если я напишу
EXTRA_CFLAGS += -Ipath/I/get/from/pwd/../..
вручную, компилируется! Может кто-нибудь объяснить, что я делаю не так? Перед вызовом make я echo
ed $(CURRENT_DIR)
и $(MAIN_MODULE_HOME)
и переменные имеют смысл.
Я знаю, что EXTRA_CFLAGS
оценивается не сразу, но, поскольку CURRENT_DIR
и MAIN_MODULE_HOME
объявлены с :=
, я не понимаю, как все портится.
(Если кто-то может лучше сформулировать заголовок вопроса, пожалуйста, сделайте!)