Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
how many useless functions can this code possibly contain?
[simgrid.git] / CMakeLists.txt
index fa02471..e60e45a 100644 (file)
@@ -16,63 +16,66 @@ endif()
 ## 
 ## Check the C/C++ standard that we need
 ##   See also tools/cmake/GCCFlags.cmake that sets our paranoid warning flags
-if (MSVC)
-  message("-- You are compiling SimGrid with MicroSoft Visual C. Good luck.")
-
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_SCL_SECURE_NO_WARNINGS")
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_SCL_SECURE_NO_WARNINGS")
-else() # gcc or clang
-  INCLUDE(CheckCCompilerFlag)
-  CHECK_C_COMPILER_FLAG(-fstack-cleaner HAVE_C_STACK_CLEANER)
-
-  ## Request full debugging flags
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
-  set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g")
-
-  if (CMAKE_COMPILER_IS_GNUCC)    
-    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7")
-      message(FATAL_ERROR
-              "SimGrid needs at least g++ version 4.7 to compile but you have ${CMAKE_CXX_COMPILER_VERSION}."
-             "You need a sufficient support of c++11 to compile SimGrid.")
-    endif()
+INCLUDE(CheckCCompilerFlag)
+CHECK_C_COMPILER_FLAG(-fstack-cleaner HAVE_C_STACK_CLEANER)
+
+## Request full debugging flags
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
+set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g")
+
+if (CMAKE_COMPILER_IS_GNUCC)    
+  if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7")
+    message(FATAL_ERROR
+            "SimGrid needs at least g++ version 4.7 to compile but you have ${CMAKE_CXX_COMPILER_VERSION}."
+            "You need a sufficient support of c++11 to compile SimGrid.")
   endif()
+endif()
 
-  ## We need a decent support of the c++11 standard
-  include(CheckCXXCompilerFlag)
-  CHECK_CXX_COMPILER_FLAG("-std=gnu++11" COMPILER_SUPPORTS_CXX11)
-  if(COMPILER_SUPPORTS_CXX11)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
-  else() 
-    message(FATAL_ERROR 
-            "The compiler ${CMAKE_CXX_COMPILER} (v${CMAKE_CXX_COMPILER_VERSION}) has no C++11 support. "
-            "Please use a decent C++ compiler.")
-  endif()
+## We need a decent support of the c++11 standard
+include(CheckCXXCompilerFlag)
+CHECK_CXX_COMPILER_FLAG("-std=gnu++11" COMPILER_SUPPORTS_CXX11)
+if(COMPILER_SUPPORTS_CXX11)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
+else() 
+  message(FATAL_ERROR 
+          "The compiler ${CMAKE_CXX_COMPILER} (v${CMAKE_CXX_COMPILER_VERSION}) has no C++11 support. "
+           "Please use a decent C++ compiler.")
+endif()
 
-  ### And we need C11 standard, too
-  include(CheckCCompilerFlag)
-  CHECK_C_COMPILER_FLAG("-std=gnu11" COMPILER_SUPPORTS_C11)
-  if(COMPILER_SUPPORTS_C11)
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
-  else()
-    message(FATAL_ERROR 
-            "The compiler ${CMAKE_C_COMPILER} (v${CMAKE_C_COMPILER_VERSION}) has no C11 support. "
-            "Please use a decent C compiler "
-            "(note that c++11 support of ${CMAKE_CXX_COMPILER} seems ok).")
-  endif()
-  if(APPLE AND (CMAKE_C_COMPILER_VERSION VERSION_LESS "4.6"))
-      ### gcc 4.[1-5] cannot compile ucontext on OSX
-      message(STATUS "Ucontext can't be used with this version of gcc (must be greater than 4.5)")
-      set(HAVE_UCONTEXT_H 0)
-  endif()
-endif() # NOT MSVC
+### And we need C11 standard, too
+include(CheckCCompilerFlag)
+CHECK_C_COMPILER_FLAG("-std=gnu11" COMPILER_SUPPORTS_C11)
+if(COMPILER_SUPPORTS_C11)
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
+else()
+  message(FATAL_ERROR 
+          "The compiler ${CMAKE_C_COMPILER} (v${CMAKE_C_COMPILER_VERSION}) has no C11 support. "
+          "Please use a decent C compiler "
+          "(note that c++11 support of ${CMAKE_CXX_COMPILER} seems ok).")
+endif()
+if(APPLE AND (CMAKE_C_COMPILER_VERSION VERSION_LESS "4.6"))
+  ### gcc 4.[1-5] cannot compile ucontext on OSX
+  message(STATUS "Ucontext can't be used with this version of gcc (must be greater than 4.5)")
+  set(HAVE_UCONTEXT_H 0)
+endif()
+
+
+### Setup Options
+include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Option.cmake)
 
 ### SMPI vs. Fortran
