mbed cli で export した vscode プロジェクトの make で失敗したでござるの巻
経緯
mbed cli を使って vscode 上で開発する場合、 mbed cli でvscode 用にプロジェクトを export できる。
vscode 以外にも export に対応しており、自分がやりなれた、適したIDE で開発可能。
が、mbed cliが吐いた makefile でエラーが発生したので解決する。
環境
- GNU Tools for Arm Embedded Proccessors 9-2019-q4-major 2019
- Git 2.26.1
- TortoiseHg 5.0.2
- GnuWin32 Make-3.81
- Python 3.8.2
※公式サイトのチュートリアルを参考に環境を構築
mbed cli が吐いた Makefile
小生も BLE のサンプルプロジェクトをexport してmake した結果、以下のように失敗。(隙を生ぜぬ3段構えでした。)
make に失敗~その①~
windows環境のecho でダブルクオーテーションが出力される問題が原因。
以下のエラーが発生。
make[1]: *** [BLE_GattServer.elf] Error -1073741819
パット見で原因不明。プリントデバッグを施して原因個所を特定し、Makefile を以下のように直せば解消した。
- +@echo "$(filter %.o, $^)" > .link_options.txt
+ +@echo $(filter %.o, $^) > .link_options.txt
make に失敗~その②~
windows の標準出力で 8192 byte 以上切り落とし問題が原因。.link_options.txt に書き込むリンク情報が切り落とされるので、以下のようなエラーが発生。
make[1]: *** [BLE_GattServer.elf] No such file directory
こちらもエラーmsgからは特定が厳しかったが、.link_options.txt が途中でちょん切られていたのを見て原因を推定。
1行でリンク情報を.link_options.txtへリダイレクトしている個所を、リンク情報を1つずつリダイレクトするように修正。
+ define append
+ +@echo $1 >> .link_options.txt
+ endef
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) $(PROJECT).link_script.ld
- +@echo "$(filter %.o, $^)" > .link_options.txt
+ +@echo. > .link_options.txt
+ $(foreach LINK_OPTION, $(filter %.o, $^), $(call append, $(LINK_OPTION)))
+@echo "link: $(notdir $@)"
これを直してもまた失敗。。。
make に失敗~その③~
Makefile で call する定義の最下行に空行がないのが原因。
発生する現象は、.link_options.txt にリダイレクトされる内容にコマンド名+@echo が含まれてしまうこと。このせいでリンクに失敗する。
以下のように修正する。
define append
+@echo $1 >> .link_options.txt
+
endef
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) $(PROJECT).link_script.ld
+@echo. > .link_options.txt
$(foreach LINK_OPTION, $(filter %.o, $^), $(call append, $(LINK_OPTION)))
+@echo "link: $(notdir $@)"
これで make に成功! Yatta!
ただ、正しい解決策としては、mbed osや driver を意味ある単位で静的ライブラリとしてリンクして、最後に全部まとめることだと思う。
Discussion