Logo AND Algorithmique Numérique Distribuée

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