Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge selected changes from branch 'simgrid-Jesse-McDonald-master-patch-09242'
[simgrid.git] / CMakeLists.txt
index ff7ab6d..ca5ab2d 100644 (file)
@@ -1,11 +1,9 @@
 # Build the version number
 
 set(SIMGRID_VERSION_MAJOR "3")
-set(SIMGRID_VERSION_MINOR "25")
+set(SIMGRID_VERSION_MINOR "31")
 set(SIMGRID_VERSION_PATCH "1") # odd => git branch; even => stable release or released snapshot
 
-set(SIMGRID_VERSION_DATE  "2020") # Year for copyright information
-
 if(${SIMGRID_VERSION_PATCH} EQUAL "0")
   set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}")
 else()
@@ -21,21 +19,22 @@ set(libsimgrid-java_version "${release_version}")
 
 # Basic checks on cmake
 cmake_minimum_required(VERSION 3.5)
+#for lto, to avoid warning (should be removed when switching to requiring cmake >= 3.9)
+if(NOT CMAKE_VERSION VERSION_LESS "3.9")
+  cmake_policy(SET CMP0069 NEW)
+endif()
 message(STATUS "Cmake version ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/tools/cmake/Modules)
 
-project(SimGrid C CXX)
+project(simgrid C CXX)
 
-## Save compiler flags preset with environment variables CFLAGS or CXXFLAGS;
-## they will used within smpicc, smpicxx.
-## Do it early so that we get their genuine values. The same will be done later for Fortran.
-string(REGEX REPLACE " *-f[a-z]+-prefix-map=[^ ]*" "" SMPI_C_FLAGS "${CMAKE_C_FLAGS}")
-string(REGEX REPLACE " *-f[a-z]+-prefix-map=[^ ]*" "" SMPI_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+# customizable installation directories
+include(GNUInstallDirs)
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 #     Check for the compiler        #
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
-## 
+##
 ## Check the C/C++ standard that we need
 ##   See also tools/cmake/Flags.cmake that sets our paranoid warning flags
 INCLUDE(CheckCCompilerFlag)
@@ -45,16 +44,16 @@ CHECK_C_COMPILER_FLAG(-fstack-cleaner HAVE_C_STACK_CLEANER)
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
 
-if (CMAKE_COMPILER_IS_GNUCC)    
-  if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7")
+if (CMAKE_COMPILER_IS_GNUCC)
+  if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "7.0")
     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.")
+            "SimGrid needs at least g++ version 7.0 to compile but you have ${CMAKE_CXX_COMPILER_VERSION}."
+            "You need a sufficient support of c++17 to compile SimGrid.")
   endif()
 endif()
 
-## We need a decent support of the C++11 and C11 standards
-set(CMAKE_CXX_STANDARD 11)
+## We need a decent support of the C++14 and C11 standards
+set(CMAKE_CXX_STANDARD 17)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
 set(CMAKE_C_STANDARD 11)
@@ -72,16 +71,16 @@ find_package(Threads)
 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Option.cmake)
 
 ### SMPI vs. Fortran
-if ((NOT DEFINED enable_smpi) OR enable_smpi) 
+if ((NOT DEFINED enable_smpi) OR enable_smpi)
   # First unset the compiler in case we're re-running cmake over a previous
   # configuration where it was saved as smpiff
   unset(CMAKE_Fortran_COMPILER)
-  
+
   SET(SMPI_FORTRAN 0)
   if(enable_fortran)
     enable_language(Fortran OPTIONAL)
   endif()
-  
+
   if(CMAKE_Fortran_COMPILER)
 
     # Fortran compiler detected: save it, then replace by smpiff
@@ -89,19 +88,19 @@ if ((NOT DEFINED enable_smpi) OR enable_smpi)
 
        # Set flags/libs to be used in smpiff
     if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
-      set(SMPI_Fortran_FLAGS "\"-fpic\" \"-ff2c\" \"-fno-second-underscore\"")
+      set(SMPI_Fortran_FLAGS_ "\"-fpic\" \"-ff2c\" \"-fno-second-underscore\"")
       set(SMPI_Fortran_LIBS "\"-lgfortran\"")
       set(SMPI_GFORTRAN 1)
     elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel")
