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.
上的文档
我有一个使用 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.
上的文档