我有一个 out-tree linux 内核模块,它有一个公共头文件。此标头旨在与其他模块共享,因为它声明了模块的导出函数,而不是与用户空间共享。
我阅读了有关 Kbuild
header-y
变量的信息,但它似乎不再在当前内核中使用。有header_install
和headers_install_all
目标。但这旨在生成放置在 /usr/include
中的用户空间 api 标头?
最后,仅仅将标头放在正常的包含路径中(例如/usr/include
)是行不通的,因为这不是模块构建期间正常内核包含路径的一部分。
经过数周的搜索,似乎就是这样。树外构建模块依赖标头没有预定义的位置。
我目前的解决方案是在导出标题的模块上添加它:
INSTALL_MOD_PATH ?= /
INSTALL_HDR_PATH ?= $(INSTALL_MOD_PATH)/usr/include/
INSTALL_HDR_PATH_KERNEL ?= $(INSTALL_MOD_PATH)/usr/src/include/
header_install:
install -d $(INSTALL_HDR_PATH)
install -d $(INSTALL_HDR_PATH_KERNEL)
install -Dm 0655 ./user.h $(INSTALL_HDR_PATH)/user.h
install -Dm 0655 ./mod-external.h $(INSTALL_HDR_PATH_KERNEL)/mod-external.h
并在依赖模块中在构建时执行此操作
export KCFLAGS="-I$(INSTALL_MOD_PATH)/usr/src/include/"
make
这将
/usr/src/include
提升为标题交换的文件夹