Logo AND Algorithmique Numérique Distribuée

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