view agent/configure.ac @ 31:778bd93bc33a

Bug 1871: HotSpot VM warns HeapStats agent has executable stack. reviewed-by: ykubota
author Yasumasa Suenaga <yasuenag@gmail.com>
date Thu, 24 Jul 2014 14:27:18 +0900
parents e52df4e1bc2b
children 7dbbab82d6c2
line wrap: on
line source

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.59])
AC_INIT([heapstats_agent], [1.1.1], [oss-java-support@lab.ntt.co.jp])
AC_CONFIG_SRCDIR([./src])
AC_CONFIG_AUX_DIR([./m4])
AC_CONFIG_MACRO_DIR([./m4])
AM_INIT_AUTOMAKE
AM_MAINTAINER_MODE
AC_CACHE_SAVE
AC_DISABLE_OPTION_CHECKING

LDFLAGS+=" -Wl,-z,noexecstack"

# Checks for programs.
AC_PROG_CC
AC_PROG_CXX
AC_PROG_CXXCPP
AM_PROG_AS
AC_DISABLE_STATIC
AM_DISABLE_STATIC
AC_PROG_LIBTOOL
AC_SUBST([LIBTOOL_DEPS])
AC_PROG_AWK
AC_PROG_EGREP
AC_PROG_INSTALL
AC_PATH_PROG([LS], [ls],
  [AC_MSG_ERROR([Not found: cmd:ls])], [$PATH])
AC_PATH_PROG([CAT], [cat],
  [AC_MSG_ERROR([Not found: cmd:cat])], [$PATH])
AC_PATH_PROG([SORT], [sort],
  [AC_MSG_ERROR([Not found: cmd:sort])], [$PATH])
AC_PATH_PROG([UNIQ], [uniq],
  [AC_MSG_ERROR([Not found: cmd:uniq])], [$PATH])
AC_PATH_PROG([READLINK], [readlink],
  [AC_MSG_ERROR([Not found: cmd:readlink])], [$PATH])
AC_CACHE_SAVE

# Checks for libraries.
AC_CHECK_LIB([pcre], [main], [],
  [AC_MSG_ERROR([PCRE library was not found.])])
AC_CHECK_LIB([netsnmp], [main], [],
  [AC_MSG_ERROR([net-snmp library was not found.])])
AC_CACHE_SAVE

# Checks for common header files.
AC_HEADER_STDC     # stdlib.h stdarg.h string.h float.h
AC_HEADER_DIRENT   # dirent.h
AC_HEADER_STAT     # sys/stat.h
AC_HEADER_SYS_WAIT # sys/wait.h
AC_HEADER_TIME     # time.h sys/time.h
AC_CHECK_HEADERS([ \
  unistd.h sys/socket.h sys/types.h sys/un.h \
  sys/utsname.h sys/wait.h sys/syscall.h sys/mman.h \
  stddef.h stdint.h stdio.h fcntl.h link.h \
  limits.h errno.h signal.h execinfo.h \
  gnu/libc-version.h pthread.h \
  ], [], [AC_MSG_ERROR([Not found common header files.])])
AC_CACHE_SAVE

# Checks for library header files.
AC_CHECK_HEADERS([pcre.h],
  [], [AC_MSG_ERROR([Header files of PCRE were not found.])])
AC_CHECK_HEADERS([net-snmp/net-snmp-config.h],
  [], [AC_MSG_ERROR([Header files of Net-SNMP were not found.])])
