2016-08-12 3 views
0

мне нужно написать шаблонное правило для следующего случая:Makefile. Многомерный список?

  • Есть 2 папки: A и B
  • Выполнение команды python gen.py --a=A/file1.foo --b=file2.bar --c=file3.bar генерирует B/file1.foo
  • file1, file2 и file3 разные строки

Есть ли способ сгруппировать эти имена файлов в каком-либо многомерном ar луча, так что все файлы записываются только один раз (я буду использовать синтаксис питона):

files = [["a1.foo", "a2.bar", "a3.bar"], 
     #...200 other groups... 
     ["b1.foo", "b2.bar", "b3.bar"]] 

, а затем правило выглядит следующим образом:

$(files): B/{reference 1 elem}: A/{1 elem} {2 elem} {3 elem} 
    python gen.py --a=A/{1 elem} --b={2 elem} --c={3 elem} 

Любые идеи, как архивировать?

ответ

1

Вы можете использовать стандартный синтаксис грим для этого:

all : 

targets := 
define add_target 
B/${1}: A/${1} ${2} ${3} 
targets += B/${1} 
endef 

# Build dependencies. 
$(eval $(call add_target,a1.foo,a2.bar,a3.bar)) 
# ... 
$(eval $(call add_target,b1.foo,b2.bar,b3.bar)) 

# One generic rule for all ${targets}  
${targets} : % : 
    @echo Making [email protected] from $^ 

all : ${targets} 

.PHONY: all 

Обратите внимание, что эти $(eval $(call add_target,...) белые-пространство чувствительно, не вставляйте пробелы там.

Если вы хотите make, чтобы автоматически создать каталог для выходов сделать:

${targets} : % : | B 

B : 
    mkdir [email protected] 
+0

Wow! Это именно то, чего я хотел. Большое спасибо! –

+0

B/$ {1}: A/$ {1} $ {2} $ {3} | Как добавить все оставшиеся аргументы (если их более 3)? И где я могу узнать больше об этом? Я ничего не нашел в этом. –

+0

@ViacheslavKroilov https://www.gnu.org/software/make/manual/make.html#index-call –

0

Иногда немного повторение не так уж плохо на самом деле

targets := B/a1.foo B/b1.foo 

.PHONY: all 

all: $(targets) 

$(targets): B/%: A/% 
    python gen.py --a=$< --b=$(word 2,$^) --c=$(word 3,$^) 

B/a1.foo: a2.bar a3.bar 
B/b1.foo: b2.bar b3.bar 
Смежные вопросы