configure.ac 23.9 KB
Newer Older
1
AC_PREREQ([2.69])
2

Andreas Marek's avatar
Andreas Marek committed
3
AC_INIT([elpa],[2015.02.002], [elpa-library@rzg.mpg.de])
4
AC_SUBST([PACKAGE_VERSION])
5

6 7 8
AC_CONFIG_SRCDIR([src/elpa1.F90])

AM_INIT_AUTOMAKE([foreign -Wall subdir-objects])
9 10 11 12 13 14 15 16 17

# Without this, automake tries to be smart and rebuilt
# the autoconf generated files such as configure, aclocal.m4, etc.,
# in case the timestamps of files such as configure.ac are newer
#
# This only makes trouble for end users with out-of-date autoconf versions
# that cannot produce these files
AM_MAINTAINER_MODE([disable])

18 19 20 21
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
AM_SILENT_RULES([yes])

22 23
rm -rf config.h config-f90.h

24 25 26 27 28 29 30 31 32 33 34 35 36
# Set the libtool library version, see LIBRARY_INTERFACE
#
# See http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
#
# [c:r:a]
#
# c: The currently implement interface
# r: The revision number of the current interface, that is the number
#    of released source-code changes for the current interface
# a: The "age" is the number of interfaces prior to c that are also supported
#    by the current interface, as they are ABI compatible (e.g. only new symbols
#    were added by the new interface)
#
Andreas Marek's avatar
Andreas Marek committed
37
AC_SUBST([ELPA_SO_VERSION], [3:0:0])
38 39
#

40

41 42 43 44 45 46
AX_CHECK_GNU_MAKE()
if test x$_cv_gnu_make_command = x ; then
        AC_MSG_ERROR([Need GNU Make])
fi

AC_CHECK_PROG(CPP_FOUND,cpp,yes,no)
47
if test x"${CPP_FOUND}" = xno; then
48 49 50 51 52 53 54
  AC_MSG_ERROR([no cpp found])
fi

# gnu-make fortran module dependencies
m4_include([fdep/fortran_dependencies.m4])
FDEP_F90_GNU_MAKE_DEPS

55 56 57 58
###

AC_MSG_CHECKING(whether --enable-openmp is specified)
AC_ARG_ENABLE([openmp],
59
		AS_HELP_STRING([--enable-openmp],
60 61 62 63 64 65 66 67 68
			       [use OpenMP threading, default no.]),
	      [],
	      [enable_openmp=no])
AC_MSG_RESULT([${enable_openmp}])
AM_CONDITIONAL([WITH_OPENMP],[test x"$enable_openmp" = x"yes"])
if test x"${enable_openmp}" = x"yes"; then
	AC_DEFINE([WITH_OPENMP], [1], [use OpenMP threading])
fi

Andreas Marek's avatar
Andreas Marek committed
69 70 71 72 73 74 75
dnl check whether mpi compilers are available;
dnl if not abort since it is mandatory

# C
AC_LANG([C])
m4_include([m4/ax_prog_cc_mpi.m4])
AX_PROG_CC_MPI([true],[],[AC_MSG_ERROR([no MPI C wrapper found])])
76 77 78 79 80 81 82
if test x"${enable_openmp}" = x"yes"; then
	AX_ELPA_OPENMP
	if test "$ac_cv_prog_cc_openmp" = unsupported; then
	  AC_MSG_ERROR([Could not compile a C program with OpenMP, adjust CFLAGS])
	fi
	CFLAGS="$OPENMP_CFLAGS $CFLAGS"
fi
83

84
AC_PROG_INSTALL
85 86
AM_PROG_AR
AM_PROG_AS
Andreas Marek's avatar
Andreas Marek committed
87 88 89 90 91 92 93


# Fortran
AC_LANG([Fortran])
m4_include([m4/ax_prog_fc_mpi.m4])
AX_PROG_FC_MPI([],[],[AC_MSG_ERROR([no MPI Fortran wrapper found])])

94 95 96 97 98 99 100 101 102
if test x"${enable_openmp}" = x"yes"; then
	AX_ELPA_OPENMP
	if test "$ac_cv_prog_fc_openmp" = unsupported; then
	  AC_MSG_ERROR([Could not compile a Fortran program with OpenMP, adjust FCFLAGS])
	fi
	FCFLAGS="$OPENMP_FCFLAGS $FCFLAGS"
fi


Andreas Marek's avatar
Andreas Marek committed
103 104 105

# C++
AC_LANG([C++])
106
AC_PROG_CXX
107

108 109 110 111 112 113 114
if test x"${enable_openmp}" = x"yes"; then
	AX_ELPA_OPENMP
	if test "$ac_cv_prog_cxx_openmp" = unsupported; then
	  AC_MSG_ERROR([Could not compile a C++ program with OpenMP, adjust CXXFLAGS])
	fi
	CXXFLAGS="$OPENMP_CXXFLAGS $CXXFLAGS"
