Logo AND Algorithmique Numérique Distribuée

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