-if ((NOT DEFINED enable_smpi OR enable_smpi) AND NOT APPLE) # smpi is enabled by default
-  # Call enable_language(Fortran) in order to load the build rules for
-  # this language, needed by teshsuite/smpi/mpich-test/.  Use
-  # CMAKE_FORCE_Fortran_COMPILER to bypass checks for a working
-  # compiler (smpiff don't exist at configure time).
+if ((NOT DEFINED enable_smpi) OR enable_smpi) 
+  if(enable_fortran)
+    include(FindGFortran)
+  else()
+    SET(SMPI_FORTRAN 0)
+  endif()
+  
+  if(NOT APPLE) # smpi is enabled by default
+  # Call enable_language(Fortran) in order to load the build rules for this language, needed by 
+  # teshsuite/smpi/mpich-test/.  Use CMAKE_FORCE_Fortran_COMPILER to bypass checks for a working compiler (smpiff 
+  # doesn't exist at configure time).
   include(CMakeForceCompiler)
   if(NOT COMMAND CMAKE_FORCE_Fortran_COMPILER)
     MACRO(CMAKE_FORCE_Fortran_COMPILER compiler id)
@@ -90,6 +93,7 @@ if ((NOT DEFINED enable_smpi OR enable_smpi) AND NOT APPLE) # smpi is enabled by
   endif()
   CMAKE_FORCE_Fortran_COMPILER(smpiff smpiff)
   enable_language(Fortran OPTIONAL)
+  endif()
 endif()
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
@@ -98,8 +102,8 @@ endif()
 
 set(SIMGRID_VERSION_MAJOR "3")
 set(SIMGRID_VERSION_MINOR "13")
-set(SIMGRID_VERSION_PATCH "0")
-set(SIMGRID_VERSION_EXTRA "-devel") # Extra words to add to version string (e.g. -rc1)
+set(SIMGRID_VERSION_PATCH "90")
+set(SIMGRID_VERSION_EXTRA "-prealpha") # Extra words to add to version string (e.g. -rc1)
 
 set(SIMGRID_VERSION_DATE  "2016") # Year for copyright information
 
@@ -126,8 +130,7 @@ else()
   endif()
 endif()
 
-execute_process(COMMAND         ${CMAKE_LINKER} --version
-                OUTPUT_VARIABLE LINKER_VERSION)
+execute_process(COMMAND   ${CMAKE_LINKER}   --version    OUTPUT_VARIABLE LINKER_VERSION)
 string(REGEX MATCH "[0-9].[0-9]*" LINKER_VERSION "${LINKER_VERSION}")
 
 ### Find programs and paths
@@ -164,20 +167,17 @@ ELSE()
 ENDIF()
 
 if(WIN32)
-
   set(CMAKE_INCLUDE_WIN "${CMAKE_C_COMPILER}")
   set(CMAKE_LIB_WIN "${CMAKE_C_COMPILER}")
   string(REGEX REPLACE "/bin/gcc.*" "/include"  CMAKE_INCLUDE_WIN "${CMAKE_INCLUDE_WIN}")
   string(REGEX REPLACE "/bin/gcc.*" "/lib"  CMAKE_LIB_WIN "${CMAKE_LIB_WIN}")
   set(INCLUDES ${INCLUDES} ${CMAKE_INCLUDE_WIN})
   unset(CMAKE_INCLUDE_WIN)
-
 endif()
 
 include_directories(${INCLUDES})
 
-### Setup Options
-include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Option.cmake)
+
 
 ### Determine the assembly flavor that we need today
 set(HAVE_RAW_CONTEXTS 0)
@@ -228,6 +228,13 @@ endif()
 if(WIN32)
   set(Boost_USE_STATIC_LIBS 1)
 endif()
+set(HAVE_PAPI 0)
+if(enable_smpi_papi)
+  include(FindPAPI)
+  if (NOT HAVE_PAPI)
+    message(FATAL_ERROR "Cannot find PAPI. Please install it (apt-get install papi-tools libpapi-dev) or disable PAPI bindings.")
+  endif()
+endif()
 
 find_package(Boost 1.48)
 if(Boost_FOUND)
@@ -243,39 +250,49 @@ else()
   endif()
 endif()
 