-      set(SMPI_Fortran_FLAGS "\"-fPIC\" \"-nofor-main\"")
+      set(SMPI_Fortran_FLAGS_ "\"-fPIC\" \"-nofor-main\"")
       set(SMPI_Fortran_LIBS "\"-lifcore\"")
       set(SMPI_IFORT 1)
     elseif(CMAKE_Fortran_COMPILER_ID MATCHES "PGI|Flang") # flang
-      set(SMPI_Fortran_FLAGS "\"-fPIC\"")
+      set(SMPI_Fortran_FLAGS_ "\"-fPIC\"")
       set(SMPI_Fortran_LIBS "")
       set(SMPI_FLANG 1)
     endif()
-    string(REGEX REPLACE " *-f[a-z]+-prefix-map=[^ ]*" "" SMPI_Fortran_FLAGS "${SMPI_Fortran_FLAGS} ${CMAKE_Fortran_FLAGS}")
+    set(SMPI_Fortran_FLAGS "${SMPI_Fortran_FLAGS_} ${SMPI_Fortran_FLAGS}")
 
     ## Request debugging flags for Fortran too
     set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g")
@@ -111,7 +110,7 @@ if ((NOT DEFINED enable_smpi) OR enable_smpi)
 
 endif()
 
-### SET THE LIBRARY EXTENSION 
+### SET THE LIBRARY EXTENSION
 if(APPLE)
   set(LIB_EXE "dylib")
 elseif(WIN32)
@@ -121,7 +120,7 @@ else()
   set(LIB_EXE "so")
 endif()
 
-execute_process(COMMAND ${CMAKE_LINKER} -version OUTPUT_VARIABLE LINKER_VERSION ERROR_VARIABLE LINKER_VERSION)
+execute_process(COMMAND ${CMAKE_LINKER} -v OUTPUT_VARIABLE LINKER_VERSION ERROR_VARIABLE LINKER_VERSION)
 string(REGEX MATCH "[0-9].[0-9]*" LINKER_VERSION "${LINKER_VERSION}")
 
 ### Find programs and paths
@@ -132,12 +131,20 @@ if(NOT PERL_FOUND)
 endif()
 
 # tesh.py needs python 3 (or the module python-subprocess32 on python2.8+)
-set(PythonInterp_FIND_VERSION 3)
-set(PythonInterp_FIND_VERSION_COUNT 1)
-set(PythonInterp_FIND_VERSION_MAJOR 3)
-include(FindPythonInterp)
-if(NOT PYTHONINTERP_FOUND)
-  message(FATAL_ERROR "Please install Python (version 3 or higher) to compile SimGrid.")
+if(CMAKE_VERSION VERSION_LESS "3.12")
+  set(PythonInterp_FIND_VERSION 3)
+  set(PythonInterp_FIND_VERSION_COUNT 1)
+  set(PythonInterp_FIND_VERSION_MAJOR 3)
+  include(FindPythonInterp)
+  if(NOT PYTHONINTERP_FOUND)
+    message(FATAL_ERROR "Please install Python (version 3 or higher) to compile SimGrid.")
+  endif()
+else()
+  find_package(Python3 COMPONENTS Interpreter Development)
+  if(NOT Python3_Interpreter_FOUND)
+    message(FATAL_ERROR "Please install Python (version 3 or higher) to compile SimGrid.")
+  endif()
+  set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
 endif()
 
 SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
@@ -174,8 +181,8 @@ if(WIN32)
   unset(CMAKE_INCLUDE_WIN)
 endif()
 
-# library dependency cannot start with a space (CMP0004), so initialize it with something that is never desactivated.
-set(SIMGRID_DEP "-lm") 
+# library dependency cannot start with a space (CMP0004), so initialize it with something that is never deactivated.
+set(SIMGRID_DEP "-lm")
 
 ### Determine the assembly flavor that we need today
 set(HAVE_RAW_CONTEXTS 0)
@@ -192,6 +199,8 @@ IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86|AMD64|amd64")
   ENDIF()
   if (WIN32)
     message(STATUS "Disable fast raw contexts on Windows.")
+  elseif(CMAKE_SIZEOF_VOID_P EQUAL 4 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+    message(STATUS "Disable fast raw contexts on x32 ABI.")
   else()
     set(HAVE_RAW_CONTEXTS 1)
   endif()
@@ -208,22 +217,21 @@ include(CheckLibraryExists)
 include(CheckSymbolExists)
 
 set(HAVE_GRAPHVIZ 0)
-set(SIMGRID_HAVE_LUA 0)
 if(minimal-bindings)
-  message(STATUS "Don't even look for graphviz nor lua, as we build minimal binding libraries.")
+  message(STATUS "Don't even look for graphviz, as we build minimal binding libraries.")
 else()
   include(FindGraphviz)
-  if(enable_lua)
-    include(FindLuaSimgrid)
-  endif()
 endif()
 
 set(SIMGRID_HAVE_NS3 0)
 if(enable_ns3)
   include(FindNS3)
   if (SIMGRID_HAVE_NS3)
+    if (NOT NS3_VERSION EQUAL "3-dev" AND NS3_VERSION VERSION_LESS "3.28")
+      message(FATAL_ERROR "SimGrid needs at least ns-3.28. Please upgrade or disable that cmake option.")
+    endif()
     set(SIMGRID_HAVE_NS3 1)
-    foreach(lib core csma point-to-point internet network applications)
+    foreach(lib core csma point-to-point internet network applications wifi)
       set(SIMGRID_DEP "${SIMGRID_DEP} -lns${NS3_VERSION}-${lib}${NS3_SUFFIX}")
     endforeach()
   else()
@@ -231,6 +239,22 @@ if(enable_ns3)
   endif()
 endif()
 
+### Check for Eigen library
+set(SIMGRID_HAVE_EIGEN3 0)
+find_package (Eigen3 3.3 CONFIG
+              HINTS ${EIGEN3_HINT})
+if (Eigen3_FOUND)
+  set(SIMGRID_HAVE_EIGEN3 1)
+  message(STATUS "Found Eigen3: ${EIGEN3_INCLUDE_DIR}")
+  include_directories(${EIGEN3_INCLUDE_DIR})
+  if ("3.3.4" VERSION_EQUAL EIGEN3_VERSION_STRING AND CMAKE_COMPILER_IS_GNUCC)
+    message(STATUS "Avoid build error of Eigen3 v3.3.4 using -Wno-error=int-in-bool-context")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=int-in-bool-context")
+  endif()
+else()
+  message(STATUS "Disabling model BMF because Eigen3 was not found. If it's installed, use EIGEN3_HINT to hint cmake about the location of Eigen3Config.cmake")
+endif()
+
 set(SIMGRID_HAVE_MSG 0)
 if(enable_msg)
   set(SIMGRID_HAVE_MSG 1)
@@ -302,7 +326,7 @@ set(_Boost_STACKTRACE_ADDR2LINE_HEADERS "boost/stacktrace.hpp")
         message(STATUS "Mandatory components found. SimGrid is compilable.")
       endif()
     endif()
-  endif() 
+  endif()
 
 # Checks for header libraries functions.
 CHECK_LIBRARY_EXISTS(rt      clock_gettime           "" HAVE_POSIX_GETTIME)
@@ -321,15 +345,11 @@ endif()
 
 CHECK_INCLUDE_FILE("valgrind/valgrind.h" HAVE_VALGRIND_H)
 CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
-CHECK_INCLUDE_FILE("signal.h" HAVE_SIGNAL_H)
-CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H)
-CHECK_INCLUDE_FILE("sys/sysctl.h" HAVE_SYS_SYSCTL_H)
 CHECK_INCLUDE_FILE("linux/futex.h" HAVE_FUTEX_H)
 
 CHECK_FUNCTION_EXISTS(dlfunc HAVE_DLFUNC)
 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
-CHECK_FUNCTION_EXISTS(getdtablesize HAVE_GETDTABLESIZE)
 CHECK_FUNCTION_EXISTS(sysconf HAVE_SYSCONF)
 CHECK_FUNCTION_EXISTS(process_vm_readv HAVE_PROCESS_VM_READV)
 CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP)
@@ -356,6 +376,10 @@ if(enable_model-checking AND NOT "${CMAKE_SYSTEM}" MATCHES "Linux|FreeBSD")
   set(enable_model-checking FALSE)
 endif()
 
+if(enable_model-checking AND minimal-bindings)
+  message(FATAL_ERROR "Compile-time option 'minimal-bindings' cannot be enabled with 'model-checking'")
+endif()
+
 if(HAVE_MMAP)
   SET(HAVE_MMALLOC 1)
 else()
@@ -366,35 +390,19 @@ else()
   SET(enable_model-checking 0)
 endif()
 
-if(enable_jedule)
-  set(SIMGRID_HAVE_JEDULE 1)
-else()
-  set(SIMGRID_HAVE_JEDULE 0)
-endif()
-
 if(enable_mallocators)
   SET(SIMGRID_HAVE_MALLOCATOR 1)
 else()
   SET(SIMGRID_HAVE_MALLOCATOR 0)
 endif()
 
-if (minimal-bindings)
-  message(STATUS "Don't look for libunwind as we build minimal binding libraries.")
-  if(enable_model-checking)
-    message(FATAL_ERROR "You cannot enable model-checking and minimal-bindings at the same time.")
-  endif()
-else()
+if(enable_model-checking)
   include(FindLibunwind)
   if(HAVE_LIBUNWIND)
     SET(SIMGRID_DEP "${SIMGRID_DEP} ${LIBUNWIND_LIBRARIES}")
   else()
-    if(enable_model-checking)
-      message(FATAL_ERROR "Please install libunwind-dev libdw-dev libelf-dev libevent-dev if you want to compile the SimGrid model checker.")
-    endif()
+    message(FATAL_ERROR "Please install libunwind-dev libdw-dev libelf-dev libevent-dev if you want to compile the SimGrid model checker.")
   endif()
-endif()
-
-if(enable_model-checking)
   find_package(Libdw REQUIRED)
   find_package(Libelf REQUIRED)
   find_package(Libevent REQUIRED)
@@ -406,7 +414,7 @@ if(enable_model-checking)
     set(enable_java FALSE)
   endif()
 else()
-  SET(SIMGRID_HAVE_MC 0)  
+  SET(SIMGRID_HAVE_MC 0)
   set(HAVE_MMALLOC 0)
 endif()
 mark_as_advanced(PATH_LIBDW_H)
@@ -417,11 +425,9 @@ if(enable_java AND NOT enable_msg)
 endif()
 
 if (enable_model-checking AND enable_ns3)
-  message(FATAL_ERROR "Cannot activate both model-checking and ns-3 bindings: ns-3 pulls too much dependencies for the MC to work")
+  message(WARNING "Activating both model-checking and ns-3 bindings is considered experimental.")
 endif()
 
-get_property(known_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES)
-
 if(enable_smpi)
   SET(HAVE_SMPI 1)
   if(WIN32)
@@ -548,10 +554,10 @@ file(READ ${CMAKE_HOME_DIRECTORY}/src/smpi/smpitools.sh SMPITOOLS_SH) # Definiti
 
 ### SMPI script used when simgrid is installed
 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
-set(includeflag "-I${CMAKE_INSTALL_PREFIX}/include -I${CMAKE_INSTALL_PREFIX}/include/smpi")
-set(includedir "${CMAKE_INSTALL_PREFIX}/include")
-set(libdir ${exec_prefix}/lib)
-set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${CMAKE_INSTALL_PREFIX}/lib")
+set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
+set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
+set(includeflag "\"-I${includedir}\" \"-I${includedir}/smpi\"")
+set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${libdir}")
 if(NS3_LIBRARY_PATH)
   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
 endif()
@@ -574,19 +580,19 @@ foreach(script cc cxx ff f90 run)
   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/bin/smpi${script} @ONLY)
 endforeach()
 
-### SMPI scripts used when compiling simgrid 
+### SMPI scripts used when compiling simgrid
 set(exec_prefix "${CMAKE_BINARY_DIR}/smpi_script/")
-set(includeflag "-I${CMAKE_HOME_DIRECTORY}/include -I${CMAKE_HOME_DIRECTORY}/include/smpi")
-set(includeflag "${includeflag} -I${CMAKE_BINARY_DIR}/include -I${CMAKE_BINARY_DIR}/include/smpi")
 set(includedir "${CMAKE_HOME_DIRECTORY}/include")
 set(libdir "${CMAKE_BINARY_DIR}/lib")
-set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${CMAKE_BINARY_DIR}/lib")
+set(includeflag "\"-I${includedir}\" \"-I${includedir}/smpi\"")
+set(includeflag "${includeflag} \"-I${CMAKE_BINARY_DIR}/include\" \"-I${CMAKE_BINARY_DIR}/include/smpi\"")
+set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${libdir}")
 if(NS3_LIBRARY_PATH)
   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
 endif()
 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
