4

この種の構造を持つメイクファイルのセクションがあります。


bob:
ifdef DEBUG
    @echo running
endif
    @echo chug chug chug
ifdef DEBUG
    @echo done
endif    

bobit:
    @echo "before"
    @make bob
    @echo "after"

ここでは非常に単純化しています。すべてのエコーは実際には重要なコマンドのブロックであり、さらに条件付きのものがありますが、これは私の問題の本質を捉えています。

技術的な理由から、今は入りたくないので、そのサブメイクを取り除く必要がありますが、echo は重要な量のコードを表しているため、bob の本体を単にコピーして貼り付けたくはありません。サブメイク。

理想的には、私がやりたいことはこのようなものです


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: コマンドが見つかりません」というエラーが発生します。eval と call のさまざまな組み合わせでこれを回避しようとしましたが、それを機能させる方法を見つけられないようです。

どうすればこれを機能させることができますか? そして、それは問題にアプローチする正しい方法でさえありますか?

4

2 に答える 2

2

私がこれを修正した方法は、代わりに 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"

于 2008-10-24T10:30:20.700 に答える
0

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
于 2011-10-05T20:49:09.797 に答える