Windows で MikanOS (その3:EDK2環境構築)

お疲れ様です！お世話になっております。！！
3回目となりました！今回もどうぞよろしくお願いいたします！！！

#【前回から】
前回の「その2」では Visual Studio Community 2017 をインストール
して、ソースコードのコンパイルやリンクを行いました。
今回は MikanOS のビルドに必要となる EDK2 の環境を構築したいと
思います。

EDK2環境の構築にあたり、バージョンを指定しないで EDK2 の
リポジトリを使用すると、一部コンポーネントがサブモジュール化
されて別のリポジトリを参照するようになっていたため、簡単に
環境構築することができませんでした。

そこで、 少し古いリリースバージョンですが UDK2017 を使用して
EDK2の環境構築をしたいと思います。
このバージョンは環境構築方法が公開されており、EDK2のビルド
ツールのソースコードや、ライブラリのソースコードなどの
構成ファイルも一式ZIPファイル化されています。
詳しくはこちらを参照ください。
https://github.com/tianocore/tianocore.github.io/wiki/UDK2017-How-to-Build

#【今回の目標】
"みかん本" の「2.1章 EDK II入門」を Windows環境に構築する。
UDK2017の環境構築方法に記載のある、 HelloWorld.efi が
ビルド出来たら目標達成とします。

#【結果】
**！ビルドできました！**
今回の HelloWorld.efi は下記の手順だけですと IA32 になって
しまうため、ビルド出来たら目標達成としました。
(おまけで x64 の HelloWorld.efi もビルドしました。)

#【必要なもの】
・「その2」で記載した「【必要なもの】」一式
・バージョン 2.0.7 以降の Netwide Assembler (NASM)
　https://www.nasm.us/
・バージョン 2.7.x系の Python
　https://www.python.org/
・UDK2017のソースコード
　https://github.com/tianocore/edk2/archive/vUDK2017.zip
　

#【手順】
※ここでの手順は UDK2017 の構築手順になるべく番号を合わせます。

