Logo AND Algorithmique Numérique Distribuée

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