fi
Andreas Marek's avatar
Andreas Marek committed
115 116 117



Andreas Marek's avatar
Andreas Marek committed
118 119 120 121 122 123 124 125 126 127
dnl variables needed for the tests

dnl these test will cause an abort of configure if not
dnl successful. However, if MKL is found then the blas, blacs,
dnl lapack, and scalapack test can fail and vice versa
have_blas=no
have_blacs=no
have_mkl=no
have_lapack=no
have_scalapack=no
128

Andreas Marek's avatar
Andreas Marek committed
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
dnl these tests will decide which kernels can be build
dnl the usual case is all except the BlueGene (bg) kernels

can_compile_sse=no
can_compile_bgp=no
can_compile_bqq=no

fortran_can_check_environment=no
use_specific_real_kernel=no
use_specific_complex_kernel=no

install_real_generic=yes
install_real_generic_simple=yes
install_real_sse=no
install_real_bgp=no
install_real_bgq=no
install_real_avx_block2=no
install_real_avx_block4=no
install_real_avx_block6=no

install_complex_generic=yes
install_complex_generic_simple=yes
install_complex_sse=no
install_complex_bgp=no
install_complex_bgq=no
install_complex_avx_block1=no
install_complex_avx_block2=no
156

Andreas Marek's avatar
Andreas Marek committed
157 158
AC_LANG([C])

159 160 161 162 163 164 165 166 167
dnl build with ftimings support
AC_MSG_CHECKING(whether ELPA should be build with ftimings support)
AC_ARG_WITH([ftimings],
		AS_HELP_STRING([--with-ftimings],
			       [detailed timings, default no.]),
	      [with_ftimings=yes],
	      [with_ftimings=no])
AC_MSG_RESULT([${with_ftimings}])

168 169 170 171 172 173 174 175 176 177 178 179 180 181
dnl build with the possibilty to redirect stdout and stderr
dnl per MPI task in a file
AC_MSG_CHECKING(whether stdout/stderr file redirect should be enabled)
AC_ARG_WITH([redirect],
		AS_HELP_STRING([--with-redirect],
			       [for test programs, allow redirection of stdout/stderr per MPI taks in a file (useful for ftimings), default no.]),
	      [with_redirect=yes],
	      [with_redirect=no])
AC_MSG_RESULT([${with_redirect}])

if test x"${with_redirect}" = x"yes"; then
  AC_DEFINE([HAVE_REDIRECT], [1], [Redirect stdout and stderr of test programs per MPI tasks to a file])
fi
AM_CONDITIONAL([HAVE_REDIRECT],[test x"$with_redirect" = x"yes"])
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203

if test x"${with_ftimings}" = x"yes"; then
  AC_DEFINE([HAVE_DETAILED_TIMINGS], [1], [Enable more timings])
  AC_ARG_ENABLE([papi],
	[AS_HELP_STRING([--disable-papi],[Do not use PAPI to also measure flop count, autodetected by default])],
	[want_papi=$enableval],[want_papi="auto"])
  papi_found=unknown
  if test x"$want_papi" != x"no" ; then
    AC_CHECK_LIB([papi],[PAPI_library_init],[papi_found="yes"],[papi_found="no"])
    if test x"$want_papi" = x"yes" ; then
      if test x"$papi_found" = x"no" ; then
        AC_MSG_ERROR(["Could not find usable PAPI installation, please adjust CFLAGS, LDFLAGS"])
      fi
    fi
  fi
  if test x"$papi_found" = x"yes"; then
    AC_DEFINE([HAVE_LIBPAPI], [1], [Use the PAPI library])
    LIBS="-lpapi $LIBS"
  fi
fi
AM_CONDITIONAL([HAVE_DETAILED_TIMINGS],[test x"$with_ftimings" = x"yes"])

Andreas Marek's avatar
Andreas Marek committed
204 205
AC_MSG_CHECKING(whether SSE assembler kernel can be compiled)

206 207
$CC -c $srcdir/src/elpa2_kernels/elpa2_kernels_asm_x86_64.s -o test.o 2>/dev/null
if test "$?" == 0; then
Andreas Marek's avatar
Andreas Marek committed
208 209 210
  can_compile_sse=yes
  install_real_sse=yes
  install_complex_sse=yes
211
else
Andreas Marek's avatar
Andreas Marek committed
212 213 214
  can_compile_sse=no
  install_real_sse=no
  install_complex_sse=no
215 216
fi
rm -f ./test.o
Andreas Marek's avatar
Andreas Marek committed
217
AC_MSG_RESULT([${can_compile_sse}])
218

Andreas Marek's avatar
Andreas Marek committed
219
dnl check whether one can compile with avx - gcc intrinsics
220