1. ビルド環境をセットアップする<BR>
　i) Visual Studio Community 2017 をインストールする<BR>
　　 AMD64のコンパイラーを選択しましょう。<BR>
　　 前回の「その2」の手順が終わっていれば既に選択されて<BR>
　　 インストールされています。<BR>
　ii) バージョン <B>2.0.7 以降の NASM をインストール</B>する<BR>
　　 <B>NASM は C:\Nasm にインストール</B>しましょう。<BR>
　　 システムの環境変数 <B>PATH に C:\Nasm を追加</B>しましょう。<BR>
　　 私は 2.15.05 の win64 インストーラー版でインストール<BR>
　　 しました。<BR>
　　 インストール中はインストール先ディレクトリの変更が<BR>
　　 必要です。<BR>
　　 なお、システム環境変数 <B>PATH は手動で追加する必要が<BR>
　　 あります。</B><BR>
　　 また、後の手順 5.で必要となりますので、ここで<B>ユーザー<BR>
　　 環境変数名 NASM_PREFIX として C:\NASM\ を手動で<BR>
　　 追加してください。</B><BR>
　iii) Windows版Git(GitHub) をインストールする<BR>
　　 前回の「その2」の手順が終わっていれば既にインストール<BR>
　　 されています。<BR>
　iv) バージョン <B>2.7.x系の Python インストール</B>する<BR>
　　 Python は <B>C:\Python27 にインストール</B>しましょう。<BR>
　　 (1) システムの環境変数 <B>PATH に C:\Python27 を<BR>
　　 　追加</B>しましょう。<BR>
　　 (2) <B>ユーザーの環境変数名 PYTHON_HOME として <BR>
　　　　C:\Python27 を追加</B>しましょう。<BR>
　　 "Windows x86-64 MSI installer" 版を使用すると、インストール<BR>
　　 フォルダが C:\Python27 に設定されます。<BR>
　　 私は 2.7.18 をインストールしました。<BR>
　　 (1)について、デフォルト設定のままでインストールすると、<BR>
　　 環境変数<B>PATH を手動で編集する必要があります。</B><BR>
　　 (2)について、後のコマンド入力回数を減らすために行う<BR>
　　 設定です。<BR>
<BR>
2. UDK2017リリースのディレクトリとソースコードを準備する<BR>
　i) 作業用ディレクトリを作成する<BR>
　　 コマンドプロンプトを開き、以下を入力する<BR>
　　 - <B>mkdir C:\MyWorkspace</B><BR>
　ii) UDK2017リリースのディレクトリとソースコードが圧縮<BR>
　　 されたZIPファイルをダウンロードし、i) で作成した作業用<BR>
　　 ディレクトリに展開する<BR>
　　 UDK2017リリースのディレクトリとソースコードが圧縮<BR>
　　 されたZIPファイルはこちらからダウンロードできます。<BR>
　　 　https://github.com/tianocore/edk2/archive/vUDK2017.zip<BR>
　　 展開は C:\MyWorkspace に ZIPファイルの edk2-vUDK2017 <BR>
　　 フォルダ以下が配置されるようにしてください。<BR>
　　 robocopyコマンド を使用する場合は、管理者権限のある<BR>
　　 コマンドプロントで以下のように入力します。<BR>
　　   - robocopy .\edk2-vUDK2017 C:\MyWorkspace \*.\* /copyall /move /s /e<BR>
　iii) 省略します。<BR>
　　 手順の ii) あるいは iii) は、どちらかを選択して行うものと<BR>
　　 なりますので、ここでは iii) を省略します。<BR>
　iv) 省略します。<BR>
　　 後述の手順 4.で BaseTools をビルドしますので、ここでは<BR>
　　 iv) を省略します。<BR>
<BR>
3. OpenSSL Crypto Library を準備する<BR>
"C:\MyWorkspace\CryptoPkg\Library\OpensslLib\OpenSSL-HOWTO.txt"<BR>
を参照して OpenSSL Crypto Library 1.1.0e を準備します。<BR>
※とは書きましたが、実際には同テキストファイルに書かれている<BR>
　「HOW to Install OpenSSL for UEFI Building」 セクションの<BR>
　「1. Clone the latest official OpenSSL release into the directory」<BR>
　に書かれていることを行います。<BR>
　<B>以下は UDK2017 の構築手順には記載のない追加となる手順です。</B><BR>
　i) <B>コマンドプロンプトを開く</B><BR>
　ii) C:\MyWorkspace\CryptoPkg\Library\OpensslLib へカレント<BR>
　　ディレクトリを移動する<BR>
　　   - <B>cd C:\MyWorkspace\CryptoPkg\Library\OpensslLib</B><BR>
　iii) Git で OpenSSL_1_1_0e を openssl に clone する<BR>
　　   - <B>git clone -b OpenSSL_1_1_0e https://github.com/openssl/openssl openssl</B><BR>
<BR>
4. BaseTools をビルドする<BR>
以下の手順で EDK2(UDK2017) の BaseTools をビルドします。<BR>
　0) スタートメニュー の Visual Studio 2015 にある、<BR>
　 <B>「VS2015 x86 Native Tools コマンド プロンプト」を開く</B><BR>
　　<B>※x64を選んでしまうと、この後のビルドに失敗するため<BR>
　　　選ばないでください。</B><BR>
　i) カレントディレクトリを C:\MyWorkspace に移動する<BR>
　　 - <B>cd C:\MyWorkspace</B><BR>
　ii) 以下のように入力して BaseTools のビルドを行う<BR>
　　 - set PYTHON_HOME=C:\Python27 (これは省略可)<BR>
　　 - <B>set EDK_TOOLS_PATH=%CD%\BaseTools</B><BR>
　　 - <B>BaseTools\toolsetup.bat Rebuild</B><BR>
　　 <B>※注意：UDK2017の手順と実際のバッチファイル名に違いがありました。</B><BR>
　　バッチファイルの実行中に以下の WARNING が出ますが<BR>
　　ここでは無視します。<BR>
　  「!!! WARNING !!! Cannot make executable from Python code, executing python scripts instead !!!」<BR>
<BR>
5. NT32プラットフォームでビルドを行う<BR>
以下の手順でUEFIモジュールをビルドします。<BR>
　i) スタートメニュー の Visual Studio 2015 にある、<BR>
　 <B>「VS2015 x86 Native Tools コマンド プロンプト」を開き</B><BR>
　　カレントディレクトリを C:\MyWorkspace に移動する<BR>
　　   - <B>cd C:\MyWorkspace</B><BR>
　ii) 以下の通り edksetup.bat を実行してビルド環境を準備します。<BR>
　　   - <B>edksetup --nt32</B><BR>
　　バッチファイルの実行中に以下の2つの WARNING が出ますが<BR>
　　ここでは無視します。<BR>
　　「!!! WARNING !!! PYTHON_FREEZER_PATH environment variable is not set.」<BR>
　　「!!! WARNING !!! No CYGWIN_HOME set, gcc build may not be used !!!」<BR>
　iii) 以下の通り build を実行して HelloWorld.efi をビルドする<BR>
　　   - <B>build -t VS2015x86</B><BR>
　iv) HelloWorld.efi がビルドされたか確認する<BR>
　　   - <B>dir C:\MyWorkspace\Build\NT32IA32\DEBUG_VS2015x86\IA32\HelloWorld.efi</B><BR>
　　   <B>※注意：UDK2017の手順とビルドされたファイルが<BR>
　　　　　保存されるフォルダ名に違いがありました。</B><BR>

