Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Define a version for _XOPEN_SOURCE
[simgrid.git] / buildtools / Cmake / CompleteInFiles.cmake
index 7ced0a7..3802ed9 100644 (file)
@@ -131,7 +131,7 @@ CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_MUTEX_TIMEDLOCK_LIB
 CHECK_LIBRARY_EXISTS(rt      clock_gettime           "" HAVE_POSIX_GETTIME)
 
 if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
-  set(CMAKE_REQUIRED_DEFINITIONS -D_XOPEN_SOURCE")
+  set(CMAKE_REQUIRED_DEFINITIONS "-D_XOPEN_SOURCE=700")
 endif()
 
 CHECK_INCLUDE_FILES("time.h;sys/time.h" TIME_WITH_SYS_TIME)
@@ -145,7 +145,7 @@ CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H)
 CHECK_INCLUDE_FILE("windows.h" HAVE_WINDOWS_H)
 CHECK_INCLUDE_FILE("winsock.h" HAVE_WINSOCK_H)
 CHECK_INCLUDE_FILE("winsock2.h" HAVE_WINSOCK2_H)
-CHECK_INCLUDE_FILE("WinDef.h" HAVE_WINDEF_H)
+CHECK_INCLUDE_FILE("windef.h" HAVE_WINDEF_H)
 CHECK_INCLUDE_FILE("errno.h" HAVE_ERRNO_H)
 CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
 CHECK_INCLUDE_FILE("execinfo.h" HAVE_EXECINFO_H)
@@ -177,6 +177,8 @@ CHECK_FUNCTION_EXISTS(vasprintf HAVE_VASPRINTF)
 CHECK_FUNCTION_EXISTS(makecontext HAVE_MAKECONTEXT)
 CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP)
 CHECK_FUNCTION_EXISTS(process_vm_readv HAVE_PROCESS_VM_READV)
+CHECK_FUNCTION_EXISTS(strdup SIMGRID_HAVE_STRDUP)
+CHECK_FUNCTION_EXISTS(_strdup SIMGRID_HAVE__STRDUP)
 
 #Check if __thread is defined
 execute_process(
@@ -314,6 +316,7 @@ if(pthread)
     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")
@@ -323,27 +326,29 @@ if(pthread)
       message(STATUS "sem_open is compilable")
     endif()
 
-    execute_process(COMMAND ./sem_open
-    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-    RESULT_VARIABLE HAVE_SEM_OPEN_run
-    OUTPUT_VARIABLE var_compil
-    )
-    file(REMOVE sem_open)
-
-    if(NOT HAVE_SEM_OPEN_run)
-      set(HAVE_SEM_OPEN 1)
-      message(STATUS "sem_open is executable")
-    else()
-      set(HAVE_SEM_OPEN 0)
-      if(EXISTS "${CMAKE_BINARY_DIR}/sem_open")
-        message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open exists!")
+    # 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")
       else()
-        message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open not exists!")
+        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}")
       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}")
     endif()
+    file(REMOVE sem_open)
 
   else()
     set(HAVE_SEM_OPEN 0)
@@ -354,6 +359,7 @@ if(pthread)
     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")
@@ -362,28 +368,30 @@ if(pthread)
       set(HAVE_SEM_INIT 1)
       message(STATUS "sem_init is compilable")
     endif()
-    execute_process(COMMAND ./sem_init
-    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-    RESULT_VARIABLE HAVE_SEM_INIT_run
-    OUTPUT_VARIABLE var_compil
-    )
-    file(REMOVE sem_init)
 
-
-    if(NOT HAVE_SEM_INIT_run)
-      set(HAVE_SEM_INIT 1)
-      message(STATUS "sem_init is executable")
-    else()
-      set(HAVE_SEM_INIT 0)
-      if(EXISTS "${CMAKE_BINARY_DIR}/sem_init")
-        message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init exists!")
+    # 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")
       else()
-        message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init not exists!")
+        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}")
       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}")
     endif()
+    file(REMOVE sem_init)
   endif()
 
   if(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT)
