FindThreads.cmake 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # - This module determines the thread library of the system.
  2. # The following variables are set
  3. # CMAKE_THREAD_LIBS_INIT - the thread library
  4. # CMAKE_USE_SPROC_INIT - are we using sproc?
  5. # CMAKE_USE_WIN32_THREADS_INIT - using WIN32 threads?
  6. # CMAKE_USE_PTHREADS_INIT - are we using pthreads
  7. # CMAKE_HP_PTHREADS_INIT - are we using hp pthreads
  8. INCLUDE (CheckIncludeFiles)
  9. INCLUDE (CheckLibraryExists)
  10. SET(Threads_FOUND FALSE)
  11. # Do we have sproc?
  12. IF(CMAKE_SYSTEM MATCHES IRIX)
  13. CHECK_INCLUDE_FILES("sys/types.h;sys/prctl.h" CMAKE_HAVE_SPROC_H)
  14. ENDIF()
  15. IF(CMAKE_HAVE_SPROC_H)
  16. # We have sproc
  17. SET(CMAKE_USE_SPROC_INIT 1)
  18. ELSE()
  19. # Do we have pthreads?
  20. CHECK_INCLUDE_FILES("pthread.h" CMAKE_HAVE_PTHREAD_H)
  21. IF(CMAKE_HAVE_PTHREAD_H)
  22. #
  23. # We have pthread.h
  24. # Let's check for the library now.
  25. #
  26. SET(CMAKE_HAVE_THREADS_LIBRARY)
  27. IF(NOT THREADS_HAVE_PTHREAD_ARG)
  28. # Do we have -lpthreads
  29. CHECK_LIBRARY_EXISTS(pthreads pthread_create "" CMAKE_HAVE_PTHREADS_CREATE)
  30. IF(CMAKE_HAVE_PTHREADS_CREATE)
  31. SET(CMAKE_THREAD_LIBS_INIT "-lpthreads")
  32. SET(CMAKE_HAVE_THREADS_LIBRARY 1)
  33. SET(Threads_FOUND TRUE)
  34. ENDIF()
  35. # Ok, how about -lpthread
  36. CHECK_LIBRARY_EXISTS(pthread pthread_create "" CMAKE_HAVE_PTHREAD_CREATE)
  37. IF(CMAKE_HAVE_PTHREAD_CREATE)
  38. SET(CMAKE_THREAD_LIBS_INIT "-lpthread")
  39. SET(Threads_FOUND TRUE)
  40. SET(CMAKE_HAVE_THREADS_LIBRARY 1)
  41. ENDIF()
  42. IF(CMAKE_SYSTEM MATCHES "SunOS.*")
  43. # On sun also check for -lthread
  44. CHECK_LIBRARY_EXISTS(thread thr_create "" CMAKE_HAVE_THR_CREATE)
  45. IF(CMAKE_HAVE_THR_CREATE)
  46. SET(CMAKE_THREAD_LIBS_INIT "-lthread")
  47. SET(CMAKE_HAVE_THREADS_LIBRARY 1)
  48. SET(Threads_FOUND TRUE)
  49. ENDIF()
  50. ENDIF(CMAKE_SYSTEM MATCHES "SunOS.*")
  51. ENDIF(NOT THREADS_HAVE_PTHREAD_ARG)
  52. IF(NOT CMAKE_HAVE_THREADS_LIBRARY)
  53. # If we did not found -lpthread, -lpthread, or -lthread, look for -pthread
  54. IF("THREADS_HAVE_PTHREAD_ARG" MATCHES "^THREADS_HAVE_PTHREAD_ARG")
  55. MESSAGE(STATUS "Check if compiler accepts -pthread")
  56. TRY_RUN(THREADS_PTHREAD_ARG THREADS_HAVE_PTHREAD_ARG
  57. ${CMAKE_BINARY_DIR}
  58. ${CMAKE_ROOT}/Modules/CheckForPthreads.c
  59. CMAKE_FLAGS -DLINK_LIBRARIES:STRING=-pthread
  60. COMPILE_OUTPUT_VARIABLE OUTPUT)
  61. IF(THREADS_HAVE_PTHREAD_ARG)
  62. IF(THREADS_PTHREAD_ARG MATCHES "^2$")
  63. SET(Threads_FOUND TRUE)
  64. MESSAGE(STATUS "Check if compiler accepts -pthread - yes")
  65. ELSE()
  66. MESSAGE(STATUS "Check if compiler accepts -pthread - no")
  67. FILE(APPEND
  68. ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
  69. "Determining if compiler accepts -pthread returned ${THREADS_PTHREAD_ARG} instead of 2. The compiler had the following output:\n${OUTPUT}\n\n")
  70. ENDIF()
  71. ELSE()
  72. MESSAGE(STATUS "Check if compiler accepts -pthread - no")
  73. FILE(APPEND
  74. ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
  75. "Determining if compiler accepts -pthread failed with the following output:\n${OUTPUT}\n\n")
  76. ENDIF()
  77. ENDIF("THREADS_HAVE_PTHREAD_ARG" MATCHES "^THREADS_HAVE_PTHREAD_ARG")
  78. IF(THREADS_HAVE_PTHREAD_ARG)
  79. SET(Threads_FOUND TRUE)
  80. SET(CMAKE_THREAD_LIBS_INIT "-pthread")
  81. ENDIF()
  82. ENDIF(NOT CMAKE_HAVE_THREADS_LIBRARY)
  83. ENDIF(CMAKE_HAVE_PTHREAD_H)
  84. ENDIF()
  85. IF(CMAKE_THREAD_LIBS_INIT)
  86. SET(CMAKE_USE_PTHREADS_INIT 1)
  87. SET(Threads_FOUND TRUE)
  88. ENDIF()
  89. IF(CMAKE_SYSTEM MATCHES "Windows")
  90. SET(CMAKE_USE_WIN32_THREADS_INIT 1)
  91. SET(Threads_FOUND TRUE)
  92. ENDIF()
  93. IF(CMAKE_USE_PTHREADS_INIT)
  94. IF(CMAKE_SYSTEM MATCHES "HP-UX-*")
  95. # Use libcma if it exists and can be used. It provides more
  96. # symbols than the plain pthread library. CMA threads
  97. # have actually been deprecated:
  98. # http://docs.hp.com/en/B3920-90091/ch12s03.html#d0e11395
  99. # http://docs.hp.com/en/947/d8.html
  100. # but we need to maintain compatibility here.
  101. # The CMAKE_HP_PTHREADS setting actually indicates whether CMA threads
  102. # are available.
  103. CHECK_LIBRARY_EXISTS(cma pthread_attr_create "" CMAKE_HAVE_HP_CMA)
  104. IF(CMAKE_HAVE_HP_CMA)
  105. SET(CMAKE_THREAD_LIBS_INIT "-lcma")
  106. SET(CMAKE_HP_PTHREADS_INIT 1)
  107. SET(Threads_FOUND TRUE)
  108. ENDIF(CMAKE_HAVE_HP_CMA)
  109. SET(CMAKE_USE_PTHREADS_INIT 1)
  110. ENDIF()
  111. IF(CMAKE_SYSTEM MATCHES "OSF1-V*")
  112. SET(CMAKE_USE_PTHREADS_INIT 0)
  113. SET(CMAKE_THREAD_LIBS_INIT )
  114. ENDIF()
  115. IF(CMAKE_SYSTEM MATCHES "CYGWIN_NT*")
  116. SET(CMAKE_USE_PTHREADS_INIT 1)
  117. SET(Threads_FOUND TRUE)
  118. SET(CMAKE_THREAD_LIBS_INIT )
  119. SET(CMAKE_USE_WIN32_THREADS_INIT 0)
  120. ENDIF()
  121. ENDIF(CMAKE_USE_PTHREADS_INIT)
  122. INCLUDE(FindPackageHandleStandardArgs)
  123. FIND_PACKAGE_HANDLE_STANDARD_ARGS(Threads DEFAULT_MSG Threads_FOUND)