Logo AND Algorithmique Numérique Distribuée

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