AC_CHECK_HEADERS([net-snmp/net-snmp-includes.h],
  [], [AC_MSG_ERROR([Header files of Net-SNMP were not found.])],
  [#include <net-snmp/net-snmp-config.h>])
AC_CHECK_HEADERS([bfd.h],
  [], [AC_MSG_ERROR([Header files of binutils were not found.])])
AC_CACHE_SAVE

# Checks for compiler characteristics.
AC_C_BIGENDIAN([], [],
  [AC_MSG_ERROR([Unknown byteorder.])])
AC_CACHE_SAVE

# Checks for typedefs, structures.
AC_TYPE_OFF_T
AC_TYPE_PID_T
AC_TYPE_SIZE_T
AC_STRUCT_TM
AC_CHECK_TYPES([ptrdiff_t])
AC_CACHE_SAVE

# Checks for library functions.
AC_FUNC_MEMCMP
AC_FUNC_STRFTIME
AC_FUNC_FORK
AC_FUNC_STAT
AC_FUNC_CLOSEDIR_VOID
AC_FUNC_MALLOC
AC_FUNC_MMAP
#AC_CHECK_FUNCS([ sysconf \
#  memcpy memmove memset munmap \
#  getpid geteuid getegid \
#  open socket close write read lseek fopen fclose \
#  opendir readdir closedir mkdir rmdir unlink \
#  strchr strrchr strstr strtol \
#  strcpy strncpy strcat strncat strdup strlen \
#  sprintf snprintf sscanf \
#  pthread_mutex_init pthread_mutex_destroy \
#  pthread_mutex_lock pthread_mutex_unlock \
#  pthread_cond_init pthread_cond_destroy \
#  pthread_cond_signal pthread_cond_wait \
#  pthread_key_create pthread_getspecific pthread_setspecific pthread_self \
#  abort uname gettimeofday ], [], \
#  [AC_MSG_ERROR([Not found using common function.])])
AC_CHECK_FUNCS([ syscall dl_iterate_phdr \
  localtime_r strdup realpath unlink truncate getline \
  madvise posix_fadvise munmap \
  gnu_get_libc_version gnu_get_libc_release ], [], \
  [AC_MSG_ERROR([Function was not found that need to test feature.])])
AC_CHECK_FUNCS([netsnmp_transport_open_client],
  [], [AC_CHECK_FUNCS([netsnmp_tdomain_transport], [],
    [AC_MSG_ERROR([Function was not found in net-snmp library.])])
  ])
AC_CACHE_SAVE

# set test macro state
AC_LANG([C++])
AC_REQUIRE_CPP

# set general file path
DEVNULL="/dev/null"

# check cpu instruction set ----------------------------------------------------

CPUINFO="/proc/cpuinfo"
CPUINFO_DATA="./cpuinfo.tmp"
$CAT $CPUINFO 2>$DEVNULL | $SORT 2>$DEVNULL | $UNIQ 2>$DEVNULL 1>$CPUINFO_DATA

INSTRUCT_FLAGS=`$CAT $CPUINFO_DATA 2>$DEVNULL | $SED -ne "/flags\W*:+*/p" 2>$DEVNULL`
INSTRUCT_OPTS=""

AC_ARG_WITH([instruction-set],AC_HELP_STRING([--with-instruction-set@<:@=<arch>/auto@:>@],
  [Optimization level for processor. @<:@default=auto@:>@]),
  [], [with_instruction_set="auto"])

AC_MSG_CHECKING([for sse instruction set])
# check SSE
[$ECHO "$INSTRUCT_FLAGS" 2>$DEVNULL | $EGREP " sse[^0-9]" 1>$DEVNULL 2>$DEVNULL]
if test $? -eq 0; then
  AC_MSG_RESULT([enable])
else
  AC_MSG_RESULT([disable])
  AC_MSG_FAILURE([Heapstats agent use SSE/SSE2 instruction set.
    This machine or this system maybe inferior to required spec.])
fi

AC_MSG_CHECKING([for sse2 instruction set])
# check SSE2
$ECHO "$INSTRUCT_FLAGS" 2>$DEVNULL | $EGREP "sse2" 1>$DEVNULL 2>$DEVNULL
if test $? -eq 0; then
  AC_MSG_RESULT([enable])
else
  AC_MSG_RESULT([disable])
  AC_MSG_FAILURE([Heapstats agent use SSE/SSE2 instruction set.
    This machine or this system maybe inferior to required spec.])
fi

# check SSE/SSE2 flag for compiler
IS_ENABLE_FLAG="no"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
  [IS_ENABLE_FLAG="yes"], [])

AC_MSG_CHECKING([for sse/sse2 compiler flag])
AC_MSG_RESULT([$IS_ENABLE_FLAG])
if test "$IS_ENABLE_FLAG" = "no" ; then
  AC_MSG_FAILURE([Heapstats agent use SSE/SSE2 instruction set.
    Detected compiler is unsuppoted SSE flag.
    Please confirm your compiler, linker and etc..])
fi

# check instruction set after sse2
if test "$with_instruction_set" = "auto" ; then
  OPTIMIZED=0

  # check intel-AVX
  AC_MSG_CHECKING([for intel-avx instruction set])
  $ECHO "$INSTRUCT_FLAGS" 2>$DEVNULL | $EGREP "avx" 1>$DEVNULL 2>$DEVNULL
  if test $? -eq 0; then
    AC_MSG_RESULT([enable])
    
    CHECK_FLAG="-mavx"
    # check Intel-AVX flag for compiler
    OLD_CXXFLAGS=$CXXFLAGS
    CXXFLAGS+=" `echo $CHECK_FLAG`"
    IS_ENABLE_FLAG="no"
    AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
      [IS_ENABLE_FLAG="yes"], [])
    
    AC_MSG_CHECKING([for avx compiler flag])
    AC_MSG_RESULT([$IS_ENABLE_FLAG])
    if test "$IS_ENABLE_FLAG" = "no" ; then
      AC_MSG_WARN([Detected compiler is unsuppoted Intel-AVX flag.
        So this script disabled it.
        Please confirm your compiler, linker and etc..])
    else
      INSTRUCT_OPTS+=" `echo $CHECK_FLAG`"
      OPTIMIZED=1
    fi
    CXXFLAGS=$OLD_CXXFLAGS
  else
    AC_MSG_RESULT([disable])
  fi

  # check SSE4
  if test $OPTIMIZED -eq 0; then
    AC_MSG_CHECKING([for sse4 instruction set])
    $ECHO "$INSTRUCT_FLAGS" 2>$DEVNULL | $EGREP "sse4" 1>$DEVNULL 2>$DEVNULL
    if test $? -eq 0; then
      AC_MSG_RESULT([enable])
    
      CHECK_FLAG="-msse4"
      # check SSE4 flag for compiler
      OLD_CXXFLAGS=$CXXFLAGS
      CXXFLAGS+=" `echo $CHECK_FLAG`"
      IS_ENABLE_FLAG="no"
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
        [IS_ENABLE_FLAG="yes"], [])
    
      AC_MSG_CHECKING([for sse4 compiler flag])
      AC_MSG_RESULT([$IS_ENABLE_FLAG])
      if test "$IS_ENABLE_FLAG" = "no" ; then
        AC_MSG_WARN([Detected compiler is unsuppoted SSE4.1 flag.
          So this script disabled it.
          Please confirm your compiler, linker and etc..])
      else
        INSTRUCT_OPTS+=" `echo $CHECK_FLAG`"
        CCASFLAGS+=" -DSSE4_1"
        OPTIMIZED=1
      fi
      CXXFLAGS=$OLD_CXXFLAGS
    else
      AC_MSG_RESULT([disable])
    fi
  fi

  # check SSE3
  if test $OPTIMIZED -eq 0; then
    AC_MSG_CHECKING([for sse3 instruction set])
    $ECHO "$INSTRUCT_FLAGS" 2>$DEVNULL | $EGREP "sse3" 1>$DEVNULL 2>$DEVNULL
    if test $? -eq 0; then
      AC_MSG_RESULT([enable])
    
      CHECK_FLAG="-msse3"
      # check SSE4 flag for compiler
      OLD_CXXFLAGS=$CXXFLAGS
      CXXFLAGS+=" `echo $CHECK_FLAG`"
      IS_ENABLE_FLAG="no"
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
        [IS_ENABLE_FLAG="yes"], [])
    
      AC_MSG_CHECKING([for sse4 compiler flag])
      AC_MSG_RESULT([$IS_ENABLE_FLAG])
      if test "$IS_ENABLE_FLAG" = "no" ; then
        AC_MSG_WARN([Detected compiler is unsuppoted SSE4.1 flag.
          So this script disabled it.
          Please confirm your compiler, linker and etc..])
      else
        INSTRUCT_OPTS+=" `echo $CHECK_FLAG`"
        OPTIMIZED=1
      fi
      CXXFLAGS=$OLD_CXXFLAGS
    else
      AC_MSG_RESULT([disable])
    fi
  fi

