configure.ac 9.77 KB
Newer Older
1
# This file is part of SWIFT.
2
# Copyright (C) 2012 pedro.gonnet@durham.ac.uk.
3
#
Pedro Gonnet's avatar
Pedro Gonnet committed
4
5
6
7
# 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.
8
#
Pedro Gonnet's avatar
Pedro Gonnet committed
9
10
11
12
# 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.
13
#
Pedro Gonnet's avatar
Pedro Gonnet committed
14
15
16
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

17
# Init the project.
18
19
AC_INIT([SWIFT],[0.1.0])
AC_CONFIG_SRCDIR([src/space.c])
20
AC_CONFIG_AUX_DIR([.])
21
AM_INIT_AUTOMAKE
Pedro Gonnet's avatar
Pedro Gonnet committed
22

23
# Add local macro collection.
Pedro Gonnet's avatar
Pedro Gonnet committed
24
25
AC_CONFIG_MACRO_DIR([m4])

26
27
28
29
# Stop default CFLAGS from anyone except the environment.
: ${CFLAGS=""}

# Generate header file.
Pedro Gonnet's avatar
Pedro Gonnet committed
30
31
AM_CONFIG_HEADER(config.h)

32
33
# Find and test the compiler.
AX_CHECK_ENABLE_DEBUG
Peter W. Draper's avatar
Peter W. Draper committed
34
AC_PROG_CC
35
36
AM_PROG_CC_C_O

37
38
39
40
41
42
# Enable POSIX and platform extension preprocessor macros.
AC_USE_SYSTEM_EXTENSIONS

# Add libtool support.
LT_INIT

43
44
45
46
# Check for compiler version and vendor.
AX_COMPILER_VENDOR
AX_COMPILER_VERSION

47
48
# Check for MPI. Need to do this before characterising the compiler (C99 mode),
# as this changes the compiler.
49
50
51
52
# We should consider using AX_PROG_CC_MPI to replace AC_PROG_CC when compiling
# whole applications. There are issues with mixing compilers when using this
# macro. See
# http://lists.gnu.org/archive/html/autoconf-archive-maintainers/2011-05/msg00004.html.
53
AC_ARG_ENABLE([mpi],
54
    [AS_HELP_STRING([--enable-mpi],
55
      [Compile with functionality for distributed-memory parallelism using MPI @<:@default=yes@:>@]
56
57
58
59
    )],
    [enable_mpi="$enableval"],
    [enable_mpi="yes"]
)
60
good_mpi="yes"
61
62
if test "$enable_mpi" = "yes"; then
    AX_MPI([CC="$MPICC" AC_DEFINE(HAVE_MPI, 1, [Define if you have the MPI library.]) ])
63
64
65

    # Various MPI implementations require additional libraries when also using
    # threads. Use mpirun (on PATH) as that seems to be only command with
66
67
68
69
70
71
    # version flag, allow MPIRUN to override for systems that insist on
    # a non-standard name (PRACE).
    : ${MPIRUN='mpirun'}
    if test "$MPIRUN" = "mpirun"; then
       AC_PATH_PROG([MPIRUN],[mpirun],[notfound])
    fi
72
73
    if test "$MPIRUN" = "notfound"; then
       AC_MSG_WARN([Cannot find mpirun command on PATH, thread support may not be correct])
74
       enable_mpi="no"
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
    else
       # Special options we know about.
       # Intel: -mt_mpi
       # PLATFORM: -lmtmpi
       # OpenMPI: nothing, but library should be built correctly.
       # Set MPI_THREAD_LIBS and add to linker commands as necessary.
       AC_MSG_CHECKING([MPI threads options])
       version=`$MPIRUN -version 2>&1`
       case "$version" in
         *Intel*MPI*)
            MPI_THREAD_LIBS="-mt_mpi"
            AC_MSG_RESULT([Intel MPI])
         ;;
         *Platform*)
            MPI_THREAD_LIBS="-lmtmpi"
            AC_MSG_RESULT([PLATFORM MPI])
         ;;
         *"Open MPI"*)
            MPI_THREAD_LIBS=""
            AC_MSG_RESULT([Open MPI])
95
96
97
98
99
100
101
102
103
            #  OpenMPI should be 1.8.6 or later, if not complain.
            #  Version is last word on first line of -version output.
            revision=`mpirun -version 2>&1 | grep "Open MPI" | awk '{print $NF}'`
            AX_COMPARE_VERSION( $revision, [ge], [1.8.6],,[good_mpi="no"] )
            if test "$good_mpi" = "no"; then
                AC_MSG_WARN([
    Open MPI version should be at least 1.8.6 (is $revision)])
                enable_mpi="yes (but with warning)"
            fi
104
105
106
107
108
109
110
111
         ;;
         *)
            MPI_THREAD_LIBS=""
            AC_MSG_RESULT([unknown])
         ;;
       esac
       AC_SUBST([MPI_THREAD_LIBS])
    fi
