Logo AND Algorithmique Numérique Distribuée

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