The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
:
#!/bin/sh -x
# The above : is necessary on some buggy systems.

# configure: Guess values for system-dependent variables
# Output the flag definitions to the file "flags".
# Parameters: $1 = $(CC), $2 = $(CFLAGS), $3 = $(IZ_BZIP2)
# To construct unzip automatically using this file, type
# "make -f unix/Makefile generic".
# If this fails, then type "make list" to get a list of special targets.

trap "rm -f conftest* core a.out; exit 1" 1 2 3 15

CC=${1-cc}
CFLAGS=${2}
CFLAGSR=${CFLAGS}
IZ_BZIP2=${3}
CFLAGS="${CFLAGS} -I. -DUNIX"
LFLAGS1=""
LFLAGS2="-s"
LN="ln -s"

CFLAGS_OPT=''
CFLAGS_BZ=''
BZLF=''

echo "Check C compiler operation"
cat > conftest.c << _EOF_
int main()
{
   return 0;
}
_EOF_
$CC $CFLAGS -c conftest.c
status=$?
if test $status -ne 0; then
  echo ''
  echo "C compiler \"${CC}\" does not work as expected."
  echo "Failing command was: $CC $CFLAGS -c conftest.c"
  exit $status
else
  echo '  Ok'
fi

echo 'Check C compiler type (optimization options)'
# Sun C?
cat > conftest.c << _EOF_
int main()
{
#ifndef __SUNPRO_C
   bad code
#endif
   return 0;
}
_EOF_
$CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
if test $? -eq 0; then
  CFLAGS_OPT='-xO3'
  echo "  Sun C ($CFLAGS_OPT)"
else
  # Tru64 DEC/Compaq/HP C?
  cat > conftest.c << _EOF_
int main()
{
#ifndef __DECC
   bad code
#endif
   return 0;
}
_EOF_
  $CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
  if test $? -eq 0; then
    CFLAGS_OPT='-O3'
    echo "  DEC C ($CFLAGS_OPT)"
  else
    # HP-UX HP C?
    cat > conftest.c << _EOF_
int main()
{
#ifdef __GNUC__
   bad code
#endif
#ifndef __hpux
   bad code
#endif
   return 0;
}
_EOF_
    $CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
    if test $? -eq 0; then
      # HP-UX, not GCC.  Lame bundled or real ANSI compiler?
      CFLAGS_OPT_TRY="+O3 +Onolimit"
      $CC $CFLAGS $CFLAGS_OPT_TRY -c conftest.c 2>&1 | \
       grep '(Bundled)' > /dev/null
      if test $? -ne 0; then
        CFLAGS_OPT="$CFLAGS_OPT_TRY"
        echo "  HP-UX ANSI C ($CFLAGS_OPT)"
      else
        echo '  HP-UX Bundled C (no opt)'
      fi
    else
      # GNU C?
      cat > conftest.c << _EOF_
int main()
{
#ifndef __GNUC__
   bad code
#endif
   return 0;
}
_EOF_
      $CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
      if test $? -eq 0; then
        CFLAGS_OPT='-O3'
        echo "  GNU C ($CFLAGS_OPT)"
	# Special Mac OS X shared library "ld" option?
        if test ` uname -s 2> /dev/null ` = 'Darwin'; then
          lf='-Wl,-search_paths_first'
          $CC $CFLAGS $lf conftest.c > /dev/null 2>/dev/null
          if test $? -eq 0; then
            BZLF=${lf}
          fi
          rm -f conftest
        fi
      else
        CFLAGS_OPT='-O'
        echo "  Other-unknown C ($CFLAGS_OPT)"
      fi
    fi
  fi
fi

# optimization flags
if test -n "${CFLAGS_OPT}"; then
  CFLAGSR="${CFLAGSR} ${CFLAGS_OPT}"
  CFLAGS_BZ="${CFLAGS_BZ} ${CFLAGS_OPT}"
fi

echo Check for the C preprocessor
# on SVR4, cc -E does not produce correct assembler files. Need /lib/cpp.
CPP="${CC} -E"
# solaris as(1) needs -P, maybe others as well ?
[ -f /usr/ccs/lib/cpp ] && CPP="/usr/ccs/lib/cpp -P"
[ -f /usr/lib/cpp ] && CPP=/usr/lib/cpp
[ -f /lib/cpp ] && CPP=/lib/cpp
[ -f /usr/bin/cpp ] && CPP=/usr/bin/cpp
[ -f /xenix ] && CPP="${CC} -E"
[ -f /lynx.os ] && CPP="${CC} -E"