#【おまけ】
上記まで出来たら、せっかくなので x64 で HelloWorld.efi もビルド
したいと思います。

1. テキストエディタで C:\MyWorkspace\Conf\target.txt を修正して<BR>
保存する<BR>
修正内容は以下の2点です。<BR>
・TARGET_ARCH           = <B>IA32</B><BR>
　-> TARGET_ARCH           = <B>X64</B><BR>
・TOOL_CHAIN_TAG        = <B>MYTOOLS</B><BR>
　-> TOOL_CHAIN_TAG        = <B>VS2015x86</B><BR>
2. スタートメニュー の Visual Studio 2015 にある、<BR>
<B>「VS2015 x86 Native Tools コマンド プロンプト」を開く</B><BR>
3. カレントディレクトリを C:\MyWorkspace に移動する<BR>
　- <B>cd C:\MyWorkspace</B><BR>
4. 以下の通り edksetup.bat を実行してビルド環境を準備する<BR>
　- <B>edksetup --nt32 X64</B><BR>
5. 以下の通り build clean を実行する<BR>
　- <B>build clean</B><BR>
6. 以下の通り build を実行して HelloWorld.efi をビルドする<BR>
　- <B>build</B><BR>
7. HelloWorld.efi がビルドされたか確認する<BR>
　- <B>dir C:\MyWorkspace\Build\NT32X64\DEBUG_VS2015x86\X64\HelloWorld.efi</B><BR>

#【紆余曲折】
・EDK2環境は バージョンなしEDK2 -> UDK2017 -> UDK2018 -> UDK2017
　と作ってはうまく動かず消してを繰り返してしまいました。
　・バージョンなしEDK2 : C:\MyWorkspace\BaseTools\Source\C\BrotliCompress
　　が git clone できず断念(だいぶわかっていない)
　・1回目のUDK2017 : OpenSSL Crypto Library の準備方法がわからなくて
　　(よく読んでいなくて)、UDK2018に浮気(まだまだわかっていない)
　・1回目のUDK2018 : UDK2018の手順を読んでいたらUDK2017でやり直せる
　　ような気がして元鞘(まだあやしい)
　・2回目のUDK2017 : 出来た！(こいつ大丈夫か？)

#【次回の目標】
・"みかん本" の「2.2章 EDK IIでハローワールド(osbook_day02a)」を
　Windows環境で構築する。
にしようと思います。

#【参考とか引用とか】
・「HOW-TO: Set Up The EDK2's Windows-Hosted UEFI Environment With Visual Studio 2010.」
　https://uefi.blogspot.com/2012/06/how-to-set-up-edk2s-windows-hosted-uefi.html
　いろいろとやっているときに、こちらのサイトで edksetup.bat に --nt32 の
　オプションが必要であることがわかりました。
・target.txt の TOOL_CHAIN_TAG の設定値に関しては下記に記載があります。
　「Windows systems ToolChain Matrix」
　https://github.com/tianocore/tianocore.github.io/wiki/Windows-systems-ToolChain-Matrix