Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
modernize cabinet creation
[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("signal.h" HAVE_SIGNAL_H)
343 CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H)
344 CHECK_INCLUDE_FILE("sys/sysctl.h" HAVE_SYS_SYSCTL_H)
345 CHECK_INCLUDE_FILE("linux/futex.h" HAVE_FUTEX_H)
346
347 CHECK_FUNCTION_EXISTS(dlfunc HAVE_DLFUNC)
348 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
349 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
350 CHECK_FUNCTION_EXISTS(getdtablesize HAVE_GETDTABLESIZE)
351 CHECK_FUNCTION_EXISTS(sysconf HAVE_SYSCONF)
352 CHECK_FUNCTION_EXISTS(process_vm_readv HAVE_PROCESS_VM_READV)
353 CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP)
354 CHECK_FUNCTION_EXISTS(mremap HAVE_MREMAP)
355
356 CHECK_SYMBOL_EXISTS(vasprintf stdio.h HAVE_VASPRINTF)
357 if(MINGW)
358   # The detection of vasprintf fails on MinGW, assumingly because it's
359   # defined as an inline function in stdio.h instead of a regular
360   # function. So force the result to be 1 despite of the test.
361   set(HAVE_VASPRINTF 1)
362 endif()
363
364 CHECK_INCLUDE_FILE("sys/sendfile.h" HAVE_SENDFILE_H)
365 CHECK_FUNCTION_EXISTS(sendfile HAVE_SENDFILE)
366 if(HAVE_SENDFILE_H AND HAVE_SENDFILE)
367   set(SG_HAVE_SENDFILE 1)
368 else()
369   set(SG_HAVE_SENDFILE 0)
370 endif()
371
372 if(enable_model-checking AND NOT "${CMAKE_SYSTEM}" MATCHES "Linux|FreeBSD")
373   message(WARNING "Support for model-checking has not been enabled on ${CMAKE_SYSTEM}: disabling it")
374   set(enable_model-checking FALSE)
375 endif()
376
377 if(HAVE_MMAP)
378   SET(HAVE_MMALLOC 1)
379 else()
380   SET(HAVE_MMALLOC 0)
381   if(enable_model-checking)
382     message(STATUS "Warning: support for model-checking has been disabled because you are missing either mmap or __thread.")
383   endif()
384   SET(enable_model-checking 0)
385 endif()
386
387 if(enable_jedule)
388   set(SIMGRID_HAVE_JEDULE 1)
389 else()
390   set(SIMGRID_HAVE_JEDULE 0)
391 endif()
392
393 if(enable_mallocators)
394   SET(SIMGRID_HAVE_MALLOCATOR 1)
395 else()
396   SET(SIMGRID_HAVE_MALLOCATOR 0)
397 endif()
398
399 if (minimal-bindings)
400   message(STATUS "Don't look for libunwind as we build minimal binding libraries.")
401   if(enable_model-checking)
402     message(FATAL_ERROR "You cannot enable model-checking and minimal-bindings at the same time.")
403   endif()
404 else()
405   include(FindLibunwind)
406   if(HAVE_LIBUNWIND)
407     SET(SIMGRID_DEP "${SIMGRID_DEP} ${LIBUNWIND_LIBRARIES}")
408   else()
409     if(enable_model-checking)
410       message(FATAL_ERROR "Please install libunwind-dev libdw-dev libelf-dev libevent-dev if you want to compile the SimGrid model checker.")
411     endif()
412   endif()
413 endif()
414
415 if(enable_model-checking)
416   find_package(Libdw REQUIRED)
417   find_package(Libelf REQUIRED)
418   find_package(Libevent REQUIRED)
419   include_directories(${LIBDW_INCLUDE_DIR} ${LIBELF_INCLUDE_DIR} ${LIBEVENT_INCLUDE_DIR})
420   set(SIMGRID_DEP "${SIMGRID_DEP} ${LIBEVENT_LIBRARIES} ${LIBELF_LIBRARIES} ${LIBDW_LIBRARIES}")
421   set(SIMGRID_HAVE_MC 1)
422   if("${CMAKE_SYSTEM}" MATCHES "FreeBSD" AND enable_java)
423     message(WARNING "FreeBSD + Model-Checking + Java = too much for now. Disabling the Java bindings.")
424     set(enable_java FALSE)
425   endif()
426 else()
427   SET(SIMGRID_HAVE_MC 0)  
428   set(HAVE_MMALLOC 0)
429 endif()
430 mark_as_advanced(PATH_LIBDW_H)
431 mark_as_advanced(PATH_LIBDW_LIB)
432
433 if(enable_java AND NOT enable_msg)
434   message(FATAL_ERROR "Cannot activate the Java bindings without the MSG module. Either add -Denable_msg=ON or -Denable_java=OFF")
435 endif()
436
437 if (enable_model-checking AND enable_ns3)
438   message(FATAL_ERROR "Cannot activate both model-checking and ns-3 bindings: ns-3 pulls too much dependencies for the MC to work")
439 endif()
440
441 if(enable_smpi)
442   SET(HAVE_SMPI 1)
443   if(WIN32)
444     message (STATUS "Warning: no support for SMPI automatic privatization on Windows.")
445     SET(HAVE_PRIVATIZATION 0)
446   else()
447     SET(HAVE_PRIVATIZATION 1)
448   endif()
449 else()
450   SET(HAVE_SMPI 0)
451 endif()
452
453 #--------------------------------------------------------------------------------------------------
454 ### Check what context backends are available
455
456 set(HAVE_UCONTEXT_CONTEXTS 0)
457 CHECK_INCLUDE_FILE("ucontext.h" HAVE_UCONTEXT_H)
458 if(NOT HAVE_UCONTEXT_H)
459   message(STATUS "No ucontext factory: <ucontext.h> not found.")
460 elseif(APPLE)
461   message(STATUS "No ucontext factory: Apple don't want us to use them.")
462   set(HAVE_UCONTEXT_H 0)
463 else()
464   try_compile(compile_makecontext ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_makecontext.c
465     OUTPUT_VARIABLE compile_makecontext_output)
466
467   #If can have both context
468   if(compile_makecontext)
469     set(HAVE_UCONTEXT_CONTEXTS 1)
470     message(STATUS "Support for ucontext factory ok.")
471   else()
472     message(STATUS "Error: <ucontext.h> exists, but makecontext is not compilable. Compilation output:\n ${compile_makecontext_output}")
473     message(STATUS "No ucontext factory: makecontext() is not compilable.")
474   endif()
475
476   # Stack setup (size and address)
477   try_run(RUN_makecontext_VAR COMPILE_makecontext_VAR
478     ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stacksetup.c
479     RUN_OUTPUT_VARIABLE stack_setup)
480
481   LIST(LENGTH stack_setup stack_setup_len)
482   if("${stack_setup_len}" STREQUAL "2")
483     LIST(GET stack_setup 0 makecontext_addr)
484     LIST(GET stack_setup 1 makecontext_size)
485     set(sg_makecontext_stack_addr "#define sg_makecontext_stack_addr(skaddr) (${makecontext_addr})")
486     set(sg_makecontext_stack_size "#define sg_makecontext_stack_size(sksize) (${makecontext_size})")
487   else()
488     message(FATAL_ERROR "Could not figure out the stack setup. Compil: ${RUN_makecontext_VAR}. Exec: ${COMPILE_makecontext_VAR}. Output: ${stack_setup}")
489   endif()
490 endif()
491
492 # Stack growth direction (upward or downward). Used for the following contexts: SysV, raw, Boost
493 try_run(RUN_stackgrowth_VAR COMPILE_stackgrowth_VAR
494   ${CMAKE_BINARY_DIR}
495   ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_stackgrowth.c
496   RUN_OUTPUT_VARIABLE stack
497   COPY_FILE test_stackgrowth)
498
499 if("${stack}" STREQUAL "down")
500   set(PTH_STACKGROWTH "-1")
501 elseif("${stack}" STREQUAL "up")
502   set(PTH_STACKGROWTH "1")
503 else()
504   if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
505     set(PTH_STACKGROWTH "-1")
506   elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686")
507     set(PTH_STACKGROWTH "-1")
508   else()
509     message(FATAL_ERROR "Could not figure out the stack direction. Test prog returned: ${stack}; CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}.")
510   endif()
511 endif()
512 # If the test ran well, remove the test binary
513 file(REMOVE test_stackgrowth)
514 #--------------------------------------------------------------------------------------------------
515
516 ###############
517 ## GIT version check
518 ##
519 if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/)
520   execute_process(COMMAND git rev-parse --verify --short HEAD
521      WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}
522      OUTPUT_VARIABLE GIT_VERSION
523      OUTPUT_STRIP_TRAILING_WHITESPACE)
524   # Check for uncommitted changes
525   execute_process(COMMAND git diff --name-only HEAD
526     WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}
527     OUTPUT_VARIABLE files_changed)
528   if(files_changed)
529     set(GIT_VERSION "${GIT_VERSION}-dirty")
530   endif()
531 elseif(EXISTS ${CMAKE_HOME_DIRECTORY}/.gitversion)
532   FILE(STRINGS ${CMAKE_HOME_DIRECTORY}/.gitversion GIT_VERSION)
533 else()
534   set(GIT_VERSION "none, release version")
535 endif()
536 message(STATUS "Git version: ${GIT_VERSION}")
537
538 ### Define source packages for Libs
539 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/DefinePackages.cmake)
540
541 ### Setup gcc & clang flags (include after DefinePackage.cmake, and before generating header files)
542 if (NOT MSVC)
543   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Flags.cmake)
544 endif()
545
546 ### Generate the required headers and scripts
547 #############################################
548
549 # Avoid triggering a (full) rebuild by touching the files if they did not really change
550 configure_file("${CMAKE_HOME_DIRECTORY}/src/internal_config.h.in"    "${CMAKE_BINARY_DIR}/src/internal_config.h.generated"    @ONLY IMMEDIATE)
551 configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid/version.h.in" "${CMAKE_BINARY_DIR}/include/simgrid/version.h.generated" @ONLY IMMEDIATE)
552 configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid/config.h.in" "${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated" @ONLY IMMEDIATE)
553 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/internal_config.h.generated ${CMAKE_BINARY_DIR}/src/internal_config.h)
554 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/include/simgrid/version.h.generated ${CMAKE_BINARY_DIR}/include/simgrid/version.h)
555 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated ${CMAKE_BINARY_DIR}/include/simgrid/config.h)
556 file(REMOVE ${CMAKE_BINARY_DIR}/src/internal_config.h.generated)
557 file(REMOVE ${CMAKE_BINARY_DIR}/include/simgrid/config.h.generated)
558 file(REMOVE ${CMAKE_BINARY_DIR}/include/simgrid/version.h.generated)
559
560 # We need two versions of the SMPI scripts because they contain the path to the library
561 # so, it depends of whether SimGrid is installed, or run from the sources (during the build)
562
563 file(READ ${CMAKE_HOME_DIRECTORY}/src/smpi/smpitools.sh SMPITOOLS_SH) # Definitions shared amongst all SMPI scripts, inlined in each of them
564
565 ### SMPI script used when simgrid is installed
566 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
567 set(includedir "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}")
568 set(libdir "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
569 set(includeflag "-I${includedir} -I${includedir}/smpi")
570 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${libdir}")
571 if(NS3_LIBRARY_PATH)
572   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
573 endif()
574 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
575 set(SMPIMAIN ${libdir}/simgrid/smpimain)
576 set(SMPIREPLAYMAIN ${libdir}/simgrid/smpireplaymain)
577
578 configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/include/smpi/mpif.h @ONLY)
579 #configure mpif.f90 to build mpi.mod
580 if(SMPI_FORTRAN)
581   set(MODULE_MPIF_IN "module mpi")
582   set(MODULE_MPIF_OUT "end module mpi")
583   configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated @ONLY)
584   execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90.generated ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90)
585   set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/include/smpi)
586   add_library(mpi SHARED ${CMAKE_BINARY_DIR}/src/smpi/mpif.f90)
587 endif()
588
589 foreach(script cc cxx ff f90 run)
590   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/bin/smpi${script} @ONLY)
591 endforeach()
592
593 ### SMPI scripts used when compiling simgrid 
594 set(exec_prefix "${CMAKE_BINARY_DIR}/smpi_script/")
595 set(includedir "${CMAKE_HOME_DIRECTORY}/include")
596 set(libdir "${CMAKE_BINARY_DIR}/lib")
597 set(includeflag "-I${includedir} -I${includedir}/smpi")
598 set(includeflag "${includeflag} -I${CMAKE_BINARY_DIR}/include -I${CMAKE_BINARY_DIR}/include/smpi")
599 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${libdir}")
600 if(NS3_LIBRARY_PATH)
601   set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:${NS3_LIBRARY_PATH}")
602 endif()
603 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
604 set(SMPIMAIN ${libdir}/simgrid/smpimain)
605 set(SMPIREPLAYMAIN ${libdir}/simgrid/smpireplaymain)
606
607 foreach(script cc cxx ff f90 run)
608   configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpi${script}.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script} @ONLY)
609 endforeach()
610
611 if(NOT WIN32)
612   foreach(script cc cxx ff f90 run)
613     execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpi${script})
614     execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpi${script})
615   endforeach()
616 endif()
617
618 set(generated_headers_to_install
619   ${CMAKE_CURRENT_BINARY_DIR}/include/smpi/mpif.h
620   ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid/config.h
621   ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid/version.h
622   )
623
624 set(generated_headers  ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h )
625
626 set(generated_files_to_clean
627   ${generated_headers}
628   ${generated_headers_to_install}
629   ${CMAKE_BINARY_DIR}/bin/smpicc
630   ${CMAKE_BINARY_DIR}/bin/smpicxx
631   ${CMAKE_BINARY_DIR}/bin/smpiff
632   ${CMAKE_BINARY_DIR}/bin/smpif90
633   ${CMAKE_BINARY_DIR}/bin/smpirun
634   ${CMAKE_BINARY_DIR}/bin/colorize
635   ${CMAKE_BINARY_DIR}/bin/simgrid_update_xml
636   ${CMAKE_BINARY_DIR}/examples/smpi/tracing/smpi_traced.trace
637   )
638
639 if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
640   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions0.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt COPYONLY)
641   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions1.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt COPYONLY)
642   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allreduce.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allreduce.txt COPYONLY)
643   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_barrier.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt COPYONLY)
644   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_bcast.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt COPYONLY)
645   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_with_isend.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt COPYONLY)
646   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt COPYONLY)
647   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoallv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt COPYONLY)
648   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_waitall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt COPYONLY)
649   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_reducescatter.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt COPYONLY)
650   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_gather.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt COPYONLY)
651   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allgatherv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt COPYONLY)
652   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile COPYONLY)
653   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_cluster ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_cluster COPYONLY)
654   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_coll ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_coll COPYONLY)
655   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_io ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_io COPYONLY)
656   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_empty ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_empty COPYONLY)
657
658   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/description_file ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file COPYONLY)
659   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/README ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README COPYONLY)
660   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay_multiple/smpi_replay.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt COPYONLY)
661   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)
662   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)
663   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)
664   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)
665   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)
666   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)
667   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)
668   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)
669   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)
670   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)
671   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)
672   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)
673   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)
674   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)
675   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)
676   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)
677   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)
678   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)
679   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)
680   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)
681   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)
682   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)
683   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)
684   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)
685   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)
686   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)
687   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)
688   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)
689   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)
690   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)
691   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)
692   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)
693
694 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)
695 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)
696 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)
697 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)
698 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)
699 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)
700 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)
701 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)
702 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)
703 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)
704 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)
705 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)
706 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)
707 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)
708 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)
709
710   set(generated_files_to_clean
711     ${generated_files_to_clean}
712     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions0.txt
713     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions1.txt
714     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allreduce.txt
715     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_barrier.txt
716     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt
717     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_with_isend.txt
718     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt
719     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt
720     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt
721     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt
722     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt
723     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt
724     ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile
725     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/description_file
726     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/README
727     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/smpi_replay.txt
728     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace0.txt
729     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace1.txt
730     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace2.txt
731     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace3.txt
732     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace4.txt
733     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace5.txt
734     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace6.txt
735     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace7.txt
736     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace8.txt
737     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace9.txt
738     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace10.txt
739     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace11.txt
740     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace12.txt
741     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace13.txt
742     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace14.txt
743     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace15.txt
744     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace16.txt
745     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace17.txt
746     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace18.txt
747     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace19.txt
748     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace20.txt
749     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace21.txt
750     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace22.txt
751     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace23.txt
752     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace24.txt
753     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace25.txt
754     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace26.txt
755     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace27.txt
756     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace28.txt
757     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace29.txt
758     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace30.txt
759     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple/ti_traces_32_1/ti_trace31.txt
760     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only.txt
761     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions0.txt
762     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/compute_only/actions1.txt
763     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty.txt
764     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions0.txt
765     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/empty/actions1.txt
766     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed.txt
767     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions0.txt
768     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/mixed/actions1.txt
769     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual.tesh
770     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute
771     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive
772     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive2
773     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_compute_simple
774     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty1
775     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2
776     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_resources
777     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_time
778     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_empty2_same_time_and_resources
779     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed1
780     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2
781     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_resources
782     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time
783     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time_and_resources
784     ${CMAKE_BINARY_DIR}/examples/smpi/replay_multiple_manual_deploy/workload_nojob
785     )
786 endif()
787
788 SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
789   "${generated_files_to_clean}")
790
791 add_custom_target(tests    COMMENT "Recompiling the tests")
792 add_custom_target(tests-mc COMMENT "Recompiling the MC tests and tools.")
793 add_dependencies(tests tests-mc)
794
795 ### Build some Maintainer files
796 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MaintainerMode.cmake)
797
798 ### Make Libs
799 if(NOT WIN32)
800   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MakeLib.cmake)
801 else()
802   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MakeLibWin.cmake)
803 endif()
804
805 if(enable_java)
806   include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Java.cmake)
807 endif()
808
809 # Python binding (with pybind11)
810 ################
811 if((NOT DEFINED enable_python) OR enable_python)
812   if(EXISTS ${CMAKE_HOME_DIRECTORY}/pybind11) # Try to use a local copy of pybind11, if any
813     message(STATUS "Use the internal copy of pybind11.")
814     add_subdirectory(${CMAKE_HOME_DIRECTORY}/pybind11)
815     set(pybind11_FOUND ON)
816
817     set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/pybind11/tools/)
818     set(Python_ADDITIONAL_VERSIONS 3.9 3.8 3.7 3.6 3.5 3.4)
819     find_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} REQUIRED)
820
821   else()
822     find_package(pybind11 CONFIG)
823     message(STATUS "Pybind11 version: ${pybind11_VERSION}")
824     if (pybind11_VERSION VERSION_LESS 2.4)
825       message(STATUS "SimGrid needs at least v2.4 of pybind11. Disabling the Python bindings.")
826       set(pybind11_FOUND OFF)
827     endif()
828   endif()
829
830   if(NOT PYTHONLIBS_FOUND AND NOT Python3_Development_FOUND)
831     message(STATUS "Python libs not found. Turn pybind11 off.")
832
833     set(pybind11_FOUND OFF)
834   endif()
835 endif()
836
837 option(enable_python "Whether the Python bindings are activated." ${pybind11_FOUND}) # ON by default if dependencies are met
838
839 if("${CMAKE_SYSTEM}" MATCHES "FreeBSD" AND enable_model-checking AND enable_python)
840   message(WARNING "FreeBSD + Model-Checking + Python = too much for now. Disabling the Python bindings.")
841   set(enable_python FALSE)
842 endif()
843
844 if(enable_python)
845   if(pybind11_FOUND)
846     message(STATUS "Found pybind11.")
847     if(NOT enable_lto)
848       set(pybind11_options NO_EXTRAS)
849     endif()
850     pybind11_add_module(python-bindings src/bindings/python/simgrid_python.cpp ${pybind11_options})
851     target_compile_features(python-bindings PRIVATE cxx_std_14)
852     target_link_libraries(python-bindings PUBLIC simgrid)
853     set_target_properties(python-bindings PROPERTIES
854                           LIBRARY_OUTPUT_NAME simgrid
855                           CXX_VISIBILITY_PRESET "default"
856                           INTERPROCEDURAL_OPTIMIZATION FALSE)
857     # LTO is disabled here from the python bindings because this makes a
858     # cmake warning about CMP0069 even when this policy is set. This
859     # problem may be in cmake, in pybind11 or even in our code, not sure.
860     # It may get eventually solved in cmake or pybind11. Or not.
861     # The sure thing is that our python bindings are in one file only,
862     # so there is no need for LTO here. Problem solved :)
863
864     add_dependencies(tests python-bindings)
865     set_property(TARGET python-bindings
866                  APPEND PROPERTY INCLUDE_DIRECTORIES "${INTERNAL_INCLUDES}")
867   else()
868     message(FATAL_ERROR "Please install pybind11-dev to build the Python bindings (or disable that option).")
869   endif()
870 endif()
871 mark_as_advanced(PYBIND11_PYTHON_VERSION)
872 mark_as_advanced(pybind11_DIR)
873
874 ### Make tests
875 if(enable_memcheck_xml)
876   set(enable_memcheck true)
877 endif()
878
879 INCLUDE(CTest)
880 ENABLE_TESTING()
881 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Tests.cmake)
882 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/CTestConfig.cmake)
883
884 ### Define subdirectories
885 foreach(cmakefile ${CMAKEFILES_TXT})
886   string(REPLACE "/CMakeLists.txt" "" repository ${cmakefile})
887   add_subdirectory("${CMAKE_HOME_DIRECTORY}/${repository}")
888 endforeach()
889
890 ### Setup the distrib
891 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Distrib.cmake)
892
893 ### Build the docs if asked to
894 include(${CMAKE_HOME_DIRECTORY}/tools/cmake/Documentation.cmake)
895
896 ### Print the result of configuration
897 message("")
898 message("##########################################")
899 message("#### Content of src/internal_config.h ####")
900 message("##########################################")
901 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h config_output)
902 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 10) # Pass the file header
903 foreach(line ${config_output})
904   message("   ${line}")
905 endforeach()
906 message("##########################################")
907 message("####   Content of simgrid/config.h    ####")
908 message("##########################################")
909 file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid/config.h config_output)
910 LIST(REMOVE_AT config_output 0 1 2 3 4 5 6 7 8 9 -1) # Pass the file header
911 foreach(line ${config_output})
912   message("   ${line}")
913 endforeach()
914 message("##########################################")
915 message("####   End of configuration headers   ####")
916 message("##########################################")
917
918 message("\nConfiguration of package `simgrid':")
919 message("        Home directory ..............: ${CMAKE_HOME_DIRECTORY}")
920 message("        Build Name ..................: ${BUILDNAME}")
921 message("        Cmake Generator .............: ${CMAKE_GENERATOR}")
922 message("        Site ........................: ${SITE}")
923 message("        Install prefix ..............: ${CMAKE_INSTALL_PREFIX}")
924 message("        Release .....................: simgrid-${release_version}")
925 message("")
926 message("        Compiler: C .................: ${CMAKE_C_COMPILER} (id: ${CMAKE_C_COMPILER_ID})")
927 message("                version .............: ${CMAKE_C_COMPILER_VERSION}")
928 message("                is gnu ..............: ${CMAKE_COMPILER_IS_GNUCC}")
929 message("        Compiler: C++ ...............: ${CMAKE_CXX_COMPILER} (id: ${CMAKE_CXX_COMPILER_ID})")
930 message("                version .............: ${CMAKE_CXX_COMPILER_VERSION}")
931 if(${Java_FOUND})
932   message("        Compiler: Javac .............: ${Java_JAVAC_EXECUTABLE}")
933   message("                version .............: ${Java_VERSION_STRING}")
934   message("                runtime .............: ${Java_JAVA_EXECUTABLE}")
935 endif()
936 if(CMAKE_Fortran_COMPILER)
937   message("        Compiler: Fortran ...........: ${SMPI_Fortran_COMPILER} (id: ${CMAKE_Fortran_COMPILER_ID})")
938   message("                version .............: ${CMAKE_Fortran_COMPILER_VERSION}")
939 endif()
940 message("        Linker: .....................: ${CMAKE_LINKER}")
941 message("                version .............: ${LINKER_VERSION}")
942 message("        Make program: ...............: ${CMAKE_MAKE_PROGRAM}")
943 message("")
944 message("        CFlags ......................: ${CMAKE_C_FLAGS}")
945 message("        CXXFlags ....................: ${CMAKE_CXX_FLAGS}")
946 message("        LDFlags .....................: ${CMAKE_C_LINK_FLAGS}")
947 message("        with LTO ....................: ${enable_lto}")
948 message("")
949
950 if (SIMGRID_HAVE_MSG)
951   message("        Compile MSG .................: ON")
952 else()
953   message("        Compile MSG .................: OFF")
954 endif()
955
956 if (SIMGRID_HAVE_NS3)
957   message("        Compile ns-3 ................: ON (path: ${NS3_PATH})")
958 else()
959   message("        Compile ns-3 ................: OFF  (hint: ${NS3_HINT})")
960 endif()
961
962 if (${Java_FOUND})
963   message("        Compile Java ................: ON")
964   message("          Native lib in jar .........: ${enable_lib_in_jar}")
965 else()
966   message("        Compile Java ................: OFF")
967 endif()
968 if(pybind11_FOUND)
969   message("        Compile Python bindings .....: ${enable_python}")
970   message("          module ....................: ${PYTHON_MODULE_PREFIX}simgrid${PYTHON_MODULE_EXTENSION}")
971 else()
972   message("        Compile Python bindings .....: OFF (disabled, or pybind11 not found)")
973 endif()
974 message("        Compile Lua .................: ${SIMGRID_HAVE_LUA}")
975 message("        Compile Smpi ................: ${HAVE_SMPI}")
976 message("          Smpi fortran ..............: ${SMPI_FORTRAN}")
977 message("          MPICH3 testsuite ..........: ${enable_smpi_MPICH3_testsuite}")
978 message("          Privatization .............: ${HAVE_PRIVATIZATION}")
979 message("          PAPI support...............: ${HAVE_PAPI}")
980 message("        Compile Boost.Context support: ${HAVE_BOOST_CONTEXTS}")
981 message("")
982 message("        Maintainer mode .............: ${enable_maintainer_mode}")
983 message("        Documentation................: ${enable_documentation}")
984 message("        Model checking ..............: ${SIMGRID_HAVE_MC}")
985 message("        Jedule  mode ................: ${SIMGRID_HAVE_JEDULE}")
986 message("        Graphviz mode ...............: ${HAVE_GRAPHVIZ}")
987 message("        Mallocators .................: ${enable_mallocators}")
988 message("")
989 message("        Simgrid dependencies ........: ${SIMGRID_DEP}")
990 message("")
991
992 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/Testing/Notes/)
993 file(WRITE ${PROJECT_BINARY_DIR}/Testing/Notes/Build  "GIT version : ${GIT_VERSION}\n")
994 file(APPEND ${PROJECT_BINARY_DIR}/Testing/Notes/Build "Release     : simgrid-${release_version}\n")
995
996 INCLUDE(Dart)