From 8423595b8bebff110e6d5b5619f7206d6c5f2ceb Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Tue, 16 Jun 2015 09:52:54 +0200 Subject: [PATCH] [cmake] Try to simplify the ucontext checks --- buildtools/Cmake/CompleteInFiles.cmake | 70 +++++++------------------- buildtools/Cmake/PrintArgs.cmake | 2 +- src/xbt/win32_ucontext.c | 9 ++-- 3 files changed, 24 insertions(+), 57 deletions(-) diff --git a/buildtools/Cmake/CompleteInFiles.cmake b/buildtools/Cmake/CompleteInFiles.cmake index 01e184decb..6f64d35f4b 100644 --- a/buildtools/Cmake/CompleteInFiles.cmake +++ b/buildtools/Cmake/CompleteInFiles.cmake @@ -437,70 +437,38 @@ if(pthread) endif() endif() -# AC_CHECK_MCSC(mcsc=yes, mcsc=no) -set(mcsc_flags "") +# This is needed for ucontext on MacOS X: if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - set(mcsc_flags -D_XOPEN_SOURCE) + add_definitions(-D_XOPEN_SOURCE) endif() if(WIN32) - if(ARCH_32_BITS) - set(mcsc_flags -D_XBT_WIN32 -D_I_X86_ -I${CMAKE_HOME_DIRECTORY}/src/include -I${CMAKE_HOME_DIRECTORY}/src/xbt) - else() - set(mcsc_flags -D_XBT_WIN32 -D_AMD64_ -I${CMAKE_HOME_DIRECTORY}/src/include -I${CMAKE_HOME_DIRECTORY}/src/xbt) - endif() -endif() - -IF(NOT CMAKE_CROSSCOMPILING) - file(REMOVE "${CMAKE_BINARY_DIR}/testprog*") - file(REMOVE ${CMAKE_BINARY_DIR}/conftestval) - set(MCSC_buildcmd ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_AC_CHECK_MCSC.c ${mcsc_flags} -o testprog) - execute_process(COMMAND ${MCSC_buildcmd} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/ - OUTPUT_VARIABLE COMPILE_mcsc_VAR ERROR_VARIABLE COMPILE_mcsc_VAR) - - if(NOT COMPILE_mcsc_VAR) - message(STATUS "prog_AC_CHECK_MCSC.c is compilable") - execute_process(COMMAND ./testprog - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/ - OUTPUT_VARIABLE var_compil) - else() - message(STATUS "prog_AC_CHECK_MCSC.c is not compilable. \nBuild command: ${MCSC_buildcmd}\nOutput\n${COMPILE_mcsc_VAR}") - endif() - file(REMOVE "${CMAKE_BINARY_DIR}/testprog*") - - if(EXISTS "${CMAKE_BINARY_DIR}/conftestval") - file(READ "${CMAKE_BINARY_DIR}/conftestval" mcsc) - STRING(REPLACE "\n" "" mcsc "${mcsc}") - if(mcsc) - set(mcsc "yes") - set(HAVE_UCONTEXT_H 1) - else() - set(mcsc "no") - endif() - else() - set(mcsc "no") - endif() - - message(STATUS "mcsc: ${mcsc}") -ENDIF() - -#Only windows - -if(WIN32) - if(NOT HAVE_WINDOWS_H) - message(FATAL_ERROR "no appropriate backend found windows") - endif() + # We always provide our own implementation of ucontext on Windows. + try_compile(HAVE_UCONTEXT + ${CMAKE_BINARY_DIR} + ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_AC_CHECK_MCSC.c + COMPILE_DEFINITIONS _XBT_WIN32 + INCLUDE_DIRECTORIES + ${CMAKE_HOME_DIRECTORY}/src/include + ${CMAKE_HOME_DIRECTORY}/src/xbt + ) +else() + # We always provide our own implementation of ucontext on Windows. + try_compile(HAVE_UCONTEXT + ${CMAKE_BINARY_DIR} + ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_AC_CHECK_MCSC.c) endif() #If can have both context -if(mcsc) +if(HAVE_UCONTEXT) set(CONTEXT_UCONTEXT 1) + message("-- Support for ucontext factory") endif() if(pthread) set(CONTEXT_THREADS 1) + message("-- Support for thread context factory") endif() ############### diff --git a/buildtools/Cmake/PrintArgs.cmake b/buildtools/Cmake/PrintArgs.cmake index a3c0603125..27d6d6d48c 100644 --- a/buildtools/Cmake/PrintArgs.cmake +++ b/buildtools/Cmake/PrintArgs.cmake @@ -14,7 +14,7 @@ if(enable_print_message) message("\#define pth_skaddr_makecontext(skaddr,sksize) (${makecontext_addr})") message("\#define pth_sksize_makecontext(skaddr,sksize) (${makecontext_size})") message("\#define __VA_COPY_USE ${__VA_COPY_USE}") - message("mcsc ........................: ${mcsc}") + message("HAVE_UCONTEXT ...............: ${HAVE_UCONTEXT}") message("") message("HAVE_PTHREAD_CREATE .........: ${pthread}") message("HAVE_SEM_INIT ...............: ${HAVE_SEM_INIT_LIB}") diff --git a/src/xbt/win32_ucontext.c b/src/xbt/win32_ucontext.c index d218febbb6..5c2e2b5107 100644 --- a/src/xbt/win32_ucontext.c +++ b/src/xbt/win32_ucontext.c @@ -65,16 +65,16 @@ int makecontext(ucontext_t * ucp, void (*func) (), int argc, ...) } /* Set the instruction and the stack pointer */ - #ifdef _I_X86_ + #if defined(_I_X86_) || defined(__i383) || defined(__i383__) ucp->uc_mcontext.Eip = (DWORD) func; ucp->uc_mcontext.Esp = (DWORD) sp - sizeof(void*); - #elif defined _IA64_ + #elif defined(_IA64_) || defined(__ia64) || defined(__ia64__) # error "_IA64_" - #elif defined _AMD64_ + #elif defined _AMD64_ || defined(__x86_64) || defined(__x86_64__) ucp->uc_mcontext.Rip = (DWORD64) func; ucp->uc_mcontext.Rsp = (DWORD64) sp - sizeof(void*); #else - #error "No architecture defined for Windows build. need either _AMD64_ or _I_X86_" + #error "No architecture defined for Windows build. #endif /* Save/Restore the full machine context */ @@ -105,4 +105,3 @@ int swapcontext(ucontext_t * oucp, const ucontext_t * ucp) } return ret; } - -- 2.20.1