# 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      3.6
"

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
}
