2008-09-16 6 views
2

私はコーナーに自分自身を描いていないことを願っています。私は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はどこから来たのですか?

答えて

0

私はmake expertではありませんが、$(BOMS)は$(SIGS)に依存し、$(SIGS)ターゲットは現在$ BOMS)ターゲット。

$(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 

EDIT:そうだね、もちろん、あなたが$(BOM)は$(SIGS)に依存することはできません。しかし、$(DEP)を再作成するには、$(SIG)をターゲットにする必要があります。おそらく$(BOM)と$(SIG)の両方に依存する中間目標を持っているかもしれません。

$(DEP) : $(SIGS) 
    ... recreate dependency 
$(NEWTARGET) : $(BOMS) $(SIGS) 
$(BOMS) : 
    ...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 

$(SIGS)も$(BOMS)に依存する必要があります。

1

更新は、単に更新されたタイムスタンプではなく、実際のファイル変更を検出できることに非常に悪いです。

問題の根本は、bom-checkoutが常にbomのタイムスタンプを変更し、依存関係を再生成するということです。私はおそらくこの問題を解決しようとするでしょう - タイムスタンプを台無しにしないでbomをチェックアウトしようとする。チェックアウトツールの周りのラッパースクリプトがそのトリックを行うかもしれません。最初にbomを一時ファイルにチェックアウトし、それをすでにチェックアウトしたバージョンと比較し、新しいバージョンが異なる場合にのみ置き換えます。

makeを使用することに厳密に縛られていないのであれば、実際のファイル変更(SConsなど)を検出するのに優れたツールがあります。

関連する問題