# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have access  
# to either file, you may request a copy from help@hdfgroup.org.           
#
# A script to reconfigure autotools for HDF5, and to recreate other
# generated files specifc to HDF5.
#
# IMPORTANT OS X NOTE
#
# If you are using OS X, you will probably not have the autotools
# installed, even if you have the Xcode command-line tools. The
# bison version you have installed may also have a bug that makes
# it unable to process our input files.
# installed, even if you have the Xcode command-line tools.
#
# The easiest way to fix this is to install everything via Homebrew:
#
#   http://brew.sh/
#
# After you install the base packages, install autoconf, automake,
# libtool, and flex/bison.
# and libtool.
#
#   brew install autoconf
#   brew install automake
#   brew install libtool
#   brew install flex
#   brew install bison
#
# This only takes a few minutes. Note that libtool and libtoolize will
# be glibtool and glibtoolize so as not to conflict with Apple's non-gnu
# tools. This autogen.sh script handles this for you.
#
# END IMPORTANT OS X NOTE
#
# If you want to use a particular version of the autotools, the paths
# to each tool can be overridden using the following environment
# variables:
#
#   HDF5_ACLOCAL
#   HDF5_AUTOHEADER
#   HDF5_AUTOMAKE
#   HDF5_AUTOCONF
#   HDF5_LIBTOOL
#   HDF5_M4
#   HDF5_FLEX
#   HDF5_BISON
#
# Note that aclocal will attempt to include libtool's share/aclocal
# directory.
#
# This script takes two potential options:
#
# -p
#
# When this is selected, the autotools versions are set to the paths
# and versions used by The HDF Group to produce the released versions
    fi
    if test -z ${HDF5_ACLOCAL}; then
        HDF5_ACLOCAL=/usr/hdf/bin/AUTOTOOLS/aclocal
    fi
    if test -z ${HDF5_LIBTOOL}; then
        HDF5_LIBTOOL=/usr/hdf/bin/AUTOTOOLS/libtool
    fi
    if test -z ${HDF5_M4}; then
        HDF5_M4=/usr/hdf/bin/AUTOTOOLS/m4
    fi
    if test -z ${HDF5_BISON}; then
        HDF5_BISON=/usr/hdf/bin/AUTOTOOLS/bison
    fi
    if test -z ${HDF5_FLEX}; then
        HDF5_FLEX=/usr/hdf/bin/AUTOTOOLS/flex
    fi
else
    # Not in production mode
    #
    # If paths to autotools are not specified, use whatever the system
    # has installed as the default. We use 'which <tool>' to
    # show exactly what's being used.
    if test -z ${HDF5_AUTOCONF}; then
        HDF5_AUTOCONF=$(which autoconf)
            HDF5_LIBTOOL=$(which glibtool)
            ;;
        *)
            HDF5_LIBTOOL=$(which libtool)
            ;;
        esac
    fi
    if test -z ${HDF5_M4}; then
        HDF5_M4=$(which m4)
    fi
    if test -z ${HDF5_BISON}; then
        HDF5_BISON=$(which bison)
    fi
    if test -z ${HDF5_FLEX}; then
        HDF5_FLEX=$(which flex)
    fi
fi # production
# Make sure that these versions of the autotools are in the path
AUTOCONF_DIR=`dirname ${HDF5_AUTOCONF}`
LIBTOOL_DIR=`dirname ${HDF5_LIBTOOL}`
M4_DIR=`dirname ${HDF5_M4}`
BISON_DIR=`dirname ${HDF5_BISON}`
FLEX_DIR=`dirname ${HDF5_FLEX}`
PATH=${AUTOCONF_DIR}:${LIBTOOL_DIR}:${M4_DIR}:${FLEX_DIR}:${BISON_DIR}:$PATH
PATH=${AUTOCONF_DIR}:${LIBTOOL_DIR}:${M4_DIR}:$PATH
# Make libtoolize match the specified libtool
case "`uname`" in
Darwin*)
    # On OS X, libtoolize could be named glibtoolize or
    # libtoolize. Try the former first, then fall back
    # to the latter if it's not found.
    HDF5_LIBTOOLIZE="${LIBTOOL_DIR}/glibtoolize"
    if [ ! -f $HDF5_LIBTOOLIZE ] ; then
        HDF5_LIBTOOLIZE="${LIBTOOL_DIR}/libtoolize"