221
dnl first pass: try with specified CFLAGS and CXXFLAGS
222
AC_MSG_CHECKING([whether we can compile AVX intrinsics in C])
223 224
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
 #include <x86intrin.h>
225
 int main(int argc, char **argv){
226 227
 double* q;
 __m256d a1_1 = _mm256_load_pd(q);
228
 return 0;
229 230 231 232 233
 }
 ])],
 [can_compile_avx=yes],
 [can_compile_avx=no]
)
Andreas Marek's avatar
Andreas Marek committed
234
AC_MSG_RESULT([${can_compile_avx}])
235 236 237
if test "${can_compile_avx}" = "yes" ; then
  AC_MSG_CHECKING([whether we can compile AVX intrinsics in C++])
  AC_LANG_PUSH([C++])
238 239
  AC_COMPILE_IFELSE([AC_LANG_SOURCE([
   #include <x86intrin.h>
240
   int main(int argc, char **argv){
241 242
   double* q;
   __m256d a1_1 = _mm256_load_pd(q);
243
   return 0;
244 245 246 247 248
   }
   ])],
   [can_compile_avx=yes],
   [can_compile_avx=no]
  )
249
  AC_LANG_POP([C++])
250
  AC_MSG_RESULT([${can_compile_avx}])
251 252
  if test "${can_compile_avx}" = "no" ; then
    AC_MSG_WARN([Cannot compile C++ with AVX: disabling AVX alltogether])
253 254 255
  fi
fi

256
if test "${can_compile_avx}" = "yes" ; then
Andreas Marek's avatar
Andreas Marek committed
257 258 259 260 261 262
  install_real_avx_block2=yes
  install_real_avx_block4=yes
  install_real_avx_block6=yes

  install_complex_avx_block1=yes
  install_complex_avx_block2=yes
263 264 265 266 267 268 269 270 271
fi

dnl set the AVX optimization flags if this option is specified
AC_MSG_CHECKING(whether AVX optimization flags should be set automatically)
AC_ARG_WITH([avx-optimization],
		AS_HELP_STRING([--with-avx-optimization],
			       [use AVX optimization, default no.]),
	      [with_avx_optimization=yes],
	      [with_avx_optimization=no])
Andreas Marek's avatar
Andreas Marek committed
272
AC_MSG_RESULT([${with_avx_optimization}])
273
if test x"${with_avx_optimization}" = x"yes"; then
Andreas Marek's avatar
Andreas Marek committed
274 275 276
 CFLAGS="$CFLAGS -funsafe-loop-optimizations -funsafe-math-optimizations -ftree-vect-loop-version -ftree-vectorize"
 CXXFLAGS="$CXXFLAGS -funsafe-loop-optimizations -funsafe-math-optimizations -ftree-vect-loop-version -ftree-vectorize"
fi
277

278
AC_LANG([Fortran])
279 280 281
AC_FC_FREEFORM
AC_FC_MODULE_FLAG
AC_FC_MODULE_OUTPUT_FLAG
282
AC_FC_LIBRARY_LDFLAGS
283 284 285 286

save_FCFLAGS=$FCFLAGS
save_LDFLAGS=$LDFLAGS

287 288 289
AC_ARG_VAR([SCALAPACK_LDFLAGS],[Extra LDFLAGS necessary to link a program with Scalapack])
AC_ARG_VAR([SCALAPACK_FCFLAGS],[Extra FCFLAGS necessary to compile a Fortran program with Scalapack])

290 291
FCFLAGS="$FCFLAGS $SCALAPACK_FCFLAGS"
LDFLAGS="$LDFLAGS $SCALAPACK_LDFLAGS"
292

293
dnl check whether fortran error_unit is defined
294
AC_MSG_CHECKING([whether Fortran module iso_fortran_env is available])
295
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
296 297 298 299 300 301 302 303 304 305
  program test_error_unit
    use ISO_FORTRAN_ENV, only : error_unit
    implicit none

    write(error_unit,*) "error_unit is defined"
  end program
])],
  [can_use_iso_fortran_env=yes],
  [can_use_iso_fortran_env=no]
)
306
AC_MSG_RESULT([${can_use_iso_fortran_env}])
307

308 309 310 311
dnl check whether one can link with specified MKL (desired method)
AC_MSG_CHECKING([whether we can compile a Fortran program using MKL])


312
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
313
  program test_mkl
314
    use mkl_service
315 316 317 318 319 320 321 322 323 324 325 326
    character*198 :: string
    call mkl_get_version_string(string)
    write(*,'(a)') string
  end program
])],
  [can_compile_with_mkl=yes],
  [can_compile_with_mkl=no]
)
AC_MSG_RESULT([${can_compile_with_mkl}])

if test x"$can_compile_with_mkl" = x"yes" ; then
  AC_MSG_CHECKING([whether we can link a Fortran program with MKL])
