インテルx86ホストでARMアーキテクチャ上のhelloworldカーネル(2.6.x)モジュールをクロスコンパイルしようとしています。
ARMのコードソースツールチェーンは、次の場所にあります。/ home/ravi/workspace/hawk/arm-2009q
カーネルソースは次の場所にあります:/ home/ravi/workspace/hawk/linux-omapl1
私のメイクファイル:
Arch=arm
CROSS_COMPILE=arm-none-linux-gnueabi
obj-m := Hello.o
KDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(Shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
makeを実行すると、生成される.koはホストマシンの.koになります。これは、メイクファイルがクロスコンパイラではなくネイティブコンパイラを呼び出すことを意味します。クロスコンパイラのバイナリは私のパスにあります。
Arch
とCROSS_COMPILE
がMakefileで機能しません。それらをコマンドラインに配置する必要があります。
make Arch=arm CROSS_COMPILE=arm-none-linux-gnueabi-
交換
アーチ=腕
CROSS_COMPILE = arm-none-linux-gnueabi
沿って
arch:= armをエクスポート
export CROSS_COMPILE:= arm-none-linux-gnueabi-
これは、毎回これらのパラメーターコマンドラインを指定したくない場合にも機能します。
サイドノート: SUBDIRS=
は廃止され、M=
。
試してみてください、ArchとCROSS_COMPILEをデフォルトに追加して、きれいにするのを忘れました
Arch=arm
COMPILER=arm-none-linux-gnueabi
obj-m := Hello.o
KERNELDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(Shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) Arch=$(Arch) CROSS_COMPILE=$(COMPILER) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) Arch=$(Arch) clean
makefile変数宣言の最後にexport
を追加すると、サブシェルで使用可能になります。そして、ダッシュをCROSS_COMPILE
接頭辞に JayM 指摘として追加し、M
の代わりにSUBDIRS
として ser502515 回答します。
makefileで:=
ではなく=
を使用することをお勧めします。したがって、変数は1回だけ補間されます。しかし、この特定のケースでは実際には問題ではありません。
Arch := arm
CROSS_COMPILE := arm-none-linux-gnueabi-
obj-m := Hello.o
KDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(Shell pwd)
export
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean