Logo AND Algorithmique Numérique Distribuée

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