2016-10-10 3 views
0

두 가지 유형의 파일이 있습니다. 스크립트 및 데이터 세트. 각 데이터 집합마다 각 스크립트를 실행하기 위해 makefile을 작성하려고합니다. 내 생각은 각 출력에 대해 대상을 만드는 것이 었습니다. 대상에는 스크립트와 모델 이름이 포함 된 이름이 있습니다. 이 타겟은 "target-pattern"-rule (some_folder/%. eval 유형의 타겟)과 일치합니다. 이제 "target-pattern"-rule은 파일에서 필요한 이름을 알아 내야합니다. 그러나 이것은 힘든 일입니다.Makefile : Crosscombination 대상

더 좋은 방법이 있습니까?

예 :

는 파일 : 스크립, 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의 주요 단점 중 하나 : 와일드 카드로 그리 좋지 않습니다.

할 수 있습니다, 하나 두 변수 반복하여이 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))))