Logo AND Algorithmique Numérique Distribuée

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