[CMake] Problem with CHECK_FUNCTION_EXISTS and strcasecmp
Michael Wild
themiwi at gmail.com
Sun Mar 14 06:14:16 EDT 2010
> On 03/13/2010 01:03 PM, Mateusz Loskot wrote:
> > Michael Surette wrote:
> >> I am updating the CMake build files for a cross-platform project. One
> >> of the tests is for strcasecmp for which I use CHECK_FUNCTION_EXISTS. If
> >> it's not found the code generates its own function by that name.
> >>
> >> This works well with GCC under Linux, including cross-compiling with
> >> MinGW, as well as MinGW under Windows.
> >>
> >> Testing this with MSVS 2008 Express under Windows XP, it fails to find
> >> the function but gives errors and fails when I try to build.
> >>
> >> If I manually edit the config.h file generated by CMake so that it
> >> misreports that there is a strcasecmp function available it compiles well.
> >>
> >> My conclusion is that either this function exists or a macro is defining
> >> it, but it's not being found by CHECK_FUNCTION_EXISTS. I've greped
> >> through the header files, but find no reference to it.
> >>
> >> How can I find this function reliably?
> >
> > CMake macro is right because Visual C++ does not define strcasecmp.
> > This function is defined by POSIX (not even C99). Visual C++ does not
> > implement POSIX. For Visual C++, you should look for equivalents, it is:
> > _stricmp or _strnicmp
> >
> > Best regards,
>
> Thank you for the prompt answer.
>
> The problem isn't about standards or whether or not Visual C++ defines
> strcasecmp, but that it handles it in a way that isn't compatible with
> the CMake test. The whole idea of detecting resources is about working
> around missing functions and defining the function yourself should be a
> valid solution, regardless of the standards supported.
>
> CMake detects whether or not that fuction exists and sets a variable.
> When the code is compiled our own version of strcasecmp is #defined in
> depending on that variable. This is a straightforward solution to a
> simple problem. If Visual C++ really didn't define strcasecmp that
> would be the end of it.
>
> With observation, I have seen that Visual C++ automatically converts
> calls to strcasecmp to be calls to _stricmp. This makes things messy,
> because even though the function isn't officially there, we get compile
> errors when we try to define it for ourselves and none when we don't.
>
> This is a cross platform project and Visual C++ is only one of the many
> targets we want to work. Visual C++ will compile the project without
> code changes as long as we assume that it does have a strcasecmp
> function, which as you pointed out, isn't true. IMHO, this is the sort
> of thing that should be handled by CMake, not code changes.
>
> Based on your information, I have added a check for _stricmp. When the
> CMake script detects either strcasecmp or _stricmp it turns off
> inserting our own strcasecmp. This solution builds well, although a
> check for the compiler itself would probably be a better way.
>
> Thanks for steering me in the right direction.
>
> Mike
>
The problem is that CMake _can't_ check this without your help. The reason is that strcasecmp is a preprocessor macro in one of the MS headers and in order for it to work you need to tell CMake to include this header when creating the small test-program.
But you might as well check for the MSVC variable in your CMake code...
HTH
Michael
More information about the CMake
mailing list