Newlib(組み込み用標準Cライブラリ)をarm-none-eabi用にUbuntu上でビルドしていたところ、「warning: using cross tools not prefixed with host triplet」に遭遇しました.
実行環境
項目 | 説明 |
---|---|
OS | Ubuntu 20.04 LTS |
コンパイラ | x86_64 Linux hosted cross toolchains AArch32 bare-metal target (arm-none-eabi) |
warningの内容
これはconfigureスクリプトを実行する際に--hostオプションで指定したprefix(接頭字)とは異なるprefixをもつクロスコンパイラツールを利用しようとしたときに出てくる警告のようです.
この警告に関連するオプションは以下の3点です.
- --build...ビルドを行うマシンの情報. デフォルトではconfig.guessの結果自動的に設定される. 自分の環境ではi686-pc-linux-gnu.
- --host...ビルドしたバイナリを実際に動かすマシンの情報. デフォルトではbuildと同じ値(セルフコンパイル)となる. この値を--buildの値と別のものにするとクロスコンパイルとなる. 自分の環境ではarm-none-eabi.
- --target...コンパイラに出力させるシステムを指定. デフォルトではhostと同じ値になる. 滅多に指定する必要はない(rarely needed)とのこと. 自分の環境ではarm-none-eabi.
tripletとはa-b-cという形で指定されることを言っているようです. target tripletはcpu-vendor-osという形をとります. 今回の場合はarm-none-eabiなので、cpu=arm、 vendor=none、 os=eabiのことですね.
さて、クロスコンパイルをするのであればたいていの場合hostとtargetは同じ値になるはずです. そのうえ、使用するクロスコンパイルツールはこのhostの値をprefixに持つはずです. 具体的には、 --host=arm-none-eabiを指定した場合、arm-none-eabi-as やarm-none-eabi-stripなどを使うはずです . そこが食い違っていますが大丈夫ですか?という警告を出してくれているようです.
警告とはいえ、このメッセージが出る場合はほぼ間違いなく期待通りのビルドが出来ないと思われます(ビルドできたとしてもセルフコンパイルしただったとかになりそう).
warningの解決方法
configureスクリプト実行時にホストに適したクロスコンパイルツールを設定してやれば解決します. configureスクリプトの中身を見ると分かりますが、たいていは次のような変数の記述があります.
#configureスクリプトではたいていこれらの変数が定義されている CC AS AR OBJDUMP OBJCOPY STRIP . . .
これら変数に使用したいツールのコマンド名(prefixだけじゃダメ!)を指定すればそのコマンドをビルドに利用するようになります.ただし、configureスクリプトは パスが通っているディレクトリを巡回しコマンドを見つける ため、利用したいコンパイルツールのbinフォルダにパスを通しておきましょう.
結局のところ、.bashrcでArm GNU Toolchainへのパスを追加し、以下のようにconfigureするとビルドに成功しました.
#~/.bashrc #追記 export PATH=$PATH:path_to_arm_gnu_toolchain/bin
#configureスクリプトの実行 buildDir$ ../newlib/newlib/configure --target=arm-none-eabi --enable-newlib-io-long-long --enable-newlib-register-fini --enable-newlib-retargetable-locking --disable-newlib-supplied-syscalls CC=arm-none-eabi-gcc --host=arm-none-eabi --build=i686-pc-linux-gnu