Logo AND Algorithmique Numérique Distribuée

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