else
  INSTRUCT_OPTS="-m$with_instruction_set"
fi

AC_SUBST([INSTRUCT_OPTS])

# end cpu instruction set ------------------------------------------------------

# check build target -----------------------------------------------------------

# parse build target options
BUILD_TARGET_CPU="$target_cpu"
BUILD_TARGET_ARCH="$target_cpu"
if test "$BUILD_TARGET_CPU" = "" ; then
  BUILD_TARGET_CPU="$host_cpu"
fi
if test "$BUILD_TARGET_ARCH" = "" ; then
  BUILD_TARGET_ARCH="$host_cpu"
fi
BUILD_ENV_OPT=""

ARCH_TYPE="unknown"
AC_MSG_CHECKING([for cpu address size])
# check bit size
case $BUILD_TARGET_CPU in
  i*86 )
    BUILD_ENV_OPT+=" -m32"
    ARCH_TYPE="32bit" ;;
  x86_64 | amd64 )
    BUILD_ENV_OPT+=" -m64"
    ARCH_TYPE="64bit" ;;
  * )
    ARCH_TYPE="unknown" ;;
esac
AC_MSG_RESULT([$ARCH_TYPE])
AC_SUBST([BUILD_ENV_OPT])

# end build target -------------------------------------------------------------

# remove temporary file
rm -f $CPUINFO_DATA

