Paul Eggert wrote: > > It's needed for compiling and for linking. As far as I can tell, it's not > > needed for preprocessing, since <omp.h> is found in the compiler's search > > path anyway. > > Thanks, but earlier you mentioned the _OPENMP macro -- is that defined > by <omp.h>, or is it predefined by cpp? It is predefined by cpp. > I just now checked <http://docs.hp.com/en/B3901-90012/ch08s05.html> That doc is based on OpenMP 1.0; the current version of the standard is 2.5. > If so, OPENMP_CFLAGS needs to be put into CPPFLAGS too, and the problem needs > to be documented. Indeed. It's rare that someone will want to preprocess a source file with ifdefs specific to OpenMP, but in theory it can happen. > > When an app doesn't use OpenMP (i.e. contains no #pragma omp and no use of > > <omp.h>), compiling with -fopenmp has no effect on the generated code. > > In this case, I don't see the downside of having 'configure' > manipulate CC, CFLAGS, and/or CPPFLAGS to use the -fopenmp option > uniformly for all compiles. The downside is program startup time and memory use. If $OPENMP_CFLAGS is added to the $CFLAGS, all programs of the package will be linked with an extra shared library or two (also -lpthread!) and therefore 1. start more slowly, 2. consume more memory in RAM. Really, when I need OpenMP only in msgmerge, I don't want to make msgfmt and xgettext start more slowly. Find attached an updated patch, taking into account your remark and one of Ralf's remarks. Bruno 2007-05-17 Bruno Haible <bruno@xxxxxxxxx> * lib/autoconf/c.m4 (AC_C_OPENMP): New macro. * doc/autoconf.texi (C Compiler): Document AC_C_OPENMP. * NEWS: Mention AC_C_OPENMP. *** NEWS 14 May 2007 16:54:55 -0000 1.428 --- NEWS 17 May 2007 21:16:16 -0000 *************** *** 1,5 **** --- 1,7 ---- * Major changes in Autoconf 2.61b (????-??-??) + ** New macro AC_C_OPENMP. + ** AC_C_BIGENDIAN now supports universal binaries a la Mac OS X. ** AC_C_RESTRICT now prefers to #define 'restrict' to a variant spelling *** doc/autoconf.texi 14 May 2007 16:54:55 -0000 1.1154 --- doc/autoconf.texi 17 May 2007 21:16:24 -0000 *************** *** 6593,6598 **** --- 6593,6624 ---- if it accepts one of those, otherwise define @code{inline} to be empty. @end defmac + @defmac AC_C_OPENMP + @acindex{C_OPENMP} + @cvindex _OPENMP + OpenMP (@url{http://www.openmp.org/}) is an extension of the C language + that makes it possible to optimize programs for Shared Multiprocessing + architectures, such as multi-core CPUs, with very small effort. + + The macro @code{AC_C_OPENMP} sets the variable @code{OPENMP_CFLAGS} to the + C compiler flags needed for supporting OpenMP. If the compiler already + supports OpenMP or if it has no way to activate OpenMP support, + @code{OPENMP_CFLAGS} is set to empty. Also, the user can reject OpenMP + support if it is not the default, by invoking @samp{configure} with the + @samp{--disable-openmp} option; then @code{OPENMP_CFLAGS} is set to empty + as well. + + The @code{OPENMP_CFLAGS} need to be used when compiling programs, when + preprocessing program source, and when linking programs. Therefore you + need to add them to the @code{CFLAGS} and @code{CPPFLAGS} of your programs + that use OpenMP. The presence of OpenMP support at compile time is revealed + by the preprocessor macro @code{_OPENMP}. + + Linking a program with @code{OPENMP_CFLAGS} typically adds one more shared + library to the program's dependencies, therefore its use is recommended only + on programs that actually use code conditional on @code{#ifdef _OPENMP}. + @end defmac + @defmac AC_C_CHAR_UNSIGNED @acindex{C_CHAR_UNSIGNED} @cvindex __CHAR_UNSIGNED__ *** lib/autoconf/c.m4 14 May 2007 16:54:55 -0000 1.247 --- lib/autoconf/c.m4 17 May 2007 21:16:25 -0000 *************** *** 1841,1843 **** --- 1841,1943 ---- fi fi ]) + + + # AC_C_OPENMP + # ----------- + # Check which options need to be passed to the C compiler to support OpenMP. + # Set the OPENMP_CFLAGS variable to these options. + # The options are necessary at compile time (so the #pragmas are understood) + # and at link time (so the appropriate library is linked with). + # This macro takes care to not produce redundant options if $CC $CFLAGS already + # supports OpenMP. It also is careful to not pass options to compilers that + # misinterpret them; for example, most compilers accept "-openmp" and create + # an output file called 'penmp' rather than activating OpenMP support. + AC_DEFUN([AC_C_OPENMP], + [ + AC_MSG_CHECKING([whether to use OpenMP]) + AC_ARG_ENABLE(openmp, + [AS_HELP_STRING([--disable-openmp], [do not use OpenMP])], + [], + [enable_openmp=yes]) + AC_MSG_RESULT([$enable_openmp]) + OPENMP_CFLAGS= + if test "$enable_openmp" = yes; then + AC_MSG_CHECKING([for $CC option to support OpenMP]) + AC_CACHE_VAL([ac_cv_prog_cc_openmp], [ + ac_cv_prog_cc_openmp=unsupported + AC_LINK_IFELSE([ + #ifndef _OPENMP + choke me + #endif + #include <omp.h> + int main () { return omp_get_num_threads (); } + ], [ac_cv_prog_cc_openmp="none needed"]) + if test "$ac_cv_prog_cc_openmp" = unsupported; then + dnl Try these flags: + dnl GCC >= 4.2 -fopenmp + dnl SunPRO C -xopenmp + dnl Intel C -openmp + dnl SGI C, PGI C -mp + dnl Tru64 Compaq C -omp + dnl IBM C (AIX, Linux) -qsmp=omp + for brand in GCC SunPRO Intel SGI/PGI Compaq IBM; do + case $brand in + GCC) + ac_conditional='defined __GNUC__' + ac_option='-fopenmp' ;; + SunPRO) + ac_conditional='defined __SUNPRO_C || defined __SUNPRO_CC' + ac_option='-xopenmp' ;; + Intel) + ac_conditional='defined __INTEL_COMPILER' + ac_option='-openmp' ;; + SGI/PGI) + ac_conditional='defined __sgi || defined __PGI || defined __PGIC__' + ac_option='-mp' ;; + Compaq) + ac_conditional='defined __DECC || defined __DECCXX' + ac_option='-omp' ;; + IBM) + ac_conditional='defined __xlc__ || defined __xlC__' + ac_option='-qsmp=omp' ;; + esac + if test $brand = GCC; then + if test "$GCC" = yes; then + ac_openmp_result=yes + else + ac_openmp_result=no + fi + else + AC_EGREP_CPP([Brand], [ + #if $ac_conditional + Brand + #endif + ], [ac_openmp_result=yes], [ac_openmp_result=no]) + fi + if test $ac_openmp_result = yes; then + ac_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS $ac_option" + AC_LINK_IFELSE([ + #ifndef _OPENMP + choke me + #endif + #include <omp.h> + int main () { return omp_get_num_threads (); } + ], [ac_cv_prog_cc_openmp=$ac_option]) + CFLAGS=$ac_save_CFLAGS + break + fi + done + fi + ]) + AC_MSG_RESULT([$ac_cv_prog_cc_openmp]) + case $ac_cv_prog_cc_openmp in + "none needed" | unsupported) + OPENMP_CFLAGS= ;; + *) + OPENMP_CFLAGS=$ac_cv_prog_cc_openmp ;; + esac + fi + AC_SUBST([OPENMP_CFLAGS]) + ]) _______________________________________________ Autoconf mailing list Autoconf@xxxxxxx http://lists.gnu.org/mailman/listinfo/autoconf