私は、ビルドコマンドとしてmcs
を使ってmakefileシステムを使っています。簡単に説明すると、mcs
が呼び出されます。GNU Makeで複雑なビルドコマンドのパターンルールを書く
- ソースファイル:直接渡されました。
- resources:with
-resource:
; - ターゲット:
-target:
であり、exe
,winexe
,library
またはmodule
とすることができる。
*.exe
,*.dll
または*.netmodule
を生成する。 -target:
パラメータは最後の2つのケースでは特定ですが、*.exe
はexe
またはwinexe
のいずれかで構築できます。
RESOLVED_SOURCES := $(addprefix $(srcdir)/,$(SOURCES))
RESOLVED_RESOURCES := $(addprefix $(srcdir)/,$(RESOURCES))
S_PARAM := $(RESOLVED_SOURCES)
R_PARAM := $(addprefix -resource:,$(RESOLVED_RESOURCES))
all: $(OUTPUT)
$(OUTPUT): $(RESOLVED_SOURCES) $(RESOLVED_RESOURCES)
$(MCS) $(MCSARGS) $(S_PARAM) $(R_PARAM) -target:$(TARGET) -out:$(OUTPUT)
そして、それぞれのプロジェクトディレクトリにOUTPUT
、TARGET
、SOURCES
とRESOURCES
が含まれる前に定義された変数:
現在、各ディレクトリのmakefileはこれに沸く何を含んでいます。
私が除外したものすべてでさえ、それはかなり複雑で、ビルドルールを複製せずに、それが含まれている単一の具体的なターゲットを構築することしかできません。
重複を避けるため、私はこの複雑なビルドコマンドのためのいくつかのパターンルールを定義したいのですが、それは難しい柔軟性を高めるために:
- 各コンパイル単位は、一般的に多くの入力を持っています。
- 各入力を段階的に追加する方法はありません。
- いくつかの入力は異なる処理が必要です。
mcs
のためにこれらのパターンは、可能なようだ:
%.exe: %.cs
$(MCS) $(MCSARGS) -target:$(target) -out:[email protected] $<
%.dll: %.cs
$(MCS) $(MCSARGS) -target:library -out:[email protected] $<
%.netmodule: %.cs
$(MCS) $(MCSARGS) -target:module -out:[email protected] $<
パターンルールは、彼らがあまりにも悪くないですが、渡された1つのソースファイルだけがありますよう、彼らはmcs
のほとんどの用途に有用ではない行くように。
ターゲットにソースファイルの前提条件を追加すると、上記の$<
はスワップされて$^
にすべて渡されますが、リソースファイルでは機能しません。注文のみのリストは、リソースファイルの前提条件を渡すために使用できますが、リソースファイルのみが更新された場合には再構築を防止します。
この種の複雑なコマンドの呼び出しをパターンルールまたはルールセットに変換する一般的なテクニックはありますか?
メークのこの複雑な使い方は、すでに1つ悪い結果をもたらしています。それはあなたの質問を不明瞭にします。これを行うための正しい方法を見つけようとする前に、私はあなたがしようとしていること、なぜそれを解き放つ必要があるのですか?それは私にもっと報いのある問題を探すのに十分です。また、あなたのラン・オン・センテンスは私の目を傷つけます。 – Beta
かなり明確にする必要があります、それはタイトルにあります。私はVPATHの作業中に複数の前提条件タイプを処理しようとしています。 – arfbtwn
「複数の前提条件」とは何を意味するのか分かりません。 「前提条件のタイプ」とは何ですか?ベータが示唆しているのは、すでに解決した問題に関する情報を提供するのではなく、少なくとも追加して、達成しようとしていることの具体例を提供することです。また、通常の注文のみの前提条件の違いを絶対に知ることはできません。自動変数のリストを参照してください。https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html – MadScientist