Logo AND Algorithmique Numérique Distribuée

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