# get JDK path -----------------------------------------------------------------

AC_ARG_WITH([jdk], AC_HELP_STRING([--with-jdk@<:@=PATH@:>@],
  [Path to JDK home directory. @<:@default=/usr/lib/jvm/java-openjdk@:>@]))

AC_MSG_CHECKING([for JAVA_HOME])
if test "$with_jdk" != ""; then
  JDK_DIR="$with_jdk"
  AC_MSG_RESULT($JDK_DIR)
else
  AC_MSG_RESULT(none)
  AC_MSG_CHECKING([for default openjdk home directory])
  DEFAULT_JDK_PATH="/usr/lib/jvm/java-openjdk"
  
  if test -d "$DEFAULT_JDK_PATH" && test -r "$DEFAULT_JDK_PATH" ; then
    JDK_DIR="$DEFAULT_JDK_PATH"
    AC_MSG_RESULT([exist])
  else
    AC_MSG_RESULT([none])
    AC_PATH_PROG([JAVA_PATH], [java], [], [/etc/alternatives])
    AC_MSG_CHECKING([for java configured by alternatives])
    
    if test -L $JAVA_PATH; then
      JDK_DIR=`$READLINK -f "$JAVA_PATH" 2>$DEVNULL | $SED -e 's:bin/java::g' 2>$DEVNULL`
      if test $? -ne 0 ; then
        JDK_DIR=""
        AC_MSG_RESULT([not found])
      else
        AC_MSG_RESULT([found])
      fi
    else
      AC_MSG_RESULT([not found])
    fi
  fi
fi

AC_MSG_CHECKING([for JAVA_HOME])
if test "$JDK_DIR" = "" || test ! -d $JDK_DIR || test ! -r $JDK_DIR \
  || test ! -d $JDK_DIR/bin/ || test ! -r $JDK_DIR/bin/ \
  || test ! -d $JDK_DIR/include/ || test ! -r $JDK_DIR/include/ \
  || test ! -d $JDK_DIR/jre/ || test ! -r $JDK_DIR/jre/ \
  || test ! -d $JDK_DIR/lib/ || test ! -r $JDK_DIR/lib/ ; then
  
  AC_MSG_RESULT([not found])
  AC_MSG_NOTICE([
    [Do you put java at non default directory ?]
    [Please expect path to "with-jdk" option, if you put java to such path.]])
  AC_MSG_ERROR([JDK directory (JAVA_HOME) was not found.])
fi

AC_MSG_RESULT([$JDK_DIR])
AC_SUBST([JDK_DIR])

# end JDK path -----------------------------------------------------------------

# VMStructs --------------------------------------------------------------------

AC_ARG_ENABLE([vmstructs], AC_HELP_STRING([--enable-vmstructs@<:@=yes/no@:>@],
  [Use symbol of VMStructs in libjvm.so . @<:@default=no@:>@]))