112
fi
113
AM_CONDITIONAL([HAVEMPI],[test $enable_mpi = "yes"])
114

115
# Need C99 and inline support.
Pedro Gonnet's avatar
Pedro Gonnet committed
116
AC_PROG_CC_C99
Peter W. Draper's avatar
Peter W. Draper committed
117
118
AC_C_INLINE

119
# Define HAVE_POSIX_MEMALIGN if it works.
Pedro Gonnet's avatar
Pedro Gonnet committed
120
121
AX_FUNC_POSIX_MEMALIGN

122
123
# Only optimize if allowed, otherwise assume user will set CFLAGS as
# appropriate.
124
AC_ARG_ENABLE([optimization],
125
126
127
128
129
   [AS_HELP_STRING([--enable-optimization],
     [Enable compile time optimization flags for host @<:@default=yes@:>@]
   )],
   [enable_opt="$enableval"],
   [enable_opt="yes"]
130
131
)

132
if test "$enable_opt" = "yes" ; then
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147

   # Add code optimisation flags and tuning to host. This is a funny macro
   # that does not like CFLAGS being already set. Work around that as we have
   # at least set it to "", so it is set.
   ac_test_CFLAGS="no"
   old_CFLAGS="$CFLAGS"
   AX_CC_MAXOPT
   ac_test_CFLAGS="yes"
   CFLAGS="$old_CFLAGS $CFLAGS"

   # Check SSE & AVX support (some overlap with AX_CC_MAXOPT).
   AX_EXT
   if test "$SIMD_FLAGS" != ""; then
       CFLAGS="$CFLAGS $SIMD_FLAGS"
   fi
148
fi
Peter W. Draper's avatar
Peter W. Draper committed
149

150
151
152
# Add address sanitizer options to flags, if requested. Only useful for GCC
# version 4.8 and later.
AC_ARG_ENABLE([sanitizer],
153
154
155
156
157
   [AS_HELP_STRING([--enable-sanitizer],
     [Enable memory error detection using address sanitizer @<:@default=no@:>@]
   )],
   [enable_san="$enableval"],
   [enable_san="no"]
158
159
)

160
161
162
163
164
165
166
167
168
if test "$enable_san" = "yes"; then
   if test "$ax_cv_c_compiler_vendor" = "gnu"; then
      AX_COMPARE_VERSION( $ax_cv_c_compiler_version, [ge], [4.8.0],
                          [enable_san="yes"], [enable_san="no"] )
      if test "$enable_san" = "yes"; then
         CFLAGS="$CFLAGS -fsanitize=address -fno-omit-frame-pointer"
      fi
   else
      AC_MSG_WARN([Compiler does not support address sanitizer option])
169
170
171
   fi
fi

172
# Autoconf stuff.
Pedro Gonnet's avatar
Pedro Gonnet committed
173
174
175
176
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_HEADER_STDC

177
# Check for the libraries we will need.
Pedro Gonnet's avatar
Pedro Gonnet committed
178
179
AC_CHECK_LIB(m,sqrt,,AC_MSG_ERROR(something is wrong with the math library!))

180
# Check for pthreads.
181
AX_PTHREAD([LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
182
    CC="$PTHREAD_CC" LDFLAGS="$LDFLAGS $PTHREAD_LIBS $LIBS"],
Pedro Gonnet's avatar
Pedro Gonnet committed
183
184
185
186
    AC_MSG_ERROR([Could not find a working version of
    the pthread library. Make sure you have the library and header files installed
    or use CPPFLAGS and LDFLAGS if the library is installed in a
    non-standard location.]))
187

188
# Check for OpenMP.
189
190
AC_OPENMP
AC_SUBST(OPENMP_CFLAGS)
191
enable_openmp="no"
192
if test -z "$OPENMP_CFLAGS"; then
193
194
195
196
   echo $OPENMP_CFLAGS
   AC_MSG_ERROR(Compiler does not support OpenMP, 1)
else
   CFLAGS="$CFLAGS $OPENMP_CFLAGS"
197
   enable_openmp="yes"
198
199
fi

200
201
202
# Check for metis. Note AX_LIB_METIS exists, but cannot be configured
# to be default off (i.e. given no option it tries to locate METIS), so we
# don't use that.
203
AC_ARG_WITH([metis],
204
    [AS_HELP_STRING([--with-metis=PATH],
205
       [root directory where metis is installed @<:@default=yes@:>@]
206
207
208
209
210
211
    )],
    [],
    [with_metis="no"]
)
if test "x$with_metis" != "xno"; then
   if test "x$with_metis" != "xyes" -a "x$with_metis" != "x"; then
212
213
      METIS_LIBS="-L$with_metis/lib -lmetis"
      METIS_INCS="-I$with_metis/include"
214
   else
215
      METIS_LIBS="-lmetis"
216
      METIS_INCS=""
217
218
219
   fi
   AC_CHECK_LIB([metis],[METIS_PartGraphKway],
      AC_DEFINE([HAVE_METIS],1,[The metis library appears to be present.]),
220
      AC_MSG_ERROR(something is wrong with the metis library!),$METIS_LIBS)
