Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove some restrictions on enable_model-checking now that it's only for the stateless MC
[simgrid.git] / CMakeLists.txt
1 # Build the version number
2
3 set(SIMGRID_VERSION_MAJOR "3")
4 set(SIMGRID_VERSION_MINOR "34")
5 set(SIMGRID_VERSION_PATCH "1") # odd => git branch; even => stable release or released snapshot
6
7 if(${SIMGRID_VERSION_PATCH} EQUAL "0")
8   set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}")
9 else()
10   set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}.${SIMGRID_VERSION_PATCH}")
11 endif()
12
13 if(WIN32 OR MINGW)
14   message(FATAL_ERROR "SimGrid does not build on native windows, nor with MinGW. Please use WSL2 instead.")
15 endif()
16
17 message(STATUS "Configuring SimGrid v${release_version}")
18
19 set(SIMGRID_VERSION_STRING "SimGrid version ${release_version}")
20
21 set(libsimgrid_version "${release_version}")
22
23 # Basic checks on cmake
24 cmake_minimum_required(VERSION 3.12)
25 # once we move CMake to >= 3.13, we should use target_link_option in examples/sthread
26 # once we move CMake to >= 3.13.1, we could get rid of _Boost_STACKTRACE_BACKTRACE_HEADERS
27 message(STATUS "Cmake version ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
28 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/tools/cmake/Modules)
29
30 project(simgrid C CXX)
31
32 # customizable installation directories
33 include(GNUInstallDirs)
34
35 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
36 #     Check for the compiler        #
37 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
38
39 ## Request full debugging flags
40 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
41 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
42
43 if (CMAKE_COMPILER_IS_GNUCC)
44   if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "7.0")
45     message(FATAL_ERROR
46             "SimGrid needs at least g++ version 7.0 to compile but you have ${CMAKE_CXX_COMPILER_VERSION}."
47             "You need a sufficient support of c++17 to compile SimGrid.")
48   endif()
49 endif()
50
51 ## We need a decent support of the C++17 and C11 standards
52 set(CMAKE_CXX_STANDARD 17)
53 set(CMAKE_CXX_STANDARD_REQUIRED ON)
54
55 set(CMAKE_C_STANDARD 11)
56 set(CMAKE_C_STANDARD_REQUIRED ON)
57
58 if (CMAKE_C_COMPILER_ID STREQUAL "Intel" AND CMAKE_C11_EXTENSION_COMPILE_OPTION STREQUAL "-std=c11")
59   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
60 endif()
61
62 ### Check threading support
63 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
64 find_package(Threads)
65
66 ### Setup Options
67 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Option.cmake)
68
69 ### SMPI vs. Fortran
70 if ((NOT DEFINED enable_smpi) OR enable_smpi)
71   # First unset the compiler in case we're re-running cmake over a previous
72   # configuration where it was saved as smpiff
73   unset(CMAKE_Fortran_COMPILER)
74
75   SET(SMPI_FORTRAN OFF)
76   if(enable_fortran)
77     enable_language(Fortran OPTIONAL)
78   endif()
79
80   if(CMAKE_Fortran_COMPILER)
81
82     # Fortran compiler detected: save it, then replace by smpiff
83     set(SMPI_Fortran_COMPILER "${CMAKE_Fortran_COMPILER}" CACHE FILEPATH "The real Fortran compiler")
84
85         # Set flags/libs to be used in smpiff
86     if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
87       set(SMPI_Fortran_FLAGS_ "\"-fpic\" \"-ff2c\" \"-fno-second-underscore\"")
88       set(SMPI_Fortran_LIBS "\"-lgfortran\"")
89       set(SMPI_GFORTRAN 1)
90     elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel")
91       set(SMPI_Fortran_FLAGS_ "\"-fPIC\" \"-nofor-main\"")
92       set(SMPI_Fortran_LIBS "\"-lifcore\"")
93       set(SMPI_IFORT 1)
94     elseif(CMAKE_Fortran_COMPILER_ID MATCHES "PGI|Flang") # flang
95       set(SMPI_Fortran_FLAGS_ "\"-fPIC\"")
96       set(SMPI_Fortran_LIBS "")
97       set(SMPI_FLANG 1)
98     endif()
99     set(SMPI_Fortran_FLAGS "${SMPI_Fortran_FLAGS_} ${SMPI_Fortran_FLAGS}")
100
101     ## Request debugging flags for Fortran too
102     set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g")
103
104     set(SMPI_FORTRAN ON)
105   endif(CMAKE_Fortran_COMPILER)
106
107 endif()
108
109 ### SET THE LIBRARY EXTENSION
110 if(APPLE)
111   set(LIB_EXE "dylib")
112 else()
113   set(LIB_EXE "so")
114 endif()
115
116 execute_process(COMMAND ${CMAKE_LINKER} -v OUTPUT_VARIABLE LINKER_VERSION ERROR_VARIABLE LINKER_VERSION)
117 string(REGEX MATCH "[0-9].[0-9]*" LINKER_VERSION "${LINKER_VERSION}")
118
119 ### Find programs and paths
120 FIND_PROGRAM(GCOV_PATH gcov)
121 include(FindPerl)
122 if(NOT PERL_FOUND)
123   message(FATAL_ERROR "Please install Perl to compile SimGrid.")
124 endif()
125
126 # tesh.py needs python 3 (or the module python-subprocess32 on python2.8+)
127 find_package(Python3 COMPONENTS Interpreter)
128 if(NOT Python3_Interpreter_FOUND)
129   message(FATAL_ERROR "Please install Python (version 3 or higher) to compile SimGrid.")
130 endif()
131 set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
132
133 SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
134
135 ### Compute the include paths
136
137 # Only include public headers by default
138 include_directories(
139    ${CMAKE_BINARY_DIR}/include
140    ${CMAKE_HOME_DIRECTORY}/include
141 )
142
143 # Compute the ones that should be added when compiling the library
144 set(INTERNAL_INCLUDES
145   ${CMAKE_BINARY_DIR}
146   ${CMAKE_HOME_DIRECTORY}
147   )
148
149 if(enable_smpi)
150   set (INTERNAL_INCLUDES ${INTERNAL_INCLUDES} ${CMAKE_HOME_DIRECTORY}/src/smpi/include)
151 endif()
152
153 if(NOT CMAKE_CROSSCOMPILING AND EXISTS /usr/include/)
154   set(INTERNAL_INCLUDES ${INTERNAL_INCLUDES} /usr/include/)
155 endif()
156
157 # library dependency cannot start with a space (CMP0004), so initialize it with something that is never deactivated.
158 set(SIMGRID_DEP "-lm")
159
160 ### Determine the assembly flavor that we need today
161 set(HAVE_RAW_CONTEXTS 0)
162 include(CMakeDetermineSystem)
163 foreach(arch i686 x86_64 arm64)
164   set(SIMGRID_PROCESSOR_${arch} 0)
165 endforeach()
166 IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86|AMD64|amd64")
167   IF(CMAKE_SIZEOF_VOID_P EQUAL 4) # 32 bits
168     message(STATUS "System processor: i686 (${CMAKE_SYSTEM_PROCESSOR}, 32 bits)")
169     set(SIMGRID_PROCESSOR_i686 1)
170   ELSE()
171     message(STATUS "System processor: x86_64 (${CMAKE_SYSTEM_PROCESSOR}, 64 bits)")
172     set(SIMGRID_PROCESSOR_x86_64 1)
173   ENDIF()
174   if(CMAKE_SIZEOF_VOID_P EQUAL 4 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
175     message(STATUS "Disable fast raw contexts on x32 ABI.")
176   else()
177     set(HAVE_RAW_CONTEXTS 1)
178   endif()
179 ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
180   message(STATUS "System processor: arm64 (${CMAKE_SYSTEM_PROCESSOR}, 64 bits)")
181   set(SIMGRID_PROCESSOR_arm64 1)
182 ELSE()
183   message(STATUS "System processor (${CMAKE_SYSTEM_PROCESSOR}) not explicitly accounted for")
184 ENDIF()
185
186 include(CheckFunctionExists)
187 include(CheckTypeSize)
188 include(CheckIncludeFile)
189 include(CheckIncludeFiles)
190 include(CheckLibraryExists)
191 include(CheckSymbolExists)
192
193 set(HAVE_GRAPHVIZ OFF)
194 if(minimal-bindings)
195   message(STATUS "Don't even look for graphviz, as we build minimal binding libraries.")
196 else()
197   include(FindGraphviz)
198 endif()
199
200 set(SIMGRID_HAVE_NS3 OFF)
201 if(enable_ns3)
202   include(FindNS3)
203   if (SIMGRID_HAVE_NS3)
204     if (NOT NS3_VERSION EQUAL "3-dev" AND NS3_VERSION VERSION_LESS "3.28")
205       message(FATAL_ERROR "SimGrid needs ns-3 in version 3.28 or higher. Please upgrade or disable that cmake option.")
206     endif()
207     set(SIMGRID_HAVE_NS3 ON)
208     set(SIMGRID_DEP "${SIMGRID_DEP} ${NS3_LIBRARIES}")
209   else()
210     message(FATAL_ERROR "Cannot find ns-3. Please install it (apt-get install ns3 libns3-dev) or disable that cmake option")
211   endif()
212 endif()
213
214 ### Check for Eigen library
215 if ((NOT DEFINED EIGEN3_HINT) OR (NOT EIGEN3_HINT STRLESS_EQUAL "OFF"))
216   set(SIMGRID_HAVE_EIGEN3 OFF)
217   find_package (Eigen3 3.3 CONFIG
218                 HINTS ${EIGEN3_HINT})
219   if (Eigen3_FOUND)
220     set(SIMGRID_HAVE_EIGEN3 ON)
221     message(STATUS "Found Eigen3: ${EIGEN3_INCLUDE_DIR}")
222     include_directories(${EIGEN3_INCLUDE_DIR})
223     if ("3.3.4" VERSION_EQUAL EIGEN3_VERSION_STRING AND CMAKE_COMPILER_IS_GNUCC)
224       message(STATUS "Avoid build error of Eigen3 v3.3.4 using -Wno-error=int-in-bool-context")
225       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=int-in-bool-context")
226     endif()
227   else()
228     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")
229   endif()
230   mark_as_advanced(Eigen3_DIR)
231 else()
232   message(STATUS "Disabling Eigen3 as requested by the user (EIGEN3_HINT is set to 'OFF')")
233 endif()
234
235 # Check for our JSON dependency
236 set(SIMGRID_HAVE_JSON 0)
237 find_package(nlohmann_json 3.7
238              HINTS ${nlohmann_json_HINT})
239 if (nlohmann_json_FOUND)
240   set(SIMGRID_HAVE_JSON 1)
241   if (NOT NLOHMANN_JSON_INCLUDE_DIR)
242     get_target_property(NLOHMANN_JSON_INCLUDE_DIR nlohmann_json::nlohmann_json INTERFACE_INCLUDE_DIRECTORIES)
243     list(REMOVE_DUPLICATES NLOHMANN_JSON_INCLUDE_DIR)
244   else()
245     include_directories(${NLOHMANN_JSON_INCLUDE_DIR})
246   endif()
247   message(STATUS "Found nlohmann_json: ${NLOHMANN_JSON_INCLUDE_DIR}")
248 endif()
249 mark_as_advanced(nlohmann_json_DIR)
250
251 set(HAVE_PAPI OFF)
252 if(enable_smpi_papi)
253   include(FindPAPI)
254   if (NOT HAVE_PAPI)
255     message(FATAL_ERROR "Cannot find PAPI. Please install it (apt-get install papi-tools libpapi-dev) or disable PAPI bindings.")
256   endif()
257 endif()
258 mark_as_advanced(PAPI_PREFIX)
259
260 # But we do need the core of Boost
261 # cmake before 3.13.1 does not know about stacktrace components. Fix it.
262 # Usable components: https://www.boost.org/doc/libs/1_65_1/doc/html/stacktrace/configuration_and_build.html
263 set(_Boost_STACKTRACE_HEADERS           "boost/stacktrace.hpp")
264 set(_Boost_STACKTRACE_BACKTRACE_HEADERS "boost/stacktrace.hpp")
265 set(_Boost_STACKTRACE_ADDR2LINE_HEADERS "boost/stacktrace.hpp")
266
267   if(minimal-bindings) # When we want a minimal python library, don't even search for boost optional components
268     message(STATUS "Don't even look for boost optional components, as we build minimal binding libraries.")
269     find_package(Boost 1.48)
270   else()
271     find_package(Boost 1.59 OPTIONAL_COMPONENTS context stacktrace_backtrace stacktrace_addr2line)
272   endif()
273   if(Boost_FOUND)
274     include_directories(${Boost_INCLUDE_DIRS})
275     message(STATUS "Mandatory components found. SimGrid is compilable.")
276     if (NOT minimal-bindings)
277       message(STATUS "Looking for optional Boost components:")
278       set(Boost_FOUND 1) # These components are optionals
279       CHECK_INCLUDE_FILE("backtrace.h" HAVE_BACKTRACE_H) # check that backtrace is actually possible
280       if (Boost_STACKTRACE_BACKTRACE_FOUND AND HAVE_BACKTRACE_H)
281         message (STATUS "  stacktrace: found the fast 'backtrace' implementation. Activating human-readable stack traces.")
282         set(HAVE_BOOST_STACKTRACE_BACKTRACE 1)
283       else()
284         set(HAVE_BOOST_STACKTRACE_BACKTRACE 0)
285         if (Boost_STACKTRACE_ADDR2LINE_FOUND)
286           message (STATUS "  stacktrace: found the slow 'addr2line' implementation. Activating human-readable stack traces.")
287           set(HAVE_BOOST_STACKTRACE_ADDR2LINE 1)
288         else()
289           message (STATUS "  stacktrace: MISSING. Install libboost-stacktrace-dev to display the stacktraces.")
290           set(HAVE_BOOST_STACKTRACE_ADDR2LINE 0)
291         endif()
292       endif()
293
294       if(Boost_CONTEXT_FOUND)
295         message (STATUS "  context: found. Activating Boost contexts.")
296         set(HAVE_BOOST_CONTEXTS ON)
297       else()
298         message (STATUS "  context: MISSING. Install libboost-context-dev for this optional feature.")
299         set(HAVE_BOOST_CONTEXTS OFF)
300       endif()
301     endif()
302   else()
303     if(APPLE)
304       message(FATAL_ERROR "Boost libraries not found. Try to install them with 'sudo fink install boost1.53.nopython' (check the exact name with 'fink list boost') or 'sudo brew install boost'")
305     else()
306       find_package(Boost 1.48) #try without optional libraries
307       if(NOT Boost_FOUND)
308         message(FATAL_ERROR "Boost libraries not found. Install libboost-dev (>= 1.48.0).")
309       else()
310         include_directories(${Boost_INCLUDE_DIRS})
311         message(STATUS "Mandatory components found. SimGrid is compilable.")
312       endif()
313     endif()
314   endif()
315 mark_as_advanced(Boost_CONTEXT_LIBRARY_RELEASE)
316 mark_as_advanced(Boost_INCLUDE_DIR)
317 mark_as_advanced(Boost_STACKTRACE_ADDR2LINE_LIB)
318 mark_as_advanced(Boost_STACKTRACE_BACKTRACE_LIB)
319
320 # Checks for header libraries functions.
321 CHECK_LIBRARY_EXISTS(rt      clock_gettime           "" HAVE_POSIX_GETTIME)
322 CHECK_LIBRARY_EXISTS(pthread pthread_setaffinity_np  "" HAVE_PTHREAD_SETAFFINITY)
323 CHECK_INCLUDE_FILE("pthread_np.h" HAVE_PTHREAD_NP_H) # for pthread_setaffinity_np() on FreeBSD
324
325 if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
326   set(CMAKE_REQUIRED_DEFINITIONS "-D_XOPEN_SOURCE=700 -D_DARWIN_C_SOURCE")
327 else()
328   set(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE")
329 endif()
330
331 CHECK_INCLUDE_FILE("valgrind/valgrind.h" HAVE_VALGRIND_H)
332 CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
333 CHECK_INCLUDE_FILE("linux/futex.h" HAVE_FUTEX_H)
334
335 CHECK_FUNCTION_EXISTS(dlfunc HAVE_DLFUNC)
336 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
337 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
338 CHECK_FUNCTION_EXISTS(sysconf HAVE_SYSCONF)
339 if(NOT HAVE_SYSCONF)
340   message(FATAL_ERROR "Cannot build without sysconf.")
341 endif()
342 CHECK_FUNCTION_EXISTS(process_vm_readv HAVE_PROCESS_VM_READV)
343 CHECK_FUNCTION_EXISTS(mremap HAVE_MREMAP)
344
345 CHECK_SYMBOL_EXISTS(vasprintf stdio.h HAVE_VASPRINTF)
346
347 CHECK_INCLUDE_FILE("sys/sendfile.h" HAVE_SENDFILE_H)
348 CHECK_FUNCTION_EXISTS(sendfile HAVE_SENDFILE)
349 if(HAVE_SENDFILE_H AND HAVE_SENDFILE)
350   set(SG_HAVE_SENDFILE 1)
351 else()
352   set(SG_HAVE_SENDFILE 0)
353 endif()
354
355 if(enable_mallocators)
356   SET(SIMGRID_HAVE_MALLOCATOR 1)
357 else()
358   SET(SIMGRID_HAVE_MALLOCATOR 0)
359 endif()
360
361 SET(SIMGRID_HAVE_MC OFF)
362
363 if(enable_model-checking)
364   find_package(Libevent)
365   if(Libevent_FOUND)
366     message(STATUS "Found libevent. The stateless model-checking can be enabled.")
367     include_directories(${LIBEVENT_INCLUDE_DIR})
368     set(SIMGRID_DEP "${SIMGRID_DEP} ${LIBEVENT_LIBRARIES}")
369     SET(SIMGRID_HAVE_MC ON)
370   else()
371     message(STATUS "libevent not found. Please install libevent-dev to enable the SimGrid model checker.")
372   endif()
373   mark_as_advanced(LIBEVENT_LIBRARY)
374   mark_as_advanced(LIBEVENT_THREADS_LIBRARY)
375 endif()
376
377 if(enable_smpi)
378   SET(HAVE_SMPI ON)
379   SET(HAVE_PRIVATIZATION ON)
380 else()
381   SET(HAVE_SMPI OFF)
382 endif()
383
384 #--------------------------------------------------------------------------------------------------
385 ### Check what context backends are available
386
387 set(HAVE_UCONTEXT_CONTEXTS 0)
388 CHECK_INCLUDE_FILE("ucontext.h" HAVE_UCONTEXT_H)
389 if(NOT HAVE_UCONTEXT_H)
390   message(STATUS "No ucontext factory: <ucontext.h> not found.")
391 elseif(APPLE)
392   message(STATUS "No ucontext factory: Apple don't want us to use them.")
393   set(HAVE_UCONTEXT_H 0)
394 else()
395   try_compile(compile_makecontext ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_makecontext.c
396     OUTPUT_VARIABLE compile_makecontext_output)
397
398   #If can have both context
399   if(NOT compile_makecontext)
400     message(STATUS "Error: <ucontext.h> exists, but makecontext is not compilable. Compilation output:\n ${compile_makecontext_output}")
401     message(STATUS "No ucontext factory: makecontext() is not compilable.")
402   else()
403     message(STATUS "Support for ucontext factory ok.")
404     set(HAVE_UCONTEXT_CONTEXTS 1)
405
406     # Stack setup (size and address)
407     try_run(RUN_makecontext_VAR COMPILE_makecontext_VAR
408       ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stacksetup.c
409       RUN_OUTPUT_VARIABLE stack_setup)
410
411     LIST(LENGTH stack_setup stack_setup_len)
412     if("${stack_setup_len}" STREQUAL "2")
413       LIST(GET stack_setup 0 makecontext_addr)
414       LIST(GET stack_setup 1 makecontext_size)
415       set(sg_makecontext_stack_addr "#define sg_makecontext_stack_addr(skaddr) (${makecontext_addr})")
416       set(sg_makecontext_stack_size "#define sg_makecontext_stack_size(sksize) (${makecontext_size})")
417     else()
418       message(FATAL_ERROR "Could not figure out the stack setup. Compil: ${RUN_makecontext_VAR}. Exec: ${COMPILE_makecontext_VAR}. Output: ${stack_setup}")
419     endif()
420   endif()
421 endif()
422
423 # Stack growth direction (upward or downward). Used for the following contexts: SysV, raw, Boost
424 try_run(RUN_stackgrowth_VAR COMPILE_stackgrowth_VAR
425   ${CMAKE_BINARY_DIR}
426   ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stackgrowth.c
427   RUN_OUTPUT_VARIABLE stack
428   COPY_FILE test_stackgrowth)
429
430 if("${stack}" STREQUAL "down")
431   set(PTH_STACKGROWTH "-1")
432 elseif("${stack}" STREQUAL "up")
433   set(PTH_STACKGROWTH "1")
434 else()
435   if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
436     set(PTH_STACKGROWTH "-1")
437   elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686")
438     set(PTH_STACKGROWTH "-1")
439   else()
440     message(FATAL_ERROR "Could not figure out the stack direction. Test prog returned: ${stack}; CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}.")
441   endif()
442 endif()
443 # If the test ran well, remove the test binary
444 file(REMOVE ${CMAKE_BINARY_DIR}/test_stackgrowth)
445 #--------------------------------------------------------------------------------------------------
446
447 ###############
448 ## GIT version check
449 ##
450 if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/)
451   execute_process(COMMAND git rev-parse --verify --short HEAD
452      WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}
453      OUTPUT_VARIABLE GIT_VERSION
454      OUTPUT_STRIP_TRAILING_WHITESPACE)
455   # Check for uncommitted changes
456   execute_process(COMMAND git diff --name-only HEAD
457     WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}
458     OUTPUT_VARIABLE files_changed)
459   if(files_changed)
460     set(GIT_VERSION "${GIT_VERSION}-dirty")
461   endif()
462 elseif(EXISTS ${CMAKE_HOME_DIRECTORY}/.gitversion)
463   FILE(STRINGS ${CMAKE_HOME_DIRECTORY}/.gitversion GIT_VERSION)
464 else()
465   set(GIT_VERSION "none, release version")
466 endif()
467 message(STATUS "Git version: ${GIT_VERSION}")
468
469 ### Define source packages for Libs
470 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/DefinePackages.cmake)
471
472 ### Setup gcc & clang flags (include after DefinePackage.cmake, and before generating header files)
473 if (NOT MSVC)
474   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Flags.cmake)
475 endif()
476
477 ### Generate the required headers and scripts
478 #############################################
479
480 # Avoid triggering a (full) rebuild by touching the files if they did not really change
481 configure_file("${CMAKE_HOME_DIRECTORY}/src/internal_config.h.in"    "${CMAKE_BINARY_DIR}/src/internal_config.h.generated"    @ONLY IMMEDIATE)
482 configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid/version.h.in" "${CMAKE_BINARY_DIR}/include/simgrid/version.h.generated" @ONLY IMMEDIATE)
483 configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid/config.h.in" "${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated" @ONLY IMMEDIATE)
484 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/internal_config.h.generated ${CMAKE_BINARY_DIR}/src/internal_config.h)
485 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/include/simgrid/version.h.generated ${CMAKE_BINARY_DIR}/include/simgrid/version.h)
486 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated ${CMAKE_BINARY_DIR}/include/simgrid/config.h)
487 file(REMOVE ${CMAKE_BINARY_DIR}/src/internal_config.h.generated)
488 file(REMOVE ${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated)
489 file(REMOVE ${CMAKE_BINARY_DIR}/include/simgrid/version.h.generated)
490
491 # We need two versions of the SMPI scripts because they contain the path to the library
492 # so, it depends of whether SimGrid is installed, or run from the sources (during the build)
493
494 file(READ ${CMAKE_HOME_DIRECTORY}/src/smpi/smpitools.sh SMPITOOLS_SH) # Definitions shared amongst all SMPI scripts, inlined in each of them
495
496 ### SMPI script used when simgrid is installed
497 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
498 set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
499 set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
500 set(includeflag "\"-I${includedir}\" \"-I${includedir}/smpi\"")
501 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${libdir}")
502 if(NS3_LIBRARY_PATH)
503   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
504 endif()
505 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
506 set(SMPIMAIN ${libdir}/simgrid/smpimain)
507 set(SMPIREPLAYMAIN ${libdir}/simgrid/smpireplaymain)
508
509 configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/include/smpi/mpif.h @ONLY)
510 #configure mpif.f90 to build mpi.mod
511 if(SMPI_FORTRAN)
512   set(MODULE_MPIF_IN "module mpi")
513   set(MODULE_MPIF_OUT "end module mpi")
514   configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated @ONLY)
515   execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90)
516   file(REMOVE ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated)
517   set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/include/smpi)
518   add_library(mpi SHARED ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90)
519 endif()
520
521 foreach(script cc cxx ff f90 run)
522   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/bin/smpi${script} @ONLY)
523 endforeach()
524
525 ### SMPI scripts used when compiling simgrid
526 set(exec_prefix "${CMAKE_BINARY_DIR}/smpi_script/")
527 set(includedir "${CMAKE_HOME_DIRECTORY}/include")
528 set(libdir "${CMAKE_BINARY_DIR}/lib")
529 set(includeflag "\"-I${includedir}\" \"-I${includedir}/smpi\"")
530 set(includeflag "${includeflag} \"-I${CMAKE_BINARY_DIR}/include\" \"-I${CMAKE_BINARY_DIR}/include/smpi\"")
531 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${libdir}")
532 if(NS3_LIBRARY_PATH)
533   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
534 endif()
535 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
536 set(SMPIMAIN ${libdir}/simgrid/smpimain)
537 set(SMPIREPLAYMAIN ${libdir}/simgrid/smpireplaymain)
538
539 foreach(script cc cxx ff f90 run)
540   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script} @ONLY)
541 endforeach()
542
543 foreach(script cc cxx ff f90 run)
544   execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpi${script})
545   execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script})
546 endforeach()
547
548 set(generated_headers_to_install
549   ${CMAKE_CURRENT_BINARY_DIR}/include/smpi/mpif.h
550   ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid/config.h
551   ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid/version.h
552   )
553
554 set(generated_headers  ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h )
555
556 set(generated_files_to_clean
557   ${generated_headers}
558   ${generated_headers_to_install}
559   ${CMAKE_BINARY_DIR}/bin/smpicc
560   ${CMAKE_BINARY_DIR}/bin/smpicxx
561   ${CMAKE_BINARY_DIR}/bin/smpiff
562   ${CMAKE_BINARY_DIR}/bin/smpif90
563   ${CMAKE_BINARY_DIR}/bin/smpirun
564   ${CMAKE_BINARY_DIR}/bin/simgrid_update_xml
565   ${CMAKE_BINARY_DIR}/examples/smpi/tracing/smpi_traced.trace
566   )
567
568 if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
569   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt COPYONLY)
570   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt COPYONLY)
571   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allreduce.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allreduce.txt COPYONLY)
572   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_barrier.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt COPYONLY)
573   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_bcast.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt COPYONLY)
574   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_with_isend.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt COPYONLY)
575   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt COPYONLY)
576   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoallv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt COPYONLY)
577   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_waitall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt COPYONLY)
578   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_reducescatter.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt COPYONLY)
579   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_gather.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt COPYONLY)
580   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allgatherv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt COPYONLY)
581   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile COPYONLY)
582   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_cluster ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_cluster COPYONLY)
583   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_griffon ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_griffon COPYONLY)
584   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_coll ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_coll COPYONLY)
585   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_io ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_io COPYONLY)
586   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_empty ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_empty COPYONLY)
587
588   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/description_file ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file COPYONLY)
589   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/README ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README COPYONLY)
590   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/smpi_replay.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt COPYONLY)
591   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace0.txt COPYONLY)
592   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace1.txt COPYONLY)
593   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace2.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace2.txt COPYONLY)
594   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace3.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace3.txt COPYONLY)
595   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace4.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace4.txt COPYONLY)
596   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace5.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace5.txt COPYONLY)
597   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace6.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace6.txt COPYONLY)
598   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace7.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace7.txt COPYONLY)
599   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace8.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace8.txt COPYONLY)
600   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace9.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace9.txt COPYONLY)
601   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace10.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace10.txt COPYONLY)
602   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace11.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace11.txt COPYONLY)
603   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace12.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace12.txt COPYONLY)
604   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace13.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace13.txt COPYONLY)
605   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace14.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace14.txt COPYONLY)
606   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace15.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace15.txt COPYONLY)
607   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace16.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace16.txt COPYONLY)
608   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace17.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace17.txt COPYONLY)
609   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace18.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace18.txt COPYONLY)
610   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace19.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace19.txt COPYONLY)
611   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace20.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace20.txt COPYONLY)
612   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace21.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace21.txt COPYONLY)
613   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace22.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace22.txt COPYONLY)
614   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace23.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace23.txt COPYONLY)
615   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace24.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace24.txt COPYONLY)
616   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace25.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace25.txt COPYONLY)
617   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace26.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace26.txt COPYONLY)
618   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace27.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace27.txt COPYONLY)
619   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace28.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace28.txt COPYONLY)
620   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace29.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace29.txt COPYONLY)
621   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace30.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace30.txt COPYONLY)
622   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace31.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace31.txt COPYONLY)
623
624 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/compute_only.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only.txt COPYONLY)
625 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions0.txt COPYONLY)
626 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions1.txt COPYONLY)
627 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/empty.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty.txt COPYONLY)
628 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/empty/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions0.txt COPYONLY)
629 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/empty/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions1.txt COPYONLY)
630 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/mixed.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed.txt COPYONLY)
631 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/mixed/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions0.txt COPYONLY)
632 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/mixed/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions1.txt COPYONLY)
633 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_compute ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute COPYONLY)
634 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive COPYONLY)
635 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive2 ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive2 COPYONLY)
636 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_compute_simple ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_simple COPYONLY)
637 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time COPYONLY)
638 configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time_and_resources ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time_and_resources COPYONLY)
639
640   set(generated_files_to_clean
641     ${generated_files_to_clean}
642     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt
643     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt
644     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allreduce.txt
645     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt
646     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt
647     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt
648     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt
649     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt
650     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt
651     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt
652     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt
653     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt
654     ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile
655     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file
656     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README
657     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt
658     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace0.txt
659     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace1.txt
660     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace2.txt
661     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace3.txt
662     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace4.txt
663     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace5.txt
664     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace6.txt
665     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace7.txt
666     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace8.txt
667     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace9.txt
668     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace10.txt
669     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace11.txt
670     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace12.txt
671     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace13.txt
672     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace14.txt
673     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace15.txt
674     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace16.txt
675     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace17.txt
676     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace18.txt
677     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace19.txt
678     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace20.txt
679     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace21.txt
680     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace22.txt
681     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace23.txt
682     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace24.txt
683     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace25.txt
684     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace26.txt
685     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace27.txt
686     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace28.txt
687     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace29.txt
688     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace30.txt
689     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace31.txt
690     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only.txt
691     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions0.txt
692     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions1.txt
693     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty.txt
694     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions0.txt
695     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions1.txt
696     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed.txt
697     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions0.txt
698     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions1.txt
699     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual.tesh
700     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute
701     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive
702     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive2
703     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_simple
704     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty1
705     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2
706     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_resources
707     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_time
708     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_time_and_resources
709     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed1
710     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2
711     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_resources
712     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time
713     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time_and_resources
714     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_nojob
715     )
716 endif()
717
718 SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
719   "${generated_files_to_clean}")
720
721 add_custom_target(tests    COMMENT "Recompiling the tests")
722 add_custom_target(tests-mc COMMENT "Recompiling the MC tests and tools.")
723 add_dependencies(tests tests-mc)
724 add_custom_target(tests-ns3 COMMENT "Recompiling the ns3 tests and tools.")
725 add_dependencies(tests tests-ns3)
726 add_custom_target(examples COMMENT "Recompiling all examples")
727 add_dependencies(examples tests)
728
729 ### Build some Maintainer files
730 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MaintainerMode.cmake)
731
732 ### Make Libs
733 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MakeLib.cmake)
734
735 # Python binding (with pybind11)
736 ################
737 if((NOT DEFINED enable_python) OR enable_python)
738   if(EXISTS ${CMAKE_HOME_DIRECTORY}/pybind11) # Try to use a local copy of pybind11, if any
739     message(STATUS "Use the internal copy of pybind11.")
740     add_subdirectory(${CMAKE_HOME_DIRECTORY}/pybind11)
741     set(pybind11_FOUND ON)
742
743     set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/pybind11/tools/)
744     set(Python_ADDITIONAL_VERSIONS 3.9 3.8 3.7 3.6 3.5 3.4)
745     find_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} REQUIRED)
746
747   else()
748     find_package(pybind11 CONFIG)
749     message(STATUS "Pybind11 version: ${pybind11_VERSION}")
750     if (pybind11_VERSION VERSION_LESS 2.4)
751       message(STATUS "SimGrid needs at least v2.4 of pybind11. Disabling the Python bindings.")
752       set(pybind11_FOUND OFF)
753     endif()
754   endif()
755 endif()
756
757 find_package(Python3 COMPONENTS Development)
758 if(NOT Python3_Development_FOUND OR NOT pybind11_FOUND)
759   message(STATUS "SimGrid Python bindings cannot be built on this system.")
760   set(default_enable_python OFF)
761 else()
762   set(default_enable_python ON)
763 endif()
764
765 option(enable_python "Whether the Python bindings are activated." ${default_enable_python}) # ON by default if dependencies are met
766
767 if(enable_python)
768   if(NOT Python3_Development_FOUND)
769     message(FATAL_ERROR "Please install the development components of Python (python3-dev on Debian) to build the Python bindings (or disable that option).")
770   endif()
771   if(pybind11_FOUND)
772     message(STATUS "Found pybind11.")
773     if(NOT enable_lto)
774       set(pybind11_options NO_EXTRAS)
775     endif()
776     pybind11_add_module(python-bindings src/bindings/python/simgrid_python.cpp ${pybind11_options})
777     target_compile_features(python-bindings PRIVATE cxx_std_14)
778     target_link_libraries(python-bindings PUBLIC simgrid)
779     set_target_properties(python-bindings PROPERTIES
780                           LIBRARY_OUTPUT_NAME simgrid
781                           CXX_VISIBILITY_PRESET "default"
782                           INTERPROCEDURAL_OPTIMIZATION FALSE)
783     # LTO is disabled here from the python bindings because this makes a
784     # cmake warning about CMP0069 even when this policy is set. This
785     # problem may be in cmake, in pybind11 or even in our code, not sure.
786     # It may get eventually solved in cmake or pybind11. Or not.
787     # The sure thing is that our python bindings are in one file only,
788     # so there is no need for LTO here. Problem solved :)
789
790     add_dependencies(tests python-bindings)
791     set_property(TARGET python-bindings
792                  APPEND PROPERTY INCLUDE_DIRECTORIES "${INTERNAL_INCLUDES}")
793
794     if("${SIMGRID_PYTHON_LIBDIR}" STREQUAL "") # value not manually set
795       if("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
796         set(SIMGRID_PYTHON_LIBDIR ${Python3_SITEARCH})
797       else("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
798         string(REGEX REPLACE "^/usr/" "${CMAKE_INSTALL_PREFIX}/" SIMGRID_PYTHON_LIBDIR ${Python3_SITEARCH})
799       endif("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
800     endif()
801     install(TARGETS python-bindings
802             LIBRARY DESTINATION "${SIMGRID_PYTHON_LIBDIR}")
803   else()
804     message(FATAL_ERROR "Please install pybind11-dev to build the Python bindings (or disable that option).")
805   endif()
806 endif()
807 mark_as_advanced(PYBIND11_PYTHON_VERSION)
808 mark_as_advanced(pybind11_DIR)
809
810 ### Make tests
811 if(enable_memcheck_xml)
812   set(enable_memcheck true)
813 endif()
814
815 INCLUDE(CTest)
816 ENABLE_TESTING()
817 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Tests.cmake)
818 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/CTestConfig.cmake)
819
820 ### Define subdirectories
821 foreach(cmakefile ${CMAKEFILES_TXT})
822   string(REPLACE "/CMakeLists.txt" "" repository ${cmakefile})
823   add_subdirectory("${CMAKE_HOME_DIRECTORY}/${repository}")
824 endforeach()
825
826 ### Setup the distrib
827 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Distrib.cmake)
828
829 ### Build the docs if asked to
830 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Documentation.cmake)
831
832 ### Print the result of configuration
833 message("")
834 message("##########################################")
835 message("#### Content of src/internal_config.h ####")
836 message("##########################################")
837 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h config_output)
838 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 10) # Pass the file header
839 foreach(line ${config_output})
840   message("   ${line}")
841 endforeach()
842 message("##########################################")
843 message("####   Content of simgrid/config.h    ####")
844 message("##########################################")
845 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid/config.h config_output)
846 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 -1) # Pass the file header
847 foreach(line ${config_output})
848   message("   ${line}")
849 endforeach()
850 message("##########################################")
851 message("####   End of configuration headers   ####")
852 message("##########################################")
853
854 message("\nConfiguration of package `simgrid':")
855 message("        Home directory ..............: ${CMAKE_HOME_DIRECTORY}")
856 message("        Build Name ..................: ${BUILDNAME}")
857 message("        Cmake Generator .............: ${CMAKE_GENERATOR}")
858 message("        Site ........................: ${SITE}")
859 message("        Install prefix ..............: ${CMAKE_INSTALL_PREFIX}")
860 message("        Release .....................: simgrid-${release_version}")
861 message("")
862 message("        Compiler: C .................: ${CMAKE_C_COMPILER} (id: ${CMAKE_C_COMPILER_ID})")
863 message("                version .............: ${CMAKE_C_COMPILER_VERSION}")
864 message("                is gnu ..............: ${CMAKE_COMPILER_IS_GNUCC}")
865 message("        Compiler: C++ ...............: ${CMAKE_CXX_COMPILER} (id: ${CMAKE_CXX_COMPILER_ID})")
866 message("                version .............: ${CMAKE_CXX_COMPILER_VERSION}")
867 if(CMAKE_Fortran_COMPILER)
868   message("        Compiler: Fortran ...........: ${SMPI_Fortran_COMPILER} (id: ${CMAKE_Fortran_COMPILER_ID})")
869   message("                version .............: ${CMAKE_Fortran_COMPILER_VERSION}")
870 endif()
871 message("        Linker: .....................: ${CMAKE_LINKER}")
872 message("                version .............: ${LINKER_VERSION}")
873 message("        Make program: ...............: ${CMAKE_MAKE_PROGRAM}")
874 message("")
875 message("        CFlags ......................: ${CMAKE_C_FLAGS}")
876 message("        CXXFlags ....................: ${CMAKE_CXX_FLAGS}")
877 message("        LDFlags .....................: ${CMAKE_C_LINK_FLAGS}")
878 message("        with LTO ....................: ${enable_lto}")
879 message("")
880
881 if (SIMGRID_HAVE_NS3)
882   message("        Compile ns-3 ................: ON (path: ${NS3_PATH})")
883 else()
884   message("        Compile ns-3 ................: OFF  (hint: ${NS3_HINT})")
885 endif()
886
887 if(pybind11_FOUND)
888   message("        Compile Python bindings .....: ${enable_python}")
889   message("          module ....................: ${PYTHON_MODULE_PREFIX}simgrid${PYTHON_MODULE_EXTENSION}")
890   message("          install path ..............: ${SIMGRID_PYTHON_LIBDIR} (force another value with -DSIMGRID_PYTHON_LIBDIR)")
891 else()
892   message("        Compile Python bindings .....: OFF (disabled, or pybind11 not found)")
893 endif()
894 if(SIMGRID_HAVE_EIGEN3)
895   message("        Eigen3 library ..............: ${EIGEN3_VERSION_STRING} in ${EIGEN3_INCLUDE_DIR}")
896 else()
897   message("        Eigen3 library ..............: not found (EIGEN3_HINT='${EIGEN3_HINT}')")
898 endif()
899 if(SIMGRID_HAVE_JSON)
900   message("        JSON library ................: ${nlohmann_json_VERSION} in ${NLOHMANN_JSON_INCLUDE_DIR}")
901 else()
902   message("        JSON library ................: not found (nlohmann_json_HINT='${nlohmann_json_HINT}')")
903 endif()
904 message("        Compile Smpi ................: ${HAVE_SMPI}")
905 message("          Smpi fortran ..............: ${SMPI_FORTRAN}")
906 message("          MPICH3 testsuite ..........: ${enable_testsuite_smpi_MPICH3}")
907 message("          MBI testsuite .............: ${enable_testsuite_smpi_MBI}")
908 message("          Privatization .............: ${HAVE_PRIVATIZATION}")
909 message("          PAPI support ..............: ${HAVE_PAPI}")
910 message("        Compile Boost.Context support: ${HAVE_BOOST_CONTEXTS}")
911 message("")
912 message("        Model checking ..............: ${SIMGRID_HAVE_MC}")
913 message("          MBI testsuite .............: ${enable_testsuite_smpi_MBI}")
914 message("          McMini testsuite ..........: ${enable_testsuite_McMini}")
915 message("")
916 message("        Maintainer mode .............: ${enable_maintainer_mode}")
917 message("        Documentation ...............: ${enable_documentation}")
918 message("        Graphviz mode ...............: ${HAVE_GRAPHVIZ}")
919 message("        Mallocators .................: ${enable_mallocators}")
920 message("")
921 message("        SimGrid dependencies ........: ${SIMGRID_DEP}")
922 message("")
923
924 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/Testing/Notes/)
925 file(WRITE ${PROJECT_BINARY_DIR}/Testing/Notes/Build  "GIT version : ${GIT_VERSION}\n")
926 file(APPEND ${PROJECT_BINARY_DIR}/Testing/Notes/Build "Release     : simgrid-${release_version}\n")
927