327
  AC_LINK_IFELSE([AC_LANG_SOURCE([
328
    program test_mkl
329
      use mkl_service
330 331 332 333 334
      character*198 :: string
      call mkl_get_version_string(string)
      write(*,'(a)') string
    end program
  ])],
Andreas Marek's avatar
Andreas Marek committed
335 336
    [have_mkl=yes],
    [have_mkl=no]
337
  )
Andreas Marek's avatar
Andreas Marek committed
338
  AC_MSG_RESULT([${have_mkl}])
339 340 341
fi

dnl if not mkl, check all the necessary individually
342
if test x"${have_mkl}" = x"yes" ; then
343 344 345 346
  WITH_MKL=1
else

  dnl first check blas
Andreas Marek's avatar
Andreas Marek committed
347 348 349
  AC_SEARCH_LIBS([dgemm],[blas],[have_blas=yes],[have_blas=no])
  AC_MSG_CHECKING([whether we can link a program with a blas lib])
  AC_MSG_RESULT([${have_blas}])
350

351
  if test x"${have_blas}" = x"no" ; then
Andreas Marek's avatar
Andreas Marek committed
352
    AC_MSG_ERROR([could not link with blas: specify path]) 
353
  fi
354
  dnl now lapack
Andreas Marek's avatar
Andreas Marek committed
355 356 357
  AC_SEARCH_LIBS([dlarrv],[lapack],[have_lapack=yes],[have_lapack=no])
  AC_MSG_CHECKING([whether we can link a program with a lapack lib])
  AC_MSG_RESULT([${have_lapack}])
358

359
  if test x"${have_lapack}" = x"no" ; then
360
    AC_MSG_ERROR([could not link with lapack: specify path])
361
  fi
Andreas Marek's avatar
Andreas Marek committed
362

363 364
  dnl test whether scalapack already contains blacs
  scalapack_libs="mpiscalapack scalapack"
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
  old_LIBS="$LIBS"
  for lib in ${scalapack_libs}; do
    LIBS="-l${lib} ${old_LIBS}"
    AC_MSG_CHECKING([whether -l${lib} already contains a BLACS implementation])
    AC_LINK_IFELSE([AC_LANG_FUNC_LINK_TRY([blacs_gridinit])],[blacs_in_scalapack=yes],[blacs_in_scalapack=no])
    AC_MSG_RESULT([${blacs_in_scalapack}])
    if test x"${blacs_in_scalapack}" = x"yes"; then
      break
    fi
  done

  if test x"${blacs_in_scalapack}" = x"no"; then
    LIBS="${old_LIBS}"

    dnl Test for stand-alone blacs
380 381
    AC_SEARCH_LIBS([bi_f77_init],[mpiblacsF77init],[],[],[-lmpiblacs])
    AC_SEARCH_LIBS([blacs_gridinit],[mpiblacs blacs],[have_blacs=yes],[have_blacs=no])
Andreas Marek's avatar
Andreas Marek committed
382

383 384 385
    if test x"${have_blacs}" = x"no"; then
      AC_MSG_ERROR([No usable BLACS found. If installed in a non-standard place, please specify suitable LDFLAGS and FCFLAGS as arguments to configure])
    fi
Andreas Marek's avatar
Andreas Marek committed
386
  fi
387

388
  AC_SEARCH_LIBS([pdtran],[$scalapack_libs],[have_scalapack=yes],[have_scalapack=no])
Andreas Marek's avatar
Andreas Marek committed
389

390
  if test x"${have_scalapack}" = x"no" ; then
391
    AC_MSG_ERROR([could not link with scalapack: specify path])
392 393 394 395
  fi

  dnl check whether we can link alltogehter
  AC_MSG_CHECKING([whether we can link a Fortran program with all blacs/scalapack])
396
  AC_LINK_IFELSE([AC_LANG_SOURCE([
397 398
    program dgemm_test

399 400
      integer , parameter:: M = 4, N = 3, K = 2
      real :: A(M,K), B(K,N), C(M,N)
401

402
      call dgemm('N','N',M,N,K,1.0,A,M,B,K,0.0,C,M)
403 404 405 406 407 408 409 410

     end program dgemm_test
     ])],
     [can_link_with_blacs_scalapack=yes],
     [can_link_with_blacs_scalapack=no]
   )
   AC_MSG_RESULT([${can_link_with_blacs_scalapack}])

411
   if test x"${can_link_with_blacs_scalapack}" = x"yes" ; then
412 413
     WITH_BLACS=1
   else
414
   AC_MSG_ERROR([We can neither link with MKL or another Scalpack. Please specify SCALAPACK_LDFLAGS and SCALAPACK_FCFLAGS!])
415 416 417
   fi
fi

418 419 420 421
dnl important: reset them again!
FCFLAGS=$save_FCFLAGS
LDFLAGS=$save_LDFLAGS

