我使用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
答案 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上查看我的文档。