2017-11-09 7 views
0

私は、ビルドコマンドとしてmcsを使ってmakefileシステムを使っています。簡単に説明すると、mcsが呼び出されます。GNU Makeで複雑なビルドコマンドのパターンルールを書く

  • ソースファイル:直接渡されました。
  • resources:with -resource:;
  • ターゲット:-target:であり、exe,winexe,libraryまたはmoduleとすることができる。

*.exe,*.dllまたは*.netmoduleを生成する。 -target:パラメータは最後の2つのケースでは特定ですが、*.exeexeまたは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) 

そして、それぞれのプロジェクトディレクトリにOUTPUTTARGETSOURCESRESOURCESが含まれる前に定義された変数:

現在、各ディレクトリの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のほとんどの用途に有用ではない行くように。

ターゲットにソースファイルの前提条件を追加すると、上記の$<はスワップされて$^にすべて渡されますが、リソースファイルでは機能しません。注文のみのリストは、リソースファイルの前提条件を渡すために使用できますが、リソースファイルのみが更新された場合には再構築を防止します。

この種の複雑なコマンドの呼び出しをパターンルールまたはルールセットに変換する一般的なテクニックはありますか?

+0

メークのこの複雑な使い方は、すでに1つ悪い結果をもたらしています。それはあなたの質問を不明瞭にします。これを行うための正しい方法を見つけようとする前に、私はあなたがしようとしていること、なぜそれを解き放つ必要があるのですか?それは私にもっと報いのある問題を探すのに十分です。また、あなたのラン・オン・センテンスは私の目を傷つけます。 – Beta

+0

かなり明確にする必要があります、それはタイトルにあります。私はVPATHの作業中に複数の前提条件タイプを処理しようとしています。 – arfbtwn

+1

「複数の前提条件」とは何を意味するのか分かりません。 「前提条件のタイプ」とは何ですか?ベータが示唆しているのは、すでに解決した問題に関する情報を提供するのではなく、少なくとも追加して、達成しようとしていることの具体例を提供することです。また、通常の注文のみの前提条件の違いを絶対に知ることはできません。自動変数のリストを参照してください。https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html – MadScientist

答えて

0

は多くの問題があります。

  1. ビルドコマンドが複数の前提条件の種類を区別し、
  2. これらはすべて一度に渡す必要があります。
  3. これらのいずれかの更新は、再構築を引き起こす必要があります。すべてがregular prerequisitesです。

アイデア:

  • は、あなたが入力ファイルに分けたい入力を委任し、その後でそれらを読み戻すあなたはビルドを呼び出す簡単な目標を持つことができます。
  • secondary expansionを使用すると、「パターン変数」の内容に基づいて入力ファイルを定義できます。
  • general searchたとえば、

multi_A := foo 
multi_B := bar 

all: multi.foo 

%.foo: .a.% .b.% 
    @echo $*: $(foreach _,$^,$(file < $_)) 
    @touch [email protected] 

.SECONDEXPANSION: 

.a.%: $$($$*_A) 
    $(file > [email protected],$^) 

.b.%: $$($$*_B) 
    $(file > [email protected],$(addprefix -b:,$^)) 

は二次拡張を使用して起動するには、怪しげなようです。それとは別に、すぐに問題になるのは、通常の前提条件が読み込まれ、ビルドコマンドに渡されることをユーザーが知っていることです。

一方、ユーザは、別の入力ファイルに書き込むターゲットに応じて、追加の入力パラメータでターゲットを補うことができます。

+0

あなたのシステムで '$(file Vroomfondel

+0

ええ、それは私のために働くmake 4.2.1 – arfbtwn

関連する問題