Logo AND Algorithmique Numérique Distribuée

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