给定一个使用autoconf(配置脚本)来提供用户模式应用程序和内核驱动程序的软件包,其目录结构如下:
configure.ac
configure
Makefile.am
user
Makefile.am
user.c
driver
Makefile.am
Kbuild.in
driver.c
这在本地配置时成功配置和构建用户和驱动程序(运行./configure --options
)。
然而,配置脚本的一个有用功能是,您可以拥有一个单独的源和构建目录,只需从构建目录运行脚本,例如:
mkdir build && cd build && ../configure --options
这适用于用户应用程序,但我在此上下文中无法获取内核驱动程序。在驱动程序Makefile.am
中,我按照this answer的建议提供了以下内容:
modules:
$(MAKE) -C "$(LINUX_SOURCE_DIR)" M="@abs_builddir@" src="@abs_srcdir@" modules
但这无法编译,因为它期望Kbuild或Makefile位于src
,但它们实际上在M
。省略src
会让它找到Kbuild,但它无法找到实际的源文件(no rule to make target //path/in/build//driver.o
)。
使用O=
作为其他一些答案提示不正确,因为这指定了查找内核的输出文件(.config
等)的路径,这些仍然在LINUX_SOURCE_DIR
。 (因此,尝试使用它会导致各种其他丢失文件错误。)
我希望找到一个不需要修改任何实际Kbuild脚本的解决方案,因为这些脚本不在我的包的控制之内。
到目前为止,我提出的最佳选择是在调用Kbuild之前将所有模块源文件复制/链接到构建目录中,这并不理想。我希望有一个可用于此的隐藏设置。