0

チームで Android カーネル ドライバーを開発しています。ドライバはロード可能なモジュールとして開発され、カーネル ソースとは別にコンパイルされます。ただし、ドライバー モジュールをビルドするには、最初に Android カーネル ソースをビルドする必要があります。各開発者は git からカーネルの変更をプルし、カーネル バイナリをビルドします。カーネル バイナリは各開発者のローカル システムで異なるため、カーネル バイナリとドライバー モジュールの両方を毎回置き換える必要があります。共通システムでカーネル ソースを共有する以外に、ドライバーをビルドするためのより良い解決策はありますか?

4

1 に答える 1

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 階層が提供されます。)

ビルドシステムでは、全員が上から 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 をインストールした場所に変更します。

これで、チームの誰もが同じカーネルに対してインストールされるモジュールをビルドできるようになります。

于 2014-06-14T21:40:02.220 に答える