echo "#include <stdio.h>" > conftest.c
$CPP conftest.c >/dev/null 2>/dev/null || CPP="${CC} -E"

echo Check if we can use asm code
CRC32OA=""
if eval "$CPP crc_i386.S > _crc_i386.s 2>/dev/null"; then
  if test ! -s _crc_i386.s || grep error < _crc_i386.s > /dev/null; then
    :
  elif eval "$CC -c _crc_i386.s >/dev/null 2>/dev/null" && [ -f _crc_i386.o ]; then
    CFLAGSR="${CFLAGSR} -DASM_CRC"
    CRC32OA="crc_gcc.o"
    echo "int foo() { return 0;}" > conftest.c
    $CC -c conftest.c >/dev/null 2>/dev/null
    echo Check if compiler generates underlines
    nm conftest.o | grep "(^|[^_])foo" >/dev/null 2>/dev/null
    [ $? -eq 0 ] && CPP="${CPP} -DNO_UNDERLINE"
  fi
fi
rm -f _crc_i386.s _crc_i386.o

# ANSI options for compilers that don't have __STDC__ defined by default
# Currently HPUX, pyramid, Dynix, AIX, OSF/1 and ultrix

echo Check for ANSI options
cat > conftest.c << _EOF_
int main()
{
#ifndef __STDC__
   forget it
#endif
   return 0;
}
_EOF_
$CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
if [ $? -ne 0 ]; then
  for OPT in "-Aa -D_HPUX_SOURCE" -Xa -qlanglvl=ansi -std1 -std
  do
    $CC $CFLAGS $OPT -c conftest.c > /dev/null 2>/dev/null
    [ $? -eq 0 ] && CFLAGSR="${CFLAGSR} ${OPT}" && break
  done
fi

echo Check for prototypes
echo "int main(int argc, char *argv[]) { return 0; }" > conftest.c
$CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_PROTO"

# const check currently handles mips cc and non ANSI compilers.
# does it need more ?
echo Check the handling of const
cat > conftest.c << _EOF_
typedef int charset[2];
int main()
{
  const charset x;
  const char *foo;
  return 0;
}
_EOF_
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_CONST"

echo Check for time_t
cat > conftest.c << _EOF_
#include <sys/types.h>
#include <time.h>
int main()
{
  time_t t;
  return 0;
}
_EOF_
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_TIME_T"

echo Check for size_t
cat > conftest.c << _EOF_
#include <sys/types.h>
int main()
{
  size_t s;
  return 0;
}
_EOF_
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_SIZE_T"

echo Check for off_t
cat > conftest.c << _EOF_
#include <sys/types.h>
int main()
{
  off_t s;
  return 0;
}
_EOF_
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_OFF_T"

# Added 11/4/2003 EG
# Revised 8/12/04 EG
# Now we set the 64-bit file environment and check the size of off_t
echo Check for Large File Support
cat > conftest.c << _EOF_
# define _LARGEFILE_SOURCE       /* some OSes need this for fseeko */
# define _LARGEFILE64_SOURCE
# define _FILE_OFFSET_BITS 64       /* select default interface as 64 bit */
# define _LARGE_FILES        /* some OSes need this for 64-bit off_t */
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
  off_t offset;
  struct stat s;
  /* see if have 64-bit off_t */
  if (sizeof(offset) < 8)
    return 1;
  printf("  off_t is %d bytes\n", sizeof(off_t));
  /* see if have 64-bit stat */
  if (sizeof(s.st_size) < 8) {
    printf("  s.st_size is %d bytes\n", sizeof(s.st_size));
    return 2;
  }
  return 3;
}
_EOF_
# compile it
$CC -o conftest conftest.c >/dev/null 2>/dev/null
if [ $? -ne 0 ]; then
  echo -- no Large File Support
else
# run it
  ./conftest
  r=$?
  if [ $r -eq 1 ]; then
    echo -- no Large File Support - no 64-bit off_t
  elif [ $r -eq 2 ]; then
    echo -- no Large File Support - no 64-bit stat
  elif [ $r -eq 3 ]; then
    echo -- yes we have Large File Support!
    CFLAGSR="${CFLAGSR} -DLARGE_FILE_SUPPORT"
  else
    echo -- no Large File Support - conftest returned $r
  fi
fi