VMSTRUCTS_CXX_FLAGS=""
VMSTRUCTS_LIB_FLAGS=""
JVM_LIB_DIR=""
VMSTRUCTS_SYMBOL="gHotSpotVMStructs"
if test "$enable_vmstructs" = "yes" ; then

  AC_MSG_CHECKING([for of VMStructs in jvm shared-library])

  for archPath in i386 amd64
  do
    if test -d $JDK_DIR/jre/lib/$archPath/ ; then
      JVM_LIB_DIR=`$ECHO $JDK_DIR/jre/lib/$archPath 2>$DEVNULL`
      break
    fi
  done
  
  if test "$JVM_LIB_DIR" = "" ; then
    AC_MSG_RESULT([no])
    AC_MSG_ERROR([JDK shared-library arch directory was not found.])
  fi

  if test -d $JVM_LIB_DIR/server/ ; then
    JVM_LIB_DIR+="/server"
  elif test -d $JVM_LIB_DIR/client/ ; then
    JVM_LIB_DIR+="/client"
  else
    AC_MSG_RESULT([no])
    AC_MSG_ERROR([JDK shared-library directory was not found.])
  fi

  RESULT_SYMBOL=`$NM -D $JVM_LIB_DIR/libjvm.so 2>$DEVNULL | $EGREP $VMSTRUCTS_SYMBOL 2>$DEVNULL`
  if test $? -ne 0 || test "$RESULT_SYMBOL" = "" ; then
    AC_MSG_RESULT([no])
    AC_MSG_ERROR([Symbol of VMStructs was not found in libjvm.so .])
  fi

  VMSTRUCTS_CXX_FLAGS="-DUSE_VMSTRUCTS"
  AC_MSG_RESULT([yes])
fi

AC_SUBST([VMSTRUCTS_CXX_FLAGS])

# end VMStructs ----------------------------------------------------------------

# get Net-SNMP-Config ----------------------------------------------------------

AC_PATH_PROGS([NET_SNMP_CFG_PATH], [net-snmp-config-x86_64 net-snmp-config], [:], 
  [/bin:/sbin/:/usr/bin])

NET_SNMP_LIB_FLAGS=`$NET_SNMP_CFG_PATH --agent-libs 2>$DEVNULL`
if test $? -ne 0 ; then
  AC_MSG_ERROR([Could not get LDFLAGS from net-snmp-cfg.])
fi
AC_SUBST([NET_SNMP_LIB_FLAGS])

# end Net-SNMP-Config ----------------------------------------------------------

# check bfd --------------------------------------------------------------------

AC_ARG_WITH([bfd],AC_HELP_STRING([--with-bfd@<:@=PATH@:>@],
  [Path to libbfd library file. @<:@default=autosearch@:>@]),
  [], [with_bfd=""])
AC_ARG_WITH([iberty],AC_HELP_STRING([--with-iberty@<:@=PATH@:>@],
  [Path to libiberty library file. @<:@default=autosearch@:>@]),
  [], [with_iberty=""])

BFD_PATH=""
IBERTY_FLAG=0
IBERTY_PATH=""

BFD_SYMBOL="bfd_openr"
IBERTY_SYMBOL="hex_value"

AC_MSG_CHECKING([for BFD library])
if test "$with_bfd" != "" ; then
  BFD_PATH="$with_bfd"
  AC_MSG_RESULT([$BFD_PATH])
  
  AC_MSG_CHECKING([for symbol BFD library])
  # search symbol for shared library
  RESULT_SYMBOL=`$NM -D $BFD_PATH 2>$DEVNULL | $EGREP $BFD_SYMBOL 2>$DEVNULL`
  if test $? -ne 0 || test "$RESULT_SYMBOL" = "" ; then
    
    # search symbol for static library
    RESULT_SYMBOL=`$NM -g $BFD_PATH 2>$DEVNULL | $EGREP $BFD_SYMBOL 2>$DEVNULL`
    if test $? -ne 0 || test "$RESULT_SYMBOL" = "" ; then
      AC_MSG_RESULT([none])
      AC_MSG_ERROR([Symbol to need was not found in BFD library.])
    fi
  fi
  AC_MSG_RESULT([ok])
  
  # Check designated library is static library
  RESULT_SYMBOL=`$NM -g $BFD_PATH 2>$DEVNULL | $EGREP $IBERTY_SYMBOL 2>$DEVNULL`
  if test $? -eq 0 && test "$RESULT_SYMBOL" != "" ; then
    IBERTY_FLAG=1
  fi