Andreas Marek's avatar
Andreas Marek committed
422 423 424 425
dnl check for intrinsic fortran function of 2003 standard
AC_MSG_CHECKING([whether we can use the intrinsic Fortran function "get_environment_variable"])


426
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
Andreas Marek's avatar
Andreas Marek committed
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447
  program test_get_environment

    character(len=256) :: homedir
    call get_environment_variable("HOME",homedir)
  end program
])],
  [fortran_can_check_environment=yes],
  [fortran_can_check_environment=no]
)
AC_MSG_RESULT([${fortran_can_check_environment}])


dnl now check which kernels can be compiled

dnl the checks for SSE were already done before
dnl the checks for AVX were already done before

dnl check BGP kernel
AC_MSG_CHECKING([whether we can compile with BGP intrinsics])


448
AC_LINK_IFELSE([AC_LANG_SOURCE([
Andreas Marek's avatar
Andreas Marek committed
449 450 451
  program test_bgp
    complex*16 :: y3,q3,h2
    y3 = fxcpmadd(y3,q3,h2)
452

Andreas Marek's avatar
Andreas Marek committed
453 454 455 456 457 458 459
  end program
])],
  [can_compile_bgp=yes],
  [can_compile_bgp=no]
)
AC_MSG_RESULT([${can_compile_bgp}])

460
if test x"${can_compile_bgp}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
461 462 463 464 465 466 467
  install_real_bgp=yes
  install_complex_bgp=yes
fi

dnl check BGQ kernel
AC_MSG_CHECKING([whether we can compile with BGQ intrinsics])

468
AC_LINK_IFELSE([AC_LANG_SOURCE([
Andreas Marek's avatar
Andreas Marek committed
469
  program test_bgq
Andreas Marek's avatar
Andreas Marek committed
470
    VECTOR(REAL(8))::QPX_x2
Andreas Marek's avatar
Andreas Marek committed
471 472
    real*8 :: hh(10,2))
    QPX_h2 = VEC_SPLATS(hh(2,2))
473

Andreas Marek's avatar
Andreas Marek committed
474 475 476 477 478 479 480
  end program
])],
  [can_compile_bgq=yes],
  [can_compile_bgq=no]
)
AC_MSG_RESULT([${can_compile_bgq}])

481
if test x"${can_compile_bgq}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
482 483 484 485 486 487
  install_real_bgq=yes
  install_complex_bgq=yes
fi


dnl environment variable setting of kernel
488
if test x"${fortran_can_check_environment}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
489 490 491 492
 AC_DEFINE([HAVE_ENVIRONMENT_CHECKING],[1],[Fortran can querry environment variables])
fi


493 494
dnl macro for testing whether the user wanted to compile only with one
dnl specific real kernel
Andreas Marek's avatar
Andreas Marek committed
495

496
dnl usage: DEFINE_OPTION([only-real-generic-kernel],[generic-kernel],[with_real_generic_kernel],[install_real_generic])
Andreas Marek's avatar
Andreas Marek committed
497

498 499 500 501 502 503 504 505
AC_DEFUN([DEFINE_OPTION_REAL_KERNEL],[
  AC_ARG_WITH([$1],
               AS_HELP_STRING([--with-$1],
                              [only compile $2 for real case]),
              [],[with_option=no])
   
   if test x"${with_option}" = x"yes" ; then
    if test x"${use_specific_real_kernel}" = x"no" ; then
Andreas Marek's avatar
Andreas Marek committed
506 507 508

    dnl make sure that all the other kernels are unset
    install_real_generic=no
509
    install_real_generic_simple=no
Andreas Marek's avatar
Andreas Marek committed
510
    install_real_sse=no
511
    install_real_bgp=no
Andreas Marek's avatar
Andreas Marek committed
512 513 514 515 516
    install_real_bgq=no
    install_real_avx_block2=no
    install_real_avx_block4=no
    install_real_avx_block6=no
    use_specific_real_kernel=yes
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551
    dnl now set the specific kernel
    $3=yes

    dnl in case of SSE or AVX make sure that we can compile the choosen kernel
    if test x"${install_real_sse}" = x"yes" ; then
     if test x"${can_compile_sse}" = x"no" ; then
       AC_MSG_ERROR([$2 kernel was set, but cannot be compiled!])
     fi		   
    fi

    if test x"${install_real_avx_block2}" = x"yes" ; then
     if test x"${can_compile_avx}" = x"no" ; then
       AC_MSG_ERROR([$2 kernel was set, but cannot be compiled!])
     fi		   
    fi

    if test x"${install_real_avx_block4}" = x"yes" ; then
     if test x"${can_compile_avx}" = x"no" ; then
       AC_MSG_ERROR([$2 kernel was set, but cannot be compiled!])
     fi		   
    fi

    if test x"${install_real_avx_block6}" = x"yes" ; then
     if test x"${can_compile_avx}" = x"no" ; then
       AC_MSG_ERROR([$2 kernel was set, but cannot be compiled!])
     fi		   
    fi


    AC_MSG_NOTICE([$1 will be the only compiled kernel for real case])
   else
    AC_MSG_FAILURE([$1 failed; A specific kernel for real case has already been defined before!])
   fi
  fi
])
Andreas Marek's avatar
Andreas Marek committed
552 553


