2016-10-10 7 views
0

2種類のファイルがあります。スクリプトとデータセット。私は各データセットで各スクリプトを実行するmakefileを書きたいと思っています。 私の考えは、各出力のターゲットを作成することでした。ターゲットの名前にはスクリプトとモデル名が含まれていました。これらのターゲットは "target-pattern" -rule(タイプ:some_folder /%。eval)に一致します。今度は、 "ターゲットパターン"というルールは、ファイルから必要なファイル名を特定する必要があります。しかし、これは難しい仕事のようです。Makefile:クロスコンビネーションのターゲット

より良い、よりエレガントな方法がありますか?

例:

ファイル:のScripta、ScriptB、InputA、INPUTB

ターゲット/ Outputfiles:あなたがに実行したInputA_ScriptA、InputA_ScriptB、InputB_ScriptA、InputB_ScriptB

# generate all combinations 
RT_HW = $(foreach script,$(RT_SCRIPT_HW),$(foreach input, $(RT_INPUTS), $(input)_$(script))) 

$(SANDBOX)%.eval: <requires Script X and input X> 
+0

*あなたが*持っているもの、またはあなたが何を望むものなのか* – Beta

+0

この例は私が欲しいものです。私はターゲットの名前を生成することができます。それは問題ありません。しかし、依存関係は逆になり、記述することは難しいです。 – Botnic

+0

この質問はよく聞こえます。前に見つけた場合は、リンクを追加して、この質問を重複としてマークします。 – Beta

答えて

2

Makeの主要な欠点の1つです。ワイルドカードではそれほど良くありません。

あなたは、両方の変数を反復処理のいずれかによって、evalでルールを生成することによって、あなたが望む効果を得ることができます。

define template 
$(1)_$(2).eval: $(1) $(2) 
    @echo target is [email protected] 
    @echo running $(2) on $(1) 
endef 

$(foreach script,$(RT_SCRIPT_HW),$(foreach input, $(RT_INPUTS), $(eval $(call template,$(input),$(script))))) 

かな入力として一つだけを反復処理パターンルール、発生することによって:

define template 
$(1)_%.eval: $(1) % 
    @echo target is [email protected] 
    @echo running $$* on $(1) 
endef 

$(foreach input, $(RT_INPUTS), $(eval $(call template,$(input)))) 
関連する問題