ルールのコマンド部分で使用される定義で使用される条件付きメイクファイルの問題

StackOverflow https://stackoverflow.com/questions/228567

  •  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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top