Logo AND Algorithmique Numérique Distribuée

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