Merge topic 'FindThreads_overhaul'
b7e5c5a2
FindThreads: introduce THREADS_PREFER_PTHREAD_FLAG (#14767)bcb0e387
FindThreads: introduce an imported target to link to46368edd
FindThreads: move checking of the -pthread compiler flag into a macro
This commit is contained in:
commit
c0a4f59160
|
@ -14,14 +14,32 @@
|
||||||
# CMAKE_USE_PTHREADS_INIT - are we using pthreads
|
# CMAKE_USE_PTHREADS_INIT - are we using pthreads
|
||||||
# CMAKE_HP_PTHREADS_INIT - are we using hp pthreads
|
# CMAKE_HP_PTHREADS_INIT - are we using hp pthreads
|
||||||
#
|
#
|
||||||
|
# The following import target is created
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# Threads::Threads
|
||||||
|
#
|
||||||
# For systems with multiple thread libraries, caller can set
|
# For systems with multiple thread libraries, caller can set
|
||||||
#
|
#
|
||||||
# ::
|
# ::
|
||||||
#
|
#
|
||||||
# CMAKE_THREAD_PREFER_PTHREAD
|
# CMAKE_THREAD_PREFER_PTHREAD
|
||||||
|
#
|
||||||
|
# If the use of the -pthread compiler and linker flag is prefered then the
|
||||||
|
# caller can set
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# THREADS_PREFER_PTHREAD_FLAG
|
||||||
|
#
|
||||||
|
# Please note that the compiler flag can only be used with the imported
|
||||||
|
# target. Use of both the imported target as well as this switch is highly
|
||||||
|
# recommended for new code.
|
||||||
|
|
||||||
#=============================================================================
|
#=============================================================================
|
||||||
# Copyright 2002-2009 Kitware, Inc.
|
# Copyright 2002-2009 Kitware, Inc.
|
||||||
|
# Copyright 2011-2014 Rolf Eike Beer <eike@sf-mail.de>
|
||||||
#
|
#
|
||||||
# Distributed under the OSI-approved BSD License (the "License");
|
# Distributed under the OSI-approved BSD License (the "License");
|
||||||
# see accompanying file Copyright.txt for details.
|
# see accompanying file Copyright.txt for details.
|
||||||
|
@ -48,7 +66,7 @@ endif()
|
||||||
# Internal helper macro.
|
# Internal helper macro.
|
||||||
# Do NOT even think about using it outside of this file!
|
# Do NOT even think about using it outside of this file!
|
||||||
macro(_check_threads_lib LIBNAME FUNCNAME VARNAME)
|
macro(_check_threads_lib LIBNAME FUNCNAME VARNAME)
|
||||||
if(NOT CMAKE_HAVE_THREADS_LIBRARY)
|
if(NOT Threads_FOUND)
|
||||||
CHECK_LIBRARY_EXISTS(${LIBNAME} ${FUNCNAME} "" ${VARNAME})
|
CHECK_LIBRARY_EXISTS(${LIBNAME} ${FUNCNAME} "" ${VARNAME})
|
||||||
if(${VARNAME})
|
if(${VARNAME})
|
||||||
set(CMAKE_THREAD_LIBS_INIT "-l${LIBNAME}")
|
set(CMAKE_THREAD_LIBS_INIT "-l${LIBNAME}")
|
||||||
|
@ -58,40 +76,12 @@ macro(_check_threads_lib LIBNAME FUNCNAME VARNAME)
|
||||||
endif ()
|
endif ()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
if(CMAKE_HAVE_SPROC_H AND NOT CMAKE_THREAD_PREFER_PTHREAD)
|
# Internal helper macro.
|
||||||
# We have sproc
|
# Do NOT even think about using it outside of this file!
|
||||||
set(CMAKE_USE_SPROC_INIT 1)
|
macro(_check_pthreads_flag)
|
||||||
else()
|
if(NOT Threads_FOUND)
|
||||||
# Do we have pthreads?
|
|
||||||
CHECK_INCLUDE_FILES("pthread.h" CMAKE_HAVE_PTHREAD_H)
|
|
||||||
if(CMAKE_HAVE_PTHREAD_H)
|
|
||||||
|
|
||||||
#
|
|
||||||
# We have pthread.h
|
|
||||||
# Let's check for the library now.
|
|
||||||
#
|
|
||||||
set(CMAKE_HAVE_THREADS_LIBRARY)
|
|
||||||
if(NOT THREADS_HAVE_PTHREAD_ARG)
|
|
||||||
# Check if pthread functions are in normal C library
|
|
||||||
CHECK_SYMBOL_EXISTS(pthread_create pthread.h CMAKE_HAVE_LIBC_CREATE)
|
|
||||||
if(CMAKE_HAVE_LIBC_CREATE)
|
|
||||||
set(CMAKE_THREAD_LIBS_INIT "")
|
|
||||||
set(CMAKE_HAVE_THREADS_LIBRARY 1)
|
|
||||||
set(Threads_FOUND TRUE)
|
|
||||||
else()
|
|
||||||
|
|
||||||
_check_threads_lib(pthreads pthread_create CMAKE_HAVE_PTHREADS_CREATE)
|
|
||||||
_check_threads_lib(pthread pthread_create CMAKE_HAVE_PTHREAD_CREATE)
|
|
||||||
if(CMAKE_SYSTEM_NAME MATCHES "SunOS")
|
|
||||||
# On sun also check for -lthread
|
|
||||||
_check_threads_lib(thread thr_create CMAKE_HAVE_THR_CREATE)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT CMAKE_HAVE_THREADS_LIBRARY)
|
|
||||||
# If we did not found -lpthread, -lpthread, or -lthread, look for -pthread
|
# If we did not found -lpthread, -lpthread, or -lthread, look for -pthread
|
||||||
if("x${THREADS_HAVE_PTHREAD_ARG}" STREQUAL "x")
|
if(NOT DEFINED THREADS_HAVE_PTHREAD_ARG)
|
||||||
message(STATUS "Check if compiler accepts -pthread")
|
message(STATUS "Check if compiler accepts -pthread")
|
||||||
try_run(THREADS_PTHREAD_ARG THREADS_HAVE_PTHREAD_ARG
|
try_run(THREADS_PTHREAD_ARG THREADS_HAVE_PTHREAD_ARG
|
||||||
${CMAKE_BINARY_DIR}
|
${CMAKE_BINARY_DIR}
|
||||||
|
@ -122,8 +112,48 @@ else()
|
||||||
set(Threads_FOUND TRUE)
|
set(Threads_FOUND TRUE)
|
||||||
set(CMAKE_THREAD_LIBS_INIT "-pthread")
|
set(CMAKE_THREAD_LIBS_INIT "-pthread")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
if(CMAKE_HAVE_SPROC_H AND NOT CMAKE_THREAD_PREFER_PTHREAD)
|
||||||
|
# We have sproc
|
||||||
|
set(CMAKE_USE_SPROC_INIT 1)
|
||||||
|
else()
|
||||||
|
# Do we have pthreads?
|
||||||
|
CHECK_INCLUDE_FILES("pthread.h" CMAKE_HAVE_PTHREAD_H)
|
||||||
|
if(CMAKE_HAVE_PTHREAD_H)
|
||||||
|
|
||||||
|
#
|
||||||
|
# We have pthread.h
|
||||||
|
# Let's check for the library now.
|
||||||
|
#
|
||||||
|
set(CMAKE_HAVE_THREADS_LIBRARY)
|
||||||
|
if(NOT THREADS_HAVE_PTHREAD_ARG)
|
||||||
|
# Check if pthread functions are in normal C library
|
||||||
|
CHECK_SYMBOL_EXISTS(pthread_create pthread.h CMAKE_HAVE_LIBC_CREATE)
|
||||||
|
if(CMAKE_HAVE_LIBC_CREATE)
|
||||||
|
set(CMAKE_THREAD_LIBS_INIT "")
|
||||||
|
set(CMAKE_HAVE_THREADS_LIBRARY 1)
|
||||||
|
set(Threads_FOUND TRUE)
|
||||||
|
else()
|
||||||
|
|
||||||
|
# Check for -pthread first if enabled. This is the recommended
|
||||||
|
# way, but not backwards compatible as one must also pass -pthread
|
||||||
|
# as compiler flag then.
|
||||||
|
if (THREADS_PREFER_PTHREAD_FLAG)
|
||||||
|
_check_pthreads_flag()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
_check_threads_lib(pthreads pthread_create CMAKE_HAVE_PTHREADS_CREATE)
|
||||||
|
_check_threads_lib(pthread pthread_create CMAKE_HAVE_PTHREAD_CREATE)
|
||||||
|
if(CMAKE_SYSTEM_NAME MATCHES "SunOS")
|
||||||
|
# On sun also check for -lthread
|
||||||
|
_check_threads_lib(thread thr_create CMAKE_HAVE_THR_CREATE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
_check_pthreads_flag()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -172,3 +202,15 @@ endif()
|
||||||
set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE})
|
set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE})
|
||||||
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
|
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Threads DEFAULT_MSG Threads_FOUND)
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Threads DEFAULT_MSG Threads_FOUND)
|
||||||
|
|
||||||
|
if(THREADS_FOUND AND NOT TARGET Threads::Threads)
|
||||||
|
add_library(Threads::Threads INTERFACE IMPORTED)
|
||||||
|
|
||||||
|
if(THREADS_HAVE_PTHREAD_ARG)
|
||||||
|
set_property(TARGET Threads::Threads PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_THREAD_LIBS_INIT)
|
||||||
|
set_property(TARGET Threads::Threads PROPERTY INTERFACE_LINK_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
Loading…
Reference in New Issue