Logo AND Algorithmique Numérique Distribuée

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