给定一个使用 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 或 Makefilesrc
在M
. 省略src
确实让它找到了 Kbuild,但它无法找到实际的源文件 ( no rule to make target //path/in/build//driver.o
)。
像其他一些答案所暗示的那样使用O=
是不正确的,因为这指定了查找内核输出文件(.config
等)的路径,而这些文件仍在LINUX_SOURCE_DIR
. (因此尝试使用它会导致各种其他丢失文件错误。)
我希望有一个不需要修改任何实际 Kbuild 脚本的解决方案,因为这些不在我的包的控制范围内。
到目前为止,我想出的最佳选择是在调用 Kbuild 之前将所有模块源文件复制/链接到构建目录中,这并不理想。我希望有一个隐藏的设置可以用于此。