Logo AND Algorithmique Numérique Distribuée

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