#! /bin/bash
## @file
##
## $Id$
##
## $Date: 2004/08/31 15:57:19 $
## $Author: marc $
##
## @copy &copy; Marc W&auml;ckerlin
## @license LGPL, see file <a href="license.html">COPYING</a>
##
## $Log: bootstrap.sh,v $
## Revision 1.3  2004/08/31 15:57:19  marc
## added file header
##

configure=0
while test $# -gt 0; do
    case "$1" in
        (--configure|-c) configure=1;;
        (*) break;;
    esac
    shift;
done


MY_NAME=${0##*/}
PROJECT_PATH=$(pwd)
DEFAULT_PROJECT_NAME=${PROJECT_PATH##*/}

HEADER='## @id $Id$
#
# This file has been added by '${MY_NAME}' on '$(date -R)'
# Feel free to change it or even remove and rebuild it, up to your needs
#
##       1         2         3         4         5         6         7         8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890

'

run() {
    check=1
    while test $# -gt 0; do
        case "$1" in
            (--no-check) check=0;;
            (*) break;;
        esac
        shift;
    done
    echo -en "\e[1m-> running:\e[0m $* ..."
    result=$($* 2>&1)
    res=$?
    if test $res -ne 0; then
        if test $check -eq 1; then
            echo -e " \e[31merror\e[0m"
            echo -e "\e[1m*** Failed with return code: $res\e[0m"
            if test -n "$result"; then
                echo "$result"
            fi
            exit 1
        else
            echo -e " \e[33mignored\e[0m"
        fi
    else
        echo -e " \e[32msuccess\e[0m"
    fi
}

testtag() {
    egrep -q '^ *'"$1" configure.ac
}

checkdir() {
    if ! test -d "$1"; then # create path
        run mkdir -p "$1"
        run svn add "$1"
    fi
}

to() {
    while test $# -gt 0; do
        case "$1" in
            (--condition) shift # test for a tag, abort if not set
                if ! testtag "$1" configure.ac; then
                    return
                fi;;
            (*) break;;
        esac
        shift;
    done
    if test -f "$1"; then # file already exists
        return
    fi
    checkdir "$(dirname ${1})"
    echo -en "\e[1m-> generating:\e[0m $1 ..."
    result=$(cat > "$1" 2>&1)
    res=$?
    if test $res -ne 0; then
        echo -e " \e[31merror\e[0m"
        echo -e "\e[1m*** Failed with return code: $res\e[0m"
        if test -n "$result"; then
            echo "$result"
        fi
        exit 1
    else
        echo -e " \e[32msuccess\e[0m"
    fi
    run svn add "$1"
    run svn propset svn:keywords "Id" "$1"
}

copy() {
    if ! test -f "$1"; then
        run cp "${0%/*}/$1" "$1"
        run svn add "$1"
        run svn propset svn:keywords "Id" "$1"
    fi
}

doxyreplace() {
    echo -en "\e[1m-> doxyfile:\e[0m configure $1 ..."
    if sed -i 's|\(^'"$1"' *=\) *|\1'" $2"'|g' doc/doxyfile.in; then
        echo -e " \e[32msuccess\e[0m"
    else
        echo -e " \e[31merror\e[0m"
        echo -e "\e[1m**** command: sed -i 's|\(^'"$1"' *=\) *|\1'" $2"'|g' doc/doxyfile.in;\e[0m"
        exit 1
    fi
}

# Initialize the environment:
copy ${MY_NAME}
copy ax_init_standard_project.m4
copy ax_cxx_compile_stdcxx_11.m4
copy ax_check_qt.m4
copy AUTHORS
if ! test -f configure.ac; then
    to configure.ac <<EOF
${HEADER}m4_define(x_package_name, ${DEFAULT_PROJECT_NAME}) # project's name
m4_define(x_major, 0) # project's major version
m4_define(x_minor, 0) # project's minor version
m4_include(ax_init_standard_project.m4)
AC_INIT(x_package_name, x_major.x_minor.x_least, x_bugreport, x_package_name)
AM_INIT_AUTOMAKE([1.9 tar-pax])
AX_INIT_STANDARD_PROJECT

# requirements, uncomment, what you need:
#AX_USE_CXX
#AX_USE_LIBTOOL
#AX_USE_DOXYGEN
#AX_USE_DEBIAN_PACKAGING
#AX_USE_RPM_PACKAGING
#AX_USE_CPPUNIT
#AX_BUILD_EXAMPLES

# create output
AC_OUTPUT
EOF
    echo "please edit configure.ac, then rerun $0"
    exit 0
fi
PACKAGE_NAME=$(sed -n 's/.*m4_define *( *x_package_name *, *\([^ ]*\) *).*/\1/p' configure.ac)
echo "${HEADER}" | to --condition AX_USE_CXX src/makefile.am
echo "${HEADER}" | to --condition AX_USE_DOXYGEN doc/makefile.am
to --condition AX_USE_CPPUNIT test/makefile.am <<EOF
${HEADER}AM_CPPFLAGS = -I${top_srcdir}/src -I${top_builddir}/src
AM_LDFLAGS = -L${top_builddir}/src/.libs
LDADD = -l${PACKAGE_NAME}
EOF
to --condition AX_BUILD_EXAMPLES examples/makefile.am <<EOF
${HEADER}AM_CPPFLAGS = -I${top_srcdir}/src -I${top_builddir}/src
AM_LDFLAGS = -L${top_builddir}/src/.libs
LDADD = -l${PACKAGE_NAME}
EOF
if testtag AX_USE_DOXYGEN && ! test -f doc/doxyfile.in; then
    run doxygen -g doc/doxyfile.in
    run svn add doc/doxyfile.in
    run svn propset svn:keywords "Id" doc/doxyfile.in
    doxyreplace PROJECT_NAME "@PACKAGE_NAME@"
    doxyreplace PROJECT_NUMBER "@PACKAGE_VERSION@"
    doxyreplace PROJECT_BRIEF "@DESCRIPTION@"
    doxyreplace PROJECT_LOGO "@PROJECT_LOGO@"
    doxyreplace INLINE_INHERITED_MEMB YES
    doxyreplace MULTILINE_CPP_IS_BRIEF YES
    doxyreplace TAB_SIZE 2
    doxyreplace ALIASES '"id=\par File-ID\n" "copy=\par Copyright\n" "license=\par License\n" "classmutex=\par Reentrant:\nAccess is locked with class static mutex @c " "instancemutex=\par Reentrant:\nAccess is locked with per instance mutex @c " "mutex=\par Reentrant:\nAccess is locked with mutex @c "'
    doxyreplace BUILTIN_STL_SUPPORT YES
    doxyreplace DISTRIBUTE_GROUP_DOC YES
    doxyreplace EXTRACT_ALL YES
    doxyreplace EXTRACT_PRIVATE YES
    doxyreplace EXTRACT_STATIC YES
    doxyreplace EXTRACT_LOCAL_CLASSES YES
    doxyreplace EXTRACT_LOCAL_METHODS YES
    doxyreplace EXTRACT_ANON_NSPACES YES
    doxyreplace SORT_MEMBERS_CTORS_1ST YES
    doxyreplace WARN_IF_UNDOCUMENTED NO
    doxyreplace WARN_LOGFILE doxygen.errors
    doxyreplace INPUT "@top_srcdir@/src"
    doxyreplace RECURSIVE YES
    doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_*"
    if testtag AX_BUILD_EXAMPLES; then
        doxyreplace EXAMPLE_PATH @top_srcdir@/examples
    fi
    doxyreplace EXAMPLE_RECURSIVE YES
    doxyreplace SOURCE_BROWSER YES
    doxyreplace INLINE_SOURCES YES
    doxyreplace GENERATE_TREEVIEW NO
    doxyreplace SEARCHENGINE YES
    doxyreplace GENERATE_HTML YES
    doxyreplace GENERATE_LATEX NO
    doxyreplace LATEX_BATCHMODE YES
    doxyreplace LATEX_HIDE_INDICES YES
    doxyreplace COMPACT_RTF YES
    doxyreplace RTF_HYPERLINKS YES
    doxyreplace GENERATE_TAGFILE "@PACKAGE_NAME@.doxytag"
    doxyreplace HIDE_UNDOC_RELATIONS NO
    doxyreplace HAVE_DOT YES
    doxyreplace CLASS_GRAPH YES
    doxyreplace TEMPLATE_RELATIONS YES
    doxyreplace DOT_IMAGE_FORMAT svg
    doxyreplace INTERACTIVE_SVG YES
    doxyreplace DOT_TRANSPARENT YES
fi
if testtag AX_USE_DEBIAN_PACKAGING; then
    checkdir debian
    to debian/changelog.in <<EOF
@PACKAGE@ (@PACKAGE_VERSION@~@DISTRO@.@BUILD_NUMBER@) @DISTRO@; urgency=low

  * Please see ChangeLog of @PACKAGE@

 -- @AUTHOR@  @BUILD_DATE@
EOF
    to debian/control.in <<EOF
Source: @PACKAGE_NAME@
Priority: extra
Maintainer: @AUTHOR@
Build-Depends: debhelper, pkg-config, autotools-dev, lsb-release $(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CXX_CHECK_QT; then echo -n ", qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools"; fi)

Package: @PACKAGE_NAME@
$(if testtag AX_USE_LIBTOOL; then echo "Section: libs"; fi)
Architecture: any
Depends: \${shlibs:Depends}, \${misc:Depends}
Description: @DESCRIPTION@
@README_DEB@
$(      if testtag AX_USE_LIBTOOL; then
            cat <<EOF2

Package: @PACKAGE_NAME@-dev
Section: libdevel
Architecture: any
Depends: @PACKAGE_NAME@ (= \${binary:Version})
Description: @DESCRIPTION@ - Development Package
@README_DEB@
EOF2
          fi)
EOF
    to debian/docs <<EOF
NEWS
README
EOF
    to debian/${PACKAGE_NAME}.install <<EOF
usr/bin/*
usr/lib/lib*.so.*
$(if ! testtag AX_USE_LIBTOOL; then echo "usr/share/doc/${PACKAGE_NAME}/html"; fi)
EOF
    to debian/${PACKAGE_NAME}.dirs <<EOF
usr/lib
EOF
    if testtag AX_USE_LIBTOOL; then
        to debian/${PACKAGE_NAME}-dev.install <<EOF
usr/include/*
usr/lib/lib*.a
usr/lib/lib*.so
usr/lib/pkgconfig/*
usr/lib/*.la
$(if testtag AX_USE_LIBTOOL; then echo "usr/share/doc/${PACKAGE_NAME}/html"; fi)
EOF
        to debian/${PACKAGE_NAME}-dev.dirs <<EOF
usr/lib
usr/include
EOF
    fi
    to debian/rules <<EOF
${HEADER}%:
	dh \$@
EOF
    echo 7 | to debian/compat
fi
if ! test -f makefile.am; then
    SUBDIRS=""
    for d in src test doc examples; do
        test -d $d && SUBDIRS="${SUBDIRS} $d"
    done
    echo "${HEADER}SUBDIRS =${SUBDIRS}" | to makefile.am
fi
to --condition AX_USE_LIBTOOL src/${PACKAGE_NAME}.pc.in <<EOF
${HEADER}prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=\${exec_prefix}/lib
includedir=\${prefix}/include

Name: @PACKAGE_NAME@
Description: @DESCRIPTION@
Version: @VERSION@
Libs: -L\${libdir} -l@PACKAGE_NAME@ @LDFLAGS@
Cflags: -I\${includedir} @CPPFLAGS@
EOF

#### Cleanup If Makefile Exists ####
if test -f makefile; then
    run --no-check make distclean
fi

#### Bootstrap Before Configure ####
run aclocal
run libtoolize --force
run automake -a
run autoconf

#### Run Configure If User Requires ####
if test "$configure" -eq 1; then
    ./configure $*
fi
