Logo AND Algorithmique Numérique Distribuée

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