-# Try again to see if we have libboost-context
-find_package(Boost 1.42 COMPONENTS context)
-set(Boost_FOUND 1) # We don't care of whether this component is missing
+#Boost context 1.61 will break compatibility with our implementation.
+#Warn users about that
+find_package(Boost 1.61 COMPONENTS context)
 
 if(Boost_FOUND AND Boost_CONTEXT_FOUND)
-  # We should use feature detection for this instead:
-  if (Boost_VERSION LESS 105600)
-    message("Found Boost.Context API v1")
-    set(HAVE_BOOST_CONTEXTS 1)
+  message("WARNING : our implementation of Boost context factory is not compatible with Boost >=1.61 yet.")
+
+  set(Boost_FOUND 1)
+  set(HAVE_BOOST_CONTEXTS 0)
+else()
+# Try again to see if we have libboost-context
+  find_package(Boost 1.42 COMPONENTS context)
+  set(Boost_FOUND 1) # We don't care of whether this component is missing
+
+  if(Boost_FOUND AND Boost_CONTEXT_FOUND)
+    # We should use feature detection for this instead:
+    if (Boost_VERSION LESS 105600)
+      message("Found Boost.Context API v1")
+      set(HAVE_BOOST_CONTEXTS 1)
+    else()
+      message("Found Boost.Context API v2")
+      set(HAVE_BOOST_CONTEXTS 2)
+    endif()
   else()
-    message("Found Boost.Context API v2")
-    set(HAVE_BOOST_CONTEXTS 2)
+    message ("   boost        : found.")
+    message ("   boost-context: missing. Install libboost-context-dev for this optional feature.")
+    set(HAVE_BOOST_CONTEXTS 0)
   endif()
-else()
-  message ("   boost        : found.")
-  message ("   boost-context: missing. Install libboost-context-dev for this optional feature.")
-  set(HAVE_BOOST_CONTEXTS 0)
 endif()
 
-# Try again to see if we have libboost-context
-find_package(Boost 1.42 COMPONENTS context)
-set(Boost_FOUND 1) # We don't care of whether this component is missing
-
-if(Boost_FOUND AND Boost_GRAPH_FOUND)
-  set(HAVE_BOOST_GRAPH 1)
-else()
-  message ("   boost        : found.")
-  message ("   boost-graph  : missing. Install libboost-graph-dev for this optional feature.")
-  set(HAVE_BOOST_GRAPH 0)
-endif()
+# Try again to see if we have libboost-graph
+#find_package(Boost 1.42 COMPONENTS graph)
+#set(Boost_FOUND 1) # We don't care of whether this component is missing
+#
+#if(Boost_FOUND AND Boost_GRAPH_FOUND)
+#  set(HAVE_BOOST_GRAPH 1)
+#else()
+#  message ("   boost        : found.")
+#  message ("   boost-graph  : missing. Install libboost-graph-dev for this optional feature.")
+#  set(HAVE_BOOST_GRAPH 0)
+#endif()
 
 # Checks for header libraries functions.
-CHECK_LIBRARY_EXISTS(execinfo backtrace              "" HAVE_BACKTRACE_IN_LIBEXECINFO)
 CHECK_LIBRARY_EXISTS(rt      clock_gettime           "" HAVE_POSIX_GETTIME)
 
 CHECK_LIBRARY_EXISTS(pthread pthread_create          "" HAVE_PTHREAD)
@@ -303,6 +320,7 @@ CHECK_INCLUDE_FILE("sys/sysctl.h" HAVE_SYS_SYSCTL_H)
 CHECK_INCLUDE_FILE("ucontext.h" HAVE_UCONTEXT_H)
 CHECK_INCLUDE_FILE("linux/futex.h" HAVE_FUTEX_H)
 
+CHECK_FUNCTION_EXISTS(backtrace HAVE_BACKTRACE)
 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
 CHECK_FUNCTION_EXISTS(getdtablesize HAVE_GETDTABLESIZE)
@@ -371,8 +389,11 @@ else()
   SET(HAVE_MMALLOC 0)
 endif()
 
+if (enable_model-checking AND enable_ns3)
+  message(FATAL_ERROR "Cannot activate both model-checking and NS3 bindings: NS3 pull too much dependencies for the MC to work")
+endif()
+
 if(enable_smpi)
-  include(FindGFortran)
   SET(HAVE_SMPI 1)
   if("${CMAKE_SYSTEM}" MATCHES "Linux")
     SET(USE_LIBUTIL 0)
@@ -392,41 +413,38 @@ 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 -ldl -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}")
+  execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_gnu_dynlinker.c -ldl -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()
-
-      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)
+      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
 
 set(HAVE_THREAD_CONTEXTS 0)
-
 if(HAVE_PTHREAD)
   ### Test that we have a way to create semaphores
 
