私はコーナーに自分自身を描いていないことを願っています。私はMakefileを実装することの大部分を占めているように思っており、最後の作業をすることができません。ここにいる誰かが私がやろうとしていることをするテクニックを提案してくれることを願っています。1つのMakefileで異なるバージョンのコンポーネントを効率的にビルドするには
私はソースリポジトリでバージョン管理されたファイルには「部品表」と呼ぶだろうと私のようなもの築くものを持っている:私は私のMakefileがタグとして$(VER)を使用したい
make VER=x
をリポジトリからBOMを取得し、依存ファイルを生成してMakefileにインクルードし、その依存関係を再スキャンして製品をビルドします。 A、B、C、など - -
より一般的には、私のMakefileは、いくつかの目標を持って、私はするかもしれないので、私は、それぞれの異なるバージョンを構築することができます:
make A VER=x
make B VER=y
make C VER=z
と依存ファイルが含ま3つのすべてのターゲットに関する情報。
しかし、依存関係ファイルを作成することは私が行うので、もし、やや高価です:
make A VER=x
...make source (not BOM) changes...
make A VER=x
私は本当にのMakefileのような依存関係を再生成しないように思います。そして、ちょうどできるだけ複雑として、私がやるかもしれないものを作るために:
はので、私は、第二のビルドの依存関係を再生成する必要があります。
チェックアウトは依存関係を再生成するために使用されたタイムスタンプを失ってしまいます。したがって、依存ファイルがBOMに依存するのではなく、BOMが変更されたという指示に依存する必要があると思います。
私は、BOMチェックアウトを.PHONYターゲットで行うようにしています(常にチェックアウトされるように)。最後のチェックアウトの内容を ".sig"ファイルで追跡しますファイルが見つからないか、内容が新しいファイルの署名と異なる場合は、BOMが変更され、依存関係の生成は署名によって異なります)。私のMakefileの先頭で、私はいくつかのセットアップがあります。
BOMS = $(addsuffix .bom,$(MAKECMDGOALS)
SIGS = $(subst .bom,.sig,$(BOMS))
DEP = include.d
-include $(DEP)
をそして、私が常に実行する必要がありそうです:上記のように、私はちょうどそれを行う、と続けば、
.PHONY: $(BOMS)
$(BOMS):
...checkout TAG=$(VER) [email protected]
しかし:
$(DEP) : $(BOMS)
... recreate dependency
次に、makeを呼び出すたびに依存関係が更新されます。
$(DEP) : $(SIGS)
... recreate dependency
と
$(BOMS):
...checkout TAG=$(VER) [email protected]
...if $(subst .bom,.sig,[email protected]) doesn't exist
... create signature file
...else
... if new signature is different from file contents
... update signature file
... endif
...endif
しかし、署名が変化したときに、依存関係生成が作動しません。だから私はしてみてください。 $(BIGS)ルールが署名を更新するときにmakeが気付かないので、$(SIGS)がターゲットではないためだと思います。
私は.sig:.bomルールを作成して、チェックアウトしたBOMのタイムスタンプをタッチで管理しようとしましたが、うまくいかなかったのです。
誰かが何か提案:
$(DEP) : $(SIGS)
... recreate dependency
$(BOMS) : $(SIGS)
...checkout TAG=$(VER) [email protected]
$(SIGS) :
...if $(subst .bom,.sig,$(BOMS)) doesn't exist
... create it
...else
... if new signature is different from file contents
... update signature file
... endif
...endif
をしかし、BOMは、SIGは、BOMから作成されたSIGに依存することができますか?私が読んだところでは、「BOMからSIGを作成し、SIGがBOMよりも新しい場合は、BOMをチェックアウトする」と言う。そのプロセスをどのようにブートストラップするのですか?最初のBOMはどこから来たのですか?