221
fi
222
AC_SUBST([METIS_LIBS])
223
AC_SUBST([METIS_INCS])
224
AM_CONDITIONAL([HAVEMETIS],[test -n "$METIS_LIBS"])
225

226
# Check for zlib.
227
AC_CHECK_LIB([z],[gzopen],[
228
229
230
    AC_DEFINE([HAVE_LIBZ],[1],[Set to 1 if zlib is installed.])
    LDFLAGS="$LDFLAGS -lz"
    ],[])
Pedro Gonnet's avatar
Pedro Gonnet committed
231
232


233
# Check for HDF5.
234
AX_LIB_HDF5
235

236
237
238
239
# We want to know if this HDF5 supports MPI and whether we should use it.
# The default is to use MPI support if it is available, i.e. this is
# a parallel HDF5.
# To do this need to ask the HDF5 compiler about its configuration,
240
# -showconfig should have yes/no.
241
242
have_parallel_hdf5="no"
if test "$with_hdf5" = "yes"; then
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
    AC_ARG_ENABLE([parallel-hdf5],
       [AS_HELP_STRING([--enable-parallel-hdf5],
         [Enable parallel HDF5 library MPI functions if available. @<:@default=yes@:>@]
       )],
       [enable_parallel_hdf5="$enableval"],
       [enable_parallel_hdf5="yes"]
    )

    if test "$enable_parallel_hdf5" = "yes"; then
        AC_MSG_CHECKING([for HDF5 parallel support])
        parallel=`$H5CC -showconfig | grep "Parallel HDF5:" | awk '{print $3}'`
        if test "$parallel" = "yes"; then
            have_parallel_hdf5="yes"
            AC_DEFINE([HAVE_PARALLEL_HDF5],1,[HDF5 library supports parallel access])
        fi
        AC_MSG_RESULT($parallel)
259
260
261
262
    fi
fi
AM_CONDITIONAL([HAVEPARALLELHDF5],[test "$have_parallel_hdf5" = "yes"])

263
# Check for setaffinity.
Pedro Gonnet's avatar
Pedro Gonnet committed
264
265
AC_CHECK_FUNC( pthread_setaffinity_np , AC_DEFINE([HAVE_SETAFFINITY],[true],
    [Defined if pthread_setaffinity_np exists.]) )
266

267
# Check for timing functions needed by cycle.h.
Pedro Gonnet's avatar
Pedro Gonnet committed
268
269
AC_HEADER_TIME
AC_CHECK_HEADERS([sys/time.h c_asm.h intrinsics.h mach/mach_time.h])
270
271
272
AC_CHECK_TYPE([hrtime_t],[AC_DEFINE(HAVE_HRTIME_T, 1, [Define to 1 if hrtime_t
is defined in <sys/time.h>])],,
[#if HAVE_SYS_TIME_H
Pedro Gonnet's avatar
Pedro Gonnet committed
273
274
275
276
277
#include <sys/time.h>
#endif])
AC_CHECK_FUNCS([gethrtime read_real_time time_base_to_time clock_gettime mach_absolute_time])
AC_MSG_CHECKING([for _rtc intrinsic])
rtc_ok=yes
278
279
AC_LINK_IFELSE([AC_LANG_PROGRAM(
[[#ifdef HAVE_INTRINSICS_H
Pedro Gonnet's avatar
Pedro Gonnet committed
280
#include <intrinsics.h>
281
#endif]],
282
283
[[_rtc()]])],
[AC_DEFINE(HAVE__RTC,1,[Define if you have the UNICOS _rtc() intrinsic.])],[rtc_ok=no])
Pedro Gonnet's avatar
Pedro Gonnet committed
284
285
AC_MSG_RESULT($rtc_ok)

286
287
288
# Check for git, needed for revision stamps.
AC_PATH_PROG([GIT_CMD], [git])
AC_SUBST([GIT_CMD])
289

290
# Make the documentation.
291
DX_INIT_DOXYGEN(libswift,doc/Doxyfile,doc/)
Pedro Gonnet's avatar
Pedro Gonnet committed
292

293
# Handle .in files.
294
AC_CONFIG_FILES([Makefile src/Makefile examples/Makefile doc/Makefile doc/Doxyfile])
Pedro Gonnet's avatar
Pedro Gonnet committed
295

296
297
298
299
300
301
302
303
# Report general configuration.
AC_MSG_RESULT([
   Compiler: $CC
     vendor: $ax_cv_c_compiler_vendor
    version: $ax_cv_c_compiler_version
      flags: $CFLAGS
   MPI enabled: $enable_mpi
   HDF5 enabled: $with_hdf5
304
       parallel: $have_parallel_hdf5
305
   OpenMP enabled: $enable_openmp
306
   Metis enabled: $with_metis
307
308
])

309
# Generate output.
310
AC_OUTPUT