私はマイクロコントローラを操作するためのmakefileを作成しています。
さまざまなPHONYの目標は次のとおりです。
- ビルド - プロジェクトをビルドします。
- フラッシュ - フラッシュMCU
- シリアル - Minicomシリアルインターフェイスを開きます。
これらのどれも他のものに厳密には依存しません。たとえば、再構築や再フラッシュなしでシリアルを開くことができます。
ただし、他のターゲットが指定されている場合(たとえばmake flash serial
)、特定の順序に従う必要があります(フラッシュ前のビルド、シリアルを開く前のフラッシュ)。
Makeは-j
同時実行可能状態()で実行されており、変更したくありません。
(必要でない場合)毎回これらの依存関係を確認/更新する必要なく、ターゲットの順序を保証するためにオプションの依存関係をどのように定義できますか?
ベストアンサー1
これはGNU Make用に書かれています。 MAKECMDGOALSがGNU専用かPOSIXかはわかりません。
Make では、ビルドターゲットがMAKECMDGOALS
変数に存在する必要があることを明示的に要求します。
ソート目的のためにオプションの依存関係を定義するためにそれらをフィルタリングできます。
after = $(filter $(strip $1), $(MAKECMDGOALS))
post_build = $(call after, build)
post_flash = $(call after, flash) $(post_build)
...
.PHONY: build flash serial debug
...
flash: | $(post_build)
st-flash ...
serial: | $(post_flash)
minicom ...
debug: | $(post_flash)
$(GDB) ...
そのように:
make build
プロジェクトを構築するmake flash
現在のバージョンでMCUを更新します。make serial
シリアルインターフェイスを開きますmake flash serial
(またはその逆)MCUをフラッシュしてからシリアルインタフェースを開きます。make build flash
プロジェクトが構築された後、MCUはフラッシュされます。make build flash serial
(任意の順序で)最初にビルドしてからフラッシュし、シリアルインターフェースを開きます。