AC_PATH_PROG(sedpath, sed)
#ifdef SILC_DIST_COMPILER
+
# Put here any platform specific stuff
#
case "$target" in
esac
# Get CPU
+SILC_SYSTEM_IS_SMP(AC_DEFINE([SILC_SMP], [], [SILC_SMP]), [])
cpu_i386=false
cpu_i486=false
cpu_i586=false
cpu_i686=true
cpu_i786=true
fi
+
+ # Check for specific CPU features
+ SILC_CPU_FLAG(sse2, AC_DEFINE([SILC_CPU_SSE2], [], [SILC_CPU_SSE2]), [])
+ SILC_CPU_FLAG(sse3, AC_DEFINE([SILC_CPU_SSE3], [], [SILC_CPU_SSE3]), [])
+ SILC_CPU_FLAG(ssse3, AC_DEFINE([SILC_CPU_SSSE3], [], [SILC_CPU_SSSE3]), [])
;;
# Intel IA-64, 64-bit CPU (not x86_64 compatible)
ia64)
AC_DEFINE([SILC_IA64], [], [SILC_IA64])
cpu_ia64=true
+
+ # Check for specific CPU features
+ SILC_CPU_FLAG(sse2, AC_DEFINE([SILC_CPU_SSE2], [], [SILC_CPU_SSE2]), [])
+ SILC_CPU_FLAG(sse3, AC_DEFINE([SILC_CPU_SSE3], [], [SILC_CPU_SSE3]), [])
+ SILC_CPU_FLAG(ssse3, AC_DEFINE([SILC_CPU_SSSE3], [], [SILC_CPU_SSSE3]), [])
;;
# AMD/Intel x86_64, 64-bit CPU
x86_64)
AC_DEFINE([SILC_X86_64], [], [SILC_X86_64])
cpu_x86_64=true
+
+ # Check for specific CPU features
+ SILC_CPU_FLAG(sse2, AC_DEFINE([SILC_CPU_SSE2], [], [SILC_CPU_SSE2]), [])
+ SILC_CPU_FLAG(sse3, AC_DEFINE([SILC_CPU_SSE3], [], [SILC_CPU_SSE3]), [])
+ SILC_CPU_FLAG(ssse3, AC_DEFINE([SILC_CPU_SSSE3], [], [SILC_CPU_SSSE3]), [])
;;
# PowerPC, 32-bit and 64-bit CPUs
AC_CHECK_TYPES(long long)
AC_CHECK_TYPES(long double)
-# Function to check if compiler flag works
-# Usage: SILC_ADD_CFLAGS(FLAGS, [ACTION-IF-FAILED])
-AC_DEFUN([SILC_ADD_CFLAGS],
-[ tmp_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $1"
- AC_MSG_CHECKING(whether $CC accepts $1 flag)
- AC_TRY_LINK([], [], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
- CFLAGS="$tmp_CFLAGS"
- $2])
- unset tmp_CFLAGS
-])
-
-# Function to check if compiler flag works, destination specifiable
-# Usage: SILC_ADD_CC_FLAGS(VAR, FLAGS, [ACTION-IF-FAILED])
-AC_DEFUN([SILC_ADD_CC_FLAGS],
-[ tmp_CFLAGS="$1_CFLAGS"
- $1_CFLAGS="${$1_CFLAGS} $2"
- AC_MSG_CHECKING(whether $CC accepts $2 flag)
- AC_TRY_LINK([], [], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
- $1_CFLAGS="$tmp_CFLAGS"
- $3])
- unset tmp_CFLAGS
-])
-
# Function and library checking
#
AC_CHECK_FUNC(gethostbyname, [],
--- /dev/null
+#
+# silc.m4
+#
+# Author: Pekka Riikonen <priikone@silcnet.org>
+#
+# Copyright (C) 2007 Pekka Riikonen
+#
+# 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; version 2 of the License.
+#
+# 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.
+#
+
+# Function to check if system has SMP kernel.
+# Usage: SILC_SYSTEM_IS_SMP([ACTION-IF-FOUND] [, ACTION-IF-NOT-FOUND])
+AC_DEFUN([SILC_SYSTEM_IS_SMP],
+[
+ AC_MSG_CHECKING(whether system has SMP kernel)
+
+ case "$target" in
+ *-*-linux*)
+ # Take data from Linux /proc
+ if test -f /proc/stat; then
+ cpucount=`grep "^cpu" /proc/stat -c 2> /dev/null`
+ if test $cpucount -gt 1; then
+ AC_DEFINE([SILC_SMP], [], [SILC_SMP])
+ AC_MSG_RESULT(yes)
+ ifelse([$1], , :, [$1])
+ else
+ AC_MSG_RESULT(no)
+ ifelse([$2], , :, [$2])
+ fi
+ else
+ AC_MSG_RESULT(no)
+ ifelse([$2], , :, [$2])
+ fi
+ ;;
+
+ *-*-*bsd*)
+ # BSDs can have SMP info in sysctl 'kern.smp.cpus' variable
+ cpucount=`/sbin/sysctl kern.smp.cpus 2> /dev/null | \
+ cut -d'=' -f2 | cut -d' ' -f2`
+ if test $cpucount -gt 1; then
+ AC_DEFINE([SILC_SMP], [], [SILC_SMP])
+ AC_MSG_RESULT(yes)
+ ifelse([$1], , :, [$1])
+ else
+ AC_MSG_RESULT(no)
+ ifelse([$2], , :, [$2])
+ fi
+ ;;
+
+ *)
+ AC_MSG_RESULT(no)
+ ifelse([$2], , :, [$2])
+ ;;
+ esac
+])
+
+# Function to check for CPU feature flags.
+# Usage: SILC_CPU_FLAG(flag [, ACTION-IF-FOUND] [, ACTION-IF-NOT-FOUND])
+AC_DEFUN([SILC_CPU_FLAG],
+[
+ AC_MSG_CHECKING(whether CPU supports $1)
+
+ case "$target" in
+ *-*-linux*)
+ # Take data from Linux /proc
+ if test -f /proc/cpuinfo; then
+ cpuflags=`grep "^flags.*$1 " /proc/cpuinfo 2> /dev/null`
+ if test $? != 0; then
+ AC_MSG_RESULT(no)
+ ifelse([$3], , :, [$3])
+ else
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ fi
+ else
+ AC_MSG_RESULT(no)
+ ifelse([$3], , :, [$3])
+ fi
+ ;;
+
+ *-*-*bsd*)
+ # BSDs have some flags in sysctl 'machdep' variable
+ cpuflags=`/sbin/sysctl machdep 2> /dev/null | grep "\.$1.*.1"`
+ if test $? != 0; then
+ AC_MSG_RESULT(no)
+ ifelse([$3], , :, [$3])
+ else
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ fi
+ ;;
+
+ *)
+ AC_MSG_RESULT(no)
+ ifelse([$3], , :, [$3])
+ ;;
+ esac
+])
+
+# Function to check if compiler flag works
+# Usage: SILC_ADD_CFLAGS(FLAGS, [ACTION-IF-FAILED])
+AC_DEFUN([SILC_ADD_CFLAGS],
+[ tmp_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $1"
+ AC_MSG_CHECKING(whether $CC accepts $1 flag)
+ AC_TRY_LINK([], [], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
+ CFLAGS="$tmp_CFLAGS"
+ $2])
+ unset tmp_CFLAGS
+])
+
+# Function to check if compiler flag works, destination specifiable
+# Usage: SILC_ADD_CC_FLAGS(VAR, FLAGS, [ACTION-IF-FAILED])
+AC_DEFUN([SILC_ADD_CC_FLAGS],
+[ tmp_CFLAGS="$1_CFLAGS"
+ $1_CFLAGS="${$1_CFLAGS} $2"
+ AC_MSG_CHECKING(whether $CC accepts $2 flag)
+ AC_TRY_LINK([], [], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
+ $1_CFLAGS="$tmp_CFLAGS"
+ $3])
+ unset tmp_CFLAGS
+])