Bladeren bron

cmake: Properly check for Threading support

BtbN 11 jaren geleden
bovenliggende
commit
9dd341a3ed
3 gewijzigde bestanden met toevoegingen van 257 en 5 verwijderingen
  1. 38 0
      cmake/Modules/CheckForPthreads.c
  2. 202 0
      cmake/Modules/FindThreads.cmake
  3. 17 5
      libobs/CMakeLists.txt

+ 38 - 0
cmake/Modules/CheckForPthreads.c

@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <pthread.h>
+#include <unistd.h>
+
+void* runner(void*);
+
+int res = 0;
+#ifdef __CLASSIC_C__
+int main(){
+  int ac;
+  char*av[];
+#else
+int main(int ac, char*av[]){
+#endif
+  pthread_t tid[2];
+  pthread_create(&tid[0], 0, runner, (void*)1);
+  pthread_create(&tid[1], 0, runner, (void*)2);
+
+#if defined(__BEOS__) && !defined(__ZETA__) // (no usleep on BeOS 5.)
+  usleep(1); // for strange behavior on single-processor sun
+#endif
+
+  pthread_join(tid[0], 0);
+  pthread_join(tid[1], 0);
+  if(ac > 1000){return *av[0];}
+  return res;
+}
+
+void* runner(void* args)
+{
+  int cc;
+  for ( cc = 0; cc < 10; cc ++ )
+    {
+    printf("%d CC: %d\n", (int)args, cc);
+    }
+  res ++;
+  return 0;
+}

+ 202 - 0
cmake/Modules/FindThreads.cmake

@@ -0,0 +1,202 @@
+#.rst:
+# FindThreads
+# -----------
+#
+# This module determines the thread library of the system.
+#
+# The following import target is created
+#
+# ::
+#
+#   CMake::Threads
+#
+# The following variables are set
+#
+# ::
+#
+#   THREADS_FOUND
+#   THREADS_LIBRARIES
+#   THREADS_DEFINITIONS
+#
+# Legacy variables
+#
+# ::
+#
+#   CMAKE_THREAD_LIBS_INIT     - the thread library
+#   CMAKE_THREAD_DEFS_INIT     - the thread compile definitions
+#   CMAKE_USE_SPROC_INIT       - are we using sproc?
+#   CMAKE_USE_WIN32_THREADS_INIT - using WIN32 threads?
+#   CMAKE_USE_PTHREADS_INIT    - are we using pthreads
+#   CMAKE_HP_PTHREADS_INIT     - are we using hp pthreads
+#
+# For systems with multiple thread libraries, caller can set
+#
+# ::
+#
+#   CMAKE_THREAD_PREFER_PTHREAD
+
+#=============================================================================
+# Copyright 2002-2014 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+include(CheckIncludeFiles)
+include(CheckLibraryExists)
+include(CheckSymbolExists)
+set(Threads_FOUND FALSE)
+set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET})
+set(CMAKE_REQUIRED_QUIET ${Threads_FIND_QUIETLY})
+
+# Do we have sproc?
+if(CMAKE_SYSTEM_NAME MATCHES IRIX AND NOT CMAKE_THREAD_PREFER_PTHREAD)
+  check_include_files("sys/types.h;sys/prctl.h"  CMAKE_HAVE_SPROC_H)
+endif()
+
+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)
+
+    # 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)
+    endif()
+
+    if(NOT Threads_FOUND AND NOT THREADS_HAVE_PTHREAD_ARG)
+      message(STATUS "Check if compiler accepts -pthread")
+      try_run(THREADS_PTHREAD_ARG THREADS_HAVE_PTHREAD_ARG
+        ${CMAKE_BINARY_DIR}
+        ${CMAKE_CURRENT_LIST_DIR}/CheckForPthreads.c
+        COMPILE_DEFINITIONS -pthread
+        CMAKE_FLAGS -DLINK_LIBRARIES:STRING=-pthread
+        COMPILE_OUTPUT_VARIABLE OUTPUT)
+
+      if(THREADS_HAVE_PTHREAD_ARG)
+        if(THREADS_PTHREAD_ARG STREQUAL "2")
+          message(STATUS "Check if compiler accepts -pthread - yes")
+        else()
+          message(STATUS "Check if compiler accepts -pthread - no")
+          file(APPEND
+            ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+            "Determining if compiler accepts -pthread returned ${THREADS_PTHREAD_ARG} instead of 2. The compiler had the following output:\n${OUTPUT}\n\n")
+          set(THREADS_HAVE_PTHREAD_ARG)
+        endif()
+      else()
+        message(STATUS "Check if compiler accepts -pthread - no")
+        file(APPEND
+          ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+          "Determining if compiler accepts -pthread failed with the following output:\n${OUTPUT}\n\n")
+      endif()
+    endif()
+
+    if(NOT Threads_FOUND AND THREADS_HAVE_PTHREAD_ARG)
+      set(Threads_FOUND TRUE)
+      set(CMAKE_THREAD_LIBS_INIT "-pthread")
+      set(CMAKE_THREAD_DEFS_INIT "-pthread")
+    endif()
+
+    if(NOT Threads_FOUND)
+      if(NOT CMAKE_HAVE_THREADS_LIBRARY)
+        # Do we have -lpthreads
+        check_library_exists(pthreads pthread_create "" CMAKE_HAVE_PTHREADS_CREATE)
+        if(CMAKE_HAVE_PTHREADS_CREATE)
+          set(CMAKE_THREAD_LIBS_INIT "-lpthreads")
+          set(CMAKE_HAVE_THREADS_LIBRARY 1)
+          set(Threads_FOUND TRUE)
+        endif()
+
+        # Ok, how about -lpthread
+        check_library_exists(pthread pthread_create "" CMAKE_HAVE_PTHREAD_CREATE)
+        if(CMAKE_HAVE_PTHREAD_CREATE)
+          set(CMAKE_THREAD_LIBS_INIT "-lpthread")
+          set(CMAKE_HAVE_THREADS_LIBRARY 1)
+          set(Threads_FOUND TRUE)
+        endif()
+
+        if(CMAKE_SYSTEM MATCHES "SunOS.*")
+          # On sun also check for -lthread
+          check_library_exists(thread thr_create "" CMAKE_HAVE_THR_CREATE)
+          if(CMAKE_HAVE_THR_CREATE)
+            set(CMAKE_THREAD_LIBS_INIT "-lthread")
+            set(CMAKE_HAVE_THREADS_LIBRARY 1)
+            set(Threads_FOUND TRUE)
+          endif()
+        endif()
+      endif()
+    endif()
+
+  endif()
+endif()
+
+if(CMAKE_THREAD_LIBS_INIT OR CMAKE_HAVE_LIBC_CREATE)
+  set(CMAKE_USE_PTHREADS_INIT 1)
+  set(Threads_FOUND TRUE)
+endif()
+
+if(CMAKE_SYSTEM_NAME MATCHES "Windows")
+  set(CMAKE_USE_WIN32_THREADS_INIT 1)
+  set(Threads_FOUND TRUE)
+endif()
+
+if(CMAKE_USE_PTHREADS_INIT)
+  if(CMAKE_SYSTEM_NAME MATCHES "HP-UX")
+    # Use libcma if it exists and can be used.  It provides more
+    # symbols than the plain pthread library.  CMA threads
+    # have actually been deprecated:
+    #   http://docs.hp.com/en/B3920-90091/ch12s03.html#d0e11395
+    #   http://docs.hp.com/en/947/d8.html
+    # but we need to maintain compatibility here.
+    # The CMAKE_HP_PTHREADS setting actually indicates whether CMA threads
+    # are available.
+    check_library_exists(cma pthread_attr_create "" CMAKE_HAVE_HP_CMA)
+    if(CMAKE_HAVE_HP_CMA)
+      set(CMAKE_THREAD_LIBS_INIT "-lcma")
+      set(CMAKE_HP_PTHREADS_INIT 1)
+      set(Threads_FOUND TRUE)
+    endif()
+    set(CMAKE_USE_PTHREADS_INIT 1)
+  endif()
+
+  if(CMAKE_SYSTEM MATCHES "OSF1-V")
+    set(CMAKE_USE_PTHREADS_INIT 0)
+    set(CMAKE_THREAD_LIBS_INIT )
+  endif()
+
+  if(CMAKE_SYSTEM MATCHES "CYGWIN_NT")
+    set(CMAKE_USE_PTHREADS_INIT 1)
+    set(Threads_FOUND TRUE)
+    set(CMAKE_THREAD_LIBS_INIT )
+    set(CMAKE_USE_WIN32_THREADS_INIT 0)
+  endif()
+endif()
+
+set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE})
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Threads DEFAULT_MSG Threads_FOUND)
+
+if(THREADS_FOUND)
+  set(THREADS_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}")
+  set(THREADS_DEFINITIONS "${CMAKE_THREAD_DEFS_INIT}")
+endif()

