Logo AND Algorithmique Numérique Distribuée

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