# Bootstrap configuration.                                          -*- sh -*-

# Copyright (C) 2006-2026 Free Software Foundation, Inc.

# 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/>.


# We don't need these modules.
avoided_gnulib_modules='
  --avoid=canonicalize-lgpl
  --avoid=dummy
  --avoid=mbuiter
  --avoid=mbuiterf
'

# gnulib modules used by this package.
gnulib_modules="
  $avoided_gnulib_modules
  acl
  acl-permissions
  alignalloc
  alignasof
  alloca
  announce-gen
  areadlink-with-size
  areadlinkat-with-size
  argmatch
  argv-iter
  assert
  assert-h
  assure
  attribute
  autobuild
  backup-rename
  backupfile
  base32
  base64
  bool
  btoc32
  buffer-lcm
  c-strcase
  c32iscntrl
  c32isspace
  c32width
  canon-host
  canonicalize
  chmodat
  chown
  chownat
  cl-strtod
  cl-strtold
  closein
  closeout
  config-h
  configmake
  copy-file-range
  cpu-supports
  crc-x86_64
  crypto/md5
  crypto/sha1
  crypto/sha256
  crypto/sha3
  crypto/sha512
  crypto/sm3
  cycle-check
  d-ino
  d-type
  di-set
  dirfd
  dirname
  do-release-commit-and-tag
  dtimespec-bound
  dtoastr
  dup2
  endian
  environ
  error
  euidaccess
  exclude
  exitfail
  explicit_bzero
  faccessat
  fadvise
  fchdir
  fchmodat
  fclose
  fcntl
  fcntl-safer
  fd-reopen
  fdatasync
  fdopen
  fdutimensat
  file-has-acl
  file-type
  fileblocks
  filemode
  filenamecat
  filevercmp
  findprog-in
  flexmember
  fnmatch-gnu
  fopen-safer
  fprintftime
  fpurge
  free-posix
  freopen
  freopen-safer
  fseeko
  fstatat
  fsusage
  fsync
  ftoastr
  ftruncate
  fts
  full-read
  full-write
  gethrxtime
  getline
  getloadavg
  getlogin
  getndelim2
  getopt-gnu
  getpagesize
  gettext-h
  gettime
  gettime-res
  git-version-gen
  gitlog-to-changelog
  gnu-web-doc-update
  gnumakefile
  gnupload
  hard-locale
  hash
  hashcode-file-inode
  heap
  host-os
  human
  idcache
  idx
  ignore-value
  inttostr
  inttypes-h
  isapipe
  isatty
  isblank
  issymlink
  issymlinkat
  largefile
  lchmod
  ldtoastr
  lib-ignore
  libgmp
  linebuffer
  link
  link-follow
  linkat
  long-options
  lstat
  maintainer-makefile
  malloc-gnu
  manywarnings
  mbbuf
  mbrlen
  mbrtoc32
  mbrtowc
  mbs_endswith
  mbschr
  mbslen
  mbsstr
  mbswidth
  mbszero
  mcel-prefer
  memcasecmp
  memchr
  memcmp2
  mempcpy
  memrchr
  minmax
  mkancesdirs
  mkdir
  mkdir-p
  mkdirat
  mkfifo
  mkfifoat
  mknod
  mkostemp
  mkstemp
  mktime
  modechange
  mountlist
  mpsort
  nproc
  nstrftime
  obstack
  open
  openat-safer
  parse-datetime
  parse-datetime2
  pathmax
  perl
  physmem
  pipe-posix
  pipe2
  posix-shell
  posix_spawn
  posix_spawn_file_actions_addclose
  posix_spawn_file_actions_adddup2
  posix_spawn_file_actions_destroy
  posix_spawn_file_actions_init
  posix_spawnattr_destroy
  posix_spawnattr_init
  posix_spawnattr_setflags
  posix_spawnattr_setsigdefault
  posix_spawnp
  posixtm
  posixver
  priv-set
  progname
  propername-lite
  pthread-cond
  pthread-mutex
  pthread-thread
  pthread_sigmask
  putenv-gnu
  quote
  quotearg
  randint
  randperm
  rawmemchr
  read-file
  readtokens
  readtokens0
  readutmp
  regex
  remove
  renameat
  renameatu
  rmdir
  root-dev-ino
  safe-read
  same
  save-cwd
  savedir
  savewd
  select
  selinux-at
  setenv
  settime
  sig2str
  sigaction
  skipchars
  smack
  ssize_t
  stat-macros
  stat-size
  stat-time
  stdc_leading_zeros
  stdc_trailing_zeros
  stdckdint-h
  stdcountof-h
  stddef-h
  stdlib-safer
  stpcpy
  str_endswith
  strdup-posix
  stringeq
  strnlen
  strnumcmp
  strsignal
  strtoimax
  strtoumax
  symlinkat
  sys_ioctl-h
  sys_resource-h
  sys_stat-h
  sys_types-h
  sys_wait-h
  targetdir
  tempname
  termios-h
  time_rz
  timer-time
  timespec
  tmpdir
  uname
  unicodeio
  unistd-safer
  unlink-busy
  unlinkat
  unlinkdir
  unlocked-io
  unsetenv
  update-copyright
  useless-if-before-free
  userspec
  utimecmp
  utimens
  utimensat
  vasprintf-posix
  vc-list-files
  verify
  verror
  version-etc-fsf
  winsz-ioctl
  winsz-termios
  write-any-file
  xalignalloc
  xalloc
  xbinary-io
  xdectoint
  xfts
  xgetcwd
  xgetgroups
  xgethostname
  xmemcoll
  xmemdup0
  xnanosleep
  xprintf
  xprintf-posix
  xreadlink
  xsetenv
  xstrtod
  xstrtoimax
  xstrtol
  xstrtol-error
  xstrtold
  xstrtoumax
  xvasprintf
  year2038-recommended
  yesno
