Logo AND Algorithmique Numérique Distribuée

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