Правило Automake по умолчанию для целей без расширения?

Есть ли общее правило, чтобы указать правило для чего-то, что переходит от чего-то с расширением к чему-то без расширения? (в данном случае от '.in' до '')?

У меня есть проект, использующий automake. У меня есть несколько шаблонов конфигурационных файлов, которые нужно заменить перед их установкой. Например, у меня есть файл foo.ini.in, который я хочу использовать для создания foo.ini. У меня есть несколько таких, разбросанных по кодовой базе. Однако для каждого из них мне нужно создать собственное правило Makefile, чтобы заставить их работать. Есть ли способ лучше? В настоящее время я делаю это в Makefile.am:

bazdir=$(libdir)/@PACKAGE_NAME@/baz

EXTRA_DIST = foo.ini.in bar.ini.in
CLEANFILES = foo.ini bar.ini

foo.ini: foo.ini.in
     sed -e 's|@LIBDIR@|$(bazdir)|g' $< > $@

bar.ini: bar.ini.in
     sed -e 's|@LIBDIR@|$(bazdir)|g' $< > $@

Это прекрасно работает, но мне нужно дублировать правило для каждого файла. Я хотел бы написать одно правило, которое будет заменять любые файлы «ini.in» файлами «ini». Я пробовал:

%.ini.in: %.ini
     sed ....

но autoconf жалуется, что подстановка шаблона % является непереносимым gnumake-измом. тоже не любит

.ini.in.ini: 
     sed .....

.. который я не могу обвинить в том, что он не понравился, потому что я даже не могу разобрать это.

Есть ли способ сделать это?

ПРИМЕЧАНИЕ. Я не могу использовать AC_CONFIG_FILES для этой подстановки, поскольку в этом случае 'bazdir' не раскрывается полностью.


person clemej    schedule 31.05.2013    source источник
comment
Можете ли вы объяснить, почему bazdir нельзя полностью развернуть? Поскольку переменные $libdir и $PACKAGE_NAME могут быть установлены скриптом configure?   -  person Brett Hale    schedule 01.06.2013


Ответы (1)


К счастью, есть способ намного лучше: пусть «настроенные» файлы создаются из шаблонов с помощью самого скрипта configure. Как я уже упоминал в комментарии, я не вижу причин пытаться расширить $bazdir в самом Makefile.am. Может быть, вы сможете прояснить это для меня, если для этого есть какая-то особая причина.

В сценарии configure.ac переменные подстановки определяются с помощью AC_SUBST макрос. Я предполагаю, что вы хотите заменить LIBDIR значением $bazdir. Обратите внимание, что LIBDIR не является хорошим выбором имени, так как libdir уже используется в скриптах конфигурации; поэтому давайте использовать имя переменной, к которому добавляется имя проекта: BAZ_LIBDIR

1/. установите bazdir в сценарии настройки: bazdir="${libdir}/${PACKAGE_NAME}/baz" и замените на: AC_SUBST(BAZ_LIBDIR, $bazdir). В качестве альтернативы просто присвойте значение BAZ_LIBDIR и используйте форму с одним аргументом AC_SUBST. BAZ_LIBDIR теперь готов к замене...

2/. В конце configure.ac укажите файлы, которые должны быть сгенерированы из их <file>.in шаблонов, с помощью AC_CONFIG_FILES. Обычно это список Makefile, а также файлы данных, где суффикс .in является неявным.

Предполагая, что дерево projectdir... конечно, может быть любым видом дерева:

BAZ_LIBDIR="${libdir}/${PACKAGE_NAME}/baz"
AC_SUBST(BAZ_LIBDIR)
...
AC_CONFIG_FILES([Makefile projectdir/Makefile])
AC_CONFIG_FILES([projectdir/foo.ini projectdir/bar.ini])
...
AC_OUTPUT

Экземпляры @BAZ_LIBDIR@ в файлах <file>.ini.in будут заменены значением подстановки. Для создания <file>.ini файлов не требуется никаких тайных вызовов sed.

Еще одна приятная особенность заключается в том, что вам не нужно добавлять foo.ini.in или bar.ini.in к переменной EXTRA_DIST в Makefile.am, а make distclean очистит файлы bar.ini и foo.ini.

person Brett Hale    schedule 31.05.2013
comment
Интересный. Я бы предпочел сохранить определение bazdir локально для файла Makefile.am в каталоге (это каталог плагинов, которые добавят любое количество людей... люди, которые уже ворчат, что проект использует файлы Makefile, а тем более автоинструменты). Но... Думаю, им не придется. Хм. Спасибо. - person clemej; 01.06.2013