Logo AND Algorithmique Numérique Distribuée

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