FindThreads.cmake 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # This module determines the thread library of the system.
  2. # The following variables are set
  3. # CMAKE_THREAD_LIBS_INIT - the thread library to link into an application (-lpthread )
  4. # CMAKE_USE_SPROC_INIT - are we using sproc?
  5. # CMAKE_USE_WIN32_THREADS_INIT - are we using WIN32 threads
  6. # CMAKE_USE_PTHREADS_INIT - are we using pthreads
  7. # CMAKE_HP_PTHREADS_INIT - are we using hp pthreads
  8. INCLUDE (CheckIncludeFile)
  9. INCLUDE (CheckLibraryExists)
  10. # Do we have sproc?
  11. IF(CMAKE_SYSTEM MATCHES IRIX)
  12. CHECK_INCLUDE_FILE("sys/prctl.h" CMAKE_HAVE_SPROC_H)
  13. ENDIF(CMAKE_SYSTEM MATCHES IRIX)
  14. IF(CMAKE_HAVE_SPROC_H)
  15. # We have sproc
  16. SET(CMAKE_USE_SPROC_INIT 1)
  17. ELSE(CMAKE_HAVE_SPROC_H)
  18. # Do we have pthreads?
  19. CHECK_INCLUDE_FILE("pthread.h" CMAKE_HAVE_PTHREAD_H)
  20. IF(CMAKE_HAVE_PTHREAD_H)
  21. # We have pthread.h
  22. # Let's check for the library now.
  23. SET(CMAKE_HAVE_THREADS_LIBRARY)
  24. IF(NOT THREADS_HAVE_PTHREAD_ARG)
  25. # Do we have -lpthreads
  26. CHECK_LIBRARY_EXISTS(pthreads pthread_create "" CMAKE_HAVE_PTHREADS_CREATE)
  27. IF(CMAKE_HAVE_PTHREADS_CREATE)
  28. SET(CMAKE_THREAD_LIBS_INIT "-lpthreads")
  29. SET(CMAKE_HAVE_THREADS_LIBRARY 1)
  30. ENDIF(CMAKE_HAVE_PTHREADS_CREATE)
  31. # Ok, how about -lpthread
  32. CHECK_LIBRARY_EXISTS(pthread pthread_create "" CMAKE_HAVE_PTHREAD_CREATE)
  33. IF(CMAKE_HAVE_PTHREAD_CREATE)
  34. SET(CMAKE_THREAD_LIBS_INIT "-lpthread")
  35. SET(CMAKE_HAVE_THREADS_LIBRARY 1)
  36. ENDIF(CMAKE_HAVE_PTHREAD_CREATE)
  37. IF(CMAKE_SYSTEM MATCHES "SunOS.*")
  38. # On sun also check for -lthread
  39. CHECK_LIBRARY_EXISTS(thread thr_create "" CMAKE_HAVE_THR_CREATE)
  40. IF(CMAKE_HAVE_THR_CREATE)
  41. SET(CMAKE_THREAD_LIBS_INIT "-lthread")
  42. SET(CMAKE_HAVE_THREADS_LIBRARY 1)
  43. ENDIF(CMAKE_HAVE_THR_CREATE)
  44. ENDIF(CMAKE_SYSTEM MATCHES "SunOS.*")
  45. ENDIF(NOT THREADS_HAVE_PTHREAD_ARG)
  46. IF(NOT CMAKE_HAVE_THREADS_LIBRARY)
  47. # If we did not found -lpthread, -lpthread, or -lthread, look for -pthread
  48. IF("THREADS_HAVE_PTHREAD_ARG" MATCHES "^THREADS_HAVE_PTHREAD_ARG")
  49. MESSAGE(STATUS "Check if compiler accepts -pthread")
  50. TRY_RUN(THREADS_PTHREAD_ARG THREADS_HAVE_PTHREAD_ARG
  51. ${CMAKE_BINARY_DIR}
  52. ${CMAKE_ROOT}/Modules/CheckForPthreads.c
  53. CMAKE_FLAGS -DLINK_LIBRARIES:STRING=-pthread
  54. OUTPUT_VARIABLE OUTPUT)
  55. IF(THREADS_HAVE_PTHREAD_ARG)
  56. IF(THREADS_PTHREAD_ARG MATCHES "^2$")
  57. MESSAGE(STATUS "Check if compiler accepts -pthread - yes")
  58. ELSE(THREADS_PTHREAD_ARG MATCHES "^2$")
  59. MESSAGE(STATUS "Check if compiler accepts -pthread - no")
  60. FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeError.log
  61. "Determining if compiler accepts -pthread returned ${THREADS_PTHREAD_ARG} instead of 2. The compiler had the following output:\n${OUTPUT}\n\n")
  62. ENDIF(THREADS_PTHREAD_ARG MATCHES "^2$")
  63. ELSE(THREADS_HAVE_PTHREAD_ARG)
  64. MESSAGE(STATUS "Check if compiler accepts -pthread - no")
  65. FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeError.log
  66. "Determining if compiler accepts -pthread failed with the following output:\n${OUTPUT}\n\n")
  67. ENDIF(THREADS_HAVE_PTHREAD_ARG)
  68. ENDIF("THREADS_HAVE_PTHREAD_ARG" MATCHES "^THREADS_HAVE_PTHREAD_ARG")
  69. IF(THREADS_HAVE_PTHREAD_ARG)
  70. SET(CMAKE_THREAD_LIBS_INIT "-pthread")
  71. ELSE(THREADS_HAVE_PTHREAD_ARG)
  72. ENDIF(THREADS_HAVE_PTHREAD_ARG)
  73. ENDIF(NOT CMAKE_HAVE_THREADS_LIBRARY)
  74. ENDIF(CMAKE_HAVE_PTHREAD_H)
  75. ENDIF(CMAKE_HAVE_SPROC_H)
  76. IF(CMAKE_THREAD_LIBS_INIT)
  77. SET(CMAKE_USE_PTHREADS_INIT 1)
  78. ENDIF(CMAKE_THREAD_LIBS_INIT)
  79. IF(CMAKE_SYSTEM MATCHES "Windows")
  80. SET(CMAKE_USE_WIN32_THREADS_INIT 1)
  81. ENDIF(CMAKE_SYSTEM MATCHES "Windows")
  82. IF(CMAKE_USE_PTHREADS_INIT)
  83. IF(CMAKE_SYSTEM MATCHES "HP-UX-*")
  84. SET(CMAKE_THREAD_LIBS_INIT "-lcma")
  85. SET(CMAKE_USE_PTHREADS_INIT 1)
  86. SET(CMAKE_HP_PTHREADS_INIT 1)
  87. ENDIF(CMAKE_SYSTEM MATCHES "HP-UX-*")
  88. IF(CMAKE_SYSTEM MATCHES "OSF1-V*")
  89. SET(CMAKE_USE_PTHREADS_INIT 0)
  90. SET(CMAKE_THREAD_LIBS_INIT )
  91. ENDIF(CMAKE_SYSTEM MATCHES "OSF1-V*")
  92. IF(CMAKE_SYSTEM MATCHES "CYGWIN_NT*")
  93. SET(CMAKE_USE_PTHREADS_INIT 1)
  94. SET(CMAKE_THREAD_LIBS_INIT )
  95. SET(CMAKE_USE_WIN32_THREADS_INIT 0)
  96. ENDIF(CMAKE_SYSTEM MATCHES "CYGWIN_NT*")
  97. ENDIF(CMAKE_USE_PTHREADS_INIT)