* Alexandre Montplaisir (alexandre.montplai...@gmail.com) wrote: > Use portable shell macros wherever possible.
Does it bring limitations as to what is the oldest autoconf/automake/libtool versions we require ? > > Change the mfence check to actually check for the assembly function, > instead of relying on the architecture's name. This check won't work as expected, because you can compile fine for a target and have the mfence instruction in your code, the problem will only show up at runtime. Due to cross-compilation support, we cannot use this kind of check. Thanks, Mathieu > > Signed-off-by: Alexandre Montplaisir <alexandre.montplai...@gmail.com> > --- > Makefile.am | 2 + > bootstrap | 6 +- > configure.ac | 265 > ++++++++++++++++++++++++++++------------------------------ > 3 files changed, 130 insertions(+), 143 deletions(-) > > diff --git a/Makefile.am b/Makefile.am > index a7d3316..a14029b 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -1,3 +1,5 @@ > +ACLOCAL_AMFLAGS=-I config > + > INCLUDES = -I$(top_builddir)/urcu > > #Add the -version-info directly here since we are only building > diff --git a/bootstrap b/bootstrap > index c507425..c71b862 100755 > --- a/bootstrap > +++ b/bootstrap > @@ -4,9 +4,5 @@ set -x > if [ ! -e config ]; then > mkdir config > fi > -aclocal > -libtoolize --force --copy > -autoheader > -automake --add-missing --copy > -autoconf > > +autoreconf -i > diff --git a/configure.ac b/configure.ac > index 5a90008..0311246 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -9,23 +9,21 @@ AC_INIT([userspace-rcu],[0.6.7],[mathieu dot desnoyers at > efficios dot com]) > AC_SUBST([URCU_LIBRARY_VERSION], [1:0:0]) > > AC_CONFIG_AUX_DIR([config]) > +AC_CONFIG_MACRO_DIR([config]) > AC_CANONICAL_TARGET > AC_CANONICAL_HOST > AM_INIT_AUTOMAKE([foreign dist-bzip2 no-dist-gzip]) > m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) > > AC_CONFIG_SRCDIR([urcu.h]) > -AM_PROG_MKDIR_P > > AC_CONFIG_HEADERS([config.h urcu/config.h]) > > -# Keep at the end to do not pollute installed header. > AH_TEMPLATE([CONFIG_RCU_SMP], [Enable SMP support. With SMP support enabled, > uniprocessors are also supported. With SMP support disabled, UP systems work > fine, but the behavior of SMP systems is undefined.]) > AH_TEMPLATE([CONFIG_RCU_HAVE_FENCE], [Defined when on a system that has > memory fence instructions.]) > AH_TEMPLATE([CONFIG_RCU_HAVE_FUTEX], [Defined when on a system with futex > support.]) > -AH_TEMPLATE([CONFIG_RCU_COMPAT_ARCH], [Compatibility mode for i386 which > lacks > -cmpxchg instruction.]) > -AH_TEMPLATE([CONFIG_RCU_ARM_HAVE_DMB], [Use the dmb instruction is available > for use on ARM.]) > +AH_TEMPLATE([CONFIG_RCU_COMPAT_ARCH], [Compatibility mode for i386 which > lacks cmpxchg instruction.]) > +AH_TEMPLATE([CONFIG_RCU_ARM_HAVE_DMB], [Use the dmb instruction if available > for use on ARM.]) > > # Checks for programs. > AC_PROG_CC > @@ -43,105 +41,90 @@ AC_FUNC_MMAP > AC_CHECK_FUNCS([bzero gettimeofday munmap sched_getcpu strtoul sysconf]) > > # Find arch type > -case $host_cpu in > - i386) ARCHTYPE="x86"; SUBARCHTYPE="x86compat" ;; > - i486) ARCHTYPE="x86";; > - i586) ARCHTYPE="x86";; > - i686) ARCHTYPE="x86";; > - amd64) ARCHTYPE="x86";; > - x86_64) ARCHTYPE="x86";; > - powerpc) ARCHTYPE="ppc" ;; > - ppc64) ARCHTYPE="ppc" ;; > - powerpc64) ARCHTYPE="ppc" ;; > - ppc) ARCHTYPE="ppc" ;; > - s390) ARCHTYPE="s390" ;; > - s390x) ARCHTYPE="s390" ;; > - sparc64) ARCHTYPE="sparc64" ;; > - alpha*) ARCHTYPE="alpha" ;; > - ia64) ARCHTYPE="gcc" ;; > - arm*) ARCHTYPE="arm" ;; > - *) ARCHTYPE="unknown";; > -esac > - > -if test "x$ARCHTYPE" = "xarm" ; then > -AC_MSG_CHECKING([checking for dmb instruction]) > -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ > -]], [[ > -asm volatile("dmb":::"memory"); > -]])],[ > - AC_MSG_RESULT([yes]) > - AC_DEFINE([CONFIG_RCU_ARM_HAVE_DMB], [1]) > - > -],[ > - AC_MSG_RESULT([no]) > +AS_CASE([$host_cpu], > + [i386], [ARCHTYPE="x86" && SUBARCHTYPE="x86compat"], > + [i486], [ARCHTYPE="x86"], > + [i586], [ARCHTYPE="x86"], > + [i686], [ARCHTYPE="x86"], > + [amd64], [ARCHTYPE="x86"], > + [x86_64], [ARCHTYPE="x86"], > + [powerpc], [ARCHTYPE="ppc"], > + [ppc64], [ARCHTYPE="ppc"], > + [powerpc64], [ARCHTYPE="ppc"], > + [ppc], [ARCHTYPE="ppc"], > + [s390], [ARCHTYPE="s390"], > + [s390x], [ARCHTYPE="s390"], > + [sparc64], [ARCHTYPE="sparc64"], > + [alpha*], [ARCHTYPE="alpha"], > + [ia64], [ARCHTYPE="gcc"], > + [arm*], [ARCHTYPE="arm"], > + [ARCHTYPE="unknown"] > +) > > -]) > -fi > +AC_SUBST(ARCHTYPE) > +AC_SUBST(SUBARCHTYPE) > > UATOMICSRC=urcu/uatomic/$ARCHTYPE.h > ARCHSRC=urcu/arch/$ARCHTYPE.h > -if test "$ARCHTYPE" == "armv7l"; then > - CFLAGS="-mcpu=cortex-a9 -mtune=cortex-a9 -O" > -fi > > -AC_SUBST(ARCHTYPE) > -AC_SUBST(SUBARCHTYPE) > +AS_IF([test "x$SUBARCHTYPE" = xx86compat],[ > + AC_DEFINE([CONFIG_RCU_COMPAT_ARCH], [1]) > +]) > + > +AS_IF([test "$host_cpu" = "armv7l"],[ > + CFLAGS="$CFLAGS -mcpu=cortex-a9 -mtune=cortex-a9 -O1" > +]) > > -[ > -#if test "x$ARCHTYPE" = "xx86" -a "x$host_cpu" != "xi386" -a "x$host_cpu" != > "xi486" -a "x$host_cpu" != "xi586"; then > -#For now, using lock; addl compatibility mode even for i686, because the > -#Pentium III is seen as a i686, but lacks mfence instruction. > -#Only using fence for x86_64. > -if test "x$ARCHTYPE" = "xx86" -a "x$host_cpu" != "xi386" -a "x$host_cpu" != > "xi486" -a "x$host_cpu" != "xi586" -a "x$host_cpu" != "xi686"; then > -] > - AC_DEFINE([CONFIG_RCU_HAVE_FENCE], [1]) > -[ > -fi > -] > - > -AC_MSG_CHECKING([sys_futex()]) > +# ARM-specific checks > +AS_IF([test "x$ARCHTYPE" = "xarm"],[ > + AC_MSG_CHECKING([for dmb instruction]) > + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[asm > volatile("dmb":::"memory");]])],[ > + AC_MSG_RESULT([yes]) > + AC_DEFINE([CONFIG_RCU_ARM_HAVE_DMB], [1]) > + ],[ > + AC_MSG_RESULT([no]) > + ]) > +]) > + > +# x86-specific checks > +AS_IF([test "x$ARCHTYPE" = "xx86"],[ > + AC_MSG_CHECKING([for mfence instruction]) > + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[asm > volatile("mfence":::"memory");]])],[ > + AC_MSG_RESULT([yes]) > + AC_DEFINE([CONFIG_RCU_HAVE_FENCE], [1]) > + ],[ > + AC_MSG_RESULT([no]) > + ]) > +]) > + > +# Check if sys_futex() is available > +AC_MSG_CHECKING([for sys_futex()]) > AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ > -#include <sys/syscall.h> > -]], [[ > -#ifndef __NR_futex > -#error "futexes not available" > -#endif > -]])],[ > + #include <sys/syscall.h> > + ]],[[ > + #ifndef __NR_futex > + #error "futexes not available" > + #endif > + ]]) > +],[ > AC_MSG_RESULT([yes]) > AC_DEFINE([CONFIG_RCU_HAVE_FUTEX], [1]) > compat_futex_test=0 > - > ],[ > AC_MSG_RESULT([no]) > compat_futex_test=1 > - > ]) > > -AM_CONDITIONAL([COMPAT_FUTEX], [ test "x$compat_futex_test" = "x1" ]) > +AM_CONDITIONAL([COMPAT_FUTEX], [test "x$compat_futex_test" = "x1"]) > +AM_CONDITIONAL([COMPAT_ARCH], [test "x$SUBARCHTYPE" = "xx86compat"]) > > -AM_CONDITIONAL([COMPAT_ARCH], [test "x$SUBARCHTYPE" = xx86compat ]) > +# smp-support configure option > +AC_ARG_ENABLE([smp-support], > + AS_HELP_STRING([--disable-smp-support], [Disable SMP support. Warning: > only use this on uniprocessor systems. [default=enabled]]), > + [def_smp_support=$enableval], > + [def_smp_support="yes"]) > +AS_IF([test "x$def_smp_support" = "xyes"], [AC_DEFINE([CONFIG_RCU_SMP], > [1])]) > > -[ > -if test "x$SUBARCHTYPE" = xx86compat; then > -] > - AC_DEFINE([CONFIG_RCU_COMPAT_ARCH], [1]) > -[ > -fi > -] > - > -AC_ARG_ENABLE([smp-support], [ --disable-smp-support Disable SMP support. > Warning: only use this > - on uniprocessor systems. [[default=enabled]]], > [def_smp_support=$enableval], [def_smp_support="yes"]) > - > -[ > -if test "$def_smp_support" = "no"; then > - echo "SMP support disabled." > -else > -] > - AC_DEFINE([CONFIG_RCU_SMP], [1]) > -[ > - echo "SMP support enabled." > -fi > -] > > # From the sched_setaffinity(2)'s man page: > # ~~~~ > @@ -169,60 +152,59 @@ fi > # int sched_setaffinity (pid_t __pid, const cpu_set_t *__mask); > # ~~~~ > > -dnl Since we define _GNU_SOURCE in the sources, must do so too in the > -dnl autoconf tests, as defining _GNU_SOURCE or not exposes > -dnl sched_setaffinity bits differently. > +# Since we define _GNU_SOURCE in the sources, must do so too in the > +# autoconf tests, as defining _GNU_SOURCE or not exposes > +# sched_setaffinity bits differently. > saved_CFLAGS=$CFLAGS > CFLAGS="$CFLAGS -D_GNU_SOURCE" > > # First check if the function is available at all. > -AC_CHECK_FUNCS( > - [sched_setaffinity], > - [ # Okay, we have it. Check if also have cpu_set_t. If we don't, > - # then we have the first version using unsigned long, and no > - # CPU_ZERO, etc. macros. If we do have cpu_set_t, we may have the > - # version with 2 or 3 arguments. In that case, CPU_ZERO, etc., > - # should also be present, but we confirm nonetheless. > - > - AC_CHECK_TYPES( > - [cpu_set_t], > - [ # We do have it. Confirm that we have CPU_ZERO, and it actually > works. > - AC_MSG_CHECKING([whether CPU_ZERO works]) > - AH_TEMPLATE([HAVE_CPU_ZERO], > - [Define to 1 if we have CPU_ZERO and if it works]) > - AC_COMPILE_IFELSE( > - [AC_LANG_PROGRAM( > - [#define _GNU_SOURCE > - #include <sched.h>], > - [cpu_set_t foo; CPU_ZERO (&foo);]) > - ], > - [ # Works! > - AC_DEFINE(HAVE_CPU_ZERO, 1) > - AC_MSG_RESULT([yes]) > - ], > - [AC_MSG_RESULT([no])] > - ) > - > - # Check how many arguments does sched_setaffinity take. > - # Should be 3 or 2. > - AC_MSG_CHECKING([how many arguments sched_setaffinity takes]) > - AC_COMPILE_IFELSE( > - [AC_LANG_PROGRAM( > - [#include <sched.h>], > - [cpu_set_t foo; sched_setaffinity (0, sizeof (foo), &foo);]) > - ], > - [sched_set_affinity_args=3], > - [sched_set_affinity_args=2]) > - AC_DEFINE_UNQUOTED(SCHED_SETAFFINITY_ARGS, $sched_set_affinity_args, > - [Define to sched_setaffinity's number of arguments.]) > - AC_MSG_RESULT([$sched_set_affinity_args]) > - ], > - [ # No cpu_set_t, always 3 args. > - AC_DEFINE(SCHED_SETAFFINITY_ARGS, 3) ], > - [#include <sched.h>] > - ) > - ] > -) > +AC_CHECK_FUNCS([sched_setaffinity],[ > + # Okay, we have it. Check if also have cpu_set_t. If we don't, > + # then we have the first version using unsigned long, and no > + # CPU_ZERO, etc. macros. If we do have cpu_set_t, we may have the > + # version with 2 or 3 arguments. In that case, CPU_ZERO, etc., > + # should also be present, but we confirm nonetheless. > + > + AC_CHECK_TYPES([cpu_set_t],[ > + # We do have it. Confirm that we have CPU_ZERO, and it > actually works. > + AC_MSG_CHECKING([whether CPU_ZERO works]) > + AH_TEMPLATE([HAVE_CPU_ZERO], [Defined to 1 if we have CPU_ZERO > and it works]) > + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ > + #define _GNU_SOURCE > + #include <sched.h> > + ]],[[ > + cpu_set_t foo; CPU_ZERO (&foo); > + ]]) > + ],[ > + # Works! > + AC_DEFINE(HAVE_CPU_ZERO, 1) > + AC_MSG_RESULT([yes]) > + ],[ > + AC_MSG_RESULT([no]) > + ]) > + > + # Check how many arguments does sched_setaffinity take. > + # Should be 3 or 2. > + AC_MSG_CHECKING([how many arguments sched_setaffinity takes]) > + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ > + #include <sched.h> > + ]],[[ > + cpu_set_t foo; > + sched_setaffinity (0, sizeof (foo), &foo); > + ]]) > + ], > + [sched_set_affinity_args=3], > + [sched_set_affinity_args=2]) > + AC_DEFINE_UNQUOTED(SCHED_SETAFFINITY_ARGS, > $sched_set_affinity_args, > + [Defined to sched_setaffinity's number of arguments.]) > + AC_MSG_RESULT([$sched_set_affinity_args]) > + ],[ > + # No cpu_set_t, always 3 args. > + AC_DEFINE(SCHED_SETAFFINITY_ARGS, 3) > + ], > + [#include <sched.h>]) > +]) > > CFLAGS=$saved_CFLAGS > > @@ -233,11 +215,18 @@ AC_CONFIG_LINKS([ > AC_CONFIG_FILES([ > Makefile > tests/Makefile > - liburcu-cds.pc > liburcu.pc > liburcu-bp.pc > + liburcu-cds.pc > liburcu-qsbr.pc > liburcu-mb.pc > liburcu-signal.pc > ]) > AC_OUTPUT > + > +# Report on selected configure options > +AS_IF([test "x$def_smp_support" = "xyes"],[ > + AS_ECHO("SMP support enabled.") > +],[ > + AS_ECHO("SMP support disabled.") > +]) > -- > 1.7.7.3 > > > _______________________________________________ > lttng-dev mailing list > lttng-dev@lists.lttng.org > http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > -- Mathieu Desnoyers Operating System Efficiency R&D Consultant EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list lttng-dev@lists.lttng.org http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev