Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
modernize cabinet creation
[simgrid.git] / CMakeLists.txt
index 21d4b05..87a0e1e 100644 (file)
@@ -1,7 +1,7 @@
 # Build the version number
 
 set(SIMGRID_VERSION_MAJOR "3")
-set(SIMGRID_VERSION_MINOR "25")
+set(SIMGRID_VERSION_MINOR "27")
 set(SIMGRID_VERSION_PATCH "1") # odd => git branch; even => stable release or released snapshot
 
 if(${SIMGRID_VERSION_PATCH} EQUAL "0")
@@ -26,7 +26,10 @@ 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)
+
+# customizable installation directories
+include(GNUInstallDirs)
 
 ## Save compiler flags preset with environment variables CFLAGS or CXXFLAGS;
 ## they will used within smpicc, smpicxx.
@@ -48,15 +51,15 @@ 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_CXX_COMPILER_VERSION VERSION_LESS "5.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 5.0 to compile but you have ${CMAKE_CXX_COMPILER_VERSION}."
+            "You need a sufficient support of c++14 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 14)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
 set(CMAKE_C_STANDARD 11)
@@ -123,7 +126,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
@@ -134,12 +137,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)
@@ -176,7 +187,7 @@ if(WIN32)
   unset(CMAKE_INCLUDE_WIN)
 endif()
 
-# library dependency cannot start with a space (CMP0004), so initialize it with something that is never desactivated.
+# 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
@@ -194,6 +205,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()
@@ -224,8 +237,11 @@ set(SIMGRID_HAVE_NS3 0)
 if(enable_ns3)
   include(FindNS3)
   if (SIMGRID_HAVE_NS3)
+    if (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()
@@ -422,8 +438,6 @@ 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")
 endif()
 
-get_property(known_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES)
-
 if(enable_smpi)
   SET(HAVE_SMPI 1)
   if(WIN32)
@@ -550,10 +564,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_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}")
+set(libdir "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_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()
@@ -578,17 +592,17 @@ endforeach()
 
 ### 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)
@@ -638,6 +652,8 @@ if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
   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_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)
@@ -772,7 +788,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)
@@ -788,49 +806,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
@@ -842,7 +843,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()
@@ -851,7 +852,15 @@ 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}")