Gilles, The strange configure check comes from this commit
https://github.com/open-mpi/hwloc/commit/6a9299ce9d1cb1c13b3b346fe6fdfed2df75c672 Are you sure your patch won't break something else? I'll ask Pavan what he thinks about your patch. I agree that it's crazy we don't find strncasecmp on some Linux boxes but this detection code is already a mess so I'd rather no change it again. Brice Le 09/09/2014 04:56, Gilles Gouaillardet a écrit : > Ralph, > > ok, let me clarify my point : > > tolower() is invoked in : > opal/mca/hwloc/hwloc191/hwloc/src/misc.c > and ctype.h is already #include'd in this file > > tolower() is also invoked in : > opal/mca/hwloc/hwloc191/hwloc/include/private/misc.h > *only* if HWLOC_HAVE_DECL_STRNCASECMP is not #define'd : > > static __hwloc_inline int hwloc_strncasecmp(const char *s1, const char > *s2, size_t n) > { > #ifdef HWLOC_HAVE_DECL_STRNCASECMP > return strncasecmp(s1, s2, n); > #else > while (n) { > char c1 = tolower(*s1), c2 = tolower(*s2); > if (!c1 || !c2 || c1 != c2) > return c1-c2; > n--; s1++; s2++; > } > return 0; > #endif > } > > my point was that on your CentOS box, HWLOC_HAVE_DECL_STRNCASECMP > *should* have been #define'd by configure, > even if you are using intel or clang 3.2 compiler. > > Cheers, > > Gilles > > On 2014/09/09 11:47, Ralph Castain wrote: >> I'll have to let Brice comment on the config change. All I can say is that >> "tolower" on my CentOS box is defined in <ctype.h>, and that has to be >> included in the misc.h header. >> >> >> On Sep 8, 2014, at 5:49 PM, Gilles Gouaillardet >> <gilles.gouaillar...@iferc.org> wrote: >> >>> Ralph and Brice, >>> >>> i noted Ralph commited r32685 in order to fix a problem with Intel >>> compilers. >>> The very similar issue occurs with clang 3.2 (gcc and clang 3.4 are ok >>> for me) >>> >>> imho, the root cause is in the hwloc configure. >>> in this case, configure fails to detect strncasecmp is part of the C >>> include files. >>> >>> in order to achieve this, the conftest.1.c program is compiled and a >>> failure means that >>> strncasecmp is supported since it is declared in some C include files. >>> >>> gcc and clang 3.4 both fail to compile this program : >>> >>> $ gcc -c /tmp/conftest.1.c ; echo $? >>> /tmp/conftest.1.c:592: warning: data definition has no type or storage class >>> /tmp/conftest.1.c:592: error: conflicting types for ‘strncasecmp’ >>> 1 >>> >>> $ clang --version >>> clang version 3.4 (tags/RELEASE_34/final) >>> Target: x86_64-redhat-linux-gnu >>> Thread model: posix >>> $ clang -c /tmp/conftest.1.c ; echo $? >>> /tmp/conftest.1.c:592:8: warning: type specifier missing, defaults to 'int' >>> [-Wimplicit-int] >>> strncasecmp(int,long,int,long,int,long,int,long,int,long); >>> ^~~~~~~~~~~ >>> /tmp/conftest.1.c:592:8: error: conflicting types for 'strncasecmp' >>> /usr/include/string.h:540:12: note: previous declaration is here >>> extern int strncasecmp (__const char *__s1, __const char *__s2, size_t __n) >>> ^ >>> /tmp/conftest.1.c:596:19: error: too many arguments to function call, >>> expected >>> 3, have 10 >>> strncasecmp(1,2,3,4,5,6,7,8,9,10); >>> ~~~~~~~~~~~ ^~~~~~~~~~~~~~ >>> 1 warning and 2 errors generated. >>> 1 >>> >>> >>> but clang 3.2 and icc simply issue a warning and no error : >>> >>> $ clang --version >>> clang version 3.2 (tags/RELEASE_32/final) >>> Target: x86_64-unknown-linux-gnu >>> Thread model: posix >>> $ clang -c /tmp/conftest.1.c ; echo $? >>> /tmp/conftest.1.c:592:8: warning: type specifier missing, defaults to 'int' >>> [-Wimplicit-int] >>> strncasecmp(int,long,int,long,int,long,int,long,int,long); >>> ^~~~~~~~~~~ >>> /tmp/conftest.1.c:592:8: warning: incompatible redeclaration of library >>> function >>> 'strncasecmp' >>> /usr/include/string.h:540:12: note: 'strncasecmp' is a builtin with type >>> 'int >>> (const char *, const char *, size_t)' >>> extern int strncasecmp (__const char *__s1, __const char *__s2, size_t __n) >>> ^ >>> 2 warnings generated. >>> 0 >>> >>> $ icc -c conftest.1.c ; echo $? >>> conftest.1.c(592): warning #77: this declaration has no storage class or >>> type specifier >>> strncasecmp(int,long,int,long,int,long,int,long,int,long); >>> ^ >>> >>> conftest.1.c(592): warning #147: declaration is incompatible with "int >>> strncasecmp(const char *, const char *, size_t={unsigned long})" >>> (declared at line 540 of "/usr/include/string.h") >>> strncasecmp(int,long,int,long,int,long,int,long,int,long); >>> ^ >>> >>> 0 >>> >>> >>> the attached hwloc_config.patch is used in order to make the test >>> program slightly different (conftest.2.c) and it does fail with all the >>> compilers. >>> >>> >>> that being said, r32685 might not be reversed since in the case >>> strncasecmp is not supported by the system (i do not even know if such >>> os exist) >>> ctype.h must be #include'd in order to get the prototype of the >>> tolower() function. >>> >>> >>> could you please review the hwloc_config.patch and comment ? >>> >>> Cheers, >>> >>> Gilles >>> <conftest.1.c><hwloc_config.patch><conftest.2.c>_______________________________________________ >>> devel mailing list >>> de...@open-mpi.org >>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/devel >>> Link to this post: >>> http://www.open-mpi.org/community/lists/devel/2014/09/15775.php >> _______________________________________________ >> devel mailing list >> de...@open-mpi.org >> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/devel >> Link to this post: >> http://www.open-mpi.org/community/lists/devel/2014/09/15776.php > _______________________________________________ > devel mailing list > de...@open-mpi.org > Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/devel > Link to this post: > http://www.open-mpi.org/community/lists/devel/2014/09/15777.php