-set(SMPIMAIN ${CMAKE_BINARY_DIR}/lib/simgrid/smpimain)
-set(SMPIREPLAYMAIN ${CMAKE_BINARY_DIR}/lib/simgrid/smpireplaymain)
+set(SMPIMAIN ${libdir}/simgrid/smpimain)
+set(SMPIREPLAYMAIN ${libdir}/simgrid/smpireplaymain)
 
 foreach(script cc cxx ff f90 run)
   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script} @ONLY)
@@ -635,7 +641,10 @@ if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
   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}/teshsuite/smpi/hostfile_cluster ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_cluster COPYONLY)
+  configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_griffon ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_griffon COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_coll ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_coll COPYONLY)
+  configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_io ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_io COPYONLY)
+  configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_empty ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_empty 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)
@@ -770,7 +779,9 @@ endif()
 SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
   "${generated_files_to_clean}")
 
-add_custom_target(tests COMMENT "Recompiling the tests")
+add_custom_target(tests    COMMENT "Recompiling the tests")
+add_custom_target(tests-mc COMMENT "Recompiling the MC tests and tools.")
+add_dependencies(tests tests-mc)
 
 ### Build some Maintainer files
 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MaintainerMode.cmake)
@@ -786,49 +797,32 @@ if(enable_java)
   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Java.cmake)
 endif()
 
-if (enable_model-checking AND (NOT ("cxx_std_14" IN_LIST known_features)))
-  message(WARNING "C++14 not found. The model-checker will use a slow hash function. You should upgrade your compiler")
-  set(SG_HAVE_CPP14 0)
-else()
-  set(SG_HAVE_CPP14 1)
-  set_property(TARGET simgrid PROPERTY CXX_STANDARD 14)    
-endif()
-
 # Python binding (with pybind11)
 ################
-# Our usage of pybind11::overload_cast mandates C++14
 if((NOT DEFINED enable_python) OR enable_python)
-  if("cxx_std_14" IN_LIST known_features)
-
-    if(EXISTS ${CMAKE_HOME_DIRECTORY}/pybind11) # Try to use a local copy of pybind11, if any
-      message(STATUS "Use the internal copy of pybind11 (using C++14).")
-      add_subdirectory(${CMAKE_HOME_DIRECTORY}/pybind11)
-      set(pybind11_FOUND ON)
-
-      set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/pybind11/tools/)
-      set(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5 3.4)
-      find_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} REQUIRED)
-
-    else()
-      find_package(pybind11 CONFIG)
-      message(STATUS "Pybind11 version: ${pybind11_VERSION}")
-      if (pybind11_VERSION VERSION_LESS 2.4)
-        message(STATUS "SimGrid needs at least v2.4 of pybind11. Disabling the Python bindings.")
-        set(pybind11_FOUND OFF)
-      endif()
-    endif()
+  if(EXISTS ${CMAKE_HOME_DIRECTORY}/pybind11) # Try to use a local copy of pybind11, if any
+    message(STATUS "Use the internal copy of pybind11.")
+    add_subdirectory(${CMAKE_HOME_DIRECTORY}/pybind11)
+    set(pybind11_FOUND ON)
 
-    if(NOT PYTHONLIBS_FOUND)
-      message(STATUS "Python libs not found. Turn pybind11 off.")
+    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/pybind11/tools/)
+    set(Python_ADDITIONAL_VERSIONS 3.9 3.8 3.7 3.6 3.5 3.4)
+    find_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} REQUIRED)
 
+  else()
+    find_package(pybind11 CONFIG)
+    message(STATUS "Pybind11 version: ${pybind11_VERSION}")
+    if (pybind11_VERSION VERSION_LESS 2.4)
+      message(STATUS "SimGrid needs at least v2.4 of pybind11. Disabling the Python bindings.")
       set(pybind11_FOUND OFF)
     endif()
+  endif()
+
+  if(NOT PYTHONLIBS_FOUND AND NOT Python3_Development_FOUND)
+    message(STATUS "Python libs not found. Turn pybind11 off.")
 
