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

Reply via email to