Logo AND Algorithmique Numérique Distribuée

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