-  else()
-    message(STATUS "No support for C++14 detected, don't even search for pybind11.")
     set(pybind11_FOUND OFF)
   endif()
-  unset(known_features)
 endif()
 
 option(enable_python "Whether the Python bindings are activated." ${pybind11_FOUND}) # ON by default if dependencies are met
@@ -840,7 +834,7 @@ endif()
 
 if(enable_python)
   if(pybind11_FOUND)
-    message(STATUS "Found pybind11, with C++14.")
+    message(STATUS "Found pybind11.")
     if(NOT enable_lto)
       set(pybind11_options NO_EXTRAS)
     endif()
@@ -849,10 +843,28 @@ if(enable_python)
     target_link_libraries(python-bindings PUBLIC simgrid)
     set_target_properties(python-bindings PROPERTIES
                           LIBRARY_OUTPUT_NAME simgrid
-                          CXX_VISIBILITY_PRESET "default")
+                          CXX_VISIBILITY_PRESET "default"
+                          INTERPROCEDURAL_OPTIMIZATION FALSE)
+    # LTO is disabled here from the python bindings because this makes a
+    # cmake warning about CMP0069 even when this policy is set. This
+    # problem may be in cmake, in pybind11 or even in our code, not sure.
+    # It may get eventually solved in cmake or pybind11. Or not.
+    # The sure thing is that our python bindings are in one file only,
+    # so there is no need for LTO here. Problem solved :)
+
     add_dependencies(tests python-bindings)
     set_property(TARGET python-bindings
                  APPEND PROPERTY INCLUDE_DIRECTORIES "${INTERNAL_INCLUDES}")
+
+    if("${SIMGRID_PYTHON_LIBDIR}" STREQUAL "") # value not manually set
+      if("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
+        set(SIMGRID_PYTHON_LIBDIR ${Python3_SITEARCH})
+      else("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
+        string(REGEX REPLACE "^/usr/" "${CMAKE_INSTALL_PREFIX}/" SIMGRID_PYTHON_LIBDIR ${Python3_SITEARCH})
+      endif("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
+    endif()
+    install(TARGETS python-bindings
+           LIBRARY DESTINATION "${SIMGRID_PYTHON_LIBDIR}")
   else()
     message(FATAL_ERROR "Please install pybind11-dev to build the Python bindings (or disable that option).")
   endif()
@@ -957,13 +969,19 @@ endif()
 if(pybind11_FOUND)
   message("        Compile Python bindings .....: ${enable_python}")
   message("          module ....................: ${PYTHON_MODULE_PREFIX}simgrid${PYTHON_MODULE_EXTENSION}")
+  message("          install path ..............: ${SIMGRID_PYTHON_LIBDIR} (force another value with -DSIMGRID_PYTHON_LIBDIR)")
 else()
   message("        Compile Python bindings .....: OFF (disabled, or pybind11 not found)")
 endif()
-message("        Compile Lua .................: ${SIMGRID_HAVE_LUA}")
+if(Eigen3_FOUND)
+  message("        Eigen3 library ..............: ${EIGEN3_VERSION_STRING} in ${EIGEN3_INCLUDE_DIR}")
+else()
+  message("        Eigen3 library ..............: not found (EIGEN3_HINT='${EIGEN3_HINT}').")
+endif()
 message("        Compile Smpi ................: ${HAVE_SMPI}")
 message("          Smpi fortran ..............: ${SMPI_FORTRAN}")
 message("          MPICH3 testsuite ..........: ${enable_smpi_MPICH3_testsuite}")
+message("          MBI testsuite .............: ${enable_smpi_MBI_testsuite}")
 message("          Privatization .............: ${HAVE_PRIVATIZATION}")
 message("          PAPI support...............: ${HAVE_PAPI}")
 message("        Compile Boost.Context support: ${HAVE_BOOST_CONTEXTS}")
@@ -971,7 +989,6 @@ message("")
 message("        Maintainer mode .............: ${enable_maintainer_mode}")
 message("        Documentation................: ${enable_documentation}")
 message("        Model checking ..............: ${SIMGRID_HAVE_MC}")
-message("        Jedule  mode ................: ${SIMGRID_HAVE_JEDULE}")
 message("        Graphviz mode ...............: ${HAVE_GRAPHVIZ}")
 message("        Mallocators .................: ${enable_mallocators}")
 message("")