Logo AND Algorithmique Numérique Distribuée

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