🙄

mbed cli で export した vscode プロジェクトの make で失敗したでござるの巻

2022/01/22に公開

経緯

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