else
  AC_MSG_RESULT([none])
  AC_MSG_CHECKING([for symbol in BFD library])
  
  BFD_TARGET=`$LS {/usr,/usr/local,}/lib*/libbfd*.a* 2>$DEVNULL`
  BFD_TARGET+=" "
  BFD_TARGET+=`$LS {/usr,/usr/local,}/lib*/libbfd*.so* 2>$DEVNULL`
  for tmpPath in $BFD_TARGET
  do
    if test -f $tmpPath ; then
      
      # search symbol for shared library
      RESULT_SYMBOL=`$NM -D $tmpPath 2>$DEVNULL | $EGREP $BFD_SYMBOL 2>$DEVNULL`
      if test $? -eq 0 && test "$RESULT_SYMBOL" != "" ; then
        AC_MSG_RESULT([$tmpPath])
        BFD_PATH=`$ECHO $tmpPath 2>$DEVNULL`
        break
      fi
      
      # search symbol for static library
      RESULT_SYMBOL=`$NM -g $tmpPath 2>$DEVNULL | $EGREP $BFD_SYMBOL 2>$DEVNULL`
      if test $? -eq 0 && test "$RESULT_SYMBOL" != "" ; then
        AC_MSG_RESULT([$tmpPath])
        BFD_PATH=`$ECHO $tmpPath 2>$DEVNULL`
        IBERTY_FLAG=1
        break
      fi
    fi
  done
  
  if test "$BFD_PATH" = "" ; then
    AC_MSG_RESULT([not found])
  fi
fi

AC_MSG_CHECKING([for BFD library])
if test "$BFD_PATH" = "" || test ! -f $BFD_PATH ; then
  AC_MSG_RESULT([no])
  AC_MSG_ERROR([BFD library was not found.])
fi
AC_MSG_RESULT([yes])

if test $IBERTY_FLAG -ne 0 ; then
  AC_MSG_NOTICE([BFD library designate need iberty library.])
  
  AC_MSG_CHECKING([for with-iberty])
  if test "$with_iberty" != "" ; then
    IBERTY_PATH="$with_iberty"
    AC_MSG_RESULT([$IBERTY_PATH])
  else
    AC_MSG_RESULT([none])
    
    AC_MSG_CHECKING([for symbol in iberty library])
    IBERTY_TARGET=`$LS {/usr,/usr/local,}/lib*/libiberty*.a* 2>$DEVNULL`
    IBERTY_TARGET+=" "
    IBERTY_TARGET+=`$LS {/usr,/usr/local,}/lib*/libiberty*.so* 2>$DEVNULL`
    for tmpPath in $IBERTY_TARGET
    do
      
      # search symbol for shared library
      RESULT_SYMBOL=`$NM -D $tmpPath 2>$DEVNULL | $EGREP $IBERTY_SYMBOL 2>$DEVNULL`
      if test $? -eq 0 && test "$RESULT_SYMBOL" != "" ; then
        AC_MSG_RESULT($tmpPath)
        IBERTY_PATH=`$ECHO $tmpPath 2>$DEVNULL`
        
        break
      fi
      
      # search symbol for static library
      RESULT_SYMBOL=`$NM -g $tmpPath 2>$DEVNULL | $EGREP $IBERTY_SYMBOL 2>$DEVNULL`
      if test $? -eq 0 && test "$RESULT_SYMBOL" != "" ; then
        AC_MSG_RESULT($tmpPath)
        IBERTY_PATH=`$ECHO $tmpPath 2>$DEVNULL`
        
        break
      fi
    done
    
    if test "$IBERTY_PATH" = "" ; then
      AC_MSG_RESULT([not found])
    fi
  fi
  
  AC_MSG_CHECKING([for iberty library])
  if test "$IBERTY_PATH" = "" || test ! -f $IBERTY_PATH ; then
    AC_MSG_RESULT([no])
    AC_MSG_ERROR([iberty library was not found.])
  fi
  AC_MSG_RESULT([yes])
fi

MASK_LIBNAME="s:.*/\?lib\(.*\)\.\(so\|a\):\1:g"
MASK_LIBPATH="s:\(.*\)/\?lib.*\.\(so\|a\):\1:g"

LIB_NAME=`eval "echo $BFD_PATH | $SED -e \"$MASK_LIBNAME\"" 2>$DEVNULL`
LIB_PATH=`eval "echo $BFD_PATH | $SED -e \"$MASK_LIBPATH\"" 2>$DEVNULL`
LDFLAGS+=" -L$LIB_PATH -l$LIB_NAME"
#LIB_NAME=`eval "\"$ECHO\" $BFD_PATH | $SED -e \`$ECHO \'$MASK_LIBNAME\'\`" 2>$DEVNULL`
#$LIB_PATH=`eval "\"$ECHO\" $BFD_PATH | $SED -e \`$ECHO \'$MASK_LIBPATH\'\`" 2>$DEVNULL`
#LDFLAGS+=`eval "$ECHO" " -L$LIB_PATH -l$LIB_NAME"`

