我们正在团队中开发Android内核驱动程序。驱动程序是作为可加载模块开发的,并与内核源分开编译。但是我们需要首先构建android内核源代码以构建驱动程序模块。每个开发人员都会从git中更改内核并构建内核二进制文件。由于每个开发人员的本地系统上的内核二进制文件不同,我们每次都需要替换内核二进制文件和驱动程序模块。除了在公共系统上共享内核源之外,是否有更好的解决方案来构建驱动程序?
答案 0 :(得分:3)
你们当中有人应该在当地这样做。假设您的内核源目录是$ kern_dir,您将在新的临时区域(内核源层次结构之外)中构建以下工件。叫这个$ stage。
在暂存区域内,创建一个子目录层次结构:$ stage / lib / modules / $ kernel_version / build($ kernel_version应与内核Makefile中的KERNEL_VERSION匹配;生成的路径将与您当前的目录名相同在目标系统上安装模块);叫这个$ build。
# Configure and build the kernel as you currently do.
cp <my-kernel-config> to $kern_dir
cd $kern_dir
make oldconfig # or whatever is needed to set your config
make
# Create the staging area and build directory
mkdir -p $build
# Copy updated kernel config to staging area:
cp .config $build
# Create necessary kernel configuration support (in staging area) to support out-of-tree modules
make O=$build modules_prepare
# Add Module.symvers to build directory
cp Module.symvers $build
您现在应该拥有一个完全配置的构建目录,每个人都可以在自己的系统上安装。这是一个包含使用该内核构建所需的所有头文件的目录,以及描述内核构建的配置选项的信息以及描述内核导出符号的Module.symvers文件。
将其捆绑(“cd $ stage; tar czf kernel-devel.tgz lib / modules / $ kernel_version / build”)并将其分发给所有开发人员。
单独提交包含构建内核和相关模块的“包”(即内核附带的所有内容以及您未修改的内容);为此,请使用您现在使用的任何机制。让每个人都安装此内核并将目录构建到其目标(运行时)系统上。 (这应该给每个人一个共同的/ boot /和/ lib / modules层次结构。)
在 build 系统上,每个人都应该从上面安装kernel-devel.tgz。假设构建系统与目标系统运行相同的内核,并且您相对于root安装了kernel-devel.tgz(即它实际上在构建系统上的/ lib / modules / $ kernel_version / build中),那么您可以使用用于构建模块的“标准”模块Makefile模型。应该是这样的:
obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
如果你的构建系统没有运行相同的内核,那么只需将KDIR更改为你安装kernel-devel.tgz tarball的地方。
现在团队中的任何人都应该能够构建针对同一内核安装的模块。