+ 17 - 5
libobs/CMakeLists.txt

@@ -1,5 +1,7 @@
 project(libobs)
 
+find_package(Threads REQUIRED)
+
 find_package(Libswscale REQUIRED)
 include_directories(${LIBSWSCALE_INCLUDE_DIRS})
 add_definitions(${LIBSWSCALE_DEFINITIONS})
@@ -263,18 +265,26 @@ set_target_properties(libobs PROPERTIES
 	OUTPUT_NAME obs
 	VERSION "0"
 	SOVERSION "0")
-target_compile_definitions(libobs PUBLIC HAVE_OBSCONFIG_H)
+target_compile_definitions(libobs
+	PUBLIC
+		HAVE_OBSCONFIG_H)
 
 if(NOT MSVC)
-	target_compile_options(libobs PUBLIC "-mmmx" "-msse" "-msse2")
+	target_compile_options(libobs
+		PUBLIC
+			-mmmx
+			-msse
+			-msse2)
 endif()
 
+
+target_compile_options(libobs
+	PUBLIC
+		"${THREADS_DEFINITIONS}")
 target_include_directories(libobs PUBLIC
 	"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
 	"$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/config>"
 	"$<INSTALL_INTERFACE:${OBS_INCLUDE_DESTINATION}>")
-
-
 target_link_libraries(libobs
 	PRIVATE
 		${libobs_PLATFORM_DEPS}
@@ -283,7 +293,9 @@ target_link_libraries(libobs
 		${LIBSWSCALE_LIBRARIES}
 		${LIBSWRESAMPLE_LIBRARIES}
 		${LIBAVFORMAT_LIBRARIES}
-		${LIBAVUTIL_LIBRARIES})
+		${LIBAVUTIL_LIBRARIES}
+	PUBLIC
+		${THREADS_LIBRARIES})
 
 install_obs_core(libobs EXPORT LibObs)
 install_obs_data(libobs data libobs)