我正在尝试添加一些shell命令来自动搜索我的项目autoconf中的Makefile.am(这样我就不用担心下次有新的Makefile.am时忘记添加一个条目)。但它似乎没有用。我试图创建一个最小的项目设置来说明问题。项目目录包含:
├── AUTHORS
├── ChangeLog
├── common.mk.in
├── configure.ac
├── COPYING
├── INSTALL
├── install-sh
├── Makefile.am
├── missing
├── NEWS
├── proj1
│ ├── Makefile.am
│ ├── module1
│ │ └── Makfile.am
│ └── module2
│ └── Makfile.am
├── proj2
│ ├── Makefile.am
│ ├── module1
│ │ └── Makfile.am
│ └── module2
│ └── Makfile.am
└── README
这里的大多数文件都是空的,除了:
--------- --------- configure.ac
AC_INIT([TEST], [1.0])
found_makefile_am=`find . -name 'Makefile.am' | sed -e 's/\.am$//g' -e 's/^\.\///g' | sed ':a;N;$!ba;s/\n/ /g'`
found_mk=`find . -name '*.mk.in' | sed -e 's/\.am$//g' -e 's/^\.\///g' | sed ':a;N;$!ba;s/\n/ /g'`
AM_INIT_AUTOMAKE
#AC_CONFIG_FILES([proj2/Makefile proj1/Makefile Makefile])
AC_CONFIG_FILES([${found_makefile_am}])
AC_CONFIG_FILES([${found_mk}])
AC_OUTPUT
---------凸出* / Makefile.am ---------
SUBDIRS = module1 module2
请注意以下行:
AC_CONFIG_FILES([${found_mk}])
效果很好但是这个:
AC_CONFIG_FILES([${found_makefile_am}])
失败:
$autoreconf -i
automake-1.12: error: no 'Makefile.am' found for any configure output
automake-1.12: Did you forget AC_CONFIG_FILES([Makefile]) in configure.ac?
autoreconf-2.69: automake failed with exit status: 1
我不得不用以下代替:
AC_CONFIG_FILES([proj2/Makefile proj1/Makefile Makefile])
在我看来,在autoconfig调用automake之前,shell变量没有正确扩展。那么有没有解决这个问题的方法呢?
答案 0 :(得分:1)
我想这可能无法按照automake手册中的说明完成:
http://www.gnu.org/software/automake/manual/automake.html#Requirements
请注意,不应使用shell变量来声明Makefile文件 必须为其创建Makefile.in。甚至AC_SUBST也没有 在这里提供帮助,因为automake在运行时需要知道文件名 以检查Makefile.am是否存在。
答案 1 :(得分:1)
在运行autoconf之前需要填充configure.ac
,因此m4_esyscmd
应该调用任何shell命令。请注意,我给你的建议是用锤子砸拇指的最佳方法,也就是说你真的不应该这样做,但是如果你想自动填充AC_CONFIG_FILES的内容,你可以这样做:
AC_CONFIG_FILES(m4_esyscmd([find ...]))
其中...
是find
命令的剩余部分。这将在autoconf期间运行m4时调用find命令,而不是等到用户执行configure脚本。这是必要的,因为您需要在Makefile.am
运行之前找到automake
文件,并且在配置脚本之前很久就会调用automake。