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

Automake: Run a script before traversing subdirectories

我有一个使用 GNU 自动工具的库的构建系统设置。该库有源文件和头文件的子目录。它还在顶层目录中包含一个脚本,该脚本会在适当的子目录中自动生成源文件和头文件(与配置文件不同)。有必要在子目录中执行 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

我认为最好的解决方案是摆脱递归 make 并且只有 top-level Makefile.am。然后你只需添加一个规则

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

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

如果您想保留递归结构(即使这是 considered harmful),您可以将生成文件的规则放入 sub-directories 中的 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

顺便问一下,您需要多久 re-build 一次?如果生成的文件只依赖于项目配置,你可以简单地在你的 configure.ac 末尾 运行 myscript.sh 并删除生成的文件只在 make distclean.

你可以做的是强制当前目录 运行 在其余子目录之前

SUBDIRS = . src include

更严重的是,您不应该使用递归自动制作。特别是如果您的结构看起来相对简单。如果您有兴趣查找如何执行此操作,可以查看我在 Autotools Mythbuser.

上的文档