Logo AND Algorithmique Numérique Distribuée

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