X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/88fad0aaff9eb463f048bfdfe4ad6218aba44ddb..6f1b0ef8689a9f9f47c12ea61b6aef187a8b6192:/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 3733e2bd18..80ff66e1ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,7 +209,7 @@ IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86|AMD64|amd64") if (WIN32) message(STATUS "Disable fast raw contexts on Windows.") elseif(enable_address_sanitizer) - message(STATUS "Disable fast raw contexts with ASan") + message(STATUS "Disable fast raw contexts with ASan (FIXME: we should implement the wrappers as explained in https://github.com/google/sanitizers/issues/189)") else() set(HAVE_RAW_CONTEXTS 1) endif() @@ -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) @@ -428,38 +424,6 @@ else() SET(HAVE_SMPI 0) endif() -#-------------------------------------------------------------------------------------------------- -### Check for GNU dynamic linker -CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H) -if (HAVE_DLFCN_H) - execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_gnu_dynlinker.c ${DL_LIBRARY} -o test_gnu_ld - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - OUTPUT_VARIABLE HAVE_GNU_LD_compil - ) - if(HAVE_GNU_LD_compil) - set(HAVE_GNU_LD 0) - message(STATUS "Warning: test program toward GNU ld failed to compile:") - message(STATUS "${HAVE_GNU_LD_comp_output}") - else() - execute_process(COMMAND ./test_gnu_ld - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE HAVE_GNU_LD_run - OUTPUT_VARIABLE var_exec - ) - - if(NOT HAVE_GNU_LD_run) - set(HAVE_GNU_LD 1) - message(STATUS "We are using GNU dynamic linker") - else() - set(HAVE_GNU_LD 0) - message(STATUS "Warning: error while checking for GNU ld:") - message(STATUS "Test output: '${var_exec}'") - message(STATUS "Exit status: ${HAVE_GNU_LD_run}") - endif() - file(REMOVE test_gnu_ld) - endif() -endif() - #-------------------------------------------------------------------------------------------------- ### Initialize of CONTEXT THREADS @@ -467,94 +431,70 @@ 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) - 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) @@ -568,7 +508,7 @@ elseif(APPLE) message(STATUS "No ucontext factory: Apple don't want us to use them.") set(HAVE_UCONTEXT_H 0) elseif(enable_address_sanitizer) - message(STATUS "No ucontext factory: ASan does not support it (see http://code.google.com/p/address-sanitizer/issues/detail?id=189)") + message(STATUS "No ucontext factory: ASan needs us to write the wrappers as explained in https://github.com/google/sanitizers/issues/189") else() try_compile(compile_makecontext ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_makecontext.c OUTPUT_VARIABLE compile_makecontext_output)