Logo AND Algorithmique Numérique Distribuée

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