makefile
2013-09-09 6 views 0 likes 
0

Я хотел бы сгенерировать несколько файлов с помощью GNU Make, используя следующий рецепт.GNU MAKE: функции в зависимостях

ina_as%.dat:  ina_driver.m ina_as$(word 1,$(subst _epsi, , %)).m 
    echo "modelType = '$(word 1,$(subst _epsi, , $*))'; ofile = '[email protected]'; epsi = '$(word 2,$(subst _epsi, , $*))';" | cat - $< | nohup matlab -nodesktop -nosplash 

Мишень находится в формате - ina_as% d_epsi% .2f.dat (например, ina_as1_epsi0.50.dat), а второе условием является ina_as% ого (например, ina_as1.m) (уведомление, вторая part _epsi% .2f отсутствует в имени файла требуемого файла).

Я попробовал несколько комбинаций для неявного правила ($ , $$, $ (eval $ *) и т. Д.), Но он по-прежнему не работает. Я думаю, это могло быть потому, что Make не мог понять функции ('$ (слово 1, $ (subst _epsi,,%))') в определении зависимости.

Есть ли способ преодолеть эту проблему?

Спасибо.

ответ

2

Вопросы, подобные этому, возникают время от времени. Короткий ответ заключается в том, что Make просто не может сделать это чистым способом; операторы манипулирования текстом расширяются до выполнения какого-либо правила (то есть до % имеет любое значение), а Make не обрабатывает подстановочные знаки (или регулярные выражения) очень хорошо.

Более длинный ответ заключается в том, что это можно сделать, но только прибегая к одному клопу или другому. Если ваша версия Make поддерживает SECONDEXPANSION, вы можете сделать это следующим образом:

.SECONDEXPANSION: 

ina_as%.dat: ina_as$$(word 1,$$(subst _, ,%)).m 
    @echo "modelType = '$(word 1,$(subst _epsi, , $*))'; ofile = '[email protected]'; epsi\ 
    = '$(word 2,$(subst _epsi, , $*))';" | cat - $< | nohup matlab -nodesktop\ 
    -nosplash   

Если нет, то вы можете прибегнуть к рекурсивному Make (иногда полезно, независимо от того, что они говорят):

ina_as%.dat : 
    @$(MAKE) dummy MODELTYPE=`echo $* | sed "s/_.*//"` EPSI=`echo $* | sed \ 
    "s/.*_epsi//"` 


dummy: ina_as$(MODELTYPE).m 
    @echo "modelType = $(MODELTYPE); ofile = ina_as$(MODELTYPE)_epsi$(EPSI)\ 
    ; epsi = $(EPSI);" | cat - ina_as$(MODELTYPE).m | nohup matlab -nodesktop\ 
    -nosplash 

 Смежные вопросы

  • Нет связанных вопросов^_^