554 555 556 557 558 559
dnl last check whether user wants to compile only a specific kernel
dnl
dnl real kernels
dnl
dnl generic kernel
DEFINE_OPTION_REAL_KERNEL([only-real-generic-kernel],[generic-kernel],[install_real_generic])
Andreas Marek's avatar
Andreas Marek committed
560

561 562
dnl generic-simple kernel
DEFINE_OPTION_REAL_KERNEL([only-real-generic-simple-kernel],[generic-simple-kernel],[install_real_generic_simple])
Andreas Marek's avatar
Andreas Marek committed
563

564 565
dnl sse kernel
DEFINE_OPTION_REAL_KERNEL([only-real-sse-kernel],[sse-kernel],[install_real_sse])
Andreas Marek's avatar
Andreas Marek committed
566 567

dnl bgp kernel
568
DEFINE_OPTION_REAL_KERNEL([only-real-bgp-kernel],[bgp-kernel],[install_real_bgp])
Andreas Marek's avatar
Andreas Marek committed
569 570

dnl bgq kernel
571
DEFINE_OPTION_REAL_KERNEL([only-real-bgq-kernel],[bgq-kernel],[install_real_bgq])
Andreas Marek's avatar
Andreas Marek committed
572 573

dnl real-avx-block2 kernel
574
DEFINE_OPTION_REAL_KERNEL([only-real-avx-block2-kernel],[real-avx-block2-kernel],[install_real_avx_block2])
Andreas Marek's avatar
Andreas Marek committed
575 576

dnl real-avx-block4 kernel
577
DEFINE_OPTION_REAL_KERNEL([only-real-avx-block4-kernel],[real-avx-block4-kernel],[install_real_avx_block4])
Andreas Marek's avatar
Andreas Marek committed
578 579

dnl real-avx-block6 kernel
580
DEFINE_OPTION_REAL_KERNEL([only-real-avx-block6-kernel],[real-avx-block6-kernel],[install_real_avx_block6])
Andreas Marek's avatar
Andreas Marek committed
581 582 583 584 585 586

dnl last check whether user wants to compile ony a specific kernel
dnl
dnl complex kernels
dnl

587 588 589 590 591 592 593 594
AC_DEFUN([DEFINE_OPTION_COMPLEX_KERNEL],[
  AC_ARG_WITH([$1],
                 AS_HELP_STRING([--with-$1],
                                [only compile $2 for complex case]),
              [],[with_option=no])
   
   if test x"${with_option}" = x"yes" ; then
    if test x"${use_specific_complex_kernel}" = x"no" ; then
Andreas Marek's avatar
Andreas Marek committed
595 596 597 598 599 600 601 602 603 604 605

    dnl make sure that all the other kernels are unset
    install_complex_generic=yes
    install_complex_generic_simple=no
    install_complex_sse=no
    install_complex_bgp=no
    install_complex_bgq=no
    install_complex_avx_block1=no
    install_complex_avx_block2=no

    use_specific_complex_kernel=yes
606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633
    dnl now set the specific kernel
    $3=yes

    dnl in case of SSE or AVX make sure that we can compile the choosen kernel
    if test x"${install_complex_sse}" = x"yes" ; then
     if test x"${can_compile_sse}" = x"no" ; then
       AC_MSG_ERROR([$2 kernel was set, but cannot be compiled!])
     fi		   
    fi

    if test x"${install_complex_avx_block1}" = x"yes" ; then
     if test x"${can_compile_avx}" = x"no" ; then
       AC_MSG_ERROR([$2 kernel was set, but cannot be compiled!])
     fi		   
    fi

    if test x"${install_complex_avx_block2}" = x"yes" ; then
     if test x"${can_compile_avx}" = x"no" ; then
       AC_MSG_ERROR([$2 kernel was set, but cannot be compiled!])
     fi		   
    fi

    AC_MSG_NOTICE([$1 will be the only compiled kernel for real case])
   else
    AC_MSG_FAILURE([$1 failed; A specific kernel for real case has already been defined before!])
   fi
  fi
])
Andreas Marek's avatar
Andreas Marek committed
634 635


636 637
dnl generic kernel
DEFINE_OPTION_COMPLEX_KERNEL([only-complex-generic-kernel],[generic-kernel],[install_complex_generic])
Andreas Marek's avatar
Andreas Marek committed
638 639


