Googleの新OS,Fuchsiaに使われてるらしいカーネル「lk」をx86_64なPCをターゲットにビルドしてみる.

表題の通りです.
レポジトリはここ
https://github.com/littlekernel/lk.git

まずは,
$ git clone https://github.com/littlekernel/lk.git
$ cd lk
ここで次のパッチをあてる.
diff --git a/arch/x86/toolchain.mk b/arch/x86/toolchain.mk
index dba751e..ac5c005 100644
--- a/arch/x86/toolchain.mk
+++ b/arch/x86/toolchain.mk
@@ -22,9 +22,10 @@ ARCH_x86_64_TOOLCHAIN_INCLUDED := 1
ifndef ARCH_x86_64_TOOLCHAIN_PREFIX
ARCH_x86_64_TOOLCHAIN_PREFIX := x86_64-elf-
-FOUNDTOOL=$(shell which $(ARCH_x86_64_TOOLCHAIN_PREFIX)gcc)
endif
+FOUNDTOOL=$(shell which $(ARCH_x86_64_TOOLCHAIN_PREFIX)gcc)
+
ifeq ($(FOUNDTOOL),)
$(error cannot find toolchain, please set ARCH_x86_64_TOOLCHAIN_PREFIX or add it to your path)
endif
diff --git a/engine.mk b/engine.mk
index cffbcdd..5d0f3b8 100644
--- a/engine.mk
+++ b/engine.mk
@@ -91,6 +91,7 @@ GENERATED := $(CONFIGHEADER)
# anything added to GLOBAL_DEFINES will be put into $(BUILDDIR)/config.h
GLOBAL_DEFINES := LK=1
+GLOBAL_DEFINES += HAVE_MREMAP=0
# Anything added to GLOBAL_SRCDEPS will become a dependency of every source file in the system.
# Useful for header files that may be included by one or more source files.
このパッチは2つの変更から為る.

ひとつめ
arch/x86/toolchain.mkの25行目,FOUNDTOOLが,ifndef ARCH_x86_64_TOOLCHAIN_PREFIX の中にある.
これだとARCH_x86_64_TOOLCHAIN_PREFIXを自分で指定したら必ずビルドに失敗してしまう.
しかも,この変数はもし宣言されてない場合はx86_64-elf-をプレフィクスにしようとする.大半のPCのLinux環境ではx86_64-pc-linux-gnu-だろう.
ふたつめ
engine.mkGLOBAL_DEFINESHAVE_MREMAP=0を追加する. Linuxだとこの環境変数はデフォルトで1にされてしまい,external/lib/heap/dlmalloc/dlmalloc.cmremap(2)を使おうとするが, その実装がこのプロジェクト中に存在しないので,ビルドに失敗する.

加えて,次の修正が必要かもしれない.
binutilsの中でも,nm, c++filt, objdump, objcopy, size, ldのコマンドを使用するが,このlkのビルドシステムはARCH_x86_64_TOOLCHAIN_PREFIXで指定したツールチェインのプレフィクスがこれらコマンドについてる前提でビルドする. しかし,x86_64向けのbinutilsにプレフィクスがついたコマンド名のコマンドが入ってない場合も多い.その場合はlnコマンドとか使ってなんとかするしかない.

以上を修正したところで,次の通りに実行.
(ただしツールチェインのプレフィクスは自分の環境に合わせてください)

$ env ARCH_x86_64_TOOLCHAIN_PREFIX=x86_64-pc-linux-gnu- make pc-x86-64-test
これでビルドは完了

P.S. という指摘を貰う.ARMとかMIPSとかだけじゃなくてi386/x86_64もここのツールチェイン使うが正解っぽい. FOUNDTOOL変数の定義の場所は明かにバグっぽいけど,そもそもここのツールチェインダウンロードしてパス通してってやれば,普通にプレフィクスそのままでビルド通るだろうから気がつかなかったんだろな.