# 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="
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
}
