Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

# ==============================================================================
# This is a heavily modified version of FindPthreads.cmake for the pcap project.
# It's meant to find Pthreads-w32, an implementation of the
# Threads component of the POSIX 1003.1c 1995 Standard (or later)
# for Microsoft's WIndows.
#
# Apart from this notice, this module "enjoys" the following modifications:
#
# - changed its name to FindPthreads-w32.cmake to not conflict with FindThreads.cmake
#
# - users may be able to use the environment variable PTHREADS_ROOT to point
#   cmake to the *root* of their Pthreads-w32 installation.
#   Alternatively, PTHREADS_ROOT may also be set from cmake command line or GUI
#   (-DPTHREADS_ROOT=/path/to/Pthreads-w32)
#   Two other variables that can be defined in a similar fashion are
#   PTHREAD_INCLUDE_PATH and PTHREAD_LIBRARY_PATH.
#
# - added some additional status/error messages
#
# - changed formating (uppercase to lowercare + indentation)
#
# - removed some stuff
#
# - when searching for Pthreads-win32 libraries, the directory structure of the
#   pre-build binaries folder found in the pthreads-win32 CVS code repository is
#   considered (e.i /Pre-built.2/lib/x64 /Pre-built.2/lib/x86)
#
# Send suggestion, patches, gifts and praises to pcap's developers.
# ==============================================================================
#
# Find the Pthreads library
# This module searches for the Pthreads-win32 library (including the
# pthreads-win32 port).
#
# This module defines these variables:
#
#  PTHREADS_FOUND       - True if the Pthreads library was found
#  PTHREADS_LIBRARY     - The location of the Pthreads library
#  PTHREADS_INCLUDE_DIR - The include directory of the Pthreads library
#  PTHREADS_DEFINITIONS - Preprocessor definitions to define (HAVE_PTHREAD_H is a fairly common one)
#
# This module responds to the PTHREADS_EXCEPTION_SCHEME
# variable on Win32 to allow the user to control the
# library linked against. The Pthreads-win32 port
# provides the ability to link against a version of the
# library with exception handling.
# IT IS NOT RECOMMENDED THAT YOU CHANGE PTHREADS_EXCEPTION_SCHEME
# TO ANYTHING OTHER THAN "C" because most POSIX thread implementations
# do not support stack unwinding.
#
#  PTHREADS_EXCEPTION_SCHEME
#       C  = no exceptions (default)
#           (NOTE: This is the default scheme on most POSIX thread
#           implementations and what you should probably be using)
#       CE = C++ Exception Handling
#       SE = Structure Exception Handling (MSVC only)
#

#
# Define a default exception scheme to link against
# and validate user choice.
#
#
if(NOT DEFINED PTHREADS_EXCEPTION_SCHEME)
  # Assign default if needed
  set(PTHREADS_EXCEPTION_SCHEME "C")
else(NOT DEFINED PTHREADS_EXCEPTION_SCHEME)
  # Validate
  if(NOT PTHREADS_EXCEPTION_SCHEME STREQUAL "C" AND
    NOT PTHREADS_EXCEPTION_SCHEME STREQUAL "CE" AND
    NOT PTHREADS_EXCEPTION_SCHEME STREQUAL "SE")

    message(FATAL_ERROR "See documentation for FindPthreads.cmake, only C, CE, and SE modes are allowed")

  endif(NOT PTHREADS_EXCEPTION_SCHEME STREQUAL "C" AND
    NOT PTHREADS_EXCEPTION_SCHEME STREQUAL "CE" AND
    NOT PTHREADS_EXCEPTION_SCHEME STREQUAL "SE")

  if(NOT MSVC AND PTHREADS_EXCEPTION_SCHEME STREQUAL "SE")
    message(FATAL_ERROR "Structured Exception Handling is only allowed for MSVC")
  endif(NOT MSVC AND PTHREADS_EXCEPTION_SCHEME STREQUAL "SE")

endif(NOT DEFINED PTHREADS_EXCEPTION_SCHEME)

if(PTHREADS_ROOT)
  set(PTHREADS_ROOT PATHS ${PTHREADS_ROOT} NO_DEFAULT_PATH)
else()
  set(PTHREADS_ROOT $ENV{PTHREADS_ROOT})
endif(PTHREADS_ROOT)

#
# Find the header file
#
find_path(PTHREADS_INCLUDE_DIR
  NAMES pthread.h
  HINTS
  $ENV{PTHREAD_INCLUDE_PATH}
  ${PTHREADS_ROOT}/include
)

if(PTHREADS_INCLUDE_DIR)
  message(STATUS "Found pthread.h: ${PTHREADS_INCLUDE_DIR}")
# else()
# message(FATAL_ERROR "Could not find pthread.h. See README.Win32 for more information.")
endif(PTHREADS_INCLUDE_DIR)

#
# Find the library
#
set(names)
if(MSVC)
  set(names
      pthreadV${PTHREADS_EXCEPTION_SCHEME}2
      libpthread
  )
elseif(MINGW)
  set(names
      pthreadG${PTHREADS_EXCEPTION_SCHEME}2
      pthread
  )
endif(MSVC)

if(CMAKE_SIZEOF_VOID_P EQUAL 4)
  set(SUBDIR "/x86")
elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
  set(SUBDIR "/x64")
endif()

find_library(PTHREADS_LIBRARY NAMES ${names}
  DOC "The Portable Threads Library"
  HINTS
  ${CMAKE_SOURCE_DIR}/lib
  $ENV{PTHREAD_LIBRARY_PATH}
  ${PTHREADS_ROOT}
  C:/MinGW/lib/
  PATH_SUFFIXES lib/${SUBDIR}
)

if(PTHREADS_LIBRARY)
message(STATUS "Found PTHREADS library: ${PTHREADS_LIBRARY} (PTHREADS Exception Scheme: ${PTHREADS_EXCEPTION_SCHEME})")
# else()
# message(FATAL_ERROR "Could not find PTHREADS LIBRARY. See README.Win32 for more information.")
endif(PTHREADS_LIBRARY)

if(PTHREADS_INCLUDE_DIR AND PTHREADS_LIBRARY)
  set(PTHREADS_DEFINITIONS -DHAVE_PTHREAD_H)
  set(PTHREADS_INCLUDE_DIRS ${PTHREADS_INCLUDE_DIR})
  set(PTHREADS_LIBRARIES ${PTHREADS_LIBRARY})
  set(PTHREADS_FOUND TRUE)
endif(PTHREADS_INCLUDE_DIR AND PTHREADS_LIBRARY)

mark_as_advanced(PTHREADS_INCLUDE_DIR PTHREADS_LIBRARY)