if test $IBERTY_FLAG -ne 0 ; then
LIB_NAME=`eval "echo $IBERTY_PATH | $SED -e \"$MASK_LIBNAME\"" 2>$DEVNULL`
LIB_PATH=`eval "echo $IBERTY_PATH | $SED -e \"$MASK_LIBPATH\"" 2>$DEVNULL`
LDFLAGS+=" -L$LIB_PATH -l$LIB_NAME"
#  LIB_NAME=`eval "\"$ECHO\" $IBERTY_PATH | $SED -e \`$ECHO \'$MASK_LIBNAME\'\`" 2>$DEVNULL`
#  LIB_PATH=`eval "\"$ECHO\" $IBERTY_PATH | $SED -e \`$ECHO \'$MASK_LIBPATH\'\`" 2>$DEVNULL`
#  LDFLAGS+=`eval "$ECHO" " -L$LIB_PATH -l$LIB_NAME"`
fi

# end bfd ----------------------------------------------------------------------

# set sse3 --------------------------------------------------------------------

AC_ARG_ENABLE([sse3], AC_HELP_STRING([--enable-sse3@<:@=yes/no/auto@:>@],
  [Enable the function which use SSE3. @<:@default=auto@:>@]),
  [], [enable_sse3="auto"])

if test "$enable_sse3" = "yes" || test "$enable_sse3" = "auto" ; then
  
  AC_MSG_CHECKING([for enable function using SSE3])
  IS_ENABLE_FLAG="no"
  AC_LINK_IFELSE(
    [AC_LANG_PROGRAM([[]],
      [[asm volatile("movddup %%xmm0, %%xmm1;" : : : "cc", "%xmm0", "%xmm1");]])],
    [IS_ENABLE_FLAG="yes"], [])
  
  AC_MSG_RESULT([$IS_ENABLE_FLAG])
  if test "$IS_ENABLE_FLAG" = "no" ; then
    if test "$enable_sse3" = "yes" ; then
      AC_MSG_WARN([Selected compiler or linker is unsupported sse3.
        This script respect your designated this option.
        So this option is effective, you can complie it.
        But maybe you fail to complie.
        Please confirm your compiler, linker and etc..])
      CXXFLAGS+=" -DSSE3"
      CCASFLAGS+=" -DSSE3"
    fi
  else
    CXXFLAGS+=" -DSSE3"
    CCASFLAGS+=" -DSSE3"
  fi
fi

# end sse3 --------------------------------------------------------------------

# set sse4 --------------------------------------------------------------------

AC_ARG_ENABLE([sse4], AC_HELP_STRING([--enable-sse4@<:@=yes/no/auto@:>@],
  [Enable the function which use SSE4.1. @<:@default=auto@:>@]),
  [], [enable_sse4="auto"])

if test "$enable_sse4" = "yes" || test "$enable_sse4" = "auto" ; then
  
  AC_MSG_CHECKING([for enable function using SSE4.1])
  IS_ENABLE_FLAG="no"
  AC_LINK_IFELSE(
    [AC_LANG_PROGRAM([[]],
      [[asm volatile("pcmpeqq %%xmm0, %%xmm1;" : : : "cc", "%xmm0", "%xmm1");]])],
    [IS_ENABLE_FLAG="yes"], [])
  
  AC_MSG_RESULT([$IS_ENABLE_FLAG])
  if test "$IS_ENABLE_FLAG" = "no" ; then
    if test "$enable_sse4" = "yes" ; then
      AC_MSG_WARN([Selected compiler or linker is unsupported sse4.
        This script respect your designated this option.
        So this option is effective, you can complie it.
        But maybe you fail to complie.
        Please confirm your compiler, linker and etc..])
      CXXFLAGS+=" -DSSE4_1"
      CCASFLAGS+=" -DSSE4_1"
    fi
  else
    CXXFLAGS+=" -DSSE4_1"
    CCASFLAGS+=" -DSSE4_1"
  fi
fi

# end sse4 --------------------------------------------------------------------

# set avx --------------------------------------------------------------------

AC_ARG_ENABLE([avx], AC_HELP_STRING([--enable-avx@<:@=yes/no/auto@:>@],
  [Enable the function which use AVX. @<:@default=auto@:>@]),
  [], [enable_avx="auto"])

