2014-01-17 3 views
2

В моей Makefile У меня есть правило для компиляции исходных файлов на Fortran, как иWildcard в шаблонное правило

.SUFFIXES: 

%.o: %.[fF] 
     $(FC) $(FFLAGS) -c $< -o [email protected] 

Это работало отлично на нескольких машинах. Когда я попробовал это на другой машине (кстати, с новее (GNU) make, 3,82 вместо 3,81), это не сработало, и мне пришлось заменить его двумя отдельными правилами для .f и .F.

Подстановочный работает без %, то есть это работает:

.SUFFIXES: 

test.o: test.[fF] 
     $(FC) $(FFLAGS) -c $< -o [email protected] 

Что происходит?

+1

Вы уверены, что работали и не были только встроенными правилами, выполняющими то, что вы ожидали раньше? –

+0

Да, '.SUFFIXES:' отключает их. – xebtl

+0

.SUFFIXES отключает правила суффикса старого стиля, а не правила шаблонов. Существуют также правила шаблонов по умолчанию для этих пар, и они все равно будут активны даже с '.SUFFIXES:', как вы полагаете. –

ответ

3

Я могу полностью воспроизвести поведение здесь. Это regression in make 3.82. В обсуждении, прилагаемом к отчету об ошибке, рекомендуется использовать .SECONDEXPANSION для решения этой проблемы. Я попробовал и получил его на работу в простой тестовой конфигурации:

.SUFFIXES: 

.SECONDEXPANSION: 

%.o: $$(wildcard %.[fF]) 
    $(FC) $(FFLAGS) -c $< -o [email protected] 

Используя файл выше, и два тестовых файлов с именем test.f и test2.F, вот пара команд я выпускающая и вывод производства в Makefile:

$ make -n test2.o 
f77 -c test2.F -o test2.o 
$ make -n test.o 
f77 -c test.f -o test.o 

Обходное решение работает как с 3.81, так и 3.82.

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