[cmake-developers] CheckSymbolExists is unreliable

Brad King brad.king at kitware.com
Mon Jan 9 09:09:59 EST 2012


On 1/7/2012 6:12 AM, Rolf Eike Beer wrote:
> This has changed. It fails now for vs11-x64 on amber10 and for Linux64-
> bullseye-cov on hythloth. amber10 seems to have an unrelated, general problem.
> What's wrong with the bullseye I have no idea, but this goes wrong for the C++
> test and some others, too.

Ignore amber10.  The machine has some corruption on it.  We've been working
to move those builds to some clean machines or VMs.

I wonder if the BullsEye coverage tool ends up leaving errno set to non-zero
after program startup.  By returning it directly the return code from the test
executable ends up as non-zero so CTest thinks it failed.  This works around
the problem:

diff --git a/Tests/Module/CheckSymbolExists/errno.c b/Tests/Module/CheckSymbolExists/errno.c
index 6010f7c..da78f02 100644
--- a/Tests/Module/CheckSymbolExists/errno.c
+++ b/Tests/Module/CheckSymbolExists/errno.c
@@ -2,5 +2,6 @@

  int main()
  {
+  errno = 0;
    return errno;
  }

>> However the CheckCXXSymbolExist test fails:
>
> For the bullseye (see above) and because the dummy executable fails for
> Borland C++. "return errno;" doesn't work in C++ mode, I have no idea what's
> that for a screwup. And especially why searching for that symbol using
> CheckCXXSymbolExists works but using it doesn't.

When you use <cerrno> shouldn't you reference "std::errno" and not "errno"?
However, even that doesn't work because Borland's treatment of errno in
<cerrno> ends up preprocessing to

  namespace std { extern "C" { extern  int * __cdecl  __errno(void); } }
  int main() { return (*__errno()); }

and __errno() is not visible outside std::.  Adding std:: would end up
giving "return std::(*__errno())" which of course doesn't work.  What works
is "return (*std::__errno())" but they do not define the macro that way ;)

Using just <errno.h> works for Borland.

-Brad


diff --git a/Tests/Module/CheckCXXSymbolExists/CMakeLists.txt b/Tests/Module/CheckCXXSymbolExists/CMakeLists.txt
index c55c05d..0e57bab 100644
--- a/Tests/Module/CheckCXXSymbolExists/CMakeLists.txt
+++ b/Tests/Module/CheckCXXSymbolExists/CMakeLists.txt
@@ -31,9 +31,10 @@ endforeach()
  set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE})
  unset(CSE_RESULT_ERRNO_CERRNO CACHE)

-MESSAGE(STATUS "Checking <cerrno>")
-
-check_cxx_symbol_exists(errno "cerrno" CSE_RESULT_ERRNO_CERRNO)
+if(NOT BORLAND)
+  MESSAGE(STATUS "Checking <cerrno>")
+  check_cxx_symbol_exists(errno "cerrno" CSE_RESULT_ERRNO_CERRNO)
+endif()

  IF (NOT CSE_RESULT_ERRNO_CERRNO)
    unset(CSE_RESULT_ERRNO_ERRNOH CACHE)



More information about the cmake-developers mailing list