Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
cmake: cosmetics around the detection of sem_init
authorMartin Quinson <martin.quinson@loria.fr>
Sun, 3 Jun 2018 19:53:33 +0000 (21:53 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Sun, 3 Jun 2018 19:53:33 +0000 (21:53 +0200)
CMakeLists.txt

index 04e2ae9..166dfae 100644 (file)
@@ -292,10 +292,6 @@ endif()
 # Checks for header libraries functions.
 CHECK_LIBRARY_EXISTS(rt      clock_gettime           "" HAVE_POSIX_GETTIME)
 
-if(NOT APPLE) # OS X El Capitan deprecates this function
-  CHECK_LIBRARY_EXISTS(pthread sem_init                "" HAVE_SEM_INIT_LIB)
-endif()
-CHECK_LIBRARY_EXISTS(pthread sem_open                "" HAVE_SEM_OPEN_LIB)
 set(HAVE_PTHREAD_SETAFFINITY 0)
 CHECK_LIBRARY_EXISTS(pthread pthread_setaffinity_np  "" HAVE_PTHREAD_SETAFFINITY)
 
@@ -435,6 +431,8 @@ set(HAVE_THREAD_CONTEXTS 0)
 if(CMAKE_USE_PTHREADS_INIT)
   ### Test that we have a way to create semaphores
 
+  set(HAVE_SEM_OPEN 0)
+  CHECK_LIBRARY_EXISTS(pthread sem_open "" HAVE_SEM_OPEN_LIB)
   if(HAVE_SEM_OPEN_LIB)
     try_run(semopen_retval semopen_compilable
             ${CMAKE_BINARY_DIR}
@@ -443,7 +441,6 @@ if(CMAKE_USE_PTHREADS_INIT)
            COMPILE_OUTPUT_VARIABLE semopen_compilmsg
             RUN_OUTPUT_VARIABLE semopen_runmsg)
     
-    set(HAVE_SEM_OPEN 0)
     if(semopen_compilable)
       if(NOT semopen_retval) # error if not 0
         message(STATUS "sem_open is compilable and executable")
@@ -464,51 +461,40 @@ if(CMAKE_USE_PTHREADS_INIT)
     unset(semopen_compilmsg)
   endif()
 
+  set(HAVE_SEM_INIT 0)  
+  if(NOT APPLE) # OS X El Capitan deprecates this function
+    CHECK_LIBRARY_EXISTS(pthread sem_init "" HAVE_SEM_INIT_LIB)
+  endif()
   if(HAVE_SEM_INIT_LIB)
-    execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_init.c -lpthread -o sem_init
-      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-      RESULT_VARIABLE HAVE_SEM_INIT_run 
-      OUTPUT_VARIABLE HAVE_SEM_INIT_compil)
-
-    # Test sem_init by compiling:
-    if(HAVE_SEM_INIT_compil)
-      set(HAVE_SEM_INIT 0)
-      message(STATUS "Warning: sem_init not compilable")
-      message(STATUS "HAVE_SEM_INIT_comp_output: ${HAVE_SEM_OPEN_comp_output}")
-    else()
-      set(HAVE_SEM_INIT 1)
-      message(STATUS "sem_init is compilable")
-    endif()
-
-    # If we're not crosscompiling, we check by executing the program:
-    if (HAVE_SEM_INIT AND NOT CMAKE_CROSSCOMPILING)
-      execute_process(COMMAND ./sem_init
-        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-        RESULT_VARIABLE HAVE_SEM_INIT_run
-        OUTPUT_VARIABLE var_compil
-      )
-      if (NOT HAVE_SEM_INIT_run)
-        set(HAVE_SEM_INIT 1)
-        message(STATUS "sem_init is executable")
+    try_run(seminit_retval seminit_compilable
+            ${CMAKE_BINARY_DIR}
+            ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_init.c
+           LINK_LIBRARIES pthread
+           COMPILE_OUTPUT_VARIABLE seminit_compilmsg
+            RUN_OUTPUT_VARIABLE seminit_runmsg)
+    
+    if(seminit_compilable)
+      if(NOT seminit_retval) # error if not 0
+        message(STATUS "sem_init is compilable and executable")
+       set(HAVE_SEM_INIT 1)
       else()
-        set(HAVE_SEM_INIT 0)
-        if(EXISTS "${CMAKE_BINARY_DIR}/sem_init")
-          message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init exists!")
-        else()
-          message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init not exists!")
-        endif()
-        message(STATUS "Warning: sem_init not executable")
-        message(STATUS "Compilation output: '${var_compil}'")
-        message(STATUS "Exit result of sem_init: ${HAVE_SEM_INIT_run}")
+        message(STATUS "Warning: sem_init seems compilable but not executable")
+        message(STATUS "Compilation output: ${seminit_compilmsg}")
+        message(STATUS "Execution output: ${seminit_runmsg}")
+        message(STATUS "Exit value: ${seminit_retval}")
       endif()
+    else()
+      message(STATUS "Warning: sem_init not compilable")
+      message(STATUS "Compilation output: ${seminit_compilmsg}")
     endif()
-    file(REMOVE sem_init)
-  else() 
-    set(HAVE_SEM_INIT 0)  
+    unset(seminit_compilable)
+    unset(seminit_retval)
+    unset(seminit_runmsg)
+    unset(seminit_compilmsg)
   endif()
 
   if(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT)
-    message(FATAL_ERROR "Semaphores are not usable (neither sem_open nor sem_init is both compilable and executable), but they are mandatory to threads (you may need to mount /dev).")
+    message(FATAL_ERROR "Semaphores are not usable (failed to use both sem_open and sem_init), but they are mandatory to threads (you may need to mount /dev).")
   endif()
 
   set(HAVE_THREAD_CONTEXTS 1)