Могу ли я определить правило установки/перехватчик установки в configure.ac

Скажем, есть куча (например, около 200) модулей, которые все зависят от основного модуля. Все используют Autotools.

Основной модуль устанавливает файл core.m4, который зависимые модули уже используют для различных целей.

Все иждивенцы также имеют несколько строк в своем правиле install-data-local для создания некоторых сценариев и их установки, например.

core_stuffdir=$(prefix)/share/core/stuff/

install-data-local:
        generate-stuff stuff.xml
        test -d $(DESTDIR)$(core_stuffdir) || mkdir $(DESTDIR)$(core_stuffdir)
        stuff=`xmllint --xpath '//stuff[@install="yes"]/@name' stuff.xml`; \
            $(INSTALL_DATA) $$stuff $(DESTDIR)$(core_stuffdir); \
            rm $$stuff
        …
        $(INSTALL_DATA) other-module-specific-stuff …
        …

Я хотел бы удалить эти пять строк, которые в настоящее время избыточно дублируются более чем в 200 файлах, и вместо этого определить строки в файле core.m4. Зависимые должны быть в состоянии сказать что-то вроде SOMEVAR: somevalue (или что-то подобное короткое, в худшем случае однострочное в install-data-local) и выполнить эти строки во время make install.

Есть ли хороший способ определить эти строки в core.m4 и сделать их доступными для Makefile.am? В сети подобных примеров не нашел.

Единственное решение, которое я могу сейчас придумать, это то, что m4 выдает сценарий оболочки, который я могу вызвать из install-data-local, но я не уверен, что это лучший (или самый автоматический) способ.

В качестве альтернативы, есть ли простой способ распространения файла automake fragment.am из моего основного модуля? (Кажется, так определяются, например, правила компиляции Python.)


person unhammer    schedule 24.03.2014    source источник


Ответы (1)


Немного покопавшись, я нашел http://thread.gmane.org/gmane.comp.sysutils.automake.general/5704/focus=5708, в котором есть решение аналогичной проблемы (мне не удалось заставить работать упомянутое там решение AC_CONFIG_FILES).

Итак, core.m4 теперь определяет CORE_MKINCLUDE:

AC_DEFUN([CORE_MKINCLUDE],
[
  AC_SUBST_FILE(core_include)
  core_include=$srcdir/core_include.am

  cat >$srcdir/core_include.am <<EOF

core_stuffdir=\$(prefix)/share/core/stuff/
install-stuff:
        generate-stuff stuff.xml
        test -d \$(DESTDIR)\$(core_stuffdir) || mkdir \$(DESTDIR)\$(core_stuffdir)
        stuff=\`xmllint --xpath '//stuff@<:@@install="yes"@:>@/@name' stuff.xml`; \\
                \$(INSTALL_DATA) \$\$stuff \$(DESTDIR)\$(core_stuffdir); \\
                rm \$\$stuff

EOF

])

Т.е. цель теперь печатается в файл core_include.am и имеет собственное имя. Каждый модуль configure.ac вызывает CORE_MKINCLUDE, а каждый Makefile.am просто имеет

@core_include@
install-data-local: install-stuff

Как минимум улучшение.

person unhammer    schedule 24.03.2014