Automake:在遍历子目录之前运行脚本

时间:2016-01-22 08:09:52

标签: automake

我使用GNU autotools为库创建系统。该库具有源文件和头文件的子目录。它还在顶层目录中包含一个脚本,该脚本在相应的子目录中自动生成源文件和头文件(与配置文件不同)。在子目录中执行make之前,必须生成这些文件。

在遍历子目录之前运行脚本的最简单方法是什么(即,当用户调用make时,脚本在遍历SUBDIRS之前运行)?我尝试添加all-local等规则但没有成功。

编辑:

顶级目录:

configure.ac    Makefile.am    src    include    myscript.sh

Makefile.am

EXTRA_DIST = myscript.sh
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4

SUBDIRS = src include

.PHONY: gen-script

gen-script:
  ./myscript.sh

src/Makefile.am

AM_CPPFLAGS = -I$(top_srcdir)/include
lib_LTLIBRARIES = libmylib.la
libmylib_la_SOURCES = \
  file1.cxx \
  file2.cxx \
  autogen-file.cxx

clean-local:
  rm -f autogen-file.cxx

include/Makefile.am

nobase_include_HEADERS = \
  file1.h \
  file2.h \
  autogen-file.h

clean-local:
  rm -f autogen-file.h

2 个答案:

答案 0 :(得分:2)

我认为最好的解决方案是摆脱递归make并且只有顶级Makefile.am。然后,您只需添加规则

include/autogen-file.h src/autogen-file.cxx: myscript.sh
    ${SHELL} $<

并在BUILT_SOURCES中列出include/autogen-file.h

如果您想保留递归结构(即使这是considered harmful),您可以将规则生成到子目录中的Makefile.am

src/Makefile.am

autogen-file.cxx: ../myscript.sh
    cd ${top_srcdir} && ${SHELL} myscript.sh

include/Makefile.am

autogen-file.h: ../myscript.sh
    cd ${top_srcdir} && ${SHELL} myscript.sh

顺便说一下,您需要多久重新构建一次?如果生成的文件仅取决于项目配置,则只需在myscript.sh末尾运行configure.ac,并仅在make distclean上删除生成的文件。

答案 1 :(得分:0)

您可以做的是强制当前目录在

的其他子目录之前运行
SUBDIRS = . src include

但更严重的是,您不应该使用递归automake。特别是如果您的结构看起来相对简单。如果您有兴趣了解如何操作,可以在Autotools Mythbuser上查看我的文档。