Logo AND Algorithmique Numérique Distribuée

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