Logo AND Algorithmique Numérique Distribuée

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