Brice, the goal of the test is to check whether a function declaration is already present in one of the header. in order to achieve this, the test will redeclare the function with an absurd prototype :
strncasecmp(int,long,int,long,int,long,int,long,int,long); /* by the way, there is no prototype for the returned value if any */ the test *assumes* the compiler will fail with an error if the function is re-declared with a different prototype. this asumption is just wrong (well, at least with clang 3.2 and intel compilers) my patch redeclares the function as a variable instead of a function with a different prototype, and this leads to a failure with gnu, (all) clang and intel compilers (this is all i could test so far) as long as the _HWLOC_CHECK_DECL is invoked on a function and not on a global variable, i do not think my patch can break anything. an other option could be to use the preprocessor and grep : $CC -E conftest.1.c | egrep -q '[[:space:]]+strncasecmp[[:space:]]+' but i do not believe this is the way to go ... Cheers, Gilles On 2014/09/09 14:30, Brice Goglin wrote: > 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 > _______________________________________________ > 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/15778.php