640 641
dnl generic-simple kernel
DEFINE_OPTION_COMPLEX_KERNEL([only-complex-generic-simple-kernel],[generic-simple-kernel],[install_complex_generic_simple])
Andreas Marek's avatar
Andreas Marek committed
642 643

dnl sse kernel
644
DEFINE_OPTION_COMPLEX_KERNEL([only-complex-sse-kernel],[sse-kernel],[install_complex_sse])
Andreas Marek's avatar
Andreas Marek committed
645 646 647


dnl complex-bqp kernel
648
DEFINE_OPTION_COMPLEX_KERNEL([only-complex-bgp-kernel],[bgp-kernel],[install_complex_bgp])
Andreas Marek's avatar
Andreas Marek committed
649 650

dnl complex-bqq kernel
651
DEFINE_OPTION_COMPLEX_KERNEL([only-complex-bgq-kernel],[bgq-kernel],[install_complex_bgq])
Andreas Marek's avatar
Andreas Marek committed
652 653

dnl complex-avx-block1 kernel
654
DEFINE_OPTION_COMPLEX_KERNEL([only-complex-avx-block1-kernel],[complex-avx-block1-kernel],[install_complex_avx_block1])
Andreas Marek's avatar
Andreas Marek committed
655 656

dnl complex-avx-block2 kernel
657
DEFINE_OPTION_COMPLEX_KERNEL([only-complex-avx-block2-kernel],[complex-avx-block2-kernel],[install_complex_avx_block2])
Andreas Marek's avatar
Andreas Marek committed
658 659


660
dnl set the conditionals according to the previous tests
661
if test x"${can_use_iso_fortran_env}" = x"yes" ; then
662 663 664
 AC_DEFINE([HAVE_ISO_FORTRAN_ENV],[1],[can use module iso_fortran_env])
fi

665

Andreas Marek's avatar
Andreas Marek committed
666
AM_CONDITIONAL([WITH_REAL_GENERIC_KERNEL],[test x"$install_real_generic" = x"yes"])
667
if test x"${install_real_generic}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
668 669 670 671
 AC_DEFINE([WITH_REAL_GENERIC_KERNEL],[1],[can use real generic kernel])
fi

AM_CONDITIONAL([WITH_COMPLEX_GENERIC_KERNEL],[test x"$install_complex_generic" = x"yes"])
672
if test x"${install_complex_generic}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
673 674 675 676
 AC_DEFINE([WITH_COMPLEX_GENERIC_KERNEL],[1],[can use complex generic kernel])
fi

AM_CONDITIONAL([WITH_REAL_GENERIC_SIMPLE_KERNEL],[test x"$install_real_generic_simple" = x"yes"])
677
if test x"${install_real_generic_simple}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
678 679 680 681
 AC_DEFINE([WITH_REAL_GENERIC_SIMPLE_KERNEL],[1],[can use real generic-simple kernel])
fi

AM_CONDITIONAL([WITH_COMPLEX_GENERIC_SIMPLE_KERNEL],[test x"$install_complex_generic_simple" = x"yes"])
682
if test x"${install_complex_generic_simple}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
683 684 685 686
 AC_DEFINE([WITH_COMPLEX_GENERIC_SIMPLE_KERNEL],[1],[can use complex generic-simple kernel])
fi

AM_CONDITIONAL([WITH_REAL_SSE_KERNEL],[test x"$install_real_sse" = x"yes"])
687
if test x"${install_real_sse}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
688 689 690 691
 AC_DEFINE([WITH_REAL_SSE_KERNEL],[1],[can use real SSE kernel])
fi

AM_CONDITIONAL([WITH_COMPLEX_SSE_KERNEL],[test x"$install_complex_sse" = x"yes"])
692
if test x"${install_complex_sse}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
693 694 695 696
 AC_DEFINE([WITH_COMPLEX_SSE_KERNEL],[1],[can use complex SSE kernel])
fi

AM_CONDITIONAL([WITH_REAL_AVX_BLOCK2_KERNEL],[test x"$install_real_avx_block2" = x"yes"])
697
if test x"${install_real_avx_block2}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
698 699 700 701
 AC_DEFINE([WITH_REAL_AVX_BLOCK2_KERNEL],[1],[can use real_avx_block2 kernel])
fi

AM_CONDITIONAL([WITH_REAL_AVX_BLOCK4_KERNEL],[test x"$install_real_avx_block4" = x"yes"])
702
if test x"${install_real_avx_block4}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
703 704 705 706
 AC_DEFINE([WITH_REAL_AVX_BLOCK4_KERNEL],[1],[can use real_avx_block4 kernel])
fi

AM_CONDITIONAL([WITH_REAL_AVX_BLOCK6_KERNEL],[test x"$install_real_avx_block6" = x"yes"])
707
if test x"${install_real_avx_block6}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
708 709 710 711
 AC_DEFINE([WITH_REAL_AVX_BLOCK6_KERNEL],[1],[can use real_avx_block6 kernel])
