Logo AND Algorithmique Numérique Distribuée

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