# 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)
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)
- execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_open.c -lpthread -o sem_open
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
- OUTPUT_VARIABLE HAVE_SEM_OPEN_compil
- )
-
- # Test sem_open by compiling:
- if(HAVE_SEM_OPEN_compil)
- set(HAVE_SEM_OPEN 0)
- message(STATUS "Warning: sem_open not compilable")
- message(STATUS "HAVE_SEM_OPEN_comp_output: ${HAVE_SEM_OPEN_comp_output}")
- else()
- set(HAVE_SEM_OPEN 1)
- message(STATUS "sem_open is compilable")
- endif()
-
- # If we're not crosscompiling, we check by executing the program:
- if (HAVE_SEM_OPEN AND NOT CMAKE_CROSSCOMPILING)
- execute_process(COMMAND ./sem_open
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
- RESULT_VARIABLE HAVE_SEM_OPEN_run
- OUTPUT_VARIABLE var_compil
- )
- if (NOT HAVE_SEM_OPEN_run)
- set(HAVE_SEM_OPEN 1)
- message(STATUS "sem_open is executable")
+ try_run(semopen_retval semopen_compilable
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_open.c
+ LINK_LIBRARIES pthread
+ COMPILE_OUTPUT_VARIABLE semopen_compilmsg
+ RUN_OUTPUT_VARIABLE semopen_runmsg)
+
+ if(semopen_compilable)
+ if(NOT semopen_retval) # error if not 0
+ message(STATUS "sem_open is compilable and executable")
+ set(HAVE_SEM_OPEN 1)
else()
- set(HAVE_SEM_OPEN 0)
- if(EXISTS "${CMAKE_BINARY_DIR}/sem_open")
- message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open exists!")
- else()
- message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open not exists!")
- endif()
- message(STATUS "Warning: sem_open not executable")
- message(STATUS "Compilation output: '${var_compil}'")
- message(STATUS "Exit result of sem_open: ${HAVE_SEM_OPEN_run}")
+ message(STATUS "Warning: sem_open seems compilable but not executable")
+ message(STATUS "Compilation output: ${semopen_compilmsg}")
+ message(STATUS "Execution output: ${semopen_runmsg}")
+ message(STATUS "Exit value: ${semopen_retval}")
endif()
+ else()
+ message(STATUS "Warning: sem_open not compilable")
+ message(STATUS "Compilation output: ${semopen_compilmsg}")
endif()
- file(REMOVE sem_open)
- else()
- set(HAVE_SEM_OPEN 0)
+ unset(semopen_compilable)
+ unset(semopen_retval)
+ unset(semopen_runmsg)
+ 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)