0

ここでも、私が処理しようとしている別のmakeの問題があります(ほとんど)。読み取りたい値をいくつか設定しましたが、ループ内で変更しようとすると機能しません。$(FOUND)はまだ最初と同じですが、何が悪いのでしょうか?変数を設定したり、に変更したりする他の方法はありますか?

この質問に関連する私のコードの一部は次のとおりです。

$(shell for d in $(INPUT); \
        do \
            $(if $(FOUND) -eq 1, REL=$(REL)../); \
            $(if $(findstring $(WORD),$(INPUT)), \
                echo '$(WORD)../'; FOUND=1)\
        done)

$(FOUND)変数は外部で定義されていますが、$(WORD)を取得したときに変更する必要があります

そのための提案はありますか?

どうもありがとうございます

4

1 に答える 1

1

上記のコードにはいくつかの問題があり、意図を理解するのが難しいほどです。これが部分的なリストです(Microsoftのクリップのように聞こえたらごめんなさい)

  • コード$(if $(FOUND) -eq 1, REL=$(REL)../)は、gnu-make構文とシェル構文の組み合わせのように見えます。
  • あなたのループは不必要なようです。ループ変数を使用しておらずd、シーケンス全体を処理する構成を使用しています。例えば:$(findstring $(WORD),$(INPUT)
  • のようなコードを生成しようとしているようですがecho '$(WORD)../'、このコードのコンテキストは不明です。ルールの範囲外の場合、コードには意味がありません。ルール内にある場合、makefile変数を設定するには遅すぎます。この問題を回避する方法はありますが、最初に意図をより明確にする必要があります。
  • 私はあなたが持っているつもりだったと思うだけですREL=$(REL)/..REL=../$(REL)、私は間違っている可能性があります。
  • 最後に、Makefileで実際に行うべきことは、依存関係グラフを記述し、実行する必要のある操作の順序を理解させることであることを理解することが重要です。したがって、上記のコードから推測されるような手続き型のアプローチは最小限に抑える必要があります。

編集:

私があなたを正しく読んだ場合、あなたはMakefileでトリッキーな目標を達成しようとしています。あなたの経験不足があなたが持っている唯一のつまずきではないことをあなたに保証させてください。良いMakefileを書くのは難しいです。これを制御できる場合は、他のビルドソリューションを確認することを強くお勧めします。たとえば、cmakeはあなたにぴったりのMakefileを書くことができます。

base-dirまたはrelative-dirを計算しようとしている場合は、に保存されているcurrent-working-directoryの概念が$(CURDIR)期待どおりである場合とそうでない場合があることに注意してください。

あなたの質問に対して、あなたは確かにGNU make$(foreach ...)構文を使用することができますが、反復なしでシーケンスを処理するように設計されたいくつかの関数があり、それはあなたにもっと役立つかもしれません。

于 2011-02-14T13:04:55.200 に答える