Logo AND Algorithmique Numérique Distribuée

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