# Added 11/24/2005 EG
# Check for wide char for Unicode support
echo Check for wide char support
cat > conftest.c << _EOF_
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
int main()
{
  size_t wsize;
  wchar_t *wide_string;

  if ((wide_string = (wchar_t *)malloc(4 * sizeof(wchar_t))) == NULL) {
    return 0;
  }
  /* get wide string */
  wsize = mbstowcs(wide_string, "foo", 3);
  wide_string[wsize] = (wchar_t) NULL;
#ifndef __STDC_ISO_10646__
  return 1;
#else
  printf("  __STDC_ISO_10646__ = %d\n", __STDC_ISO_10646__);
  return 2;
#endif
}
_EOF_
# compile it
$CC -o conftest conftest.c >/dev/null 2>/dev/null
if [ $? -ne 0 ]; then
  echo "-- no Unicode (wchar_t) support"
else
# have wide char support
# run it
  ./conftest
  r=$?
  if [ $r -eq 0 ]; then
    echo -- no Unicode wchar_t support - wchar_t allocation error
  elif [ $r -eq 1 ]; then
    echo -- no Unicode support - wchar_t encoding unspecified
  elif [ $r -eq 2 ]; then
    echo -- have wchar_t with known UCS encoding - enabling Unicode support!
    CFLAGSR="${CFLAGSR} -DUNICODE_SUPPORT -DUNICODE_WCHAR"
  else
    echo "-- no Unicode (wchar_t) support - conftest returned $r"
  fi
fi

echo "Check for setlocale support (needed for UNICODE Native check)"
cat > conftest.c << _EOF_
#include <locale.h>
int main()
{
  char *loc = setlocale(LC_CTYPE, "");
  return 0;
}
_EOF_
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
  echo "-- have setlocale, can check for charset type"
  echo "--  - enabling UTF8-native support!"
  CFLAGSR="${CFLAGSR} -DUNICODE_SUPPORT -DUTF8_MAYBE_NATIVE"
else
  echo "-- no Unicode (UTF-8 native) support!"
  CFLAGSR="${CFLAGSR} -DNO_SETLOCALE"
fi

# from configure 2.4i (Onno) 12/5/04
echo Check for gcc no-builtin flag
# -fno-builtin since version 2
cat > conftest.c << _EOF_
int main()
{
#if __GNUC__ >= 2
   return 0;
#else
   forget it
#endif
}
_EOF_
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
[ $? -eq 0 ] && BFLAG="-fno-builtin"

