読者です 読者をやめる 読者になる 読者になる

macでEDK2のビルドメモ

uefi mac

UEFIの開発環境では一番メジャーなんじゃないかと勝手に思っているEDK2ですが、オフィシャルのドキュメントの手順だとうまくいかなくてちょっと手順を変更したところがいくつかあるので今後のためのメモです。
まず、公式サイトのドキュメントはUnix-like systemsこちらです。

まずビルドした環境はこんな感じです。macは未だにLionですがSnow LeopardからLionにあげてまあ良いかってなってるだけですw そもそもcpuがC2D、メモリが2GBという2世代くらい前のモデルなので。。。

  • Mac OS X Lion 10.7.5
  • gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
  • Xcode Version 4.5.2 (4G2008a)

あと、gccのビルドにgmpとmpfrの2パッケージが必要です、makeinfoコマンドも必要ですがこちらはなければインストールしてください。texinfoとかそんな感じのパッケージ名だと思います。
それでgmpとmpfrはportsでもhomebrewでも野良ビルドでも構いません。私はhomebrewで入れました。
ここまではドキュメント通りですが、ここから多少変わります。

まず、binutilsgccをクロスコンパイルするのですが、このときにbinutilsmd5チェックサムのチェックでエラーになります。これはmingw-gcc-build.pyがbinutils-2.20.51.0.5.tar.gzというファイルをダウンロードするのですが、これ自体がftpサイトにないためです。なので違うバージョンのbinutilesをダウンロードする必要があります。
私は似たようなバージョンということで2.21.51.0.5をダウンロードするようにしてついでにmd5も変更しました。

--- BaseTools/gcc/mingw-gcc-build.py    (revision 14113)
+++ BaseTools/gcc/mingw-gcc-build.py    (working copy)
@@ -210,8 +210,8 @@
         'binutils': {
             'url': 'http://www.kernel.org/pub/linux/devel/binutils/' + \
                    'binutils-$version.tar.bz2',
-            'version': '2.20.51.0.5',
-            'md5': '6d2de7cdf7a8389e70b124e3d73b4d37',
+            'version': '2.21.51.0.5',
+            'md5': '85cdd97069c230b0a8771d50e309754f',
             },
         }

実はmd5のチェックはあとで無効にしたのですがw それはさておきbinutilesはこれでダウンロード&ビルドが成功するはずです。
これが終わるとgccのビルドなのですが、スクリプトで指定している4.3.0だとコンパイルエラーになるためバージョンをかえました。この4.4.6というのはCentOSgnu-efiをビルドするのに使ったバージョンです。もうちょい新しくても良いかもですが。

         'gcc': {
             'url': 'http://ftpmirror.gnu.org/gcc/' + \
                    'gcc-$version/gcc-$version.tar.bz2',
-            'version': '4.3.0',
+            'version': '4.4.6',
             'md5': '197ed8468b38db1d3481c3111691d85b',
             },
         }

あとはチェックサムのチェックはいらないかって思ったのでチェックするメソッドではTrueを返すようにしてます。

@@ -350,7 +350,8 @@
         data = open(local_file).read()
         md5sum = md5()
         md5sum.update(data)
-        return md5sum.hexdigest().lower() == expect_md5.lower()
+        #return md5sum.hexdigest().lower() == expect_md5.lower()
+        return True

これでbinutilsgccがクロスコンパイルできました。
ちなみに、gnu-efiはELFのバイナリをPE32+に変換するのでコンパイラはELFを作るので(README.gnuefi参照)Linux環境(BSDもかな?)だとgccのクロスコンパイラはいらないんですが、EDK2はmingwで最初からPEなバイナリを作るのでクロスコンパイラ作りが必須なのですね。

あとはドキュメント通りで大丈夫なはずです。
ただ、HelloWorldのサンプルをビルドするときに環境変数が足りなくて失敗したので環境変数としてWORKSPACEを追加したのと、PATHに$HOME/edk2/BaseTools/BinWrappers/PosixLike/を追加しました。ドキュメントだとbuildコマンドでビルドするって書いてありますがこれや、その他のコマンドがPosixLike以下にあるのでパスを通す必要がありました。
*$HOME/edk2はedk2のソースがある場所です。私は~/srcは使わなかったので。
あとEDK_TOOLS_PATHも.zshrcに追加しておきました

WORKSPACE=$HOME/edk2; export WORKSPACE
EDK_TOOLS_PATH=$HOME/edk2/BaseTools ; export EDK_TOOLS_PATH

とまあこんなところです。私が何か忘れてなければこれでmacでEDK2のビルドができると思います。
サンプルのHelloWorld.efiはmacのrEFIt、QEMUのUEFIシェルで動作することを確認しました。
ヾ(*'-'*)マタネー♪