@@ -469,7 +487,6 @@ if(HAVE_PTHREAD)
       endif()
     endif()
     file(REMOVE sem_open)
-
   else()
     set(HAVE_SEM_OPEN 0)
   endif()
@@ -523,7 +540,6 @@ if(HAVE_PTHREAD)
   message("-- Support for thread context factory ok.")
 endif()
 
-
 set(HAVE_UCONTEXT_CONTEXTS 0)
 if(NOT HAVE_UCONTEXT_H)
   message("-- No ucontext factory: <ucontext.h> not found.")
@@ -533,7 +549,7 @@ elseif(APPLE)
 else()
   try_compile(compile_makecontext ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_makecontext.c
     OUTPUT_VARIABLE compile_makecontext_output)
-  
+
   #If can have both context
   if(compile_makecontext)
     set(HAVE_UCONTEXT_CONTEXTS 1)
@@ -611,14 +627,14 @@ if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/)
        OUTPUT_VARIABLE GIT_VERSION
        OUTPUT_STRIP_TRAILING_WHITESPACE)
     message(STATUS "Git version: ${GIT_VERSION}")
-    
+
     execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log -n 1 --pretty=format:%ai .
        WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
        OUTPUT_VARIABLE GIT_DATE 
        OUTPUT_STRIP_TRAILING_WHITESPACE)
     message(STATUS "Git date: ${GIT_DATE}")
     string(REGEX REPLACE " .*" "" GIT_VERSION "${GIT_VERSION}")
-    
+
     execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --pretty=format:%H -1
        WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
        OUTPUT_VARIABLE SIMGRID_GITHASH
@@ -628,7 +644,6 @@ elseif(EXISTS ${CMAKE_HOME_DIRECTORY}/.gitversion)
   FILE(STRINGS ${CMAKE_HOME_DIRECTORY}/.gitversion GIT_VERSION)
 endif()
 
-
 ### Generate the required headers and scripts
 #############################################
 
@@ -638,10 +653,9 @@ endif()
 # So we include only where needed, and compile with -Wundef to notice the missing includes.
 # But cmake sometimes defines to the empty definition (#define HAVE_VALGRIND_H).
 # So we have to make sure that everything got a decent value before generating the files.
-foreach(var HAVE_EXECINFO_H HAVE_FUTEX_H HAVE_GETDTABLESIZE HAVE_GETTIMEOFDAY HAVE_MMAP
-            HAVE_NANOSLEEP  HAVE_POPEN HAVE_POSIX_GETTIME HAVE_PROCESS_VM_READV HAVE_SIGNAL_H
-           HAVE_SYS_PARAM_H HAVE_SYS_SYSCTL_H HAVE_SYSCONF HAVE_UCONTEXT_H HAVE_UNISTD_H
-           HAVE_VALGRIND_H HAVE_VASPRINTF)
+foreach(var HAVE_BACKTRACE HAVE_EXECINFO_H HAVE_FUTEX_H HAVE_GETDTABLESIZE HAVE_GETTIMEOFDAY HAVE_MMAP HAVE_NANOSLEEP HAVE_POPEN
+            HAVE_POSIX_GETTIME HAVE_PROCESS_VM_READV HAVE_SIGNAL_H HAVE_SYS_PARAM_H HAVE_SYS_SYSCTL_H HAVE_SYSCONF 
+            HAVE_UCONTEXT_H HAVE_UNISTD_H HAVE_VALGRIND_H HAVE_VASPRINTF)
   if(${var})
     set(${var} 1)
   else()
@@ -706,9 +720,7 @@ set(generated_headers_to_install
   ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid_config.h
   )
 
-set(generated_headers
-  ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h
-  )
+set(generated_headers  ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h )
 
 set(generated_files_to_clean
   ${generated_headers}
@@ -737,7 +749,7 @@ if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_gather.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allgatherv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile COPYONLY)
-  
+
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/description_file ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/README ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/smpi_replay.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt COPYONLY)
@@ -967,6 +979,7 @@ message("        Compile Smpi ................: ${HAVE_SMPI}")
 message("          Smpi fortran ..............: ${SMPI_FORTRAN}")
 message("          MPICH3 testsuite ..........: ${enable_smpi_MPICH3_testsuite}")
 message("          Privatization .............: ${HAVE_PRIVATIZATION}")
+message("          PAPI support...............: ${HAVE_PAPI}")
 message("        Compile Boost.Context support: ${HAVE_BOOST_CONTEXTS}")
 message("")
 message("        Maintainer mode .............: ${enable_maintainer_mode}")