Toolchainにクロスコンパイラを設定したが、CMakeのチェックが通らない!
AppleシリコンMac上のCLionで, Setting->Build execution, debug->Toolchain にarm-none-eabi-gccを登録するとCMakeのチェックが自動で走る。
このチェック、クロスコンパイラを指定しても、なぜかapplieシリコン用コンパイラで使われる"-arch"というオプションが使われてしまう。arm-none-eabi-gccには"-arch"というオプションがないのでエラーになる。
そこで、どうするか。
まず正しいコンパイラを取ってくる。
brew install arm-none-eabi-gcc
とかで取ってくると、includeファイル等が含まれないバイナリだけインストールされる。インストールはこちら。
brew install --cask gcc-arm-embedded
間違ってインストールしてしまっていたら、
brew uninstall arm-none-eabi-gcc
brew autoremove
等でアンインストールしておく。
Setting->Build execution, debug->Toolchain ... ではない。
このページでコンパイラを指定すると、直後にCMakeのチェックが自動で走る。arm-none-eabi-gccを設定してもなぜかAppleシリコン用の-archオプションが設定されるのでエラーが発生する。ここのチェックがどのcmakefile.txtから行われるかは追い切れなかった。
Vsicual StudioやHEWに慣れていると、ここでクロスコンパイラを指定したくなる。ところがこのページには設定箇所がほとんどない。仕方が無いのでCLionはここでクロスコンパイラの切替は行わず、mac用コンパイラのみを設定するようにうにする。
クロスコンパイラの指定は、プロジェクトのCMakefile.txtで行う。
CubeMXが生成するCMakefile.txtを確認する。
CubeMXのような組み込み用cmake生成ツールで作成されたCMakefile.txtには、arm-none-eabi-gcc等のクロスコンパイラの設定が入っているので確認する。クロスコンパイラまでのパスが通っていることも確認する。確認は
which arm-none-eabi-gcc
で行える。
CMakeの引数の設定で、Appleシリコン用のコンパイルオプションを回避する。
この時点でTools->CMake->Reset Cache and Reload Projedectを選択すると、CMakeの事前チェックが走る。このときはルートのCMakefile.txtと、Setting->Build execution, debug->CMakeで指定した実行環境が使用される。何もしないと、ここでも事前チェックで-archが設定されてしまい、エラーで終わる。
これを避けるには、CMakeのコマンドラインオプションに-archのチェックをさせないオプションを指定する。 Setting->Build execution,debug->CMake のCMkaeオプションに
-DCMAKE_SYSTEM_NAME=Generic
を指定する。
何も記入されていないときにデフォルトのオプションがグレーで表示されているが、かまわずこれだけを記入すると、グレーで書かれていたオプションに追加となる。これで-archのオプションが指定されなくなる。
この指定はCMakefile.txtの冒頭でsetコマンドにて指定することも可能だが、これだとなぜか事前チェックが通らないので引数で指定するのがよかった。
またtoolchain.cmakeを用意して、その中のsetコマンドで上記を指定 -> コマンドラインオプションでtoolchainを指定でも回避できるが、どのみちコマンドラインオプションを指定しなければならないので、新たにファイルを用意するよりはcmakeの引数で設定するほうがスマートだと思う。