何故かいまさら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 が出てこなかった。
1 2 3 4 5 6 7 8 9 10 | $ 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 を使わせる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | --- 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 |
あとは、テストがてら:
1 2 3 | $ 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 用のファームウェアも作れるはず。たぶん。
1 2 3 4 | $ 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の方はたまに手が入ってる。けれどビルドが通らなかった。みんなどんな環境でやってるのだろうか。