Logo AND Algorithmique Numérique Distribuée

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