我已在https://github.com/Habbie/autoyacc-problem发布了一个存储库,以证明我的问题。
使用automake 1.11及更低版本,在configure.ac中使用AC_PROG_YACC
,在Makefile.am中使用AM_YFLAGS=-d
,parser.yy将转换为parser.cc和parser.h。使用automake 1.12,我得到parser.cc和parser.hh。因为mybin.cc有include "parser.h"
,这意味着1.12会破坏我的构建。
我觉得这是一个向后不相容的变化,但我觉得应该有一个理智的方式来解决这个问题。
演示:
git clone https://github.com/Habbie/autoyacc-problem.git
cd autoyacc-problem/
autoreconf -i
./configure
make
使用automake 1.11的结果:构建了mybin。使用automake 1.12的结果:
mybin.cc:1:20: error: parser.h: No such file or directory
帮助!
注意:此示例中没有实际的C ++代码,但对于我的实际问题,我确实需要g ++。
答案 0 :(得分:2)
我不是专家;但考虑到你如何依赖于旧版本的automake中的无证行为(参见zhenech),你可以要求更新版本的automake(因此你可以依赖于定义的行为);或确保期望的文件由automake生成。
鉴于默认输出扩展名为“.hh”,您可以使用简单的make指令生成从.h文件(对于旧版本的automake)生成.hh文件的内容
.h.hh
:
cp $< $@
如果您希望从.hh文件生成.h文件,您可能想要转换定义,并且根据我所知的autotools的lex / yacc处理的细节,您可能希望将生成的文件添加到BUILT_SOURCES
答案 1 :(得分:0)
我在涉及使用bison
解析的项目中使用以下方法:
我有一个文件m4/AC_PROG_BISON.m4
,它附加(automake版本1.11或更低版本)或不追加(版本1.12+)以下行到 config.h 文件:
/* Use *.h extension for parser header file */
#define BISON_USE_PARSER_H_EXTENSION 1
在需要包含解析器生成头的文件中,我添加以下#ifdef语句:
#include "config.h"
#if defined(BISON_USE_PARSER_H_EXTENSION)
# include "my_parser.h"
#else
# include "my_parser.hh"
#endif
另外,让事情变得有效我将以下行添加到configure.ac
AC_PROG_BISON
现在,根据automake版本,将包含相关标题。
文件内容:m4/AC_PROG_BISON.m4
dnl
dnl Check for bison
dnl AC_PROG_BISON([MIN_VERSION=2.0])
dnl
AC_DEFUN([AC_PROG_BISON], [
if test "x$1" = "x" ; then
bison_required_version="2.6"
else
bison_required_version="$1"
fi
AC_CHECK_PROG(have_prog_bison, [bison], [yes],[no])
AC_DEFINE_UNQUOTED([BISON_VERSION], [0.0],
[Defines bison version if bison is not present])
#Do not use *.h extension for parser header file but *.hh
bison_use_parser_h_extension=false
if test "$have_prog_bison" = "yes" ; then
AC_MSG_CHECKING([for bison version >= $bison_required_version])
bison_version=`bison --version | head -n 1 | cut '-d ' -f 4`
AC_DEFINE_UNQUOTED([BISON_VERSION], [$bison_version],
[Defines bison version])
if test "$bison_version" \< "$bison_required_version" ; then
BISON=:
AC_MSG_RESULT([no])
AC_MSG_ERROR([Bison version 2.6 or higher must be installed on the system!])
else
AC_MSG_RESULT([yes])
BISON=bison
AC_SUBST(BISON)
#Verify automake version
#Upto version 1.11 parser headers for yy files are with h extension, from 1.12 it is hh
automake_version=`automake --version | head -n 1 | cut '-d ' -f 4`
AC_DEFINE_UNQUOTED([AUTOMAKE_VERSION], [$automake_version],
[Defines automake version])
if test "$automake_version" \< "1.12" ; then
#Use *.h extension for parser header file
bison_use_parser_h_extension=true
echo "Automake version < 1.12"
AC_DEFINE([BISON_USE_PARSER_H_EXTENSION], [1],
[Use *.h extension for parser header file])
fi
fi
else
BISON=:
AC_MSG_RESULT([NO])
fi
AM_CONDITIONAL([BISON_USE_PARSER_H_EXTENSION], [test x$bison_use_parser_h_extension = xtrue])
AC_SUBST(BISON)
])
答案 2 :(得分:0)
您可以使用包含
的标题强制使用某个文件名%defines "parser.h"
位于parser.yy
的顶部。 -d
选项与仅%defines
没有文件名的选项相同。
请参阅GNU Bison Docs。