# Check for missing functions
# add NO_'function_name' to flags if missing
for func in fchmod fchown lchown nl_langinfo
do
  echo Check for $func
  echo "int main(){ $func(); return 0; }" > conftest.c
  $CC $BFLAG -o conftest conftest.c >/dev/null 2>/dev/null
  [ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_`echo $func | tr '[a-z]' '[A-Z]'`"
done

# Check (seriously) for a working lchmod.
echo 'Check for lchmod'
temp_file="/tmp/unzip_test_$$"
temp_link="link_$$"
( echo '#include <unistd.h>' ; \
  echo "int main() { lchmod(\"${temp_file}\", 0666); }" \
) > conftest.c
ln -s "${temp_link}" "${temp_file}" && \
 $CC $BFLAG -o conftest conftest.c >/dev/null 2>/dev/null && \
 ./conftest
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_LCHMOD"
rm -f "${temp_file}"

echo Check for memset
echo "int main(){ char k; memset(&k,0,0); return 0; }" > conftest.c
$CC -o conftest conftest.c >/dev/null 2>/dev/null
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DZMEM"

echo Check for errno declaration
cat > conftest.c << _EOF_
#include <errno.h>
main()
{
  errno = 0;
  return 0;
}
_EOF_
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_ERRNO"

echo Check for directory libraries
cat > conftest.c << _EOF_
int main() { return closedir(opendir(".")); }
_EOF_

$CC -o conftest conftest.c >/dev/null 2>/dev/null
if [ $? -ne 0 ]; then
  OPT=""
  for lib in ndir dir ucb bsd BSD PW x dirent
  do
    $CC -o conftest conftest.c -l$lib >/dev/null 2>/dev/null
    [ $? -eq 0 ] && OPT=-l$lib && break
  done
  if [ ${OPT} ]; then
    LFLAGS2="${LFLAGS2} ${OPT}"
  else
    CFLAGSR="${CFLAGSR} -DNO_DIR"
  fi
fi

# Dynix/ptx 1.3 needed this
echo Check for readlink
echo "int main(){ return readlink(); }" > conftest.c
$CC -o conftest conftest.c >/dev/null 2>/dev/null
if [ $? -ne 0 ]; then
  $CC -o conftest conftest.c -lseq >/dev/null 2>/dev/null
  [ $? -eq 0 ] && LFLAGS2="${LFLAGS2} -lseq"
fi

echo Check for directory include file
OPT=""
for inc in dirent.h sys/ndir.h ndir.h sys/dir.h
do
   echo "#include <$inc>" > conftest.c
   $CPP conftest.c > /dev/null 2>/dev/null
   [ $? -eq 0 ] && OPT="-DHAVE_`echo $inc | tr '[a-z]./' '[A-Z]__'`" && break
done
CFLAGSR="${CFLAGSR} ${OPT}"

echo Check for non existent include files
for inc in stdlib.h stddef.h unistd.h fcntl.h string.h langinfo.h
do
   echo "#include <$inc>" > conftest.c
   $CPP conftest.c >/dev/null 2>/dev/null
   [ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_`echo $inc | tr '[a-z]./' '[A-Z]__'`"
done

echo Check for term I/O include file
OPT=""
for inc in termios.h termio.h sgtty.h
do
   echo "#include <$inc>" > conftest.c
   $CPP conftest.c > /dev/null 2>/dev/null
   [ $? -eq 0 ] && OPT="-DHAVE_`echo $inc | tr '[a-z]./' '[A-Z]__'`" && break
done
CFLAGSR="${CFLAGSR} ${OPT}"

echo Check for MBCS include files
OPT=""
for inc in mbstring.h mbctype.h
do
   echo "#include <$inc>" > conftest.c
   $CPP conftest.c > /dev/null 2>/dev/null
   [ $? -eq 0 ] && OPT="-DHAVE_`echo $inc | tr '[a-z]./' '[A-Z]__'`" && break
done
CFLAGSR="${CFLAGSR} ${OPT}"

# Check for MBCS support
echo Check for MBCS support
cat > conftest.c << _EOF_
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
#ifdef HAVE_MBSTRING_H
#  include <mbstring.h>
#endif
int main()
{
  char *tst;
  tst = "Hallo";
  return mblen(tst, MB_CUR_MAX);
}
_EOF_
# compile it
$CC ${CFLAGS} ${CFLAGSR} -o conftest conftest.c >/dev/null 2>/dev/null
if [ $? -ne 0 ]; then
  echo "-- no MBCS support"
  CFLAGSR="${CFLAGSR} -DNO_MBCS"
else
#
  echo "-- have MBCS support"
  CFLAGSR="${CFLAGSR} -D_MBCS"
# check for library-supplied functions
# add FUNCTION_NAME='function_name' to flags if found
  for func in mbschr mbsrchr
  do
    echo Check for MBCS $func
    echo "int main() { $func(); return 0; }" > conftest.c
    $CC $BFLAG -o conftest conftest.c >/dev/null 2>/dev/null
    [ $? -eq 0 ] && CFLAGSR="${CFLAGSR} -D`echo $func | tr '[a-z]' '[A-Z]'`=$func"
  done
fi

# needed for AIX (and others ?) when mmap is used
echo Check for valloc
cat > conftest.c << _EOF_
main()
{
#ifdef MMAP
    valloc();
#endif
}
_EOF_
$CC ${CFLAGS} -c conftest.c > /dev/null 2>/dev/null
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_VALLOC"

echo Check for /usr/local/bin and /usr/local/man
BINDIR=$HOME/bin
[ -d /usr/local/bin ] && BINDIR=/usr/local/bin

MANDIR=manl
[ -d /usr/man/manl ]       && MANDIR=/usr/man/manl
[ -d /usr/local/man/manl ] && MANDIR=/usr/local/man/manl
[ -d /usr/local/man/man1 ] && MANDIR=/usr/local/man/man1

echo Checking for OS specialties
if [ -f /usr/bin/hostinfo ]; then
  if /usr/bin/hostinfo | grep NeXT > /dev/null; then
    CFLAGSR="${CFLAGSR} -posix"
    LFLAGS1="${LFLAGS1} -posix -object"
  fi
# XXX ATT6300, Cray
elif [ -f /xenix ]; then
  if uname -p | grep 286 > /dev/null; then
    CFLAGSR="${CFLAGSR} -LARGE -Mel2 -DMEDIUM_MEM -DWSIZE=16384 -DNO_VOID"
    LFLAGS1="${LFLAGS1} -LARGE -Mel2"
  fi
elif uname -X >/dev/null 2>/dev/null; then
# SCO shared library check
  echo "int main() { return 0;}" > conftest.c
  $CC -o conftest conftest.c -lc_s -nointl >/dev/null 2> /dev/null
  [ $? -eq 0 ] && LFLAGS2="-lc_s -nointl"
else
  SYSTEM=`uname -s 2>/dev/null` || SYSTEM="unknown"
  echo "int main() { return 0;}" > conftest.c
  case $SYSTEM in
     OSF1|ULTRIX)
        echo Check for -Olimit option
        $CC ${CFLAGS} -Olimit 1000 -o conftest conftest.c >/dev/null 2>/dev/null
        [ $? -eq 0 ] && CFLAGSR="${CFLAGSR} -Olimit 1000"
        ;;
###     HP-UX)
###        echo Check for +Onolimit option
###        $CC ${CFLAGS} +Onolimit -o conftest conftest.c >/dev/null 2>/dev/null
###        [ $? -eq 0 ] && CFLAGSR="${CFLAGSR} +Onolimit"
###        ;;
###     SunOS)
###        CFLAGSR="${CFLAGSR} -D_FILE_OFFSET_BITS=64"
###        ;;
  esac
fi

echo Check for symbolic links
ln -s /dev/null null > /dev/null 2>/dev/null || LN=ln

rm -f a.out conftest.c conftest.o conftest null


# bzip2

echo "Check bzip2 support"
D_USE_BZ2=""
LIBBZ2=""
L_BZ2=""
CC_BZ="${CC}"

if test -n "${IZ_BZIP2}" -a "${IZ_BZIP2}" != "bzip2" ; then
  echo "  Check for bzip2 compiled library in IZ_BZIP2 (${IZ_BZIP2})"
  if test -f "${IZ_BZIP2}/libbz2.a"; then
#
#   A bzip2 library built with BZ_NO_STDIO should have an
#   unresolved external, "bz_internal_error".  The default,
#   full-function library will not mention it.
#
    nm ${IZ_BZIP2}/libbz2.a | grep bz_internal_error > /dev/null
    if test $? -eq 0; then
      echo "    Found bzip2 BZ_NO_STDIO library, ${IZ_BZIP2}/libbz2.a"
      if test -f "${IZ_BZIP2}/bzlib.h"; then
        LIBBZ2="${IZ_BZIP2}/libbz2.a"
        D_USE_BZ2="-DUSE_BZIP2"
        L_BZ2="${BZLF} -lbz2"
        echo "-- Found bzip2 library - linking in bzip2"
      else
        echo "    ${IZ_BZIP2}/bzlib.h not found"
        echo "-- Since IZ_BZIP2 defined (!= \"bzip2\"),"
        echo "-- => skipping OS and bzip2 dir checks."
        echo "-- NO bzip2 support !"
      fi
    else
      echo "    Found bzip2 library, ${IZ_BZIP2}/libbz2.a,"
      echo "      but library not compiled with BZ_NO_STDIO."
      echo "    ERROR: This (default) variant of bzip2 library is NOT"
      echo "      supported with UnZip because of its incompatible"
      echo "      error handling!"
      echo "      Please see the UnZip installation instructions in"
      echo "      the INSTALL text file."
      echo "    Skipping bzip2 support..."
    fi
  else
    echo "    ${IZ_BZIP2}/libbz2.a not found"
    echo "-- Since IZ_BZIP2 defined (!= \"bzip2\"),"
    echo "-- => skipping OS and bzip2 dir checks."
    echo "-- NO bzip2 support !"
  fi
else
  echo "  Check for bzip2 sources in unzip's bzip2 subdirectory"
  if test -f "${IZ_BZIP2}/bzlib.c" -a -f "${IZ_BZIP2}/bzlib.h"; then
    echo "-- Found bzip2 source in ${IZ_BZIP2}/ directory"
    echo "-- Will try to build bzip2 library from source and link in"
    LIBBZ2="${IZ_BZIP2}/libbz2.a"
    D_USE_BZ2="-DUSE_BZIP2"
    L_BZ2="${BZLF} -lbz2"
  else
    echo "-- bzip2 sources not found - no bzip2 support"
  fi
fi


echo CC=\"${CC}\" CF=\"${CFLAGSR} ${D_USE_BZ2}\" CRCA_O=\"${CRC32OA}\" \
       AS=\"${CC} -c\" LFLAGS1=\"${LFLAGS1}\" LF2=\"${LFLAGS2}\" \
       CC_BZ=\"${CC_BZ}\" CFLAGS_BZ=\"${CFLAGS_BZ}\" \
       IZ_BZIP2=\"${IZ_BZIP2}\" D_USE_BZ2=\"${D_USE_BZ2}\" \
       L_BZ2=\"${L_BZ2}\" LIBBZ2=\"${LIBBZ2}\"  > flags