Logo AND Algorithmique Numérique Distribuée

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