ルールのコマンド部分で使用される定義で使用される条件付きメイクファイルの問題
-
04-07-2019 - |
質問
この種の構造を持つメイクファイルのセクションがあります:
bob:
ifdef DEBUG
@echo running
endif
@echo chug chug chug
ifdef DEBUG
@echo done
endif
bobit:
@echo "before"
@make bob
@echo "after"
ここでは大幅に簡略化しています。すべてのエコーは実際にはコマンドの自明ではないブロックであり、条件付きのものもありますが、これは私の問題の本質を捉えています。
今は入りたくない技術的な理由から、そのサブメイクを削除する必要がありますが、エコーは些細な量のコードを表しているので、ボブの本文をコピーして貼り付けたくありませんサブメイクの場所。
理想的には、このようなことをしたい
define BOB_BODY
ifdef DEBUG
@echo running
endif
@echo chug chug chug
ifdef DEBUG
@echo done
endif
endef
bob:
$(BOB_BODY)
bobit:
@echo "before"
$(BOB_BODY)
@echo "after"
残念なことに、条件文は私を刺激しているように見えますが、「ifdef:Command not found」エラー、evalとcallのさまざまな組み合わせでこれを回避しようとしましたが、それを機能させる方法がわかりません。
この作業を行うにはどうすればよいですか?そしてそれは問題にアプローチする正しい方法でさえありますか?
解決
これを修正した方法は、代わりにbash条件を使用することです。これは、ルールを作成せずにコマンドで遊んでいるため、実際にはある程度の意味があります。
つまり、上からの私の理想的な解決策は
define BOB_BODY
@if [[ -n "$(DEBUG)" ]]; then \
echo running; \
fi;
@echo chug chug chug
@if [[ -n "$(DEBUG)" ]]; then \
echo done; \
fi
endef
bob:
$(BOB_BODY)
bobit:
@echo "before"
$(BOB_BODY)
@echo "after"
他のヒント
ifdef / defineの順序を単純に変更できます:
ifdef DEBUG
define BOB_BODY
@echo running
@echo chug chug chug
@echo done
endef
else
define BOB_BODY
@echo chug chug chug
endef
endif
更新
define CHUG
@echo chug chug chug
endef
ifdef DEBUG
define BOB_BODY
@echo running
$(CHUG)
@echo done
endef
else
define BOB_BODY
$(CHUG)
endef
endif
所属していません StackOverflow