echo "Running API version generation script:"
bin/make_vers src/H5vers.txt || exit 1
# Run make_overflow
# make_overflow automatically generates macros for detecting overflows for type
# conversion.
echo
echo "Running overflow macro generation script:"
bin/make_overflow src/H5overflow.txt || exit 1
# Run flex and bison
# automatically generates hl/src/H5LTanalyze.c and hl/src/H5LTparse.c
# Note that, as of Xcode 6.1 (2015), the default bison version on OS X
# is old enough to have the circular dependency bug. You'll have
# to install a later version of bison. See the OS X note at the top
# of this script.
echo
echo "Generating H5LT parser code (requires yacc/bison):"
echo "Generate hl/src/H5LTparse.c from hl/src/H5LTparse.y"
# HDF5_BISON is set via the environment or 'which bison', above
if test -z ${HDF5_BISON}; then
    echo
    echo "*************************"
    echo " ERROR - bison not found"
    echo "*************************"
    echo "bison is required to generate parser code in H5LT"
    echo
    exit 127
fi
cd hl/src
if [ "$verbose" = true ] ; then
    ${HDF5_BISON} --version
fi
${HDF5_BISON} -pH5LTyy -o H5LTparse.c -d H5LTparse.y
echo
echo "Generating H5LT lexer code (requires lex/flex):"
echo "Generate hl/src/H5LTanalyze.c from hl/src/H5LTanalyze.l"
# HDF5_FLEX is set via the environment or 'which flex', above
if test -z ${HDF5_FLEX}; then
    echo
    echo "************************"
    echo " ERROR - flex not found"
    echo "************************"
    echo "flex is required to generate lexer code in H5LT"
    echo
    exit 127
fi
if [ "$verbose" = true ] ; then
    ${HDF5_FLEX} --version
fi
${HDF5_FLEX} --nounistd -PH5LTyy -o H5LTanalyze.c H5LTanalyze.l
# fix H5LTparse.c to declare H5LTyyparse return type as an hid_t
# instead of int.  Currently the generated function H5LTyyparse is
# generated with a return value of type int, which is a mapping to the
# flex yyparse function.  The return value in the HL library should be
# an hid_t. 
# I propose to not use flex to generate this function, but for now I am 
# adding a perl command to find and replace this function declaration in
# H5LTparse.c.
perl -0777 -pi -e 's/int yyparse/hid_t yyparse/igs' H5LTparse.c
perl -0777 -pi -e 's/int\nyyparse/hid_t\nyyparse/igs' H5LTparse.c
perl -0777 -pi -e 's/int H5LTyyparse/hid_t H5LTyyparse/igs' H5LTparse.c
# Add code that disables warnings in the flex/bison-generated code.
#
# Note that the GCC pragmas did not exist until gcc 4.2. Earlier versions
# will simply ignore them, but we want to avoid those warnings.
for f in H5LTparse.c H5LTanalyze.c
do
    echo '#if __GNUC__ >= 4 && __GNUC_MINOR__ >=2                           ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wconversion"                     ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"  ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wlarger-than="                   ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wmissing-prototypes"             ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wnested-externs"                 ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wold-style-definition"           ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wsign-compare"                   ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wsign-conversion"                ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wstrict-prototypes"              ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wswitch-default"                 ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wunused-function"                ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wunused-macros"                  ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wunused-parameter"               ' >> tmp.out
    echo '#pragma GCC diagnostic ignored "-Wredundant-decls"                ' >> tmp.out
    echo '#elif defined __SUNPRO_CC                                         ' >> tmp.out
    echo '#pragma disable_warn                                              ' >> tmp.out
    echo '#elif defined _MSC_VER                                            ' >> tmp.out
    echo '#pragma warning(push, 1)                                          ' >> tmp.out
    echo '#endif                                                            ' >> tmp.out
    cat $f >> tmp.out
    mv tmp.out $f
done
cd ../..
echo
exit 0