Logo AND Algorithmique Numérique Distribuée

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