"

# Other locale categories that need message catalogs.
EXTRA_LOCALE_CATEGORIES=LC_TIME

# Additional xgettext options to use.  Use "\\\newline" to break lines.
XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
 --flag=asnprintf:3:c-format\\\
 --flag=asprintf:2:c-format\\\
 --flag=error:3:c-format\\\
 --flag=error_at_line:5:c-format\\\
 --flag=vasnprintf:3:c-format\\\
 --flag=vasprintf:2:c-format\\\
 --flag=verror:3:c-format\\\
 --flag=verror_at_line:5:c-format\\\
 --flag=wrapf:1:c-format\\\
 --flag=xasprintf:1:c-format\\\
 --flag=xfprintf:2:c-format\\\
 --flag=xprintf:1:c-format\\\
 --from-code=UTF-8\\\
'

# Append these, since we use the propername-lite module.
see_manual='"This is a proper name. See the gettext manual, section Names."'
see_manual=\'"$see_manual"\'
XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
 --keyword=proper_name:1,'"$see_manual"'\\\
 --keyword=proper_name_lite:1,'"$see_manual"'\\\
'

gnulib_tool_option_extras="--tests-base=gnulib-tests --with-tests --symlink\
 --makefile-name=gnulib.mk --automake-subdir
"

# Build prerequisites
buildreq="\
autoconf   2.64
automake   1.11.2
autopoint  0.19.2
bison      -
gettext    0.19.2
git        1.5.5
gperf      -
gzip       -
m4         -
makeinfo   6.1
texi2pdf   6.1
patch      -
perl       5.5
tar        -
wget       -
xz         -
"

bootstrap_post_import_hook ()
{
  # Automake requires that ChangeLog exist.
  touch ChangeLog || return 1
  # List of coreutils programs.  See heading comments in the invoked
  # script for more info.  Keep this in sync with the rules in
  (m4f=m4/cu-progs.m4 mkf=src/cu-progs.mk tmp=cu-progs.tmp \
    && rm -f $m4f $mkf $tmp-1 $tmp-2 \
    && build-aux/gen-lists-of-programs.sh --autoconf >$tmp-1 \
    && build-aux/gen-lists-of-programs.sh --automake >$tmp-2 \
    && chmod a-w $tmp-1 $tmp-2 \
    && mv -f $tmp-1 $m4f && mv -f $tmp-2 $mkf)

  # If "AM_GNU_GETTEXT(external" or "AM_GNU_GETTEXT([external]" appears
  # in configure.ac, remove a file unnecessarily imported by autopoint.
  if grep '^[	 ]*AM_GNU_GETTEXT(\[*external]*[,)]' \
          configure.ac >/dev/null 2>&1; then
    rm -f m4/longlong.m4
  fi

  # Regenerate src/single-binary.mk
  (mkf=src/single-binary.mk tmp=single-binary.tmp \
    && rm -f $mkf $tmp \
    && build-aux/gen-single-binary.sh src/local.mk >$tmp \
    && chmod a-w $tmp \
    && mv -f $tmp $mkf)

  # Copy tests/init.sh from Gnulib.
  $gnulib_tool --copy-file tests/init.sh
}


bootstrap_epilogue()
{
  # Since this is a "GNU" package, replace this line
  #   if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null \
  #      | grep -v 'libtool:' >/dev/null; then
  # with this:
  #   if true; then
  # Why?  That pipeline searches all files in $(top_srcdir), and if you
  # happen to have large files (or apparently large sparse files), the
  # first grep may well run out of memory.
  perl -pi -e 's/if LC_ALL=C grep .GNU .PACKAGE.*; then/if true; then/' \
    po/Makefile.in.in

  # Add dummy 'install-html' target, required for packages using
  # non-recursive makefiles with older gettext.
  # See https://bugs.gnu.org/25690
  if ! grep -w 'install-html' po/Makefile.in.in ; then
    printf 'install-%s:;\n' dvi ps pdf html >> po/Makefile.in.in
  fi

  # Install our git hooks, as long as "cp" accepts the --backup option,
  # so that we can back up any existing files.
  case $(cp --help) in *--backup*) backup=1;; *) backup=0;; esac
  if test $backup = 1; then
    hooks=$(cd scripts/git-hooks && git ls-files)
    for f in $hooks; do
      # If it is identical, skip it.
      cmp scripts/git-hooks/$f .git/hooks/$f > /dev/null \
        && continue
      cp --backup=numbered scripts/git-hooks/$f .git/hooks
      chmod a-w .git/hooks/$f
    done
  fi
}
