Logo AND Algorithmique Numérique Distribuée

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