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

_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to