Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[cmake] Try to simplify the ucontext checks
authorGabriel Corona <gabriel.corona@loria.fr>
Tue, 16 Jun 2015 07:52:54 +0000 (09:52 +0200)
committerGabriel Corona <gabriel.corona@loria.fr>
Tue, 16 Jun 2015 07:53:32 +0000 (09:53 +0200)
buildtools/Cmake/CompleteInFiles.cmake
buildtools/Cmake/PrintArgs.cmake
src/xbt/win32_ucontext.c

index 01e184d..6f64d35 100644 (file)
@@ -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()
 
 ###############
index a3c0603..27d6d6d 100644 (file)
@@ -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}")
index d218feb..5c2e2b5 100644 (file)
@@ -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;
 }
-