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

Reply via email to