if test "$enable_avx" = "yes" || test "$enable_avx" = "auto" ; then
  
  AC_MSG_CHECKING([for enable function using AVX])
  IS_ENABLE_FLAG="no"
  AC_LINK_IFELSE(
    [AC_LANG_PROGRAM([[]],
      [[asm volatile("vpxor %%xmm0, %%xmm0, %%xmm0;" : : : "cc", "%xmm0");]])],
    [IS_ENABLE_FLAG="yes"], [])
  
  AC_MSG_RESULT([$IS_ENABLE_FLAG])
  if test "$IS_ENABLE_FLAG" = "no" ; then
    if test "$enable_avx" = "yes" ; then
      AC_MSG_WARN([Selected compiler or linker is unsupported avx.
        This script respect your designated this option.
        So this option is effective, you can complie it.
        But maybe you fail to complie.
        Please confirm your compiler, linker and etc..])
      CXXFLAGS+=" -DAVX"
      CCASFLAGS+=" -DAVX"
    fi
  else
    CXXFLAGS+=" -DAVX"
    CCASFLAGS+=" -DAVX"
  fi
fi

# end avx --------------------------------------------------------------------

# set debug --------------------------------------------------------------------

AC_ARG_ENABLE([debug], AC_HELP_STRING([--enable-debug@<:@=yes/no@:>@],
  [Enable debug compile flags. @<:@default=yes@:>@]),
  [], [enable_debug="yes"])

COMPILER_DEBUG_FLAG="-g"
if test "$enable_debug" = "yes" ; then
  CXXFLAGS+=" $COMPILER_DEBUG_FLAG"
else
  CXXFLAGS=`eval "$ECHO \"$CXXFLAGS\" | $SED -e 's:$COMPILER_DEBUG_FLAG::g'" 2>$DEVNULL`
fi

# end debug --------------------------------------------------------------------

# set optimize ------------------------------------------------------------------

AC_ARG_ENABLE([optimize], AC_HELP_STRING([--enable-optimize@<:@=yes/no@:>@],
  [Enable optimize compile flags. @<:@default=yes@:>@]),
  [], [enable_optimize="yes"])

if test "$enable_optimize" = "yes" ; then
  CXXFLAGS+=" -O2 -DRELEASE"
else
  CXXFLAGS+=" -O0 -DDEBUG"
fi

# end optimize ------------------------------------------------------------------

# check gcov and profiling ------------------------------------------------------

AC_ARG_WITH([gcov], AC_HELP_STRING([--with-gcov@<:@=yes/no@:>@],
  [Link with gcov library. @<:@default=no@:>@]))
AC_ARG_ENABLE([profiling],
  AC_HELP_STRING([--enable-profile@<:@=useprofile/sampling/no@:>@],
  [Enable gcc profile and optimize. @<:@default=no@:>@]),
  [], [enable_profile="no"])

if test "$with_gcov" = "yes" ; then
  CXXFLAGS+=" -fprofile-arcs -ftest-coverage"
  LDFLAGS+=" -lgcov"
elif test "$enable_profile" = "useprofile" ; then
  CXXFLAGS+=" -fprofile-use"
  LDFLAGS+=" -fprofile-use"
elif test "$enable_profile" = "sampling" ; then
  CXXFLAGS+=" -fprofile-genereate"
  LDFLAGS+=" -fprofile-genereate"
  AC_MSG_NOTICE([GCC optimize using profile need agent library running.
    And if you wish optimization with using profile,
    then don't remove "*.gcda/*.gcno" files
    So don't use "make clean" command which delete such files.
    You should use "make mostly-clean" command.])
fi

# end gcov and profiling  -------------------------------------------------------

# check for configure attacher  ------------------------------------------------

HEAPSTATAS_DEFAULT_AGENT=`$ECHO $libdir 2>$DEVNULL`
ATTACHER_JAR_PATH=`$ECHO $sysconfdir 2>$DEVNULL`
AC_SUBST([HEAPSTATAS_DEFAULT_AGENT])
AC_SUBST([ATTACHER_JAR_PATH])

# end of configure attacher  ---------------------------------------------------

AC_CONFIG_FILES([Makefile src/Makefile attacher/Makefile])
AC_CONFIG_FILES([heapstats.conf])

AC_OUTPUT