何故かいまさらIntel Galileo (Gen1) を手に入れた。2枚。
それで、1枚のファームウェアが壊れてしまった?のだが、リカバリ用のバイナリは配布していなくて、自分で作れということらしい。
まあ、そのままもう1枚で遊べばよいのだけれど、せっかくなのでビルドしようかと。
そして、どハマりする。
Quark まわりのソースの更新はとっくに終わっている(※)が、ドキュメントに従うと環境 (edk2) が最新になってしまって、うまくいかない。
そこで、ソースの最終更新時点やその前後の edk2 を使ってみるが、それぞれ違う場所でエラーになる。
というか、どの時点のを使ってもエラーになる気がする。
依存関係が入り組んでいてよくわからん……
ドキュメントもWeb上に新旧いろいろ置いてあってどれが正しいかわかりにくい。
というか、どれも微妙に間違っている気がする。
よくわからん……
よくわからんので、「環境もソースも古いものを使う」方針でやったところ、一応ビルドは通ったのでメモっておく。
edk2 は vUDK2018 タグのものを使う。
この時期だと QuarkPlatformPkg
がまだ edk2-platform に追い出されていない。(2019/05/13に移動)
手元の環境はWindowsだけれども、いまさら推奨のVS2015を入れるのもどうかと思ったので、WSL2でUbuntu 18.04.6 LTSを使用。
Ubuntu 20でも良いようなことが書いてあるドキュメントもあるが、標準の apt install では推奨の gcc 5.x が出てこなかった。
$ sudo apt update
$ sudo apt install build-essential uuid-dev iasl git nasm python
$ sudo apt install gcc-5-i686-linux-gnu
$ mkdir ~/src
$ cd ~/src
$ git clone -b vUDK2018 --recursive https://github.com/tianocore/edk2.git
$ git clone https://github.com/tianocore/edk2-non-osi.git
$ cd edk2
$ . edksetup.sh
$ make -C BaseTools
ポイント(?)は:
- Ubuntu 18 入れたての場合、最初に
apt update
をキメないといろいろエラーが出る - ドキュメントには Python 3 で良さそうな記述もあるが、括弧なし print が紛れ込んでいるので Python 2.7 を使う
- x64 の gcc-5 で(
-m32
オプションが付くので)良いはずだが、なぜかGenFw
でエラーが出るので IA32 用の gcc-5 を使う(理由は調べてない) - edk2 の
clone
時に--recursive
をつけると openssl (submodule) もとってきてくれる
次に、Conf/tools_def.txt
を編集する。IA32用の gcc-5 を使わせる。
--- Conf/tools_def.txt.ORIG 2024-09-19 13:23:39.318273321 +0900
+++ Conf/tools_def.txt 2024-09-19 13:26:17.402136023 +0900
@@ -5460,17 +5460,17 @@
##################
# GCC5 IA32 definitions
##################
-*_GCC5_IA32_OBJCOPY_PATH = DEF(GCC5_IA32_PREFIX)objcopy
-*_GCC5_IA32_CC_PATH = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_SLINK_PATH = DEF(GCC5_IA32_PREFIX)gcc-ar
-*_GCC5_IA32_DLINK_PATH = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_ASLDLINK_PATH = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_ASM_PATH = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_PP_PATH = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_VFRPP_PATH = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_ASLCC_PATH = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_ASLPP_PATH = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_RC_PATH = DEF(GCC5_IA32_PREFIX)objcopy
+*_GCC5_IA32_OBJCOPY_PATH = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-objcopy
+*_GCC5_IA32_CC_PATH = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_SLINK_PATH = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-ar-5
+*_GCC5_IA32_DLINK_PATH = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_ASLDLINK_PATH = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_ASM_PATH = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_PP_PATH = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_VFRPP_PATH = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_ASLCC_PATH = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_ASLPP_PATH = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_RC_PATH = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-objcopy
*_GCC5_IA32_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -m32 -fno-lto
*_GCC5_IA32_ASLDLINK_FLAGS = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -Wl,-m,elf_i386
あとは、テストがてら:
$ build -p MdeModulePkg/MdeModulePkg.dsc -t GCC5
$ file Build/MdeModule/DEBUG_GCC5/IA32/HelloWorld.efi
Build/MdeModule/DEBUG_GCC5/IA32/HelloWorld.efi: MS-DOS executable
と、HelloWorld.efi
ができていればヨシ。
ここまでできれば、あとはこんな感じで Galileo 用のファームウェアも作れるはず。たぶん。
$ export WORKSPACE="$PWD"
$ export PACKAGES_PATH="$WORKSPACE:$WORKSPACE/../edk2-non-osi/Silicon/Intel"
$ export EDK_TOOLS_PATH="$WORKSPACE/BaseTools"
$ build -t GCC5 -p QuarkPlatformPkg/Quark.dsc -DGALILEO=GEN1 -DRECOVERY_ENABLE=TRUE
(でも別のところでつまっていて、リカバリ自体はまだ……)
最新版のソースのビルドを(楽に)通す方法が見つかればまたそのうち。
※Intelの方はdiscontinueだが、edk2-platformの方はたまに手が入ってる。けれどビルドが通らなかった。みんなどんな環境でやってるのだろうか。