我可以在configure.ac中定义安装规则/安装挂钩

时间:2014-03-24 09:33:13

标签: makefile installation autotools autoconf m4

假设有一堆(例如近200个)模块都依赖于核心模块。所有人都在使用Autotools。

核心模块会安装一个core.m4文件,家属已经将其用于各种事情。

所有家属在其安装数据本地规则中也有一些行来生成一些脚本并安装它们,例如:

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调用的shell脚本,但我不确定这是最好的(或者是最自动的)。

或者,是否有一种从我的核心模块分发automake fragment.am文件的简单方法? (这似乎是例如定义Python编译规则的方式。)

1 个答案:

答案 0 :(得分:2)

经过一番挖掘,我找到了 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

])

IE中。目标现在打印到文件core_include.am,并有其目标 自己的名字。每个模块的configure.ac都会调用CORE_MKINCLUDE和每个模块 Makefile.am只有

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

至少改善。