fi

AM_CONDITIONAL([WITH_COMPLEX_AVX_BLOCK1_KERNEL],[test x"$install_complex_avx_block1" = x"yes"])
712
if test x"${install_complex_avx_block1}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
713 714 715 716
 AC_DEFINE([WITH_COMPLEX_AVX_BLOCK1_KERNEL],[1],[can use complex_avx_block1 kernel])
fi

AM_CONDITIONAL([WITH_COMPLEX_AVX_BLOCK2_KERNEL],[test x"$install_complex_avx_block2" = x"yes"])
717
if test x"${install_complex_avx_block2}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
718 719 720 721
 AC_DEFINE([WITH_COMPLEX_AVX_BLOCK2_KERNEL],[1],[can use complex_avx_block2 kernel])
fi

AM_CONDITIONAL([WITH_REAL_BGP_KERNEL],[test x"$install_real_bgp" = x"yes"])
722
if test x"${install_real_bgp}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
723 724 725 726
 AC_DEFINE([WITH_REAL_BGP_KERNEL],[1],[can use real BGP kernel])
fi

AM_CONDITIONAL([WITH_REAL_BGQ_KERNEL],[test x"$install_real_bgq" = x"yes"])
727
if test x"${install_real_bgq}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
728 729 730
 AC_DEFINE([WITH_REAL_BGQ_KERNEL],[1],[can use real BGQ kernel])
fi

731 732
if test x"${use_specific_complex_kernel}" = x"no" ; then
 AC_DEFINE([WITH_NO_SPECIFIC_COMPLEX_KERNEL],[1],[do not use only one specific complex kernel (set at compile time)])
Andreas Marek's avatar
Andreas Marek committed
733 734
fi

735 736
if test x"${use_specific_real_kernel}" = x"no" ; then
 AC_DEFINE([WITH_NO_SPECIFIC_REAL_KERNEL],[1],[do not use only one specific real kernel (set at compile time)])
Andreas Marek's avatar
Andreas Marek committed
737 738
fi

739 740 741 742 743 744 745
LT_INIT

AC_SUBST([WITH_MKL])
AC_SUBST([WITH_BLACS])
AC_SUBST([with_amd_bulldozer_kernel])
AC_SUBST([FC_MODINC])
AC_SUBST([FC_MODOUT])
746 747 748
AC_SUBST([OPENMP_CFLAGS])
AC_SUBST([OPENMP_FCFLAGS])
AC_SUBST([OPENMP_LDFLAGS])
749 750
#AC_SUBST(OPT_FCFLAGS)

751
rm -rf modules/ .fortran_dependencies/
752 753 754 755 756 757 758 759 760 761 762
mkdir modules

#gl_VISIBILITY
#AH_BOTTOM([#if HAVE_VISIBILITY
#define EXPORTED __attribute__((__visibility__("default")))
#define HIDDEN   __attribute__((__visibility__("hidden")))
#else
#define EXPORTED
#define HIDDEN
#endif])

763 764 765 766 767 768 769 770 771

# Some part of libtool is too smart and tries to parse the output of
#   gfortran -v
# and catches anything that resembles a -l library link specification.
# Unfortunately, recent versions of gfortran emit
#   -l gfortran
# with a space between -l and gfortran. The empty -l is then included
# into "postdeps_FC" and causes linking errors later on.
postdeps_FC=$(echo $postdeps_FC | sed 's/-l //g')
772

773
if test x"${enable_openmp}" = x"yes"; then
774
	SUFFIX="_openmp"
775
else
776
	SUFFIX=""
777
fi
778 779
AC_SUBST([SUFFIX])
AC_SUBST([PKG_CONFIG_FILE],[elpa${SUFFIX}-${PACKAGE_VERSION}.pc])
780

781 782
AC_CONFIG_FILES([
  Makefile
783
  ${PKG_CONFIG_FILE}:elpa.pc.in
784
])
785

786
AC_OUTPUT
787 788 789 790 791 792


if test -e config.h ; then
  grep "^#define" config.h > config-f90.h
else
  echo "Warning! No config.h was generated, check for errors and re-run configure!"
Andreas Marek's avatar
Andreas Marek committed
793
  exit 1
794
fi
Andreas Marek's avatar
Andreas Marek committed
795 796 797 798 799

echo "Generating elpa/elpa_generated.h..."
mkdir -p elpa
grep "^ *!c>" $srcdir/src/elpa_c_interface.F90 | sed 's/^ *!c>//;' > elpa/elpa_generated.h || exit 1

800 801 802 803
if test "${can_compile_avx}" = "no" ; then
  AC_MSG_WARN([Could not compile AVX instructions])
fi