STM32CubeMXはコード生成時にmain.c
を生成する。main.cpp
があってもmain.c
が作成される。その他のソースファイルについても同様。
STM32CubeMXではProject Manager
タブのCode Generator
からUser Actions
でBefore Code Generation
およびAfter Code Generation
を指定することで、コード生成の前と後に何らかのコマンドを実行することができる。ここでリネームを走らせれば、main.cppをmain.cとして処理できる。ただしちょっと癖が強く、狙い通りに動かすのに手間取ったため、方法をメモっておく。なお、使用したSTM32CubeMXはWindows環境のv6.10.0。
結構変な設定になるので、万人向けというわけではない。
手順
ショートカットを作成する
リンク先を%userprofile%\AppData\Local\Programs\STM32CubeMX\STM32CubeMX.exe hoge.ioc
として、STM32CubeMXを起動した上でプロジェクトファイルを読み込ませる(exeのパスは適宜変更)。
作業フォルダを空欄にし、プロジェクトフォルダをカレントディレクトリとして使用するようにする。
STM32CubeMXを起動するときは、必ずこのショートカットで起動する。
必要に応じて:ショートカットを.gitignore
に追加して、各環境で独自に用意してもらう。
バッチファイルを作成する
@ren core\src\*.cpp *.c
@ren core\src\*.c *.cpp
renコマンドのワイルドカードでcore/src
の*.cpp
を*.c
に書き換えている。main.cppだけ使いたい場合はそれだけ指定すればいい。
CubeMXでバッチファイルを指定する
Project Manager
→Code Generator
→User Actions
のBefore Code Generation
とAfter Code Generation
に対して、beforeCodeGeneration.bat
とafterCodeGeneration.bat
を指定する。
以上の手順により、GENERATE CODE
を実行すると、コード生成の前にbeforeCodeGeneration.bat
が実行され、コード生成の後にafterCodeGeneration.bat
が実行される。バッチファイルの中でリネーム処理を行うため、*.cpp
ファイルを一時的に*.c
ファイルへ変更し、CubeMXで処理できるようになる。
hoge.ioc
をダブルクリックしてSTM32CubeMXを起動するとUser Actionの相対パス(カレントディレクトリ)が変わり、バッチファイルの起動ができない。GENERATE CODEを使うときはショートカットから起動するのを忘れないようにする。
ショートカットを使わず(通常の手順で)STM32CubeMXを起動した場合、カレントディレクトリはCubeMXのインストール先となる。この場合でも、User Actionsのパスを絶対パスor相対パスで適切に指定してやればバッチファイルを起動することはできる(ショートカットを作る&使う手間と、絶対パス(or長い相対パス)のどちらを選ぶかのトレードオフ)。
Toolchain / IDEにMakefileを指定している場合、MakefileのC_SOURCESに各々の*.c
のパスが追加されるから、忘れずに削除する必要がある。また、リンカスクリプト(*.ld)も上書きされるため、これを変更している場合は元に戻す操作も必要になる。LDはそう書き換えるものでもないから、beforeでバックアップしafterで上書きするみたいな処理を追加すると良さそう。
ハマった点
- STM32CubeMXのUser Actionsはパスをダブルクオーテーションで囲むと実行できない(パスの途中にスペースが入っていても囲む必要はない)
- STM32CubeMXのUser Actionsは起動オプションを指定することはできない
- renコマンドはディレクトリをたどるときにスラッシュは不可でバックスラッシュが必要