私は自分自身を隅に追いやっていないといいのですが。Makefileの実装のほとんどの方法を理解しましたが、最後のビットを機能させることができません。ここの誰かが私がやろうとしていることをするためのテクニックを提案してくれることを願っています。
ソースリポジトリのバージョン管理されたファイルに「部品表」と呼ばれるものがあり、次のようなものを作成します。
make VER=x
Makefileで$(VER)をタグとして使用して、リポジトリからBOMを取得し、Makefileに含める依存関係ファイルを生成し、その依存関係を含めて再スキャンしてから、製品をビルドします。
より一般的には、私のMakefileにはいくつかのターゲット(A、B、Cなど)があり、それぞれの異なるバージョンを作成できるので、次のようにします。
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に依存関係を再生成しないようにしたいと思います。そして、物事をできるだけ複雑にするために、私は次のことを行うかもしれません:
make A VER=x
.. change version x of A's BOM and check it in
make A VER=x
したがって、2番目のビルドへの依存関係を再生成する必要があります。
チェックアウトにより、依存関係の再生成に使用されるタイムスタンプが台無しになるため、依存関係ファイルが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) $@
しかし、上記のように、私がそれを実行し、続行する場合:
$(DEP) : $(BOMS)
... recreate dependency
その後、makeを呼び出すたびに依存関係が更新されます。だから私は試してみます:
$(DEP) : $(SIGS)
... recreate dependency
と
$(BOMS):
...checkout TAG=$(VER) $@
...if $(subst .bom,.sig,$@) doesn't exist
... create signature file
...else
... if new signature is different from file contents
... update signature file
... endif
...endif
ただし、署名が変更されても、依存関係の生成は作動しません。$(SIGS)がターゲットではないため、$(BOMS)ルールが署名を更新するときにmakeが気付かないためだと思います。
.sig:.bomルールを作成し、チェックアウトされたBOMのタイムスタンプをタッチで管理しようとしましたが、機能しませんでした。
誰かが次のようなことを提案しました:
$(DEP) : $(SIGS)
... recreate dependency
$(BOMS) : $(SIGS)
...checkout TAG=$(VER) $@
$(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
しかし、SIGがBOMから作成される場合、BOMはどのようにSIGに依存することができますか?「BOMからSIGを作成し、SIGがBOMよりも新しい場合は、BOMをチェックアウトする」と書かれていることを読みました。そのプロセスをブートストラップするにはどうすればよいですか?最初のBOMはどこから来たのですか?