# Copyright (C) 2016,2018 Tim Rühsen
# Copyright (C) 2016-2017 Simon Josefsson

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

# gnulib library name
source_base=lib/gl
tests_base=tests-gl
m4_base=m4-gl
gnulib_name=libgnu
gnulib_tool_option_extras="--lgpl=2 --without-tests --no-vc-files"
use_libtool=1
checkout_only_file=
local_gl_dir=lib/gl/override/

gnulib_modules="
c-ctype
intprops
lib-symbol-versions
lib-symbol-visibility
manywarnings
minmax
stdint
strverscmp
valgrind-tests
maintainer-makefile
"

# Build prerequisites
buildreq="\
autoconf   2.62
automake   1.11.1
git        1.4.4
bison      -
"

GTKDOCIZE=$(which gtkdocize 2>/dev/null)
if test $? -ne 0; then
  echo "No gtk-doc support found. You can't build the docs."
  # rm because gtk-doc.make might be a link to a protected file
  rm -f gtk-doc.make 2>/dev/null
  echo "EXTRA_DIST =" >gtk-doc.make
  echo "CLEANFILES =" >>gtk-doc.make
  GTKDOCIZE=""
else
  $GTKDOCIZE
fi

# update git submodules
git_options=
if test -n "$SUBMODULE_NOFETCH"; then
  git_options="--no-fetch"
fi

bootstrap_post_import_hook ()
{
  touch ChangeLog
}