@@ -429,88 +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)
-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(CMAKE_CROSSCOMPILING)
-  IF(WIN32)
-    set(windows_context "yes")
-    set(IS_WINDOWS 1)
-  ENDIF()
-ELSE()
-  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()
-
-if(mcsc MATCHES "no" AND pthread)
-  if(HAVE_WINDOWS_H)
-    set(windows_context "yes")
-    set(IS_WINDOWS 1)
-  elseif(HAVE_WINDOWS_H)
-    message(FATAL_ERROR "no appropriate backend found")
-  endif()
+  add_definitions(-D_XOPEN_SOURCE=700)
 endif()
 
-#Only windows
-
 if(WIN32)
-  if(NOT HAVE_WINDOWS_H)
-    message(FATAL_ERROR "no appropriate backend found windows")
-  endif()
-endif()
-
-if(windows_context MATCHES "yes")
-  message(STATUS "Context change to windows")
+  # 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()
 
 ###############
@@ -578,7 +536,7 @@ set(makecontext_CPPFLAGS_2 "")
 if(HAVE_MAKECONTEXT OR WIN32)
   set(makecontext_CPPFLAGS "-DTEST_makecontext")
   if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
-    set(makecontext_CPPFLAGS_2 "-D_XOPEN_SOURCE")
+    set(makecontext_CPPFLAGS_2 "-D_XOPEN_SOURCE=700")
   endif()
 
   if(WIN32)
@@ -592,11 +550,16 @@ if(HAVE_MAKECONTEXT OR WIN32)
 
   file(REMOVE ${CMAKE_BINARY_DIR}/conftestval)
 
-  try_run(RUN_makecontext_VAR COMPILE_makecontext_VAR
-    ${CMAKE_BINARY_DIR}
-    ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_stacksetup.c
-    COMPILE_DEFINITIONS "${makecontext_CPPFLAGS} ${makecontext_CPPFLAGS_2}"
-    )
+  if(CMAKE_CROSSCOMPILING)
+    set(RUN_makecontext_VAR "cross")
+    set(COMPILE_makecontext_VAR "cross")
+  else()
+    try_run(RUN_makecontext_VAR COMPILE_makecontext_VAR
+      ${CMAKE_BINARY_DIR}
+      ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_stacksetup.c
+      COMPILE_DEFINITIONS "${makecontext_CPPFLAGS} ${makecontext_CPPFLAGS_2}"
+      )
+  endif()
 
   if(EXISTS ${CMAKE_BINARY_DIR}/conftestval)
     file(READ ${CMAKE_BINARY_DIR}/conftestval MAKECONTEXT_ADDR_SIZE)
@@ -621,16 +584,23 @@ if (NOT CMAKE_CROSSCOMPILING)
   try_run(RUN_makecontext_VAR COMPILE_makecontext_VAR
     ${CMAKE_BINARY_DIR}
     ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_stackgrowth.c
+    RUN_OUTPUT_VARIABLE stack
     )
-  file(READ "${CMAKE_BINARY_DIR}/conftestval" stack)
-  if(stack MATCHES "down")
+endif()
+if("${stack}" STREQUAL "down")
+  set(PTH_STACKGROWTH "-1")
+elseif("${stack}" STREQUAL "up")
+  set(PTH_STACKGROWTH "1")
+else()
+  if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
     set(PTH_STACKGROWTH "-1")
+  elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686")
+    set(PTH_STACKGROWTH "-1")
+  else()
+    message(ERROR "Could not figure the stack direction.")
   endif()
-  if(stack MATCHES "up")
-    set(PTH_STACKGROWTH "1")
-  endif()
-
 endif()
+
 ###############
 ## System checks
 ##
@@ -641,18 +611,6 @@ endif()
 
 #AC_PROG_MAKE_SET
 
-#AC_PRINTF_NULL FIXME: this is too ancient to survive!
-try_run(RUN_PRINTF_NULL_VAR COMPILE_PRINTF_NULL_VAR
-  ${CMAKE_BINARY_DIR}
-  ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_printf_null.c
-  )
-
-if(RUN_PRINTF_NULL_VAR MATCHES "FAILED_TO_RUN")
-  SET(PRINTF_NULL_WORKING "0")
-else()
-  SET(PRINTF_NULL_WORKING "1")
-endif()
-
 #AC_CHECK_VA_COPY
 
 set(diff_va "va_copy((d),(s))"